ETH Price: $3,349.33 (-2.03%)

Token

Mendel (MENDEL)
 

Overview

Max Total Supply

770 MENDEL

Holders

451

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MENDEL
0xd871e77ee04d0753438868ef562389262a38710c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Mendel Genesis Odyssey is the NFT collection based on Mendel.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Mendel

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, OSL-3.0 license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2021-11-07
*/

// File: @openzeppelin/contracts/utils/Counters.sol
pragma solidity ^0.8.0;

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

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: contracts/WithLimitedSupply.sol


pragma solidity ^0.8.0;


/// @author 1001.digital
/// @title A token tracker that limits the token supply and increments token IDs on each new mint.
abstract contract WithLimitedSupply {
    using Counters for Counters.Counter;

    // Keeps track of how many we have minted
    Counters.Counter private _tokenCount;

    /// @dev The maximum count of tokens this token tracker will hold.
    uint256 private _maxSupply;

    /// Instanciate the contract
    /// @param totalSupply_ how many tokens this collection should hold
    constructor (uint256 totalSupply_) {
        _maxSupply = totalSupply_;
    }

    /// @dev Get the max Supply
    /// @return the maximum token count
    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }

    /// @dev Get the current token count
    /// @return the created token count
    function tokenCount() public view returns (uint256) {
        return _tokenCount.current();
    }

    /// @dev Check whether tokens are still available
    /// @return the available token count
    function availableTokenCount() public view returns (uint256) {
        return maxSupply() - tokenCount();
    }

    /// @dev Increment the token count and fetch the latest count
    /// @return the next token id
    function nextToken() internal virtual ensureAvailability returns (uint256) {
        uint256 token = _tokenCount.current();

        _tokenCount.increment();

        return token;
    }

    /// @dev Check whether another token is still available
    modifier ensureAvailability() {
        require(availableTokenCount() > 0, "No more tokens available");
        _;
    }

    /// @param amount Check whether number of tokens are still available
    /// @dev Check whether tokens are still available
    modifier ensureAvailabilityFor(uint256 amount) {
        require(availableTokenCount() >= amount, "Requested number of tokens not available");
        _;
    }
}
// File: contracts/RandomlyAssigned.sol


pragma solidity ^0.8.0;


/// @author 1001.digital
/// @title Randomly assign tokenIDs from a given set of tokens.
abstract contract RandomlyAssigned is WithLimitedSupply {
    // Used for random index assignment
    mapping(uint256 => uint256) private tokenMatrix;

    // The initial token ID
    uint256 private startFrom;

    /// Instanciate the contract
    /// @param _maxSupply how many tokens this collection should hold
    /// @param _startFrom the tokenID with which to start counting
    constructor (uint256 _maxSupply, uint256 _startFrom)
        WithLimitedSupply(_maxSupply)
    {
        startFrom = _startFrom;
    }

    /// Get the next token ID
    /// @dev Randomly gets a new token ID and keeps track of the ones that are still available.
    /// @return the next token ID
    function nextToken() internal override ensureAvailability returns (uint256) {
        uint256 maxIndex = maxSupply() - tokenCount();
        uint256 random = uint256(keccak256(
            abi.encodePacked(
                msg.sender,
                block.coinbase,
                block.difficulty,
                block.gaslimit,
                block.timestamp
            )
        )) % maxIndex;

        uint256 value = 0;
        if (tokenMatrix[random] == 0) {
            // If this matrix position is empty, set the value to the generated random number.
            value = random;
        } else {
            // Otherwise, use the previously stored number from the matrix.
            value = tokenMatrix[random];
        }

        // If the last available tokenID is still unused...
        if (tokenMatrix[maxIndex - 1] == 0) {
            // ...store that ID in the current matrix position.
            tokenMatrix[random] = maxIndex - 1;
        } else {
            // ...otherwise copy over the stored number to the current matrix position.
            tokenMatrix[random] = tokenMatrix[maxIndex - 1];
        }

        // Increment counts
        super.nextToken();

        return value + startFrom;
    }
}

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 {}
}

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Mendel is ERC721Enumerable, Ownable, RandomlyAssigned {
  using Strings for uint256;

  string public baseExtension = ".json";
  uint256 public cost = 0.18 ether;
  uint256 public maxMintSupply = 770;

  uint256 public maxPresaleMintAmount = 3;

  uint256 public maxMintAmount = 3;

  bool public isPresaleActive = false;
  bool public isTeamMintActive = false;
  bool public isPublicSaleActive = false;

  uint public teamMintSupplyMinted = 0;
  uint public teamMintMaxSupply = 40; //40 for team + giveaways

  uint public publicSupplyMinted = 0; //Used for public and whitelist mints
  uint public publicMaxSupply = 730;  //Used for public and whitelist mints

  uint public presaleDay = 0;

  mapping(address => uint256) public whitelist;
  mapping(address => uint256) public teamWhitelist;

  string public baseURI;

  constructor(
  ) ERC721("Mendel", "MENDEL")
  RandomlyAssigned(770, 1) {
  }

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

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

  function mint(uint256 _mintAmount) public payable {
    require(isPublicSaleActive, "Public Sale is not active");
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(publicSupplyMinted + teamMintSupplyMinted + _mintAmount <= maxMintSupply);
    require(publicSupplyMinted + _mintAmount <= publicMaxSupply);
    require(msg.value >= cost * _mintAmount);

    for (uint256 i = 1; i <= _mintAmount; i++) {
      uint256 mintIndex = nextToken();

      _safeMint(_msgSender(), mintIndex);
    }

    publicSupplyMinted = publicSupplyMinted + _mintAmount;
  }

  function presaleMint(uint256 _mintAmount) external payable {
      require(isPresaleActive, "Presale is not active");
      require(_mintAmount > 0);
      require(_mintAmount <= maxPresaleMintAmount);
      require(publicSupplyMinted + teamMintSupplyMinted + _mintAmount <= maxMintSupply);
      require(publicSupplyMinted + _mintAmount <= publicMaxSupply);
      require(msg.value >= cost * _mintAmount);
      require(presaleDay >= 1);

      uint256 senderLimit = whitelist[msg.sender];
      if (presaleDay == 1){
          senderLimit -= 1;
      }else{
          if (senderLimit >= 1){
              senderLimit = 1;
          }
      }

      require(senderLimit > 0, "You have no tokens left");
      require(_mintAmount <= senderLimit, "Your max token holding exceeded");


      for (uint256 i = 0; i < _mintAmount; i++) {
          uint256 mintIndex = nextToken();
          _safeMint(_msgSender(), mintIndex);
          senderLimit -= 1;
      }
      if (presaleDay == 1) {
          senderLimit += 1;
      }
      publicSupplyMinted = publicSupplyMinted + _mintAmount;
      whitelist[msg.sender] = senderLimit;
  }


  function teamMint(uint256 _mintAmount) external payable {
      require(isTeamMintActive, "Teammint is not active");
      require(_mintAmount > 0);
      require(_mintAmount <= maxMintAmount);
      require(publicSupplyMinted + teamMintSupplyMinted + _mintAmount <= maxMintSupply);
      require(teamMintSupplyMinted + _mintAmount <= teamMintMaxSupply);

      uint256 senderLimit = teamWhitelist[msg.sender];

      require(senderLimit > 0, "You have no tokens left");
      require(_mintAmount <= senderLimit, "Your max token holding exceeded");


      for (uint256 i = 0; i < _mintAmount; i++) {
        uint256 mintIndex = nextToken();
        _safeMint(_msgSender(), mintIndex);
        senderLimit -= 1;
      }

      teamMintSupplyMinted = teamMintSupplyMinted + _mintAmount;
      teamWhitelist[msg.sender] = senderLimit;
  }
  function addWhitelist(
      address[] calldata _addrs,
      uint256[] calldata _limit
  ) external onlyOwner {
      require(_addrs.length == _limit.length);
      for (uint256 i = 0; i < _addrs.length; i++) {
          whitelist[_addrs[i]] = _limit[i];
      }
  }
  function addTeamMintWhitelist(
      address[] calldata _addrs,
      uint256[] calldata _limit
  ) external onlyOwner {
      require(_addrs.length == _limit.length);
      for (uint256 i = 0; i < _addrs.length; i++) {
          teamWhitelist[_addrs[i]] = _limit[i];
      }
  }
  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }
  //only owner

  function changeCost(uint256 newCost) external onlyOwner {
      cost = newCost;
  }

    function togglePresaleStatus() external onlyOwner {
        isPresaleActive = !isPresaleActive;
    }
    function mintDay(uint day) external onlyOwner {
        presaleDay = day;
    }

    function toggleTeamMintStatus() external onlyOwner {
        isTeamMintActive = !isTeamMintActive;
    }

    function togglePublicSaleStatus() external onlyOwner {
        isPublicSaleActive = !isPublicSaleActive;
    }

  function withdraw() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"addTeamMintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"changeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTeamMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"mintDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"teamMintMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMintSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"teamWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTeamMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f90805190602001906200005192919062000292565b5067027f7d0bdb920000601055610302601155600360125560036013556000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506000601460026101000a81548160ff0219169083151502179055506000601555602860165560006017556102da6018556000601955348015620000e657600080fd5b506103026001816040518060400160405280600681526020017f4d656e64656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4d454e44454c000000000000000000000000000000000000000000000000000081525081600090805190602001906200017192919062000292565b5080600190805190602001906200018a92919062000292565b505050620001ad620001a1620001c460201b60201c565b620001cc60201b60201c565b80600c819055505080600e819055505050620003a7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a09062000342565b90600052602060002090601f016020900481019282620002c4576000855562000310565b82601f10620002df57805160ff191683800117855562000310565b8280016001018555821562000310579182015b828111156200030f578251825591602001919060010190620002f2565b5b5090506200031f919062000323565b5090565b5b808211156200033e57600081600090555060010162000324565b5090565b600060028204905060018216806200035b57607f821691505b6020821081141562000372576200037162000378565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61543d80620003b76000396000f3fe6080604052600436106102e45760003560e01c806370a0823111610190578063b88d4fde116100dc578063cab6911d11610095578063e14ca3531161006f578063e14ca35314610ad0578063e985e9c514610afb578063ec8f045814610b38578063f2fde38b14610b63576102e4565b8063cab6911d14610a4f578063d2a87a0014610a7a578063d5abeb0114610aa5576102e4565b8063b88d4fde14610960578063b9ad9fde14610989578063c285e107146109a0578063c6682862146109cb578063c87b56dd146109f6578063c9b298f114610a33576102e4565b80638da5cb5b116101495780639f181b5e116101235780639f181b5e146108c7578063a0712d68146108f2578063a22cb4651461090e578063b74d2af414610937576102e4565b80638da5cb5b1461083457806395d89b411461085f5780639b19251a1461088a576102e4565b806370a0823114610748578063715018a61461078557806378cbcf231461079c5780637bffb4ce146107c757806385480756146107de57806388f627f714610809576102e4565b80632f745c591161024f5780634f6ccce7116102085780635f50db11116101e25780635f50db111461068c57806360d938dc146106b55780636352211e146106e05780636c0360eb1461071d576102e4565b80634f6ccce7146105fd57806355f804b31461063a5780635cb85cd214610663576102e4565b80632f745c59146105095780632fbba115146105465780633ccfd60b1461056257806342842e0e1461056c578063438b63001461059557806349e15807146105d2576102e4565b8063095ea7b3116102a1578063095ea7b31461040b57806313faede61461043457806318160ddd1461045f5780631e84c4131461048a578063239c70ae146104b557806323b872dd146104e0576102e4565b806301ffc9a7146102e9578063050414bb1461032657806306b9b21b1461034f57806306fdde03146103665780630790400a14610391578063081812fc146103ce575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613db5565b610b8c565b60405161031d91906144ff565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613d34565b610c06565b005b34801561035b57600080fd5b50610364610d40565b005b34801561037257600080fd5b5061037b610de8565b604051610388919061451a565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613b71565b610e7a565b6040516103c5919061483c565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613e58565b610e92565b6040516104029190614476565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190613cf4565b610f17565b005b34801561044057600080fd5b5061044961102f565b604051610456919061483c565b60405180910390f35b34801561046b57600080fd5b50610474611035565b604051610481919061483c565b60405180910390f35b34801561049657600080fd5b5061049f611042565b6040516104ac91906144ff565b60405180910390f35b3480156104c157600080fd5b506104ca611055565b6040516104d7919061483c565b60405180910390f35b3480156104ec57600080fd5b5061050760048036038101906105029190613bde565b61105b565b005b34801561051557600080fd5b50610530600480360381019061052b9190613cf4565b6110bb565b60405161053d919061483c565b60405180910390f35b610560600480360381019061055b9190613e58565b611160565b005b61056a611382565b005b34801561057857600080fd5b50610593600480360381019061058e9190613bde565b61143e565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613b71565b61145e565b6040516105c991906144dd565b60405180910390f35b3480156105de57600080fd5b506105e761150c565b6040516105f4919061483c565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613e58565b611512565b604051610631919061483c565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190613e0f565b611583565b005b34801561066f57600080fd5b5061068a60048036038101906106859190613e58565b611619565b005b34801561069857600080fd5b506106b360048036038101906106ae9190613d34565b61169f565b005b3480156106c157600080fd5b506106ca6117d9565b6040516106d791906144ff565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190613e58565b6117ec565b6040516107149190614476565b60405180910390f35b34801561072957600080fd5b5061073261189e565b60405161073f919061451a565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613b71565b61192c565b60405161077c919061483c565b60405180910390f35b34801561079157600080fd5b5061079a6119e4565b005b3480156107a857600080fd5b506107b1611a6c565b6040516107be919061483c565b60405180910390f35b3480156107d357600080fd5b506107dc611a72565b005b3480156107ea57600080fd5b506107f3611b1a565b604051610800919061483c565b60405180910390f35b34801561081557600080fd5b5061081e611b20565b60405161082b919061483c565b60405180910390f35b34801561084057600080fd5b50610849611b26565b6040516108569190614476565b60405180910390f35b34801561086b57600080fd5b50610874611b50565b604051610881919061451a565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190613b71565b611be2565b6040516108be919061483c565b60405180910390f35b3480156108d357600080fd5b506108dc611bfa565b6040516108e9919061483c565b60405180910390f35b61090c60048036038101906109079190613e58565b611c0b565b005b34801561091a57600080fd5b5061093560048036038101906109309190613cb4565b611d2c565b005b34801561094357600080fd5b5061095e60048036038101906109599190613e58565b611ead565b005b34801561096c57600080fd5b5061098760048036038101906109829190613c31565b611f33565b005b34801561099557600080fd5b5061099e611f95565b005b3480156109ac57600080fd5b506109b561203d565b6040516109c2919061483c565b60405180910390f35b3480156109d757600080fd5b506109e0612043565b6040516109ed919061451a565b60405180910390f35b348015610a0257600080fd5b50610a1d6004803603810190610a189190613e58565b6120d1565b604051610a2a919061451a565b60405180910390f35b610a4d6004803603810190610a489190613e58565b61217b565b005b348015610a5b57600080fd5b50610a6461240f565b604051610a71919061483c565b60405180910390f35b348015610a8657600080fd5b50610a8f612415565b604051610a9c91906144ff565b60405180910390f35b348015610ab157600080fd5b50610aba612428565b604051610ac7919061483c565b60405180910390f35b348015610adc57600080fd5b50610ae5612432565b604051610af2919061483c565b60405180910390f35b348015610b0757600080fd5b50610b226004803603810190610b1d9190613b9e565b612453565b604051610b2f91906144ff565b60405180910390f35b348015610b4457600080fd5b50610b4d6124e7565b604051610b5a919061483c565b60405180910390f35b348015610b6f57600080fd5b50610b8a6004803603810190610b859190613b71565b6124ed565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bff5750610bfe826125e5565b5b9050919050565b610c0e6126c7565b73ffffffffffffffffffffffffffffffffffffffff16610c2c611b26565b73ffffffffffffffffffffffffffffffffffffffff1614610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c799061473c565b60405180910390fd5b818190508484905014610c9457600080fd5b60005b84849050811015610d3957828282818110610cb557610cb4614d25565b5b90506020020135601a6000878785818110610cd357610cd2614d25565b5b9050602002016020810190610ce89190613b71565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610d3190614baf565b915050610c97565b5050505050565b610d486126c7565b73ffffffffffffffffffffffffffffffffffffffff16610d66611b26565b73ffffffffffffffffffffffffffffffffffffffff1614610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db39061473c565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b606060008054610df790614b4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2390614b4c565b8015610e705780601f10610e4557610100808354040283529160200191610e70565b820191906000526020600020905b815481529060010190602001808311610e5357829003601f168201915b5050505050905090565b601b6020528060005260406000206000915090505481565b6000610e9d826126cf565b610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed39061471c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f22826117ec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a9061479c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb26126c7565b73ffffffffffffffffffffffffffffffffffffffff161480610fe15750610fe081610fdb6126c7565b612453565b5b611020576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110179061469c565b60405180910390fd5b61102a838361273b565b505050565b60105481565b6000600880549050905090565b601460029054906101000a900460ff1681565b60135481565b61106c6110666126c7565b826127f4565b6110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a2906147bc565b60405180910390fd5b6110b68383836128d2565b505050565b60006110c68361192c565b8210611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe9061455c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601460019054906101000a900460ff166111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a69061481c565b60405180910390fd5b600081116111bc57600080fd5b6013548111156111cb57600080fd5b601154816015546017546111df919061496f565b6111e9919061496f565b11156111f457600080fd5b60165481601554611205919061496f565b111561121057600080fd5b6000601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e9061453c565b60405180910390fd5b808211156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d19061459c565b60405180910390fd5b60005b828110156113255760006112ef612b2e565b90506113026112fc6126c7565b82612cbc565b60018361130f9190614a50565b925050808061131d90614baf565b9150506112dd565b5081601554611334919061496f565b60158190555080601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61138a6126c7565b73ffffffffffffffffffffffffffffffffffffffff166113a8611b26565b73ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f59061473c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061143c57600080fd5b565b61145983838360405180602001604052806000815250611f33565b505050565b6060600061146b8361192c565b905060008167ffffffffffffffff81111561148957611488614d54565b5b6040519080825280602002602001820160405280156114b75781602001602082028036833780820191505090505b50905060005b82811015611501576114cf85826110bb565b8282815181106114e2576114e1614d25565b5b60200260200101818152505080806114f990614baf565b9150506114bd565b508092505050919050565b60155481565b600061151c611035565b821061155d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611554906147dc565b60405180910390fd5b6008828154811061157157611570614d25565b5b90600052602060002001549050919050565b61158b6126c7565b73ffffffffffffffffffffffffffffffffffffffff166115a9611b26565b73ffffffffffffffffffffffffffffffffffffffff16146115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69061473c565b60405180910390fd5b80601c90805190602001906116159291906138d9565b5050565b6116216126c7565b73ffffffffffffffffffffffffffffffffffffffff1661163f611b26565b73ffffffffffffffffffffffffffffffffffffffff1614611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c9061473c565b60405180910390fd5b8060108190555050565b6116a76126c7565b73ffffffffffffffffffffffffffffffffffffffff166116c5611b26565b73ffffffffffffffffffffffffffffffffffffffff161461171b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117129061473c565b60405180910390fd5b81819050848490501461172d57600080fd5b60005b848490508110156117d25782828281811061174e5761174d614d25565b5b90506020020135601b600087878581811061176c5761176b614d25565b5b90506020020160208101906117819190613b71565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806117ca90614baf565b915050611730565b5050505050565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188c906146dc565b60405180910390fd5b80915050919050565b601c80546118ab90614b4c565b80601f01602080910402602001604051908101604052809291908181526020018280546118d790614b4c565b80156119245780601f106118f957610100808354040283529160200191611924565b820191906000526020600020905b81548152906001019060200180831161190757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561199d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611994906146bc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119ec6126c7565b73ffffffffffffffffffffffffffffffffffffffff16611a0a611b26565b73ffffffffffffffffffffffffffffffffffffffff1614611a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a579061473c565b60405180910390fd5b611a6a6000612cda565b565b60185481565b611a7a6126c7565b73ffffffffffffffffffffffffffffffffffffffff16611a98611b26565b73ffffffffffffffffffffffffffffffffffffffff1614611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae59061473c565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b60125481565b60175481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b5f90614b4c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8b90614b4c565b8015611bd85780601f10611bad57610100808354040283529160200191611bd8565b820191906000526020600020905b815481529060010190602001808311611bbb57829003601f168201915b5050505050905090565b601a6020528060005260406000206000915090505481565b6000611c06600b612da0565b905090565b601460029054906101000a900460ff16611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c51906145fc565b60405180910390fd5b60008111611c6757600080fd5b601354811115611c7657600080fd5b60115481601554601754611c8a919061496f565b611c94919061496f565b1115611c9f57600080fd5b60185481601754611cb0919061496f565b1115611cbb57600080fd5b80601054611cc991906149f6565b341015611cd557600080fd5b6000600190505b818111611d14576000611ced612b2e565b9050611d00611cfa6126c7565b82612cbc565b508080611d0c90614baf565b915050611cdc565b5080601754611d23919061496f565b60178190555050565b611d346126c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d999061463c565b60405180910390fd5b8060056000611daf6126c7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e5c6126c7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea191906144ff565b60405180910390a35050565b611eb56126c7565b73ffffffffffffffffffffffffffffffffffffffff16611ed3611b26565b73ffffffffffffffffffffffffffffffffffffffff1614611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f209061473c565b60405180910390fd5b8060198190555050565b611f44611f3e6126c7565b836127f4565b611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a906147bc565b60405180910390fd5b611f8f84848484612dae565b50505050565b611f9d6126c7565b73ffffffffffffffffffffffffffffffffffffffff16611fbb611b26565b73ffffffffffffffffffffffffffffffffffffffff1614612011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120089061473c565b60405180910390fd5b601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b60115481565b600f805461205090614b4c565b80601f016020809104026020016040519081016040528092919081815260200182805461207c90614b4c565b80156120c95780601f1061209e576101008083540402835291602001916120c9565b820191906000526020600020905b8154815290600101906020018083116120ac57829003601f168201915b505050505081565b60606120dc826126cf565b61211b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121129061477c565b60405180910390fd5b6000612125612e0a565b905060008151116121455760405180602001604052806000815250612173565b8061214f84612e9c565b600f60405160200161216393929190614445565b6040516020818303038152906040525b915050919050565b601460009054906101000a900460ff166121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c1906147fc565b60405180910390fd5b600081116121d757600080fd5b6012548111156121e657600080fd5b601154816015546017546121fa919061496f565b612204919061496f565b111561220f57600080fd5b60185481601754612220919061496f565b111561222b57600080fd5b8060105461223991906149f6565b34101561224557600080fd5b6001601954101561225557600080fd5b6000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600160195414156122b8576001816122b19190614a50565b90506122c6565b600181106122c557600190505b5b60008111612309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123009061453c565b60405180910390fd5b8082111561234c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123439061459c565b60405180910390fd5b60005b82811015612397576000612361612b2e565b905061237461236e6126c7565b82612cbc565b6001836123819190614a50565b925050808061238f90614baf565b91505061234f565b50600160195414156123b3576001816123b0919061496f565b90505b816017546123c1919061496f565b60178190555080601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60165481565b601460019054906101000a900460ff1681565b6000600c54905090565b600061243c611bfa565b612444612428565b61244e9190614a50565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60195481565b6124f56126c7565b73ffffffffffffffffffffffffffffffffffffffff16612513611b26565b73ffffffffffffffffffffffffffffffffffffffff1614612569576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125609061473c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d0906145bc565b60405180910390fd5b6125e281612cda565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126b057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126c057506126bf82612ffd565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127ae836117ec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127ff826126cf565b61283e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128359061467c565b60405180910390fd5b6000612849836117ec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128b857508373ffffffffffffffffffffffffffffffffffffffff166128a084610e92565b73ffffffffffffffffffffffffffffffffffffffff16145b806128c957506128c88185612453565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128f2826117ec565b73ffffffffffffffffffffffffffffffffffffffff1614612948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293f9061475c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129af9061461c565b60405180910390fd5b6129c3838383613067565b6129ce60008261273b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1e9190614a50565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a75919061496f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080612b39612432565b11612b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b709061465c565b60405180910390fd5b6000612b83611bfa565b612b8b612428565b612b959190614a50565b90506000813341444542604051602001612bb39594939291906143e6565b6040516020818303038152906040528051906020012060001c612bd69190614c38565b9050600080600d6000848152602001908152602001600020541415612bfd57819050612c14565b600d60008381526020019081526020016000205490505b6000600d6000600186612c279190614a50565b8152602001908152602001600020541415612c6557600183612c499190614a50565b600d600084815260200190815260200160002081905550612c9d565b600d6000600185612c769190614a50565b815260200190815260200160002054600d6000848152602001908152602001600020819055505b612ca561317b565b50600e5481612cb4919061496f565b935050505090565b612cd68282604051806020016040528060008152506131e5565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b612db98484846128d2565b612dc584848484613240565b612e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb9061457c565b60405180910390fd5b50505050565b6060601c8054612e1990614b4c565b80601f0160208091040260200160405190810160405280929190818152602001828054612e4590614b4c565b8015612e925780601f10612e6757610100808354040283529160200191612e92565b820191906000526020600020905b815481529060010190602001808311612e7557829003601f168201915b5050505050905090565b60606000821415612ee4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ff8565b600082905060005b60008214612f16578080612eff90614baf565b915050600a82612f0f91906149c5565b9150612eec565b60008167ffffffffffffffff811115612f3257612f31614d54565b5b6040519080825280601f01601f191660200182016040528015612f645781602001600182028036833780820191505090505b5090505b60008514612ff157600182612f7d9190614a50565b9150600a85612f8c9190614c38565b6030612f98919061496f565b60f81b818381518110612fae57612fad614d25565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fea91906149c5565b9450612f68565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6130728383836133d7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130b5576130b0816133dc565b6130f4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130f3576130f28382613425565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131375761313281613592565b613176565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613175576131748282613663565b5b5b505050565b600080613186612432565b116131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bd9061465c565b60405180910390fd5b60006131d2600b612da0565b90506131de600b6136e2565b8091505090565b6131ef83836136f8565b6131fc6000848484613240565b61323b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132329061457c565b60405180910390fd5b505050565b60006132618473ffffffffffffffffffffffffffffffffffffffff166138c6565b156133ca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261328a6126c7565b8786866040518563ffffffff1660e01b81526004016132ac9493929190614491565b602060405180830381600087803b1580156132c657600080fd5b505af19250505080156132f757506040513d601f19601f820116820180604052508101906132f49190613de2565b60015b61337a573d8060008114613327576040519150601f19603f3d011682016040523d82523d6000602084013e61332c565b606091505b50600081511415613372576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133699061457c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133cf565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134328461192c565b61343c9190614a50565b9050600060076000848152602001908152602001600020549050818114613521576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135a69190614a50565b90506000600960008481526020019081526020016000205490506000600883815481106135d6576135d5614d25565b5b9060005260206000200154905080600883815481106135f8576135f7614d25565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061364757613646614cf6565b5b6001900381819060005260206000200160009055905550505050565b600061366e8361192c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375f906146fc565b60405180910390fd5b613771816126cf565b156137b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a8906145dc565b60405180910390fd5b6137bd60008383613067565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461380d919061496f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546138e590614b4c565b90600052602060002090601f016020900481019282613907576000855561394e565b82601f1061392057805160ff191683800117855561394e565b8280016001018555821561394e579182015b8281111561394d578251825591602001919060010190613932565b5b50905061395b919061395f565b5090565b5b80821115613978576000816000905550600101613960565b5090565b600061398f61398a8461487c565b614857565b9050828152602081018484840111156139ab576139aa614d92565b5b6139b6848285614b0a565b509392505050565b60006139d16139cc846148ad565b614857565b9050828152602081018484840111156139ed576139ec614d92565b5b6139f8848285614b0a565b509392505050565b600081359050613a0f816153ab565b92915050565b60008083601f840112613a2b57613a2a614d88565b5b8235905067ffffffffffffffff811115613a4857613a47614d83565b5b602083019150836020820283011115613a6457613a63614d8d565b5b9250929050565b60008083601f840112613a8157613a80614d88565b5b8235905067ffffffffffffffff811115613a9e57613a9d614d83565b5b602083019150836020820283011115613aba57613ab9614d8d565b5b9250929050565b600081359050613ad0816153c2565b92915050565b600081359050613ae5816153d9565b92915050565b600081519050613afa816153d9565b92915050565b600082601f830112613b1557613b14614d88565b5b8135613b2584826020860161397c565b91505092915050565b600082601f830112613b4357613b42614d88565b5b8135613b538482602086016139be565b91505092915050565b600081359050613b6b816153f0565b92915050565b600060208284031215613b8757613b86614d9c565b5b6000613b9584828501613a00565b91505092915050565b60008060408385031215613bb557613bb4614d9c565b5b6000613bc385828601613a00565b9250506020613bd485828601613a00565b9150509250929050565b600080600060608486031215613bf757613bf6614d9c565b5b6000613c0586828701613a00565b9350506020613c1686828701613a00565b9250506040613c2786828701613b5c565b9150509250925092565b60008060008060808587031215613c4b57613c4a614d9c565b5b6000613c5987828801613a00565b9450506020613c6a87828801613a00565b9350506040613c7b87828801613b5c565b925050606085013567ffffffffffffffff811115613c9c57613c9b614d97565b5b613ca887828801613b00565b91505092959194509250565b60008060408385031215613ccb57613cca614d9c565b5b6000613cd985828601613a00565b9250506020613cea85828601613ac1565b9150509250929050565b60008060408385031215613d0b57613d0a614d9c565b5b6000613d1985828601613a00565b9250506020613d2a85828601613b5c565b9150509250929050565b60008060008060408587031215613d4e57613d4d614d9c565b5b600085013567ffffffffffffffff811115613d6c57613d6b614d97565b5b613d7887828801613a15565b9450945050602085013567ffffffffffffffff811115613d9b57613d9a614d97565b5b613da787828801613a6b565b925092505092959194509250565b600060208284031215613dcb57613dca614d9c565b5b6000613dd984828501613ad6565b91505092915050565b600060208284031215613df857613df7614d9c565b5b6000613e0684828501613aeb565b91505092915050565b600060208284031215613e2557613e24614d9c565b5b600082013567ffffffffffffffff811115613e4357613e42614d97565b5b613e4f84828501613b2e565b91505092915050565b600060208284031215613e6e57613e6d614d9c565b5b6000613e7c84828501613b5c565b91505092915050565b6000613e9183836143b1565b60208301905092915050565b613eae613ea982614a96565b614c0a565b82525050565b613ebd81614a84565b82525050565b613ed4613ecf82614a84565b614bf8565b82525050565b6000613ee582614903565b613eef8185614931565b9350613efa836148de565b8060005b83811015613f2b578151613f128882613e85565b9750613f1d83614924565b925050600181019050613efe565b5085935050505092915050565b613f4181614aa8565b82525050565b6000613f528261490e565b613f5c8185614942565b9350613f6c818560208601614b19565b613f7581614da1565b840191505092915050565b6000613f8b82614919565b613f958185614953565b9350613fa5818560208601614b19565b613fae81614da1565b840191505092915050565b6000613fc482614919565b613fce8185614964565b9350613fde818560208601614b19565b80840191505092915050565b60008154613ff781614b4c565b6140018186614964565b9450600182166000811461401c576001811461402d57614060565b60ff19831686528186019350614060565b614036856148ee565b60005b8381101561405857815481890152600182019150602081019050614039565b838801955050505b50505092915050565b6000614076601783614953565b915061408182614dbf565b602082019050919050565b6000614099602b83614953565b91506140a482614de8565b604082019050919050565b60006140bc603283614953565b91506140c782614e37565b604082019050919050565b60006140df601f83614953565b91506140ea82614e86565b602082019050919050565b6000614102602683614953565b915061410d82614eaf565b604082019050919050565b6000614125601c83614953565b915061413082614efe565b602082019050919050565b6000614148601983614953565b915061415382614f27565b602082019050919050565b600061416b602483614953565b915061417682614f50565b604082019050919050565b600061418e601983614953565b915061419982614f9f565b602082019050919050565b60006141b1601883614953565b91506141bc82614fc8565b602082019050919050565b60006141d4602c83614953565b91506141df82614ff1565b604082019050919050565b60006141f7603883614953565b915061420282615040565b604082019050919050565b600061421a602a83614953565b91506142258261508f565b604082019050919050565b600061423d602983614953565b9150614248826150de565b604082019050919050565b6000614260602083614953565b915061426b8261512d565b602082019050919050565b6000614283602c83614953565b915061428e82615156565b604082019050919050565b60006142a6602083614953565b91506142b1826151a5565b602082019050919050565b60006142c9602983614953565b91506142d4826151ce565b604082019050919050565b60006142ec602f83614953565b91506142f78261521d565b604082019050919050565b600061430f602183614953565b915061431a8261526c565b604082019050919050565b6000614332603183614953565b915061433d826152bb565b604082019050919050565b6000614355602c83614953565b91506143608261530a565b604082019050919050565b6000614378601583614953565b915061438382615359565b602082019050919050565b600061439b601683614953565b91506143a682615382565b602082019050919050565b6143ba81614b00565b82525050565b6143c981614b00565b82525050565b6143e06143db82614b00565b614c2e565b82525050565b60006143f28288613ec3565b6014820191506144028287613e9d565b60148201915061441282866143cf565b60208201915061442282856143cf565b60208201915061443282846143cf565b6020820191508190509695505050505050565b60006144518286613fb9565b915061445d8285613fb9565b91506144698284613fea565b9150819050949350505050565b600060208201905061448b6000830184613eb4565b92915050565b60006080820190506144a66000830187613eb4565b6144b36020830186613eb4565b6144c060408301856143c0565b81810360608301526144d28184613f47565b905095945050505050565b600060208201905081810360008301526144f78184613eda565b905092915050565b60006020820190506145146000830184613f38565b92915050565b600060208201905081810360008301526145348184613f80565b905092915050565b6000602082019050818103600083015261455581614069565b9050919050565b600060208201905081810360008301526145758161408c565b9050919050565b60006020820190508181036000830152614595816140af565b9050919050565b600060208201905081810360008301526145b5816140d2565b9050919050565b600060208201905081810360008301526145d5816140f5565b9050919050565b600060208201905081810360008301526145f581614118565b9050919050565b600060208201905081810360008301526146158161413b565b9050919050565b600060208201905081810360008301526146358161415e565b9050919050565b6000602082019050818103600083015261465581614181565b9050919050565b60006020820190508181036000830152614675816141a4565b9050919050565b60006020820190508181036000830152614695816141c7565b9050919050565b600060208201905081810360008301526146b5816141ea565b9050919050565b600060208201905081810360008301526146d58161420d565b9050919050565b600060208201905081810360008301526146f581614230565b9050919050565b6000602082019050818103600083015261471581614253565b9050919050565b6000602082019050818103600083015261473581614276565b9050919050565b6000602082019050818103600083015261475581614299565b9050919050565b60006020820190508181036000830152614775816142bc565b9050919050565b60006020820190508181036000830152614795816142df565b9050919050565b600060208201905081810360008301526147b581614302565b9050919050565b600060208201905081810360008301526147d581614325565b9050919050565b600060208201905081810360008301526147f581614348565b9050919050565b600060208201905081810360008301526148158161436b565b9050919050565b600060208201905081810360008301526148358161438e565b9050919050565b600060208201905061485160008301846143c0565b92915050565b6000614861614872565b905061486d8282614b7e565b919050565b6000604051905090565b600067ffffffffffffffff82111561489757614896614d54565b5b6148a082614da1565b9050602081019050919050565b600067ffffffffffffffff8211156148c8576148c7614d54565b5b6148d182614da1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061497a82614b00565b915061498583614b00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149ba576149b9614c69565b5b828201905092915050565b60006149d082614b00565b91506149db83614b00565b9250826149eb576149ea614c98565b5b828204905092915050565b6000614a0182614b00565b9150614a0c83614b00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a4557614a44614c69565b5b828202905092915050565b6000614a5b82614b00565b9150614a6683614b00565b925082821015614a7957614a78614c69565b5b828203905092915050565b6000614a8f82614ae0565b9050919050565b6000614aa182614ae0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b37578082015181840152602081019050614b1c565b83811115614b46576000848401525b50505050565b60006002820490506001821680614b6457607f821691505b60208210811415614b7857614b77614cc7565b5b50919050565b614b8782614da1565b810181811067ffffffffffffffff82111715614ba657614ba5614d54565b5b80604052505050565b6000614bba82614b00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bed57614bec614c69565b5b600182019050919050565b6000614c0382614c1c565b9050919050565b6000614c1582614c1c565b9050919050565b6000614c2782614db2565b9050919050565b6000819050919050565b6000614c4382614b00565b9150614c4e83614b00565b925082614c5e57614c5d614c98565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f596f752068617665206e6f20746f6b656e73206c656674000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f596f7572206d617820746f6b656e20686f6c64696e6720657863656564656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c69632053616c65206973206e6f742061637469766500000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f5465616d6d696e74206973206e6f742061637469766500000000000000000000600082015250565b6153b481614a84565b81146153bf57600080fd5b50565b6153cb81614aa8565b81146153d657600080fd5b50565b6153e281614ab4565b81146153ed57600080fd5b50565b6153f981614b00565b811461540457600080fd5b5056fea26469706673582212200014cb846ad7a9185d69278b629b5831aa65d8b6c56ecd57c210c3c3d34edcd564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102e45760003560e01c806370a0823111610190578063b88d4fde116100dc578063cab6911d11610095578063e14ca3531161006f578063e14ca35314610ad0578063e985e9c514610afb578063ec8f045814610b38578063f2fde38b14610b63576102e4565b8063cab6911d14610a4f578063d2a87a0014610a7a578063d5abeb0114610aa5576102e4565b8063b88d4fde14610960578063b9ad9fde14610989578063c285e107146109a0578063c6682862146109cb578063c87b56dd146109f6578063c9b298f114610a33576102e4565b80638da5cb5b116101495780639f181b5e116101235780639f181b5e146108c7578063a0712d68146108f2578063a22cb4651461090e578063b74d2af414610937576102e4565b80638da5cb5b1461083457806395d89b411461085f5780639b19251a1461088a576102e4565b806370a0823114610748578063715018a61461078557806378cbcf231461079c5780637bffb4ce146107c757806385480756146107de57806388f627f714610809576102e4565b80632f745c591161024f5780634f6ccce7116102085780635f50db11116101e25780635f50db111461068c57806360d938dc146106b55780636352211e146106e05780636c0360eb1461071d576102e4565b80634f6ccce7146105fd57806355f804b31461063a5780635cb85cd214610663576102e4565b80632f745c59146105095780632fbba115146105465780633ccfd60b1461056257806342842e0e1461056c578063438b63001461059557806349e15807146105d2576102e4565b8063095ea7b3116102a1578063095ea7b31461040b57806313faede61461043457806318160ddd1461045f5780631e84c4131461048a578063239c70ae146104b557806323b872dd146104e0576102e4565b806301ffc9a7146102e9578063050414bb1461032657806306b9b21b1461034f57806306fdde03146103665780630790400a14610391578063081812fc146103ce575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613db5565b610b8c565b60405161031d91906144ff565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613d34565b610c06565b005b34801561035b57600080fd5b50610364610d40565b005b34801561037257600080fd5b5061037b610de8565b604051610388919061451a565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613b71565b610e7a565b6040516103c5919061483c565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613e58565b610e92565b6040516104029190614476565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190613cf4565b610f17565b005b34801561044057600080fd5b5061044961102f565b604051610456919061483c565b60405180910390f35b34801561046b57600080fd5b50610474611035565b604051610481919061483c565b60405180910390f35b34801561049657600080fd5b5061049f611042565b6040516104ac91906144ff565b60405180910390f35b3480156104c157600080fd5b506104ca611055565b6040516104d7919061483c565b60405180910390f35b3480156104ec57600080fd5b5061050760048036038101906105029190613bde565b61105b565b005b34801561051557600080fd5b50610530600480360381019061052b9190613cf4565b6110bb565b60405161053d919061483c565b60405180910390f35b610560600480360381019061055b9190613e58565b611160565b005b61056a611382565b005b34801561057857600080fd5b50610593600480360381019061058e9190613bde565b61143e565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613b71565b61145e565b6040516105c991906144dd565b60405180910390f35b3480156105de57600080fd5b506105e761150c565b6040516105f4919061483c565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613e58565b611512565b604051610631919061483c565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190613e0f565b611583565b005b34801561066f57600080fd5b5061068a60048036038101906106859190613e58565b611619565b005b34801561069857600080fd5b506106b360048036038101906106ae9190613d34565b61169f565b005b3480156106c157600080fd5b506106ca6117d9565b6040516106d791906144ff565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190613e58565b6117ec565b6040516107149190614476565b60405180910390f35b34801561072957600080fd5b5061073261189e565b60405161073f919061451a565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613b71565b61192c565b60405161077c919061483c565b60405180910390f35b34801561079157600080fd5b5061079a6119e4565b005b3480156107a857600080fd5b506107b1611a6c565b6040516107be919061483c565b60405180910390f35b3480156107d357600080fd5b506107dc611a72565b005b3480156107ea57600080fd5b506107f3611b1a565b604051610800919061483c565b60405180910390f35b34801561081557600080fd5b5061081e611b20565b60405161082b919061483c565b60405180910390f35b34801561084057600080fd5b50610849611b26565b6040516108569190614476565b60405180910390f35b34801561086b57600080fd5b50610874611b50565b604051610881919061451a565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190613b71565b611be2565b6040516108be919061483c565b60405180910390f35b3480156108d357600080fd5b506108dc611bfa565b6040516108e9919061483c565b60405180910390f35b61090c60048036038101906109079190613e58565b611c0b565b005b34801561091a57600080fd5b5061093560048036038101906109309190613cb4565b611d2c565b005b34801561094357600080fd5b5061095e60048036038101906109599190613e58565b611ead565b005b34801561096c57600080fd5b5061098760048036038101906109829190613c31565b611f33565b005b34801561099557600080fd5b5061099e611f95565b005b3480156109ac57600080fd5b506109b561203d565b6040516109c2919061483c565b60405180910390f35b3480156109d757600080fd5b506109e0612043565b6040516109ed919061451a565b60405180910390f35b348015610a0257600080fd5b50610a1d6004803603810190610a189190613e58565b6120d1565b604051610a2a919061451a565b60405180910390f35b610a4d6004803603810190610a489190613e58565b61217b565b005b348015610a5b57600080fd5b50610a6461240f565b604051610a71919061483c565b60405180910390f35b348015610a8657600080fd5b50610a8f612415565b604051610a9c91906144ff565b60405180910390f35b348015610ab157600080fd5b50610aba612428565b604051610ac7919061483c565b60405180910390f35b348015610adc57600080fd5b50610ae5612432565b604051610af2919061483c565b60405180910390f35b348015610b0757600080fd5b50610b226004803603810190610b1d9190613b9e565b612453565b604051610b2f91906144ff565b60405180910390f35b348015610b4457600080fd5b50610b4d6124e7565b604051610b5a919061483c565b60405180910390f35b348015610b6f57600080fd5b50610b8a6004803603810190610b859190613b71565b6124ed565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bff5750610bfe826125e5565b5b9050919050565b610c0e6126c7565b73ffffffffffffffffffffffffffffffffffffffff16610c2c611b26565b73ffffffffffffffffffffffffffffffffffffffff1614610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c799061473c565b60405180910390fd5b818190508484905014610c9457600080fd5b60005b84849050811015610d3957828282818110610cb557610cb4614d25565b5b90506020020135601a6000878785818110610cd357610cd2614d25565b5b9050602002016020810190610ce89190613b71565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610d3190614baf565b915050610c97565b5050505050565b610d486126c7565b73ffffffffffffffffffffffffffffffffffffffff16610d66611b26565b73ffffffffffffffffffffffffffffffffffffffff1614610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db39061473c565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b606060008054610df790614b4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2390614b4c565b8015610e705780601f10610e4557610100808354040283529160200191610e70565b820191906000526020600020905b815481529060010190602001808311610e5357829003601f168201915b5050505050905090565b601b6020528060005260406000206000915090505481565b6000610e9d826126cf565b610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed39061471c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f22826117ec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a9061479c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb26126c7565b73ffffffffffffffffffffffffffffffffffffffff161480610fe15750610fe081610fdb6126c7565b612453565b5b611020576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110179061469c565b60405180910390fd5b61102a838361273b565b505050565b60105481565b6000600880549050905090565b601460029054906101000a900460ff1681565b60135481565b61106c6110666126c7565b826127f4565b6110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a2906147bc565b60405180910390fd5b6110b68383836128d2565b505050565b60006110c68361192c565b8210611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe9061455c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601460019054906101000a900460ff166111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a69061481c565b60405180910390fd5b600081116111bc57600080fd5b6013548111156111cb57600080fd5b601154816015546017546111df919061496f565b6111e9919061496f565b11156111f457600080fd5b60165481601554611205919061496f565b111561121057600080fd5b6000601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e9061453c565b60405180910390fd5b808211156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d19061459c565b60405180910390fd5b60005b828110156113255760006112ef612b2e565b90506113026112fc6126c7565b82612cbc565b60018361130f9190614a50565b925050808061131d90614baf565b9150506112dd565b5081601554611334919061496f565b60158190555080601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61138a6126c7565b73ffffffffffffffffffffffffffffffffffffffff166113a8611b26565b73ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f59061473c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061143c57600080fd5b565b61145983838360405180602001604052806000815250611f33565b505050565b6060600061146b8361192c565b905060008167ffffffffffffffff81111561148957611488614d54565b5b6040519080825280602002602001820160405280156114b75781602001602082028036833780820191505090505b50905060005b82811015611501576114cf85826110bb565b8282815181106114e2576114e1614d25565b5b60200260200101818152505080806114f990614baf565b9150506114bd565b508092505050919050565b60155481565b600061151c611035565b821061155d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611554906147dc565b60405180910390fd5b6008828154811061157157611570614d25565b5b90600052602060002001549050919050565b61158b6126c7565b73ffffffffffffffffffffffffffffffffffffffff166115a9611b26565b73ffffffffffffffffffffffffffffffffffffffff16146115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69061473c565b60405180910390fd5b80601c90805190602001906116159291906138d9565b5050565b6116216126c7565b73ffffffffffffffffffffffffffffffffffffffff1661163f611b26565b73ffffffffffffffffffffffffffffffffffffffff1614611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c9061473c565b60405180910390fd5b8060108190555050565b6116a76126c7565b73ffffffffffffffffffffffffffffffffffffffff166116c5611b26565b73ffffffffffffffffffffffffffffffffffffffff161461171b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117129061473c565b60405180910390fd5b81819050848490501461172d57600080fd5b60005b848490508110156117d25782828281811061174e5761174d614d25565b5b90506020020135601b600087878581811061176c5761176b614d25565b5b90506020020160208101906117819190613b71565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806117ca90614baf565b915050611730565b5050505050565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188c906146dc565b60405180910390fd5b80915050919050565b601c80546118ab90614b4c565b80601f01602080910402602001604051908101604052809291908181526020018280546118d790614b4c565b80156119245780601f106118f957610100808354040283529160200191611924565b820191906000526020600020905b81548152906001019060200180831161190757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561199d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611994906146bc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119ec6126c7565b73ffffffffffffffffffffffffffffffffffffffff16611a0a611b26565b73ffffffffffffffffffffffffffffffffffffffff1614611a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a579061473c565b60405180910390fd5b611a6a6000612cda565b565b60185481565b611a7a6126c7565b73ffffffffffffffffffffffffffffffffffffffff16611a98611b26565b73ffffffffffffffffffffffffffffffffffffffff1614611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae59061473c565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b60125481565b60175481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b5f90614b4c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8b90614b4c565b8015611bd85780601f10611bad57610100808354040283529160200191611bd8565b820191906000526020600020905b815481529060010190602001808311611bbb57829003601f168201915b5050505050905090565b601a6020528060005260406000206000915090505481565b6000611c06600b612da0565b905090565b601460029054906101000a900460ff16611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c51906145fc565b60405180910390fd5b60008111611c6757600080fd5b601354811115611c7657600080fd5b60115481601554601754611c8a919061496f565b611c94919061496f565b1115611c9f57600080fd5b60185481601754611cb0919061496f565b1115611cbb57600080fd5b80601054611cc991906149f6565b341015611cd557600080fd5b6000600190505b818111611d14576000611ced612b2e565b9050611d00611cfa6126c7565b82612cbc565b508080611d0c90614baf565b915050611cdc565b5080601754611d23919061496f565b60178190555050565b611d346126c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d999061463c565b60405180910390fd5b8060056000611daf6126c7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e5c6126c7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea191906144ff565b60405180910390a35050565b611eb56126c7565b73ffffffffffffffffffffffffffffffffffffffff16611ed3611b26565b73ffffffffffffffffffffffffffffffffffffffff1614611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f209061473c565b60405180910390fd5b8060198190555050565b611f44611f3e6126c7565b836127f4565b611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a906147bc565b60405180910390fd5b611f8f84848484612dae565b50505050565b611f9d6126c7565b73ffffffffffffffffffffffffffffffffffffffff16611fbb611b26565b73ffffffffffffffffffffffffffffffffffffffff1614612011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120089061473c565b60405180910390fd5b601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b60115481565b600f805461205090614b4c565b80601f016020809104026020016040519081016040528092919081815260200182805461207c90614b4c565b80156120c95780601f1061209e576101008083540402835291602001916120c9565b820191906000526020600020905b8154815290600101906020018083116120ac57829003601f168201915b505050505081565b60606120dc826126cf565b61211b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121129061477c565b60405180910390fd5b6000612125612e0a565b905060008151116121455760405180602001604052806000815250612173565b8061214f84612e9c565b600f60405160200161216393929190614445565b6040516020818303038152906040525b915050919050565b601460009054906101000a900460ff166121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c1906147fc565b60405180910390fd5b600081116121d757600080fd5b6012548111156121e657600080fd5b601154816015546017546121fa919061496f565b612204919061496f565b111561220f57600080fd5b60185481601754612220919061496f565b111561222b57600080fd5b8060105461223991906149f6565b34101561224557600080fd5b6001601954101561225557600080fd5b6000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600160195414156122b8576001816122b19190614a50565b90506122c6565b600181106122c557600190505b5b60008111612309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123009061453c565b60405180910390fd5b8082111561234c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123439061459c565b60405180910390fd5b60005b82811015612397576000612361612b2e565b905061237461236e6126c7565b82612cbc565b6001836123819190614a50565b925050808061238f90614baf565b91505061234f565b50600160195414156123b3576001816123b0919061496f565b90505b816017546123c1919061496f565b60178190555080601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60165481565b601460019054906101000a900460ff1681565b6000600c54905090565b600061243c611bfa565b612444612428565b61244e9190614a50565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60195481565b6124f56126c7565b73ffffffffffffffffffffffffffffffffffffffff16612513611b26565b73ffffffffffffffffffffffffffffffffffffffff1614612569576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125609061473c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d0906145bc565b60405180910390fd5b6125e281612cda565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126b057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126c057506126bf82612ffd565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127ae836117ec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127ff826126cf565b61283e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128359061467c565b60405180910390fd5b6000612849836117ec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128b857508373ffffffffffffffffffffffffffffffffffffffff166128a084610e92565b73ffffffffffffffffffffffffffffffffffffffff16145b806128c957506128c88185612453565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128f2826117ec565b73ffffffffffffffffffffffffffffffffffffffff1614612948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293f9061475c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129af9061461c565b60405180910390fd5b6129c3838383613067565b6129ce60008261273b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1e9190614a50565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a75919061496f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080612b39612432565b11612b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b709061465c565b60405180910390fd5b6000612b83611bfa565b612b8b612428565b612b959190614a50565b90506000813341444542604051602001612bb39594939291906143e6565b6040516020818303038152906040528051906020012060001c612bd69190614c38565b9050600080600d6000848152602001908152602001600020541415612bfd57819050612c14565b600d60008381526020019081526020016000205490505b6000600d6000600186612c279190614a50565b8152602001908152602001600020541415612c6557600183612c499190614a50565b600d600084815260200190815260200160002081905550612c9d565b600d6000600185612c769190614a50565b815260200190815260200160002054600d6000848152602001908152602001600020819055505b612ca561317b565b50600e5481612cb4919061496f565b935050505090565b612cd68282604051806020016040528060008152506131e5565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b612db98484846128d2565b612dc584848484613240565b612e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb9061457c565b60405180910390fd5b50505050565b6060601c8054612e1990614b4c565b80601f0160208091040260200160405190810160405280929190818152602001828054612e4590614b4c565b8015612e925780601f10612e6757610100808354040283529160200191612e92565b820191906000526020600020905b815481529060010190602001808311612e7557829003601f168201915b5050505050905090565b60606000821415612ee4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ff8565b600082905060005b60008214612f16578080612eff90614baf565b915050600a82612f0f91906149c5565b9150612eec565b60008167ffffffffffffffff811115612f3257612f31614d54565b5b6040519080825280601f01601f191660200182016040528015612f645781602001600182028036833780820191505090505b5090505b60008514612ff157600182612f7d9190614a50565b9150600a85612f8c9190614c38565b6030612f98919061496f565b60f81b818381518110612fae57612fad614d25565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fea91906149c5565b9450612f68565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6130728383836133d7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130b5576130b0816133dc565b6130f4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130f3576130f28382613425565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131375761313281613592565b613176565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613175576131748282613663565b5b5b505050565b600080613186612432565b116131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bd9061465c565b60405180910390fd5b60006131d2600b612da0565b90506131de600b6136e2565b8091505090565b6131ef83836136f8565b6131fc6000848484613240565b61323b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132329061457c565b60405180910390fd5b505050565b60006132618473ffffffffffffffffffffffffffffffffffffffff166138c6565b156133ca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261328a6126c7565b8786866040518563ffffffff1660e01b81526004016132ac9493929190614491565b602060405180830381600087803b1580156132c657600080fd5b505af19250505080156132f757506040513d601f19601f820116820180604052508101906132f49190613de2565b60015b61337a573d8060008114613327576040519150601f19603f3d011682016040523d82523d6000602084013e61332c565b606091505b50600081511415613372576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133699061457c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133cf565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134328461192c565b61343c9190614a50565b9050600060076000848152602001908152602001600020549050818114613521576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135a69190614a50565b90506000600960008481526020019081526020016000205490506000600883815481106135d6576135d5614d25565b5b9060005260206000200154905080600883815481106135f8576135f7614d25565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061364757613646614cf6565b5b6001900381819060005260206000200160009055905550505050565b600061366e8361192c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375f906146fc565b60405180910390fd5b613771816126cf565b156137b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a8906145dc565b60405180910390fd5b6137bd60008383613067565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461380d919061496f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546138e590614b4c565b90600052602060002090601f016020900481019282613907576000855561394e565b82601f1061392057805160ff191683800117855561394e565b8280016001018555821561394e579182015b8281111561394d578251825591602001919060010190613932565b5b50905061395b919061395f565b5090565b5b80821115613978576000816000905550600101613960565b5090565b600061398f61398a8461487c565b614857565b9050828152602081018484840111156139ab576139aa614d92565b5b6139b6848285614b0a565b509392505050565b60006139d16139cc846148ad565b614857565b9050828152602081018484840111156139ed576139ec614d92565b5b6139f8848285614b0a565b509392505050565b600081359050613a0f816153ab565b92915050565b60008083601f840112613a2b57613a2a614d88565b5b8235905067ffffffffffffffff811115613a4857613a47614d83565b5b602083019150836020820283011115613a6457613a63614d8d565b5b9250929050565b60008083601f840112613a8157613a80614d88565b5b8235905067ffffffffffffffff811115613a9e57613a9d614d83565b5b602083019150836020820283011115613aba57613ab9614d8d565b5b9250929050565b600081359050613ad0816153c2565b92915050565b600081359050613ae5816153d9565b92915050565b600081519050613afa816153d9565b92915050565b600082601f830112613b1557613b14614d88565b5b8135613b2584826020860161397c565b91505092915050565b600082601f830112613b4357613b42614d88565b5b8135613b538482602086016139be565b91505092915050565b600081359050613b6b816153f0565b92915050565b600060208284031215613b8757613b86614d9c565b5b6000613b9584828501613a00565b91505092915050565b60008060408385031215613bb557613bb4614d9c565b5b6000613bc385828601613a00565b9250506020613bd485828601613a00565b9150509250929050565b600080600060608486031215613bf757613bf6614d9c565b5b6000613c0586828701613a00565b9350506020613c1686828701613a00565b9250506040613c2786828701613b5c565b9150509250925092565b60008060008060808587031215613c4b57613c4a614d9c565b5b6000613c5987828801613a00565b9450506020613c6a87828801613a00565b9350506040613c7b87828801613b5c565b925050606085013567ffffffffffffffff811115613c9c57613c9b614d97565b5b613ca887828801613b00565b91505092959194509250565b60008060408385031215613ccb57613cca614d9c565b5b6000613cd985828601613a00565b9250506020613cea85828601613ac1565b9150509250929050565b60008060408385031215613d0b57613d0a614d9c565b5b6000613d1985828601613a00565b9250506020613d2a85828601613b5c565b9150509250929050565b60008060008060408587031215613d4e57613d4d614d9c565b5b600085013567ffffffffffffffff811115613d6c57613d6b614d97565b5b613d7887828801613a15565b9450945050602085013567ffffffffffffffff811115613d9b57613d9a614d97565b5b613da787828801613a6b565b925092505092959194509250565b600060208284031215613dcb57613dca614d9c565b5b6000613dd984828501613ad6565b91505092915050565b600060208284031215613df857613df7614d9c565b5b6000613e0684828501613aeb565b91505092915050565b600060208284031215613e2557613e24614d9c565b5b600082013567ffffffffffffffff811115613e4357613e42614d97565b5b613e4f84828501613b2e565b91505092915050565b600060208284031215613e6e57613e6d614d9c565b5b6000613e7c84828501613b5c565b91505092915050565b6000613e9183836143b1565b60208301905092915050565b613eae613ea982614a96565b614c0a565b82525050565b613ebd81614a84565b82525050565b613ed4613ecf82614a84565b614bf8565b82525050565b6000613ee582614903565b613eef8185614931565b9350613efa836148de565b8060005b83811015613f2b578151613f128882613e85565b9750613f1d83614924565b925050600181019050613efe565b5085935050505092915050565b613f4181614aa8565b82525050565b6000613f528261490e565b613f5c8185614942565b9350613f6c818560208601614b19565b613f7581614da1565b840191505092915050565b6000613f8b82614919565b613f958185614953565b9350613fa5818560208601614b19565b613fae81614da1565b840191505092915050565b6000613fc482614919565b613fce8185614964565b9350613fde818560208601614b19565b80840191505092915050565b60008154613ff781614b4c565b6140018186614964565b9450600182166000811461401c576001811461402d57614060565b60ff19831686528186019350614060565b614036856148ee565b60005b8381101561405857815481890152600182019150602081019050614039565b838801955050505b50505092915050565b6000614076601783614953565b915061408182614dbf565b602082019050919050565b6000614099602b83614953565b91506140a482614de8565b604082019050919050565b60006140bc603283614953565b91506140c782614e37565b604082019050919050565b60006140df601f83614953565b91506140ea82614e86565b602082019050919050565b6000614102602683614953565b915061410d82614eaf565b604082019050919050565b6000614125601c83614953565b915061413082614efe565b602082019050919050565b6000614148601983614953565b915061415382614f27565b602082019050919050565b600061416b602483614953565b915061417682614f50565b604082019050919050565b600061418e601983614953565b915061419982614f9f565b602082019050919050565b60006141b1601883614953565b91506141bc82614fc8565b602082019050919050565b60006141d4602c83614953565b91506141df82614ff1565b604082019050919050565b60006141f7603883614953565b915061420282615040565b604082019050919050565b600061421a602a83614953565b91506142258261508f565b604082019050919050565b600061423d602983614953565b9150614248826150de565b604082019050919050565b6000614260602083614953565b915061426b8261512d565b602082019050919050565b6000614283602c83614953565b915061428e82615156565b604082019050919050565b60006142a6602083614953565b91506142b1826151a5565b602082019050919050565b60006142c9602983614953565b91506142d4826151ce565b604082019050919050565b60006142ec602f83614953565b91506142f78261521d565b604082019050919050565b600061430f602183614953565b915061431a8261526c565b604082019050919050565b6000614332603183614953565b915061433d826152bb565b604082019050919050565b6000614355602c83614953565b91506143608261530a565b604082019050919050565b6000614378601583614953565b915061438382615359565b602082019050919050565b600061439b601683614953565b91506143a682615382565b602082019050919050565b6143ba81614b00565b82525050565b6143c981614b00565b82525050565b6143e06143db82614b00565b614c2e565b82525050565b60006143f28288613ec3565b6014820191506144028287613e9d565b60148201915061441282866143cf565b60208201915061442282856143cf565b60208201915061443282846143cf565b6020820191508190509695505050505050565b60006144518286613fb9565b915061445d8285613fb9565b91506144698284613fea565b9150819050949350505050565b600060208201905061448b6000830184613eb4565b92915050565b60006080820190506144a66000830187613eb4565b6144b36020830186613eb4565b6144c060408301856143c0565b81810360608301526144d28184613f47565b905095945050505050565b600060208201905081810360008301526144f78184613eda565b905092915050565b60006020820190506145146000830184613f38565b92915050565b600060208201905081810360008301526145348184613f80565b905092915050565b6000602082019050818103600083015261455581614069565b9050919050565b600060208201905081810360008301526145758161408c565b9050919050565b60006020820190508181036000830152614595816140af565b9050919050565b600060208201905081810360008301526145b5816140d2565b9050919050565b600060208201905081810360008301526145d5816140f5565b9050919050565b600060208201905081810360008301526145f581614118565b9050919050565b600060208201905081810360008301526146158161413b565b9050919050565b600060208201905081810360008301526146358161415e565b9050919050565b6000602082019050818103600083015261465581614181565b9050919050565b60006020820190508181036000830152614675816141a4565b9050919050565b60006020820190508181036000830152614695816141c7565b9050919050565b600060208201905081810360008301526146b5816141ea565b9050919050565b600060208201905081810360008301526146d58161420d565b9050919050565b600060208201905081810360008301526146f581614230565b9050919050565b6000602082019050818103600083015261471581614253565b9050919050565b6000602082019050818103600083015261473581614276565b9050919050565b6000602082019050818103600083015261475581614299565b9050919050565b60006020820190508181036000830152614775816142bc565b9050919050565b60006020820190508181036000830152614795816142df565b9050919050565b600060208201905081810360008301526147b581614302565b9050919050565b600060208201905081810360008301526147d581614325565b9050919050565b600060208201905081810360008301526147f581614348565b9050919050565b600060208201905081810360008301526148158161436b565b9050919050565b600060208201905081810360008301526148358161438e565b9050919050565b600060208201905061485160008301846143c0565b92915050565b6000614861614872565b905061486d8282614b7e565b919050565b6000604051905090565b600067ffffffffffffffff82111561489757614896614d54565b5b6148a082614da1565b9050602081019050919050565b600067ffffffffffffffff8211156148c8576148c7614d54565b5b6148d182614da1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061497a82614b00565b915061498583614b00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149ba576149b9614c69565b5b828201905092915050565b60006149d082614b00565b91506149db83614b00565b9250826149eb576149ea614c98565b5b828204905092915050565b6000614a0182614b00565b9150614a0c83614b00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a4557614a44614c69565b5b828202905092915050565b6000614a5b82614b00565b9150614a6683614b00565b925082821015614a7957614a78614c69565b5b828203905092915050565b6000614a8f82614ae0565b9050919050565b6000614aa182614ae0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b37578082015181840152602081019050614b1c565b83811115614b46576000848401525b50505050565b60006002820490506001821680614b6457607f821691505b60208210811415614b7857614b77614cc7565b5b50919050565b614b8782614da1565b810181811067ffffffffffffffff82111715614ba657614ba5614d54565b5b80604052505050565b6000614bba82614b00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bed57614bec614c69565b5b600182019050919050565b6000614c0382614c1c565b9050919050565b6000614c1582614c1c565b9050919050565b6000614c2782614db2565b9050919050565b6000819050919050565b6000614c4382614b00565b9150614c4e83614b00565b925082614c5e57614c5d614c98565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f596f752068617665206e6f20746f6b656e73206c656674000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f596f7572206d617820746f6b656e20686f6c64696e6720657863656564656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c69632053616c65206973206e6f742061637469766500000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f5465616d6d696e74206973206e6f742061637469766500000000000000000000600082015250565b6153b481614a84565b81146153bf57600080fd5b50565b6153cb81614aa8565b81146153d657600080fd5b50565b6153e281614ab4565b81146153ed57600080fd5b50565b6153f981614b00565b811461540457600080fd5b5056fea26469706673582212200014cb846ad7a9185d69278b629b5831aa65d8b6c56ecd57c210c3c3d34edcd564736f6c63430008070033

Deployed Bytecode Sourcemap

48888:5808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42622:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52685:275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54345:106;;;;;;;;;;;;;:::i;:::-;;30514:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49665:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32073:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31596:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49030:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43262:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49274:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49154:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32963:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42930:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51824:857;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54577:114;;;:::i;:::-;;33373:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53255:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49319:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43452:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49941:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54054:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52964:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49193:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30208:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49720:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29938:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8151:94;;;;;;;;;;;;;:::i;:::-;;49504:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54147:103;;;;;;;;;;;;;:::i;:::-;;49108:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49427:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7500:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30683:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49616:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2408:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50045:602;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32366:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54256:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33629:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54459:112;;;;;;;;;;;;;:::i;:::-;;49067:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48988:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53609:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50653:1163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49360:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49233:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2230:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2613:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32732:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49583:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8400:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42622:224;42724:4;42763:35;42748:50;;;:11;:50;;;;:90;;;;42802:36;42826:11;42802:23;:36::i;:::-;42748:90;42741:97;;42622:224;;;:::o;52685:275::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52833:6:::1;;:13;;52816:6;;:13;;:30;52808:39;;;::::0;::::1;;52861:9;52856:99;52880:6;;:13;;52876:1;:17;52856:99;;;52936:6;;52943:1;52936:9;;;;;;;:::i;:::-;;;;;;;;52913;:20;52923:6;;52930:1;52923:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52913:20;;;;;;;;;;;;;;;:32;;;;52895:3;;;;;:::i;:::-;;;;52856:99;;;;52685:275:::0;;;;:::o;54345:106::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54427:16:::1;;;;;;;;;;;54426:17;54407:16;;:36;;;;;;;;;;;;;;;;;;54345:106::o:0;30514:100::-;30568:13;30601:5;30594:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30514:100;:::o;49665:48::-;;;;;;;;;;;;;;;;;:::o;32073:221::-;32149:7;32177:16;32185:7;32177;:16::i;:::-;32169:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:15;:24;32278:7;32262:24;;;;;;;;;;;;;;;;;;;;;32255:31;;32073:221;;;:::o;31596:411::-;31677:13;31693:23;31708:7;31693:14;:23::i;:::-;31677:39;;31741:5;31735:11;;:2;:11;;;;31727:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31835:5;31819:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31844:37;31861:5;31868:12;:10;:12::i;:::-;31844:16;:37::i;:::-;31819:62;31797:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31978:21;31987:2;31991:7;31978:8;:21::i;:::-;31666:341;31596:411;;:::o;49030:32::-;;;;:::o;43262:113::-;43323:7;43350:10;:17;;;;43343:24;;43262:113;:::o;49274:38::-;;;;;;;;;;;;;:::o;49154:32::-;;;;:::o;32963:339::-;33158:41;33177:12;:10;:12::i;:::-;33191:7;33158:18;:41::i;:::-;33150:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33266:28;33276:4;33282:2;33286:7;33266:9;:28::i;:::-;32963:339;;;:::o;42930:256::-;43027:7;43063:23;43080:5;43063:16;:23::i;:::-;43055:5;:31;43047:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43152:12;:19;43165:5;43152:19;;;;;;;;;;;;;;;:26;43172:5;43152:26;;;;;;;;;;;;43145:33;;42930:256;;;;:::o;51824:857::-;51897:16;;;;;;;;;;;51889:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51971:1;51957:11;:15;51949:24;;;;;;52005:13;;51990:11;:28;;51982:37;;;;;;52095:13;;52080:11;52057:20;;52036:18;;:41;;;;:::i;:::-;:55;;;;:::i;:::-;:72;;52028:81;;;;;;52164:17;;52149:11;52126:20;;:34;;;;:::i;:::-;:55;;52118:64;;;;;;52193:19;52215:13;:25;52229:10;52215:25;;;;;;;;;;;;;;;;52193:47;;52273:1;52259:11;:15;52251:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;52334:11;52319;:26;;52311:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52399:9;52394:166;52418:11;52414:1;:15;52394:166;;;52447:17;52467:11;:9;:11::i;:::-;52447:31;;52489:34;52499:12;:10;:12::i;:::-;52513:9;52489;:34::i;:::-;52549:1;52534:16;;;;;:::i;:::-;;;52436:124;52431:3;;;;;:::i;:::-;;;;52394:166;;;;52616:11;52593:20;;:34;;;;:::i;:::-;52570:20;:57;;;;52664:11;52636:13;:25;52650:10;52636:25;;;;;;;;;;;;;;;:39;;;;51880:801;51824:857;:::o;54577:114::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54645:10:::1;54637:24;;:47;54662:21;54637:47;;;;;;;;;;;;;;;;;;;;;;;54629:56;;;::::0;::::1;;54577:114::o:0;33373:185::-;33511:39;33528:4;33534:2;33538:7;33511:39;;;;;;;;;;;;:16;:39::i;:::-;33373:185;;;:::o;53255:348::-;53330:16;53358:23;53384:17;53394:6;53384:9;:17::i;:::-;53358:43;;53408:25;53450:15;53436:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53408:58;;53478:9;53473:103;53493:15;53489:1;:19;53473:103;;;53538:30;53558:6;53566:1;53538:19;:30::i;:::-;53524:8;53533:1;53524:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;53510:3;;;;;:::i;:::-;;;;53473:103;;;;53589:8;53582:15;;;;53255:348;;;:::o;49319:36::-;;;;:::o;43452:233::-;43527:7;43563:30;:28;:30::i;:::-;43555:5;:38;43547:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43660:10;43671:5;43660:17;;;;;;;;:::i;:::-;;;;;;;;;;43653:24;;43452:233;;;:::o;49941:98::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50022:11:::1;50012:7;:21;;;;;;;;;;;;:::i;:::-;;49941:98:::0;:::o;54054:85::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54126:7:::1;54119:4;:14;;;;54054:85:::0;:::o;52964:287::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53120:6:::1;;:13;;53103:6;;:13;;:30;53095:39;;;::::0;::::1;;53148:9;53143:103;53167:6;;:13;;53163:1;:17;53143:103;;;53227:6;;53234:1;53227:9;;;;;;;:::i;:::-;;;;;;;;53200:13;:24;53214:6;;53221:1;53214:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53200:24;;;;;;;;;;;;;;;:36;;;;53182:3;;;;;:::i;:::-;;;;53143:103;;;;52964:287:::0;;;;:::o;49193:35::-;;;;;;;;;;;;;:::o;30208:239::-;30280:7;30300:13;30316:7;:16;30324:7;30316:16;;;;;;;;;;;;;;;;;;;;;30300:32;;30368:1;30351:19;;:5;:19;;;;30343:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30434:5;30427:12;;;30208:239;;;:::o;49720:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29938:208::-;30010:7;30055:1;30038:19;;:5;:19;;;;30030:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30122:9;:16;30132:5;30122:16;;;;;;;;;;;;;;;;30115:23;;29938:208;;;:::o;8151:94::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8216:21:::1;8234:1;8216:9;:21::i;:::-;8151:94::o:0;49504:33::-;;;;:::o;54147:103::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54227:15:::1;;;;;;;;;;;54226:16;54208:15;;:34;;;;;;;;;;;;;;;;;;54147:103::o:0;49108:39::-;;;;:::o;49427:34::-;;;;:::o;7500:87::-;7546:7;7573:6;;;;;;;;;;;7566:13;;7500:87;:::o;30683:104::-;30739:13;30772:7;30765:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30683:104;:::o;49616:44::-;;;;;;;;;;;;;;;;;:::o;2408:99::-;2451:7;2478:21;:11;:19;:21::i;:::-;2471:28;;2408:99;:::o;50045:602::-;50110:18;;;;;;;;;;;50102:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50187:1;50173:11;:15;50165:24;;;;;;50219:13;;50204:11;:28;;50196:37;;;;;;50307:13;;50292:11;50269:20;;50248:18;;:41;;;;:::i;:::-;:55;;;;:::i;:::-;:72;;50240:81;;;;;;50372:15;;50357:11;50336:18;;:32;;;;:::i;:::-;:51;;50328:60;;;;;;50423:11;50416:4;;:18;;;;:::i;:::-;50403:9;:31;;50395:40;;;;;;50449:9;50461:1;50449:13;;50444:136;50469:11;50464:1;:16;50444:136;;50496:17;50516:11;:9;:11::i;:::-;50496:31;;50538:34;50548:12;:10;:12::i;:::-;50562:9;50538;:34::i;:::-;50487:93;50482:3;;;;;:::i;:::-;;;;50444:136;;;;50630:11;50609:18;;:32;;;;:::i;:::-;50588:18;:53;;;;50045:602;:::o;32366:295::-;32481:12;:10;:12::i;:::-;32469:24;;:8;:24;;;;32461:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32581:8;32536:18;:32;32555:12;:10;:12::i;:::-;32536:32;;;;;;;;;;;;;;;:42;32569:8;32536:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32634:8;32605:48;;32620:12;:10;:12::i;:::-;32605:48;;;32644:8;32605:48;;;;;;:::i;:::-;;;;;;;;32366:295;;:::o;54256:81::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54326:3:::1;54313:10;:16;;;;54256:81:::0;:::o;33629:328::-;33804:41;33823:12;:10;:12::i;:::-;33837:7;33804:18;:41::i;:::-;33796:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33910:39;33924:4;33930:2;33934:7;33943:5;33910:13;:39::i;:::-;33629:328;;;;:::o;54459:112::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54545:18:::1;;;;;;;;;;;54544:19;54523:18;;:40;;;;;;;;;;;;;;;;;;54459:112::o:0;49067:34::-;;;;:::o;48988:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53609:423::-;53707:13;53748:16;53756:7;53748;:16::i;:::-;53732:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;53838:28;53869:10;:8;:10::i;:::-;53838:41;;53924:1;53899:14;53893:28;:32;:133;;;;;;;;;;;;;;;;;53961:14;53977:18;:7;:16;:18::i;:::-;53997:13;53944:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53893:133;53886:140;;;53609:423;;;:::o;50653:1163::-;50729:15;;;;;;;;;;;50721:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50801:1;50787:11;:15;50779:24;;;;;;50835:20;;50820:11;:35;;50812:44;;;;;;50932:13;;50917:11;50894:20;;50873:18;;:41;;;;:::i;:::-;:55;;;;:::i;:::-;:72;;50865:81;;;;;;50999:15;;50984:11;50963:18;;:32;;;;:::i;:::-;:51;;50955:60;;;;;;51052:11;51045:4;;:18;;;;:::i;:::-;51032:9;:31;;51024:40;;;;;;51095:1;51081:10;;:15;;51073:24;;;;;;51108:19;51130:9;:21;51140:10;51130:21;;;;;;;;;;;;;;;;51108:43;;51178:1;51164:10;;:15;51160:152;;;51208:1;51193:16;;;;;:::i;:::-;;;51160:152;;;51255:1;51240:11;:16;51236:67;;51288:1;51274:15;;51236:67;51160:152;51344:1;51330:11;:15;51322:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51405:11;51390;:26;;51382:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51470:9;51465:172;51489:11;51485:1;:15;51465:172;;;51520:17;51540:11;:9;:11::i;:::-;51520:31;;51564:34;51574:12;:10;:12::i;:::-;51588:9;51564;:34::i;:::-;51626:1;51611:16;;;;;:::i;:::-;;;51507:130;51502:3;;;;;:::i;:::-;;;;51465:172;;;;51663:1;51649:10;;:15;51645:60;;;51694:1;51679:16;;;;;:::i;:::-;;;51645:60;51755:11;51734:18;;:32;;;;:::i;:::-;51713:18;:53;;;;51799:11;51775:9;:21;51785:10;51775:21;;;;;;;;;;;;;;;:35;;;;50712:1104;50653:1163;:::o;49360:34::-;;;;:::o;49233:36::-;;;;;;;;;;;;;:::o;2230:87::-;2272:7;2299:10;;2292:17;;2230:87;:::o;2613:113::-;2665:7;2706:12;:10;:12::i;:::-;2692:11;:9;:11::i;:::-;:26;;;;:::i;:::-;2685:33;;2613:113;:::o;32732:164::-;32829:4;32853:18;:25;32872:5;32853:25;;;;;;;;;;;;;;;:35;32879:8;32853:35;;;;;;;;;;;;;;;;;;;;;;;;;32846:42;;32732:164;;;;:::o;49583:26::-;;;;:::o;8400:192::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8509:1:::1;8489:22;;:8;:22;;;;8481:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8565:19;8575:8;8565:9;:19::i;:::-;8400:192:::0;:::o;29569:305::-;29671:4;29723:25;29708:40;;;:11;:40;;;;:105;;;;29780:33;29765:48;;;:11;:48;;;;29708:105;:158;;;;29830:36;29854:11;29830:23;:36::i;:::-;29708:158;29688:178;;29569:305;;;:::o;6288:98::-;6341:7;6368:10;6361:17;;6288:98;:::o;35467:127::-;35532:4;35584:1;35556:30;;:7;:16;35564:7;35556:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35549:37;;35467:127;;;:::o;39449:174::-;39551:2;39524:15;:24;39540:7;39524:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39607:7;39603:2;39569:46;;39578:23;39593:7;39578:14;:23::i;:::-;39569:46;;;;;;;;;;;;39449:174;;:::o;35761:348::-;35854:4;35879:16;35887:7;35879;:16::i;:::-;35871:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35955:13;35971:23;35986:7;35971:14;:23::i;:::-;35955:39;;36024:5;36013:16;;:7;:16;;;:51;;;;36057:7;36033:31;;:20;36045:7;36033:11;:20::i;:::-;:31;;;36013:51;:87;;;;36068:32;36085:5;36092:7;36068:16;:32::i;:::-;36013:87;36005:96;;;35761:348;;;;:::o;38753:578::-;38912:4;38885:31;;:23;38900:7;38885:14;:23::i;:::-;:31;;;38877:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38995:1;38981:16;;:2;:16;;;;38973:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39051:39;39072:4;39078:2;39082:7;39051:20;:39::i;:::-;39155:29;39172:1;39176:7;39155:8;:29::i;:::-;39216:1;39197:9;:15;39207:4;39197:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39245:1;39228:9;:13;39238:2;39228:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39276:2;39257:7;:16;39265:7;39257:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39315:7;39311:2;39296:27;;39305:4;39296:27;;;;;;;;;;;;38753:578;;;:::o;4394:1262::-;4461:7;3170:1;3146:21;:19;:21::i;:::-;:25;3138:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4481:16:::1;4514:12;:10;:12::i;:::-;4500:11;:9;:11::i;:::-;:26;;;;:::i;:::-;4481:45;;4537:14;4796:8;4621:10;4650:14;4683:16;4718:14;4751:15;4586:195;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4562:230;;;;;;4554:239;;:250;;;;:::i;:::-;4537:267;;4817:13;4872:1:::0;4849:11:::1;:19;4861:6;4849:19;;;;;;;;;;;;:24;4845:304;;;4994:6;4986:14;;4845:304;;;5118:11;:19;5130:6;5118:19;;;;;;;;;;;;5110:27;;4845:304;5255:1;5226:11;:25;5249:1;5238:8;:12;;;;:::i;:::-;5226:25;;;;;;;;;;;;:30;5222:331;;;5371:1;5360:8;:12;;;;:::i;:::-;5338:11;:19;5350:6;5338:19;;;;;;;;;;;:34;;;;5222:331;;;5516:11;:25;5539:1;5528:8;:12;;;;:::i;:::-;5516:25;;;;;;;;;;;;5494:11;:19;5506:6;5494:19;;;;;;;;;;;:47;;;;5222:331;5594:17;:15;:17::i;:::-;;5639:9;;5631:5;:17;;;;:::i;:::-;5624:24;;;;;4394:1262:::0;:::o;36451:110::-;36527:26;36537:2;36541:7;36527:26;;;;;;;;;;;;:9;:26::i;:::-;36451:110;;:::o;8600:173::-;8656:16;8675:6;;;;;;;;;;;8656:25;;8701:8;8692:6;;:17;;;;;;;;;;;;;;;;;;8756:8;8725:40;;8746:8;8725:40;;;;;;;;;;;;8645:128;8600:173;:::o;882:114::-;947:7;974;:14;;;967:21;;882:114;;;:::o;34839:315::-;34996:28;35006:4;35012:2;35016:7;34996:9;:28::i;:::-;35043:48;35066:4;35072:2;35076:7;35085:5;35043:22;:48::i;:::-;35035:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34839:315;;;;:::o;49833:102::-;49893:13;49922:7;49915:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49833:102;:::o;16696:723::-;16752:13;16982:1;16973:5;:10;16969:53;;;17000:10;;;;;;;;;;;;;;;;;;;;;16969:53;17032:12;17047:5;17032:20;;17063:14;17088:78;17103:1;17095:4;:9;17088:78;;17121:8;;;;;:::i;:::-;;;;17152:2;17144:10;;;;;:::i;:::-;;;17088:78;;;17176:19;17208:6;17198:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17176:39;;17226:154;17242:1;17233:5;:10;17226:154;;17270:1;17260:11;;;;;:::i;:::-;;;17337:2;17329:5;:10;;;;:::i;:::-;17316:2;:24;;;;:::i;:::-;17303:39;;17286:6;17293;17286:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17366:2;17357:11;;;;;:::i;:::-;;;17226:154;;;17404:6;17390:21;;;;;16696:723;;;;:::o;16221:157::-;16306:4;16345:25;16330:40;;;:11;:40;;;;16323:47;;16221:157;;;:::o;44298:589::-;44442:45;44469:4;44475:2;44479:7;44442:26;:45::i;:::-;44520:1;44504:18;;:4;:18;;;44500:187;;;44539:40;44571:7;44539:31;:40::i;:::-;44500:187;;;44609:2;44601:10;;:4;:10;;;44597:90;;44628:47;44661:4;44667:7;44628:32;:47::i;:::-;44597:90;44500:187;44715:1;44701:16;;:2;:16;;;44697:183;;;44734:45;44771:7;44734:36;:45::i;:::-;44697:183;;;44807:4;44801:10;;:2;:10;;;44797:83;;44828:40;44856:2;44860:7;44828:27;:40::i;:::-;44797:83;44697:183;44298:589;;;:::o;2836:192::-;2902:7;3170:1;3146:21;:19;:21::i;:::-;:25;3138:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2922:13:::1;2938:21;:11;:19;:21::i;:::-;2922:37;;2972:23;:11;:21;:23::i;:::-;3015:5;3008:12;;;2836:192:::0;:::o;36788:321::-;36918:18;36924:2;36928:7;36918:5;:18::i;:::-;36969:54;37000:1;37004:2;37008:7;37017:5;36969:22;:54::i;:::-;36947:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36788:321;;;:::o;40188:799::-;40343:4;40364:15;:2;:13;;;:15::i;:::-;40360:620;;;40416:2;40400:36;;;40437:12;:10;:12::i;:::-;40451:4;40457:7;40466:5;40400:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40396:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40659:1;40642:6;:13;:18;40638:272;;;40685:60;;;;;;;;;;:::i;:::-;;;;;;;;40638:272;40860:6;40854:13;40845:6;40841:2;40837:15;40830:38;40396:529;40533:41;;;40523:51;;;:6;:51;;;;40516:58;;;;;40360:620;40964:4;40957:11;;40188:799;;;;;;;:::o;41559:126::-;;;;:::o;45610:164::-;45714:10;:17;;;;45687:15;:24;45703:7;45687:24;;;;;;;;;;;:44;;;;45742:10;45758:7;45742:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45610:164;:::o;46401:988::-;46667:22;46717:1;46692:22;46709:4;46692:16;:22::i;:::-;:26;;;;:::i;:::-;46667:51;;46729:18;46750:17;:26;46768:7;46750:26;;;;;;;;;;;;46729:47;;46897:14;46883:10;:28;46879:328;;46928:19;46950:12;:18;46963:4;46950:18;;;;;;;;;;;;;;;:34;46969:14;46950:34;;;;;;;;;;;;46928:56;;47034:11;47001:12;:18;47014:4;47001:18;;;;;;;;;;;;;;;:30;47020:10;47001:30;;;;;;;;;;;:44;;;;47151:10;47118:17;:30;47136:11;47118:30;;;;;;;;;;;:43;;;;46913:294;46879:328;47303:17;:26;47321:7;47303:26;;;;;;;;;;;47296:33;;;47347:12;:18;47360:4;47347:18;;;;;;;;;;;;;;;:34;47366:14;47347:34;;;;;;;;;;;47340:41;;;46482:907;;46401:988;;:::o;47684:1079::-;47937:22;47982:1;47962:10;:17;;;;:21;;;;:::i;:::-;47937:46;;47994:18;48015:15;:24;48031:7;48015:24;;;;;;;;;;;;47994:45;;48366:19;48388:10;48399:14;48388:26;;;;;;;;:::i;:::-;;;;;;;;;;48366:48;;48452:11;48427:10;48438;48427:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48563:10;48532:15;:28;48548:11;48532:28;;;;;;;;;;;:41;;;;48704:15;:24;48720:7;48704:24;;;;;;;;;;;48697:31;;;48739:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47755:1008;;;47684:1079;:::o;45188:221::-;45273:14;45290:20;45307:2;45290:16;:20::i;:::-;45273:37;;45348:7;45321:12;:16;45334:2;45321:16;;;;;;;;;;;;;;;:24;45338:6;45321:24;;;;;;;;;;;:34;;;;45395:6;45366:17;:26;45384:7;45366:26;;;;;;;;;;;:35;;;;45262:147;45188:221;;:::o;1004:127::-;1111:1;1093:7;:14;;;:19;;;;;;;;;;;1004:127;:::o;37445:382::-;37539:1;37525:16;;:2;:16;;;;37517:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37598:16;37606:7;37598;:16::i;:::-;37597:17;37589:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37660:45;37689:1;37693:2;37697:7;37660:20;:45::i;:::-;37735:1;37718:9;:13;37728:2;37718:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37766:2;37747:7;:16;37755:7;37747:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37811:7;37807:2;37786:33;;37803:1;37786:33;;;;;;;;;;;;37445:382;;:::o;19221:387::-;19281:4;19489:12;19556:7;19544:20;19536:28;;19599:1;19592:4;:8;19585:15;;;19221:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:934::-;6924:6;6932;6940;6948;6997:2;6985:9;6976:7;6972:23;6968:32;6965:119;;;7003:79;;:::i;:::-;6965:119;7151:1;7140:9;7136:17;7123:31;7181:18;7173:6;7170:30;7167:117;;;7203:79;;:::i;:::-;7167:117;7316:80;7388:7;7379:6;7368:9;7364:22;7316:80;:::i;:::-;7298:98;;;;7094:312;7473:2;7462:9;7458:18;7445:32;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:80;7711:7;7702:6;7691:9;7687:22;7639:80;:::i;:::-;7621:98;;;;7416:313;6802:934;;;;;;;:::o;7742:327::-;7800:6;7849:2;7837:9;7828:7;7824:23;7820:32;7817:119;;;7855:79;;:::i;:::-;7817:119;7975:1;8000:52;8044:7;8035:6;8024:9;8020:22;8000:52;:::i;:::-;7990:62;;7946:116;7742:327;;;;:::o;8075:349::-;8144:6;8193:2;8181:9;8172:7;8168:23;8164:32;8161:119;;;8199:79;;:::i;:::-;8161:119;8319:1;8344:63;8399:7;8390:6;8379:9;8375:22;8344:63;:::i;:::-;8334:73;;8290:127;8075:349;;;;:::o;8430:509::-;8499:6;8548:2;8536:9;8527:7;8523:23;8519:32;8516:119;;;8554:79;;:::i;:::-;8516:119;8702:1;8691:9;8687:17;8674:31;8732:18;8724:6;8721:30;8718:117;;;8754:79;;:::i;:::-;8718:117;8859:63;8914:7;8905:6;8894:9;8890:22;8859:63;:::i;:::-;8849:73;;8645:287;8430:509;;;;:::o;8945:329::-;9004:6;9053:2;9041:9;9032:7;9028:23;9024:32;9021:119;;;9059:79;;:::i;:::-;9021:119;9179:1;9204:53;9249:7;9240:6;9229:9;9225:22;9204:53;:::i;:::-;9194:63;;9150:117;8945:329;;;;:::o;9280:179::-;9349:10;9370:46;9412:3;9404:6;9370:46;:::i;:::-;9448:4;9443:3;9439:14;9425:28;;9280:179;;;;:::o;9465:189::-;9586:61;9614:32;9640:5;9614:32;:::i;:::-;9586:61;:::i;:::-;9581:3;9574:74;9465:189;;:::o;9660:118::-;9747:24;9765:5;9747:24;:::i;:::-;9742:3;9735:37;9660:118;;:::o;9784:157::-;9889:45;9909:24;9927:5;9909:24;:::i;:::-;9889:45;:::i;:::-;9884:3;9877:58;9784:157;;:::o;9977:732::-;10096:3;10125:54;10173:5;10125:54;:::i;:::-;10195:86;10274:6;10269:3;10195:86;:::i;:::-;10188:93;;10305:56;10355:5;10305:56;:::i;:::-;10384:7;10415:1;10400:284;10425:6;10422:1;10419:13;10400:284;;;10501:6;10495:13;10528:63;10587:3;10572:13;10528:63;:::i;:::-;10521:70;;10614:60;10667:6;10614:60;:::i;:::-;10604:70;;10460:224;10447:1;10444;10440:9;10435:14;;10400:284;;;10404:14;10700:3;10693:10;;10101:608;;;9977:732;;;;:::o;10715:109::-;10796:21;10811:5;10796:21;:::i;:::-;10791:3;10784:34;10715:109;;:::o;10830:360::-;10916:3;10944:38;10976:5;10944:38;:::i;:::-;10998:70;11061:6;11056:3;10998:70;:::i;:::-;10991:77;;11077:52;11122:6;11117:3;11110:4;11103:5;11099:16;11077:52;:::i;:::-;11154:29;11176:6;11154:29;:::i;:::-;11149:3;11145:39;11138:46;;10920:270;10830:360;;;;:::o;11196:364::-;11284:3;11312:39;11345:5;11312:39;:::i;:::-;11367:71;11431:6;11426:3;11367:71;:::i;:::-;11360:78;;11447:52;11492:6;11487:3;11480:4;11473:5;11469:16;11447:52;:::i;:::-;11524:29;11546:6;11524:29;:::i;:::-;11519:3;11515:39;11508:46;;11288:272;11196:364;;;;:::o;11566:377::-;11672:3;11700:39;11733:5;11700:39;:::i;:::-;11755:89;11837:6;11832:3;11755:89;:::i;:::-;11748:96;;11853:52;11898:6;11893:3;11886:4;11879:5;11875:16;11853:52;:::i;:::-;11930:6;11925:3;11921:16;11914:23;;11676:267;11566:377;;;;:::o;11973:845::-;12076:3;12113:5;12107:12;12142:36;12168:9;12142:36;:::i;:::-;12194:89;12276:6;12271:3;12194:89;:::i;:::-;12187:96;;12314:1;12303:9;12299:17;12330:1;12325:137;;;;12476:1;12471:341;;;;12292:520;;12325:137;12409:4;12405:9;12394;12390:25;12385:3;12378:38;12445:6;12440:3;12436:16;12429:23;;12325:137;;12471:341;12538:38;12570:5;12538:38;:::i;:::-;12598:1;12612:154;12626:6;12623:1;12620:13;12612:154;;;12700:7;12694:14;12690:1;12685:3;12681:11;12674:35;12750:1;12741:7;12737:15;12726:26;;12648:4;12645:1;12641:12;12636:17;;12612:154;;;12795:6;12790:3;12786:16;12779:23;;12478:334;;12292:520;;12080:738;;11973:845;;;;:::o;12824:366::-;12966:3;12987:67;13051:2;13046:3;12987:67;:::i;:::-;12980:74;;13063:93;13152:3;13063:93;:::i;:::-;13181:2;13176:3;13172:12;13165:19;;12824:366;;;:::o;13196:::-;13338:3;13359:67;13423:2;13418:3;13359:67;:::i;:::-;13352:74;;13435:93;13524:3;13435:93;:::i;:::-;13553:2;13548:3;13544:12;13537:19;;13196:366;;;:::o;13568:::-;13710:3;13731:67;13795:2;13790:3;13731:67;:::i;:::-;13724:74;;13807:93;13896:3;13807:93;:::i;:::-;13925:2;13920:3;13916:12;13909:19;;13568:366;;;:::o;13940:::-;14082:3;14103:67;14167:2;14162:3;14103:67;:::i;:::-;14096:74;;14179:93;14268:3;14179:93;:::i;:::-;14297:2;14292:3;14288:12;14281:19;;13940:366;;;:::o;14312:::-;14454:3;14475:67;14539:2;14534:3;14475:67;:::i;:::-;14468:74;;14551:93;14640:3;14551:93;:::i;:::-;14669:2;14664:3;14660:12;14653:19;;14312:366;;;:::o;14684:::-;14826:3;14847:67;14911:2;14906:3;14847:67;:::i;:::-;14840:74;;14923:93;15012:3;14923:93;:::i;:::-;15041:2;15036:3;15032:12;15025:19;;14684:366;;;:::o;15056:::-;15198:3;15219:67;15283:2;15278:3;15219:67;:::i;:::-;15212:74;;15295:93;15384:3;15295:93;:::i;:::-;15413:2;15408:3;15404:12;15397:19;;15056:366;;;:::o;15428:::-;15570:3;15591:67;15655:2;15650:3;15591:67;:::i;:::-;15584:74;;15667:93;15756:3;15667:93;:::i;:::-;15785:2;15780:3;15776:12;15769:19;;15428:366;;;:::o;15800:::-;15942:3;15963:67;16027:2;16022:3;15963:67;:::i;:::-;15956:74;;16039:93;16128:3;16039:93;:::i;:::-;16157:2;16152:3;16148:12;16141:19;;15800:366;;;:::o;16172:::-;16314:3;16335:67;16399:2;16394:3;16335:67;:::i;:::-;16328:74;;16411:93;16500:3;16411:93;:::i;:::-;16529:2;16524:3;16520:12;16513:19;;16172:366;;;:::o;16544:::-;16686:3;16707:67;16771:2;16766:3;16707:67;:::i;:::-;16700:74;;16783:93;16872:3;16783:93;:::i;:::-;16901:2;16896:3;16892:12;16885:19;;16544:366;;;:::o;16916:::-;17058:3;17079:67;17143:2;17138:3;17079:67;:::i;:::-;17072:74;;17155:93;17244:3;17155:93;:::i;:::-;17273:2;17268:3;17264:12;17257:19;;16916:366;;;:::o;17288:::-;17430:3;17451:67;17515:2;17510:3;17451:67;:::i;:::-;17444:74;;17527:93;17616:3;17527:93;:::i;:::-;17645:2;17640:3;17636:12;17629:19;;17288:366;;;:::o;17660:::-;17802:3;17823:67;17887:2;17882:3;17823:67;:::i;:::-;17816:74;;17899:93;17988:3;17899:93;:::i;:::-;18017:2;18012:3;18008:12;18001:19;;17660:366;;;:::o;18032:::-;18174:3;18195:67;18259:2;18254:3;18195:67;:::i;:::-;18188:74;;18271:93;18360:3;18271:93;:::i;:::-;18389:2;18384:3;18380:12;18373:19;;18032:366;;;:::o;18404:::-;18546:3;18567:67;18631:2;18626:3;18567:67;:::i;:::-;18560:74;;18643:93;18732:3;18643:93;:::i;:::-;18761:2;18756:3;18752:12;18745:19;;18404:366;;;:::o;18776:::-;18918:3;18939:67;19003:2;18998:3;18939:67;:::i;:::-;18932:74;;19015:93;19104:3;19015:93;:::i;:::-;19133:2;19128:3;19124:12;19117:19;;18776:366;;;:::o;19148:::-;19290:3;19311:67;19375:2;19370:3;19311:67;:::i;:::-;19304:74;;19387:93;19476:3;19387:93;:::i;:::-;19505:2;19500:3;19496:12;19489:19;;19148:366;;;:::o;19520:::-;19662:3;19683:67;19747:2;19742:3;19683:67;:::i;:::-;19676:74;;19759:93;19848:3;19759:93;:::i;:::-;19877:2;19872:3;19868:12;19861:19;;19520:366;;;:::o;19892:::-;20034:3;20055:67;20119:2;20114:3;20055:67;:::i;:::-;20048:74;;20131:93;20220:3;20131:93;:::i;:::-;20249:2;20244:3;20240:12;20233:19;;19892:366;;;:::o;20264:::-;20406:3;20427:67;20491:2;20486:3;20427:67;:::i;:::-;20420:74;;20503:93;20592:3;20503:93;:::i;:::-;20621:2;20616:3;20612:12;20605:19;;20264:366;;;:::o;20636:::-;20778:3;20799:67;20863:2;20858:3;20799:67;:::i;:::-;20792:74;;20875:93;20964:3;20875:93;:::i;:::-;20993:2;20988:3;20984:12;20977:19;;20636:366;;;:::o;21008:::-;21150:3;21171:67;21235:2;21230:3;21171:67;:::i;:::-;21164:74;;21247:93;21336:3;21247:93;:::i;:::-;21365:2;21360:3;21356:12;21349:19;;21008:366;;;:::o;21380:::-;21522:3;21543:67;21607:2;21602:3;21543:67;:::i;:::-;21536:74;;21619:93;21708:3;21619:93;:::i;:::-;21737:2;21732:3;21728:12;21721:19;;21380:366;;;:::o;21752:108::-;21829:24;21847:5;21829:24;:::i;:::-;21824:3;21817:37;21752:108;;:::o;21866:118::-;21953:24;21971:5;21953:24;:::i;:::-;21948:3;21941:37;21866:118;;:::o;21990:157::-;22095:45;22115:24;22133:5;22115:24;:::i;:::-;22095:45;:::i;:::-;22090:3;22083:58;21990:157;;:::o;22153:852::-;22393:3;22408:75;22479:3;22470:6;22408:75;:::i;:::-;22508:2;22503:3;22499:12;22492:19;;22521:91;22608:3;22599:6;22521:91;:::i;:::-;22637:2;22632:3;22628:12;22621:19;;22650:75;22721:3;22712:6;22650:75;:::i;:::-;22750:2;22745:3;22741:12;22734:19;;22763:75;22834:3;22825:6;22763:75;:::i;:::-;22863:2;22858:3;22854:12;22847:19;;22876:75;22947:3;22938:6;22876:75;:::i;:::-;22976:2;22971:3;22967:12;22960:19;;22996:3;22989:10;;22153:852;;;;;;;;:::o;23011:589::-;23236:3;23258:95;23349:3;23340:6;23258:95;:::i;:::-;23251:102;;23370:95;23461:3;23452:6;23370:95;:::i;:::-;23363:102;;23482:92;23570:3;23561:6;23482:92;:::i;:::-;23475:99;;23591:3;23584:10;;23011:589;;;;;;:::o;23606:222::-;23699:4;23737:2;23726:9;23722:18;23714:26;;23750:71;23818:1;23807:9;23803:17;23794:6;23750:71;:::i;:::-;23606:222;;;;:::o;23834:640::-;24029:4;24067:3;24056:9;24052:19;24044:27;;24081:71;24149:1;24138:9;24134:17;24125:6;24081:71;:::i;:::-;24162:72;24230:2;24219:9;24215:18;24206:6;24162:72;:::i;:::-;24244;24312:2;24301:9;24297:18;24288:6;24244:72;:::i;:::-;24363:9;24357:4;24353:20;24348:2;24337:9;24333:18;24326:48;24391:76;24462:4;24453:6;24391:76;:::i;:::-;24383:84;;23834:640;;;;;;;:::o;24480:373::-;24623:4;24661:2;24650:9;24646:18;24638:26;;24710:9;24704:4;24700:20;24696:1;24685:9;24681:17;24674:47;24738:108;24841:4;24832:6;24738:108;:::i;:::-;24730:116;;24480:373;;;;:::o;24859:210::-;24946:4;24984:2;24973:9;24969:18;24961:26;;24997:65;25059:1;25048:9;25044:17;25035:6;24997:65;:::i;:::-;24859:210;;;;:::o;25075:313::-;25188:4;25226:2;25215:9;25211:18;25203:26;;25275:9;25269:4;25265:20;25261:1;25250:9;25246:17;25239:47;25303:78;25376:4;25367:6;25303:78;:::i;:::-;25295:86;;25075:313;;;;:::o;25394:419::-;25560:4;25598:2;25587:9;25583:18;25575:26;;25647:9;25641:4;25637:20;25633:1;25622:9;25618:17;25611:47;25675:131;25801:4;25675:131;:::i;:::-;25667:139;;25394:419;;;:::o;25819:::-;25985:4;26023:2;26012:9;26008:18;26000:26;;26072:9;26066:4;26062:20;26058:1;26047:9;26043:17;26036:47;26100:131;26226:4;26100:131;:::i;:::-;26092:139;;25819:419;;;:::o;26244:::-;26410:4;26448:2;26437:9;26433:18;26425:26;;26497:9;26491:4;26487:20;26483:1;26472:9;26468:17;26461:47;26525:131;26651:4;26525:131;:::i;:::-;26517:139;;26244:419;;;:::o;26669:::-;26835:4;26873:2;26862:9;26858:18;26850:26;;26922:9;26916:4;26912:20;26908:1;26897:9;26893:17;26886:47;26950:131;27076:4;26950:131;:::i;:::-;26942:139;;26669:419;;;:::o;27094:::-;27260:4;27298:2;27287:9;27283:18;27275:26;;27347:9;27341:4;27337:20;27333:1;27322:9;27318:17;27311:47;27375:131;27501:4;27375:131;:::i;:::-;27367:139;;27094:419;;;:::o;27519:::-;27685:4;27723:2;27712:9;27708:18;27700:26;;27772:9;27766:4;27762:20;27758:1;27747:9;27743:17;27736:47;27800:131;27926:4;27800:131;:::i;:::-;27792:139;;27519:419;;;:::o;27944:::-;28110:4;28148:2;28137:9;28133:18;28125:26;;28197:9;28191:4;28187:20;28183:1;28172:9;28168:17;28161:47;28225:131;28351:4;28225:131;:::i;:::-;28217:139;;27944:419;;;:::o;28369:::-;28535:4;28573:2;28562:9;28558:18;28550:26;;28622:9;28616:4;28612:20;28608:1;28597:9;28593:17;28586:47;28650:131;28776:4;28650:131;:::i;:::-;28642:139;;28369:419;;;:::o;28794:::-;28960:4;28998:2;28987:9;28983:18;28975:26;;29047:9;29041:4;29037:20;29033:1;29022:9;29018:17;29011:47;29075:131;29201:4;29075:131;:::i;:::-;29067:139;;28794:419;;;:::o;29219:::-;29385:4;29423:2;29412:9;29408:18;29400:26;;29472:9;29466:4;29462:20;29458:1;29447:9;29443:17;29436:47;29500:131;29626:4;29500:131;:::i;:::-;29492:139;;29219:419;;;:::o;29644:::-;29810:4;29848:2;29837:9;29833:18;29825:26;;29897:9;29891:4;29887:20;29883:1;29872:9;29868:17;29861:47;29925:131;30051:4;29925:131;:::i;:::-;29917:139;;29644:419;;;:::o;30069:::-;30235:4;30273:2;30262:9;30258:18;30250:26;;30322:9;30316:4;30312:20;30308:1;30297:9;30293:17;30286:47;30350:131;30476:4;30350:131;:::i;:::-;30342:139;;30069:419;;;:::o;30494:::-;30660:4;30698:2;30687:9;30683:18;30675:26;;30747:9;30741:4;30737:20;30733:1;30722:9;30718:17;30711:47;30775:131;30901:4;30775:131;:::i;:::-;30767:139;;30494:419;;;:::o;30919:::-;31085:4;31123:2;31112:9;31108:18;31100:26;;31172:9;31166:4;31162:20;31158:1;31147:9;31143:17;31136:47;31200:131;31326:4;31200:131;:::i;:::-;31192:139;;30919:419;;;:::o;31344:::-;31510:4;31548:2;31537:9;31533:18;31525:26;;31597:9;31591:4;31587:20;31583:1;31572:9;31568:17;31561:47;31625:131;31751:4;31625:131;:::i;:::-;31617:139;;31344:419;;;:::o;31769:::-;31935:4;31973:2;31962:9;31958:18;31950:26;;32022:9;32016:4;32012:20;32008:1;31997:9;31993:17;31986:47;32050:131;32176:4;32050:131;:::i;:::-;32042:139;;31769:419;;;:::o;32194:::-;32360:4;32398:2;32387:9;32383:18;32375:26;;32447:9;32441:4;32437:20;32433:1;32422:9;32418:17;32411:47;32475:131;32601:4;32475:131;:::i;:::-;32467:139;;32194:419;;;:::o;32619:::-;32785:4;32823:2;32812:9;32808:18;32800:26;;32872:9;32866:4;32862:20;32858:1;32847:9;32843:17;32836:47;32900:131;33026:4;32900:131;:::i;:::-;32892:139;;32619:419;;;:::o;33044:::-;33210:4;33248:2;33237:9;33233:18;33225:26;;33297:9;33291:4;33287:20;33283:1;33272:9;33268:17;33261:47;33325:131;33451:4;33325:131;:::i;:::-;33317:139;;33044:419;;;:::o;33469:::-;33635:4;33673:2;33662:9;33658:18;33650:26;;33722:9;33716:4;33712:20;33708:1;33697:9;33693:17;33686:47;33750:131;33876:4;33750:131;:::i;:::-;33742:139;;33469:419;;;:::o;33894:::-;34060:4;34098:2;34087:9;34083:18;34075:26;;34147:9;34141:4;34137:20;34133:1;34122:9;34118:17;34111:47;34175:131;34301:4;34175:131;:::i;:::-;34167:139;;33894:419;;;:::o;34319:::-;34485:4;34523:2;34512:9;34508:18;34500:26;;34572:9;34566:4;34562:20;34558:1;34547:9;34543:17;34536:47;34600:131;34726:4;34600:131;:::i;:::-;34592:139;;34319:419;;;:::o;34744:::-;34910:4;34948:2;34937:9;34933:18;34925:26;;34997:9;34991:4;34987:20;34983:1;34972:9;34968:17;34961:47;35025:131;35151:4;35025:131;:::i;:::-;35017:139;;34744:419;;;:::o;35169:::-;35335:4;35373:2;35362:9;35358:18;35350:26;;35422:9;35416:4;35412:20;35408:1;35397:9;35393:17;35386:47;35450:131;35576:4;35450:131;:::i;:::-;35442:139;;35169:419;;;:::o;35594:222::-;35687:4;35725:2;35714:9;35710:18;35702:26;;35738:71;35806:1;35795:9;35791:17;35782:6;35738:71;:::i;:::-;35594:222;;;;:::o;35822:129::-;35856:6;35883:20;;:::i;:::-;35873:30;;35912:33;35940:4;35932:6;35912:33;:::i;:::-;35822:129;;;:::o;35957:75::-;35990:6;36023:2;36017:9;36007:19;;35957:75;:::o;36038:307::-;36099:4;36189:18;36181:6;36178:30;36175:56;;;36211:18;;:::i;:::-;36175:56;36249:29;36271:6;36249:29;:::i;:::-;36241:37;;36333:4;36327;36323:15;36315:23;;36038:307;;;:::o;36351:308::-;36413:4;36503:18;36495:6;36492:30;36489:56;;;36525:18;;:::i;:::-;36489:56;36563:29;36585:6;36563:29;:::i;:::-;36555:37;;36647:4;36641;36637:15;36629:23;;36351:308;;;:::o;36665:132::-;36732:4;36755:3;36747:11;;36785:4;36780:3;36776:14;36768:22;;36665:132;;;:::o;36803:141::-;36852:4;36875:3;36867:11;;36898:3;36895:1;36888:14;36932:4;36929:1;36919:18;36911:26;;36803:141;;;:::o;36950:114::-;37017:6;37051:5;37045:12;37035:22;;36950:114;;;:::o;37070:98::-;37121:6;37155:5;37149:12;37139:22;;37070:98;;;:::o;37174:99::-;37226:6;37260:5;37254:12;37244:22;;37174:99;;;:::o;37279:113::-;37349:4;37381;37376:3;37372:14;37364:22;;37279:113;;;:::o;37398:184::-;37497:11;37531:6;37526:3;37519:19;37571:4;37566:3;37562:14;37547:29;;37398:184;;;;:::o;37588:168::-;37671:11;37705:6;37700:3;37693:19;37745:4;37740:3;37736:14;37721:29;;37588:168;;;;:::o;37762:169::-;37846:11;37880:6;37875:3;37868:19;37920:4;37915:3;37911:14;37896:29;;37762:169;;;;:::o;37937:148::-;38039:11;38076:3;38061:18;;37937:148;;;;:::o;38091:305::-;38131:3;38150:20;38168:1;38150:20;:::i;:::-;38145:25;;38184:20;38202:1;38184:20;:::i;:::-;38179:25;;38338:1;38270:66;38266:74;38263:1;38260:81;38257:107;;;38344:18;;:::i;:::-;38257:107;38388:1;38385;38381:9;38374:16;;38091:305;;;;:::o;38402:185::-;38442:1;38459:20;38477:1;38459:20;:::i;:::-;38454:25;;38493:20;38511:1;38493:20;:::i;:::-;38488:25;;38532:1;38522:35;;38537:18;;:::i;:::-;38522:35;38579:1;38576;38572:9;38567:14;;38402:185;;;;:::o;38593:348::-;38633:7;38656:20;38674:1;38656:20;:::i;:::-;38651:25;;38690:20;38708:1;38690:20;:::i;:::-;38685:25;;38878:1;38810:66;38806:74;38803:1;38800:81;38795:1;38788:9;38781:17;38777:105;38774:131;;;38885:18;;:::i;:::-;38774:131;38933:1;38930;38926:9;38915:20;;38593:348;;;;:::o;38947:191::-;38987:4;39007:20;39025:1;39007:20;:::i;:::-;39002:25;;39041:20;39059:1;39041:20;:::i;:::-;39036:25;;39080:1;39077;39074:8;39071:34;;;39085:18;;:::i;:::-;39071:34;39130:1;39127;39123:9;39115:17;;38947:191;;;;:::o;39144:96::-;39181:7;39210:24;39228:5;39210:24;:::i;:::-;39199:35;;39144:96;;;:::o;39246:104::-;39291:7;39320:24;39338:5;39320:24;:::i;:::-;39309:35;;39246:104;;;:::o;39356:90::-;39390:7;39433:5;39426:13;39419:21;39408:32;;39356:90;;;:::o;39452:149::-;39488:7;39528:66;39521:5;39517:78;39506:89;;39452:149;;;:::o;39607:126::-;39644:7;39684:42;39677:5;39673:54;39662:65;;39607:126;;;:::o;39739:77::-;39776:7;39805:5;39794:16;;39739:77;;;:::o;39822:154::-;39906:6;39901:3;39896;39883:30;39968:1;39959:6;39954:3;39950:16;39943:27;39822:154;;;:::o;39982:307::-;40050:1;40060:113;40074:6;40071:1;40068:13;40060:113;;;40159:1;40154:3;40150:11;40144:18;40140:1;40135:3;40131:11;40124:39;40096:2;40093:1;40089:10;40084:15;;40060:113;;;40191:6;40188:1;40185:13;40182:101;;;40271:1;40262:6;40257:3;40253:16;40246:27;40182:101;40031:258;39982:307;;;:::o;40295:320::-;40339:6;40376:1;40370:4;40366:12;40356:22;;40423:1;40417:4;40413:12;40444:18;40434:81;;40500:4;40492:6;40488:17;40478:27;;40434:81;40562:2;40554:6;40551:14;40531:18;40528:38;40525:84;;;40581:18;;:::i;:::-;40525:84;40346:269;40295:320;;;:::o;40621:281::-;40704:27;40726:4;40704:27;:::i;:::-;40696:6;40692:40;40834:6;40822:10;40819:22;40798:18;40786:10;40783:34;40780:62;40777:88;;;40845:18;;:::i;:::-;40777:88;40885:10;40881:2;40874:22;40664:238;40621:281;;:::o;40908:233::-;40947:3;40970:24;40988:5;40970:24;:::i;:::-;40961:33;;41016:66;41009:5;41006:77;41003:103;;;41086:18;;:::i;:::-;41003:103;41133:1;41126:5;41122:13;41115:20;;40908:233;;;:::o;41147:100::-;41186:7;41215:26;41235:5;41215:26;:::i;:::-;41204:37;;41147:100;;;:::o;41253:108::-;41300:7;41329:26;41349:5;41329:26;:::i;:::-;41318:37;;41253:108;;;:::o;41367:94::-;41406:7;41435:20;41449:5;41435:20;:::i;:::-;41424:31;;41367:94;;;:::o;41467:79::-;41506:7;41535:5;41524:16;;41467:79;;;:::o;41552:176::-;41584:1;41601:20;41619:1;41601:20;:::i;:::-;41596:25;;41635:20;41653:1;41635:20;:::i;:::-;41630:25;;41674:1;41664:35;;41679:18;;:::i;:::-;41664:35;41720:1;41717;41713:9;41708:14;;41552:176;;;;:::o;41734:180::-;41782:77;41779:1;41772:88;41879:4;41876:1;41869:15;41903:4;41900:1;41893:15;41920:180;41968:77;41965:1;41958:88;42065:4;42062:1;42055:15;42089:4;42086:1;42079:15;42106:180;42154:77;42151:1;42144:88;42251:4;42248:1;42241:15;42275:4;42272:1;42265:15;42292:180;42340:77;42337:1;42330:88;42437:4;42434:1;42427:15;42461:4;42458:1;42451:15;42478:180;42526:77;42523:1;42516:88;42623:4;42620:1;42613:15;42647:4;42644:1;42637:15;42664:180;42712:77;42709:1;42702:88;42809:4;42806:1;42799:15;42833:4;42830:1;42823:15;42850:117;42959:1;42956;42949:12;42973:117;43082:1;43079;43072:12;43096:117;43205:1;43202;43195:12;43219:117;43328:1;43325;43318:12;43342:117;43451:1;43448;43441:12;43465:117;43574:1;43571;43564:12;43588:102;43629:6;43680:2;43676:7;43671:2;43664:5;43660:14;43656:28;43646:38;;43588:102;;;:::o;43696:94::-;43729:8;43777:5;43773:2;43769:14;43748:35;;43696:94;;;:::o;43796:173::-;43936:25;43932:1;43924:6;43920:14;43913:49;43796:173;:::o;43975:230::-;44115:34;44111:1;44103:6;44099:14;44092:58;44184:13;44179:2;44171:6;44167:15;44160:38;43975:230;:::o;44211:237::-;44351:34;44347:1;44339:6;44335:14;44328:58;44420:20;44415:2;44407:6;44403:15;44396:45;44211:237;:::o;44454:181::-;44594:33;44590:1;44582:6;44578:14;44571:57;44454:181;:::o;44641:225::-;44781:34;44777:1;44769:6;44765:14;44758:58;44850:8;44845:2;44837:6;44833:15;44826:33;44641:225;:::o;44872:178::-;45012:30;45008:1;45000:6;44996:14;44989:54;44872:178;:::o;45056:175::-;45196:27;45192:1;45184:6;45180:14;45173:51;45056:175;:::o;45237:223::-;45377:34;45373:1;45365:6;45361:14;45354:58;45446:6;45441:2;45433:6;45429:15;45422:31;45237:223;:::o;45466:175::-;45606:27;45602:1;45594:6;45590:14;45583:51;45466:175;:::o;45647:174::-;45787:26;45783:1;45775:6;45771:14;45764:50;45647:174;:::o;45827:231::-;45967:34;45963:1;45955:6;45951:14;45944:58;46036:14;46031:2;46023:6;46019:15;46012:39;45827:231;:::o;46064:243::-;46204:34;46200:1;46192:6;46188:14;46181:58;46273:26;46268:2;46260:6;46256:15;46249:51;46064:243;:::o;46313:229::-;46453:34;46449:1;46441:6;46437:14;46430:58;46522:12;46517:2;46509:6;46505:15;46498:37;46313:229;:::o;46548:228::-;46688:34;46684:1;46676:6;46672:14;46665:58;46757:11;46752:2;46744:6;46740:15;46733:36;46548:228;:::o;46782:182::-;46922:34;46918:1;46910:6;46906:14;46899:58;46782:182;:::o;46970:231::-;47110:34;47106:1;47098:6;47094:14;47087:58;47179:14;47174:2;47166:6;47162:15;47155:39;46970:231;:::o;47207:182::-;47347:34;47343:1;47335:6;47331:14;47324:58;47207:182;:::o;47395:228::-;47535:34;47531:1;47523:6;47519:14;47512:58;47604:11;47599:2;47591:6;47587:15;47580:36;47395:228;:::o;47629:234::-;47769:34;47765:1;47757:6;47753:14;47746:58;47838:17;47833:2;47825:6;47821:15;47814:42;47629:234;:::o;47869:220::-;48009:34;48005:1;47997:6;47993:14;47986:58;48078:3;48073:2;48065:6;48061:15;48054:28;47869:220;:::o;48095:236::-;48235:34;48231:1;48223:6;48219:14;48212:58;48304:19;48299:2;48291:6;48287:15;48280:44;48095:236;:::o;48337:231::-;48477:34;48473:1;48465:6;48461:14;48454:58;48546:14;48541:2;48533:6;48529:15;48522:39;48337:231;:::o;48574:171::-;48714:23;48710:1;48702:6;48698:14;48691:47;48574:171;:::o;48751:172::-;48891:24;48887:1;48879:6;48875:14;48868:48;48751:172;:::o;48929:122::-;49002:24;49020:5;49002:24;:::i;:::-;48995:5;48992:35;48982:63;;49041:1;49038;49031:12;48982:63;48929:122;:::o;49057:116::-;49127:21;49142:5;49127:21;:::i;:::-;49120:5;49117:32;49107:60;;49163:1;49160;49153:12;49107:60;49057:116;:::o;49179:120::-;49251:23;49268:5;49251:23;:::i;:::-;49244:5;49241:34;49231:62;;49289:1;49286;49279:12;49231:62;49179:120;:::o;49305:122::-;49378:24;49396:5;49378:24;:::i;:::-;49371:5;49368:35;49358:63;;49417:1;49414;49407:12;49358:63;49305:122;:::o

Swarm Source

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