ETH Price: $2,649.61 (+0.50%)

Token

GenesisTapesJunglePosse (JunglePosseMember)
 

Overview

Max Total Supply

87 JunglePosseMember

Holders

29

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
nonfungiblelaughs.eth
Balance
1 JunglePosseMember
0x5ceb1ad2abe5cc33ae70a9f57ffac0b20548adae
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
JunglePosseMember

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (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


// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (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/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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


// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: contracts/JunglePosseMember.sol

// SPDX-License-Ide// SPDX-License-Identifier: MIT
pragma solidity 0.8.4; 







contract JunglePosseMember is ERC721, Pausable, Ownable, ERC721URIStorage, ERC721Enumerable {

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;



    string public MEMBER_PROVENANCE = "";

    string public LICENSE_TEXT = "";

    bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE

    uint256 public constant memberPrice = 89000000000000000; // 0.089 ETH

    uint public constant maxMemberPurchase = 9;

    uint256 public constant MAX_MEMBERS = 1989;

    bool public saleIsActive = false;
    
    string private _baseTokenURI;
    mapping(uint => string) public memberNames;
    
    // Reserve 125 trees for team - Giveaways/Prizes etc
    uint public memberReserve = 189;
    
    event memberNameChange(address _by, uint _tokenId, string _name);
    
    event licenseisLocked(string _licenseText);

    uint256 public tokenCounter;
    mapping (uint256 => string) private _tokenURIs;

    constructor() ERC721("GenesisTapesJunglePosse", "JunglePosseMember") {
        tokenCounter = 0;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function reserveMembers(address _to, uint256 _reserveAmount) public onlyOwner {        
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= memberReserve, "Not enough reserve left for team");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        memberReserve = memberReserve - _reserveAmount;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        MEMBER_PROVENANCE = provenanceHash;
    }

    function _setBaseURI(string memory baseURI) internal virtual {
    _baseTokenURI = baseURI;
  }

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

  // Administrative zone
  function setBaseURI(string memory baseURI) public onlyOwner {
    _setBaseURI(baseURI);
  }


    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    // Returns the license for tokens
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "CHOOSE A POSSE MEMBER WITHIN RANGE");
        return LICENSE_TEXT;
    }
    
    // Locks the license to prevent further changes 
    function lockLicense() public onlyOwner {
        licenseLocked =  true;
        emit licenseisLocked(LICENSE_TEXT);
    }
    
    // Change the license
    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }
    

    // function mintPosseMember(string memory _tokenURI) public {
    //     _safeMint(msg.sender, tokenCounter);
    //     _setTokenURI(tokenCounter, _tokenURI);

    //     tokenCounter++;
    // }

    function mintPosseMember(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint posse members");
        require(numberOfTokens > 0 && numberOfTokens <= maxMemberPurchase, "Can only mint 20 tokens at a time");
        require(totalSupply() + numberOfTokens <= MAX_MEMBERS, "Purchase would exceed max supply of Members");
        require(msg.value >= memberPrice * numberOfTokens, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_MEMBERS) {
                _safeMint(msg.sender, mintIndex);
            }
        }

    }

    function changeMemberName(uint _tokenId, string memory _name) public {
        require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this tree!");
        require(sha256(bytes(_name)) != sha256(bytes(memberNames[_tokenId])), "New name is same as the current one");
        memberNames[_tokenId] = _name;
        
        emit memberNameChange(msg.sender, _tokenId, _name);
        
    }
    
    function viewMemberName(uint _tokenId) public view returns( string memory ){
        require( _tokenId < totalSupply(), "Choose a posse member within range" );
        return memberNames[_tokenId];
    }
    
    
    // GET ALL TREES OF A WALLET AS AN ARRAY OF STRINGS. WOULD BE BETTER MAYBE IF IT RETURNED A STRUCT WITH ID-NAME MATCH
    function memberNamesOfOwner(address _owner) external view returns(string[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new string[](0);
        } else {
            string[] memory result = new string[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = memberNames[ tokenOfOwnerByIndex(_owner, index) ] ;
            }
            return result;
        }
    }

    function _setTokenURI(uint256 _tokenId, string memory _tokenURI) internal virtual override {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI set of nonexistent token"
        );  // Checks if the tokenId exists
        _tokenURIs[_tokenId] = _tokenURI;
    }

    // function tokenURI(uint256 _tokenId) public view virtual override returns(string memory) {
    //     require(
    //         _exists(_tokenId),
    //         "ERC721Metadata: URI set of nonexistent token"
    //     );
    //     return _tokenURIs[_tokenId];
    // }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

}

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"memberNameChange","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MEMBERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MEMBER_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeMemberName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMemberPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"memberNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"memberNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPosseMember","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveMembers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewMemberName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600d90805190602001906200002b92919062000254565b5060405180602001604052806000815250600e90805190602001906200005392919062000254565b506000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff02191690831515021790555060bd6012553480156200009c57600080fd5b506040518060400160405280601781526020017f47656e6573697354617065734a756e676c65506f7373650000000000000000008152506040518060400160405280601181526020017f4a756e676c65506f7373654d656d62657200000000000000000000000000000081525081600090805190602001906200012192919062000254565b5080600190805190602001906200013a92919062000254565b5050506000600660006101000a81548160ff021916908315150217905550620001786200016c6200018660201b60201c565b6200018e60201b60201c565b600060138190555062000369565b600033905090565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002629062000304565b90600052602060002090601f016020900481019282620002865760008555620002d2565b82601f10620002a157805160ff1916838001178555620002d2565b82800160010185558215620002d2579182015b82811115620002d1578251825591602001919060010190620002b4565b5b509050620002e19190620002e5565b5090565b5b8082111562000300576000816000905550600101620002e6565b5090565b600060028204905060018216806200031d57607f821691505b602082108114156200033457620003336200033a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615b3e80620003796000396000f3fe6080604052600436106102675760003560e01c8063885a212711610144578063c50b1126116100b6578063e73ae5901161007a578063e73ae590146108fb578063e985e9c514610938578063ea0e35b114610975578063eb8d2444146109a0578063f1a3f69d146109cb578063f2fde38b146109f457610267565b8063c50b112614610802578063c87b56dd1461082b578063d082e38114610868578063d9b137b214610893578063e5248261146108d057610267565b80639e2ef763116101085780639e2ef76314610708578063a22cb46514610745578063b09904b51461076e578063b88d4fde14610797578063bae5c779146107c0578063bf4702fc146107eb57610267565b8063885a21271461061f5780638da5cb5b1461065c57806395d89b4114610687578063978cceb2146106b25780639c3e72bd146106dd57610267565b80633f4ba83a116101dd5780636352211e116101a15780636352211e1461050f578063636e746b1461054c57806370a0823114610577578063715018a6146105b45780638456cb59146105cb5780638462151c146105e257610267565b80633f4ba83a1461043e57806342842e0e146104555780634f6ccce71461047e57806355f804b3146104bb5780635c975abb146104e457610267565b8063109695231161022f578063109695231461035657806318160ddd1461037f57806323b872dd146103aa5780632f745c59146103d357806334918dfd146104105780633ccfd60b1461042757610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630be146c91461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613f30565b610a1d565b6040516102a091906148ff565b60405180910390f35b3480156102b557600080fd5b506102be610a2f565b6040516102cb919061491a565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613fc3565b610ac1565b6040516103089190614816565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613ecb565b610b46565b005b610354600480360381019061034f9190613fc3565b610c5e565b005b34801561036257600080fd5b5061037d60048036038101906103789190613f82565b610df5565b005b34801561038b57600080fd5b50610394610e8b565b6040516103a19190614d3e565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613dc5565b610e98565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190613ecb565b610ef8565b6040516104079190614d3e565b60405180910390f35b34801561041c57600080fd5b50610425610f9d565b005b34801561043357600080fd5b5061043c611045565b005b34801561044a57600080fd5b50610453611110565b005b34801561046157600080fd5b5061047c60048036038101906104779190613dc5565b611196565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613fc3565b6111b6565b6040516104b29190614d3e565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd9190613f82565b61124d565b005b3480156104f057600080fd5b506104f96112d5565b60405161050691906148ff565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613fc3565b6112ec565b6040516105439190614816565b60405180910390f35b34801561055857600080fd5b5061056161139e565b60405161056e9190614d3e565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613d60565b6113aa565b6040516105ab9190614d3e565b60405180910390f35b3480156105c057600080fd5b506105c9611462565b005b3480156105d757600080fd5b506105e06114ea565b005b3480156105ee57600080fd5b5061060960048036038101906106049190613d60565b611570565b60405161061691906148dd565b60405180910390f35b34801561062b57600080fd5b5061064660048036038101906106419190613fc3565b6116ec565b604051610653919061491a565b60405180910390f35b34801561066857600080fd5b506106716117da565b60405161067e9190614816565b60405180910390f35b34801561069357600080fd5b5061069c611804565b6040516106a9919061491a565b60405180910390f35b3480156106be57600080fd5b506106c7611896565b6040516106d49190614d3e565b60405180910390f35b3480156106e957600080fd5b506106f261189c565b6040516106ff919061491a565b60405180910390f35b34801561071457600080fd5b5061072f600480360381019061072a9190613d60565b61192a565b60405161073c91906148bb565b60405180910390f35b34801561075157600080fd5b5061076c60048036038101906107679190613e8f565b611b4a565b005b34801561077a57600080fd5b5061079560048036038101906107909190613f82565b611b60565b005b3480156107a357600080fd5b506107be60048036038101906107b99190613e14565b611c4c565b005b3480156107cc57600080fd5b506107d5611cae565b6040516107e2919061491a565b60405180910390f35b3480156107f757600080fd5b50610800611d3c565b005b34801561080e57600080fd5b5061082960048036038101906108249190613fec565b611e0d565b005b34801561083757600080fd5b50610852600480360381019061084d9190613fc3565b611fdd565b60405161085f919061491a565b60405180910390f35b34801561087457600080fd5b5061087d611fef565b60405161088a9190614d3e565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613fc3565b611ff5565b6040516108c7919061491a565b60405180910390f35b3480156108dc57600080fd5b506108e56120d2565b6040516108f29190614d3e565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d9190613fc3565b6120d7565b60405161092f919061491a565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613d89565b612177565b60405161096c91906148ff565b60405180910390f35b34801561098157600080fd5b5061098a61220b565b6040516109979190614d3e565b60405180910390f35b3480156109ac57600080fd5b506109b5612211565b6040516109c291906148ff565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed9190613ecb565b612224565b005b348015610a0057600080fd5b50610a1b6004803603810190610a169190613d60565b61234a565b005b6000610a2882612442565b9050919050565b606060008054610a3e906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6a906150b0565b8015610ab75780601f10610a8c57610100808354040283529160200191610ab7565b820191906000526020600020905b815481529060010190602001808311610a9a57829003601f168201915b5050505050905090565b6000610acc826124bc565b610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0290614c1e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b51826112ec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb990614cbe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be1612528565b73ffffffffffffffffffffffffffffffffffffffff161480610c105750610c0f81610c0a612528565b612177565b5b610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690614b5e565b60405180910390fd5b610c598383612530565b505050565b600f60019054906101000a900460ff16610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca490614b1e565b60405180910390fd5b600081118015610cbe575060098111155b610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf490614afe565b60405180910390fd5b6107c581610d09610e8b565b610d139190614edb565b1115610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b9061499e565b60405180910390fd5b8067013c310749028000610d689190614f62565b341015610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190614abe565b60405180910390fd5b60005b81811015610df1576000610dbf610e8b565b90506107c5610dcc610e8b565b1015610ddd57610ddc33826125e9565b5b508080610de990615113565b915050610dad565b5050565b610dfd612528565b73ffffffffffffffffffffffffffffffffffffffff16610e1b6117da565b73ffffffffffffffffffffffffffffffffffffffff1614610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890614c3e565b60405180910390fd5b80600d9080519060200190610e87929190613b6f565b5050565b6000600a80549050905090565b610ea9610ea3612528565b82612607565b610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90614cfe565b60405180910390fd5b610ef38383836126e5565b505050565b6000610f03836113aa565b8210610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906149de565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fa5612528565b73ffffffffffffffffffffffffffffffffffffffff16610fc36117da565b73ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090614c3e565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b61104d612528565b73ffffffffffffffffffffffffffffffffffffffff1661106b6117da565b73ffffffffffffffffffffffffffffffffffffffff16146110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890614c3e565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561110c573d6000803e3d6000fd5b5050565b611118612528565b73ffffffffffffffffffffffffffffffffffffffff166111366117da565b73ffffffffffffffffffffffffffffffffffffffff161461118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390614c3e565b60405180910390fd5b611194612941565b565b6111b183838360405180602001604052806000815250611c4c565b505050565b60006111c0610e8b565b8210611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890614d1e565b60405180910390fd5b600a828154811061123b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611255612528565b73ffffffffffffffffffffffffffffffffffffffff166112736117da565b73ffffffffffffffffffffffffffffffffffffffff16146112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090614c3e565b60405180910390fd5b6112d2816129e3565b50565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90614b9e565b60405180910390fd5b80915050919050565b67013c31074902800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290614b7e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61146a612528565b73ffffffffffffffffffffffffffffffffffffffff166114886117da565b73ffffffffffffffffffffffffffffffffffffffff16146114de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d590614c3e565b60405180910390fd5b6114e860006129fd565b565b6114f2612528565b73ffffffffffffffffffffffffffffffffffffffff166115106117da565b73ffffffffffffffffffffffffffffffffffffffff1614611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90614c3e565b60405180910390fd5b61156e612ac3565b565b6060600061157d836113aa565b9050600081141561160057600067ffffffffffffffff8111156115c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115f75781602001602082028036833780820191505090505b509150506116e7565b60008167ffffffffffffffff811115611642577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116705781602001602082028036833780820191505090505b50905060005b828110156116e0576116888582610ef8565b8282815181106116c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806116d890615113565b915050611676565b8193505050505b919050565b60606116f6610e8b565b8210611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e906149be565b60405180910390fd5b601160008381526020019081526020016000208054611755906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611781906150b0565b80156117ce5780601f106117a3576101008083540402835291602001916117ce565b820191906000526020600020905b8154815290600101906020018083116117b157829003601f168201915b50505050509050919050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611813906150b0565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906150b0565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b60125481565b600e80546118a9906150b0565b80601f01602080910402602001604051908101604052809291908181526020018280546118d5906150b0565b80156119225780601f106118f757610100808354040283529160200191611922565b820191906000526020600020905b81548152906001019060200180831161190557829003601f168201915b505050505081565b60606000611937836113aa565b905060008114156119bf57600067ffffffffffffffff811115611983577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119b657816020015b60608152602001906001900390816119a15790505b50915050611b45565b60008167ffffffffffffffff811115611a01577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611a3457816020015b6060815260200190600190039081611a1f5790505b50905060005b82811015611b3e5760116000611a508784610ef8565b81526020019081526020016000208054611a69906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611a95906150b0565b8015611ae25780601f10611ab757610100808354040283529160200191611ae2565b820191906000526020600020905b815481529060010190602001808311611ac557829003601f168201915b5050505050828281518110611b20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052508080611b3690615113565b915050611a3a565b8193505050505b919050565b611b5c611b55612528565b8383612b66565b5050565b611b68612528565b73ffffffffffffffffffffffffffffffffffffffff16611b866117da565b73ffffffffffffffffffffffffffffffffffffffff1614611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd390614c3e565b60405180910390fd5b60001515600f60009054906101000a900460ff16151514611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990614cde565b60405180910390fd5b80600e9080519060200190611c48929190613b6f565b5050565b611c5d611c57612528565b83612607565b611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9390614cfe565b60405180910390fd5b611ca884848484612cd3565b50505050565b600d8054611cbb906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce7906150b0565b8015611d345780601f10611d0957610100808354040283529160200191611d34565b820191906000526020600020905b815481529060010190602001808311611d1757829003601f168201915b505050505081565b611d44612528565b73ffffffffffffffffffffffffffffffffffffffff16611d626117da565b73ffffffffffffffffffffffffffffffffffffffff1614611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf90614c3e565b60405180910390fd5b6001600f60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600e604051611e03919061493c565b60405180910390a1565b3373ffffffffffffffffffffffffffffffffffffffff16611e2d836112ec565b73ffffffffffffffffffffffffffffffffffffffff1614611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a90614bbe565b60405180910390fd5b600260116000848152602001908152602001600020604051611ea591906147db565b602060405180830381855afa158015611ec2573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611ee59190613f07565b600282604051611ef591906147c4565b602060405180830381855afa158015611f12573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611f359190613f07565b1415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d90614c9e565b60405180910390fd5b80601160008481526020019081526020016000209080519060200190611f9d929190613b6f565b507f56902d885d51c5e1fecd478dc901f6781b376aaa74a47178772284f72ab4921e338383604051611fd19392919061487d565b60405180910390a15050565b6060611fe882612d2f565b9050919050565b60135481565b6060611fff610e8b565b8210612040576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120379061495e565b60405180910390fd5b600e805461204d906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612079906150b0565b80156120c65780601f1061209b576101008083540402835291602001916120c6565b820191906000526020600020905b8154815290600101906020018083116120a957829003601f168201915b50505050509050919050565b600981565b601160205280600052604060002060009150905080546120f6906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612122906150b0565b801561216f5780601f106121445761010080835404028352916020019161216f565b820191906000526020600020905b81548152906001019060200180831161215257829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6107c581565b600f60019054906101000a900460ff1681565b61222c612528565b73ffffffffffffffffffffffffffffffffffffffff1661224a6117da565b73ffffffffffffffffffffffffffffffffffffffff16146122a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229790614c3e565b60405180910390fd5b60006122aa610e8b565b90506000821180156122be57506012548211155b6122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f490614a5e565b60405180910390fd5b60005b828110156123305761231d8482846123189190614edb565b6125e9565b808061232890615113565b915050612300565b508160125461233f9190614fbc565b601281905550505050565b612352612528565b73ffffffffffffffffffffffffffffffffffffffff166123706117da565b73ffffffffffffffffffffffffffffffffffffffff16146123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bd90614c3e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90614a1e565b60405180910390fd5b61243f816129fd565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124b557506124b482612e81565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125a3836112ec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612603828260405180602001604052806000815250612f63565b5050565b6000612612826124bc565b612651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264890614ade565b60405180910390fd5b600061265c836112ec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126cb57508373ffffffffffffffffffffffffffffffffffffffff166126b384610ac1565b73ffffffffffffffffffffffffffffffffffffffff16145b806126dc57506126db8185612177565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612705826112ec565b73ffffffffffffffffffffffffffffffffffffffff161461275b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275290614c5e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290614a7e565b60405180910390fd5b6127d6838383612fbe565b6127e1600082612530565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128319190614fbc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128889190614edb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129496112d5565b612988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297f9061497e565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129cc612528565b6040516129d99190614816565b60405180910390a1565b80601090805190602001906129f9929190613b6f565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612acb6112d5565b15612b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0290614b3e565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b4f612528565b604051612b5c9190614816565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcc90614a9e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612cc691906148ff565b60405180910390a3505050565b612cde8484846126e5565b612cea84848484613016565b612d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d20906149fe565b60405180910390fd5b50505050565b6060612d3a826124bc565b612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7090614bfe565b60405180910390fd5b6000600760008481526020019081526020016000208054612d99906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc5906150b0565b8015612e125780601f10612de757610100808354040283529160200191612e12565b820191906000526020600020905b815481529060010190602001808311612df557829003601f168201915b505050505090506000612e236131ad565b9050600081511415612e39578192505050612e7c565b600082511115612e6e578082604051602001612e569291906147f2565b60405160208183030381529060405292505050612e7c565b612e778461323f565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f4c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f5c5750612f5b826132e6565b5b9050919050565b612f6d8383613350565b612f7a6000848484613016565b612fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb0906149fe565b60405180910390fd5b505050565b612fc66112d5565b15613006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffd90614b3e565b60405180910390fd5b61301183838361351e565b505050565b60006130378473ffffffffffffffffffffffffffffffffffffffff16613632565b156131a0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613060612528565b8786866040518563ffffffff1660e01b81526004016130829493929190614831565b602060405180830381600087803b15801561309c57600080fd5b505af19250505080156130cd57506040513d601f19601f820116820180604052508101906130ca9190613f59565b60015b613150573d80600081146130fd576040519150601f19603f3d011682016040523d82523d6000602084013e613102565b606091505b50600081511415613148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313f906149fe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131a5565b600190505b949350505050565b6060601080546131bc906150b0565b80601f01602080910402602001604051908101604052809291908181526020018280546131e8906150b0565b80156132355780601f1061320a57610100808354040283529160200191613235565b820191906000526020600020905b81548152906001019060200180831161321857829003601f168201915b5050505050905090565b606061324a826124bc565b613289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328090614c7e565b60405180910390fd5b60006132936131ad565b905060008151116132b357604051806020016040528060008152506132de565b806132bd84613645565b6040516020016132ce9291906147f2565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b790614bde565b60405180910390fd5b6133c9816124bc565b15613409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340090614a3e565b60405180910390fd5b61341560008383612fbe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134659190614edb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6135298383836137f2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561356c57613567816137f7565b6135ab565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135aa576135a98382613840565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135ee576135e9816139ad565b61362d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461362c5761362b8282613af0565b5b5b505050565b600080823b905060008111915050919050565b6060600082141561368d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506137ed565b600082905060005b600082146136bf5780806136a890615113565b915050600a826136b89190614f31565b9150613695565b60008167ffffffffffffffff811115613701577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137335781602001600182028036833780820191505090505b5090505b600085146137e65760018261374c9190614fbc565b9150600a8561375b919061515c565b60306137679190614edb565b60f81b8183815181106137a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137df9190614f31565b9450613737565b8093505050505b919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161384d846113aa565b6138579190614fbc565b905060006009600084815260200190815260200160002054905081811461393c576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506139c19190614fbc565b90506000600b60008481526020019081526020016000205490506000600a8381548110613a17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a8381548110613a5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613ad4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613afb836113aa565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b828054613b7b906150b0565b90600052602060002090601f016020900481019282613b9d5760008555613be4565b82601f10613bb657805160ff1916838001178555613be4565b82800160010185558215613be4579182015b82811115613be3578251825591602001919060010190613bc8565b5b509050613bf19190613bf5565b5090565b5b80821115613c0e576000816000905550600101613bf6565b5090565b6000613c25613c2084614d7e565b614d59565b905082815260208101848484011115613c3d57600080fd5b613c4884828561506e565b509392505050565b6000613c63613c5e84614daf565b614d59565b905082815260208101848484011115613c7b57600080fd5b613c8684828561506e565b509392505050565b600081359050613c9d81615a95565b92915050565b600081359050613cb281615aac565b92915050565b600081519050613cc781615ac3565b92915050565b600081359050613cdc81615ada565b92915050565b600081519050613cf181615ada565b92915050565b600082601f830112613d0857600080fd5b8135613d18848260208601613c12565b91505092915050565b600082601f830112613d3257600080fd5b8135613d42848260208601613c50565b91505092915050565b600081359050613d5a81615af1565b92915050565b600060208284031215613d7257600080fd5b6000613d8084828501613c8e565b91505092915050565b60008060408385031215613d9c57600080fd5b6000613daa85828601613c8e565b9250506020613dbb85828601613c8e565b9150509250929050565b600080600060608486031215613dda57600080fd5b6000613de886828701613c8e565b9350506020613df986828701613c8e565b9250506040613e0a86828701613d4b565b9150509250925092565b60008060008060808587031215613e2a57600080fd5b6000613e3887828801613c8e565b9450506020613e4987828801613c8e565b9350506040613e5a87828801613d4b565b925050606085013567ffffffffffffffff811115613e7757600080fd5b613e8387828801613cf7565b91505092959194509250565b60008060408385031215613ea257600080fd5b6000613eb085828601613c8e565b9250506020613ec185828601613ca3565b9150509250929050565b60008060408385031215613ede57600080fd5b6000613eec85828601613c8e565b9250506020613efd85828601613d4b565b9150509250929050565b600060208284031215613f1957600080fd5b6000613f2784828501613cb8565b91505092915050565b600060208284031215613f4257600080fd5b6000613f5084828501613ccd565b91505092915050565b600060208284031215613f6b57600080fd5b6000613f7984828501613ce2565b91505092915050565b600060208284031215613f9457600080fd5b600082013567ffffffffffffffff811115613fae57600080fd5b613fba84828501613d21565b91505092915050565b600060208284031215613fd557600080fd5b6000613fe384828501613d4b565b91505092915050565b60008060408385031215613fff57600080fd5b600061400d85828601613d4b565b925050602083013567ffffffffffffffff81111561402a57600080fd5b61403685828601613d21565b9150509250929050565b600061404c8383614246565b905092915050565b600061406083836147a6565b60208301905092915050565b61407581614ff0565b82525050565b600061408682614e2a565b6140908185614e70565b9350836020820285016140a285614de0565b8060005b858110156140de57848403895281516140bf8582614040565b94506140ca83614e56565b925060208a019950506001810190506140a6565b50829750879550505050505092915050565b60006140fb82614e35565b6141058185614e81565b935061411083614df0565b8060005b838110156141415781516141288882614054565b975061413383614e63565b925050600181019050614114565b5085935050505092915050565b61415781615002565b82525050565b600061416882614e40565b6141728185614e92565b935061418281856020860161507d565b61418b81615249565b840191505092915050565b60006141a182614e40565b6141ab8185614ea3565b93506141bb81856020860161507d565b80840191505092915050565b600081546141d4816150b0565b6141de8186614ea3565b945060018216600081146141f9576001811461420a5761423d565b60ff1983168652818601935061423d565b61421385614e00565b60005b8381101561423557815481890152600182019150602081019050614216565b838801955050505b50505092915050565b600061425182614e4b565b61425b8185614eae565b935061426b81856020860161507d565b61427481615249565b840191505092915050565b600061428a82614e4b565b6142948185614ebf565b93506142a481856020860161507d565b6142ad81615249565b840191505092915050565b60006142c382614e4b565b6142cd8185614ed0565b93506142dd81856020860161507d565b80840191505092915050565b600081546142f6816150b0565b6143008186614ebf565b9450600182166000811461431b576001811461432d57614360565b60ff1983168652602086019350614360565b61433685614e15565b60005b8381101561435857815481890152600182019150602081019050614339565b808801955050505b50505092915050565b6000614376602283614ebf565b91506143818261525a565b604082019050919050565b6000614399601483614ebf565b91506143a4826152a9565b602082019050919050565b60006143bc602b83614ebf565b91506143c7826152d2565b604082019050919050565b60006143df602283614ebf565b91506143ea82615321565b604082019050919050565b6000614402602b83614ebf565b915061440d82615370565b604082019050919050565b6000614425603283614ebf565b9150614430826153bf565b604082019050919050565b6000614448602683614ebf565b91506144538261540e565b604082019050919050565b600061446b601c83614ebf565b91506144768261545d565b602082019050919050565b600061448e602083614ebf565b915061449982615486565b602082019050919050565b60006144b1602483614ebf565b91506144bc826154af565b604082019050919050565b60006144d4601983614ebf565b91506144df826154fe565b602082019050919050565b60006144f7601f83614ebf565b915061450282615527565b602082019050919050565b600061451a602c83614ebf565b915061452582615550565b604082019050919050565b600061453d602183614ebf565b91506145488261559f565b604082019050919050565b6000614560602983614ebf565b915061456b826155ee565b604082019050919050565b6000614583601083614ebf565b915061458e8261563d565b602082019050919050565b60006145a6603883614ebf565b91506145b182615666565b604082019050919050565b60006145c9602a83614ebf565b91506145d4826156b5565b604082019050919050565b60006145ec602983614ebf565b91506145f782615704565b604082019050919050565b600061460f602783614ebf565b915061461a82615753565b604082019050919050565b6000614632602083614ebf565b915061463d826157a2565b602082019050919050565b6000614655603183614ebf565b9150614660826157cb565b604082019050919050565b6000614678602c83614ebf565b91506146838261581a565b604082019050919050565b600061469b602083614ebf565b91506146a682615869565b602082019050919050565b60006146be602983614ebf565b91506146c982615892565b604082019050919050565b60006146e1602f83614ebf565b91506146ec826158e1565b604082019050919050565b6000614704602383614ebf565b915061470f82615930565b604082019050919050565b6000614727602183614ebf565b91506147328261597f565b604082019050919050565b600061474a601683614ebf565b9150614755826159ce565b602082019050919050565b600061476d603183614ebf565b9150614778826159f7565b604082019050919050565b6000614790602c83614ebf565b915061479b82615a46565b604082019050919050565b6147af81615064565b82525050565b6147be81615064565b82525050565b60006147d08284614196565b915081905092915050565b60006147e782846141c7565b915081905092915050565b60006147fe82856142b8565b915061480a82846142b8565b91508190509392505050565b600060208201905061482b600083018461406c565b92915050565b6000608082019050614846600083018761406c565b614853602083018661406c565b61486060408301856147b5565b8181036060830152614872818461415d565b905095945050505050565b6000606082019050614892600083018661406c565b61489f60208301856147b5565b81810360408301526148b1818461427f565b9050949350505050565b600060208201905081810360008301526148d5818461407b565b905092915050565b600060208201905081810360008301526148f781846140f0565b905092915050565b6000602082019050614914600083018461414e565b92915050565b60006020820190508181036000830152614934818461427f565b905092915050565b6000602082019050818103600083015261495681846142e9565b905092915050565b6000602082019050818103600083015261497781614369565b9050919050565b600060208201905081810360008301526149978161438c565b9050919050565b600060208201905081810360008301526149b7816143af565b9050919050565b600060208201905081810360008301526149d7816143d2565b9050919050565b600060208201905081810360008301526149f7816143f5565b9050919050565b60006020820190508181036000830152614a1781614418565b9050919050565b60006020820190508181036000830152614a378161443b565b9050919050565b60006020820190508181036000830152614a578161445e565b9050919050565b60006020820190508181036000830152614a7781614481565b9050919050565b60006020820190508181036000830152614a97816144a4565b9050919050565b60006020820190508181036000830152614ab7816144c7565b9050919050565b60006020820190508181036000830152614ad7816144ea565b9050919050565b60006020820190508181036000830152614af78161450d565b9050919050565b60006020820190508181036000830152614b1781614530565b9050919050565b60006020820190508181036000830152614b3781614553565b9050919050565b60006020820190508181036000830152614b5781614576565b9050919050565b60006020820190508181036000830152614b7781614599565b9050919050565b60006020820190508181036000830152614b97816145bc565b9050919050565b60006020820190508181036000830152614bb7816145df565b9050919050565b60006020820190508181036000830152614bd781614602565b9050919050565b60006020820190508181036000830152614bf781614625565b9050919050565b60006020820190508181036000830152614c1781614648565b9050919050565b60006020820190508181036000830152614c378161466b565b9050919050565b60006020820190508181036000830152614c578161468e565b9050919050565b60006020820190508181036000830152614c77816146b1565b9050919050565b60006020820190508181036000830152614c97816146d4565b9050919050565b60006020820190508181036000830152614cb7816146f7565b9050919050565b60006020820190508181036000830152614cd78161471a565b9050919050565b60006020820190508181036000830152614cf78161473d565b9050919050565b60006020820190508181036000830152614d1781614760565b9050919050565b60006020820190508181036000830152614d3781614783565b9050919050565b6000602082019050614d5360008301846147b5565b92915050565b6000614d63614d74565b9050614d6f82826150e2565b919050565b6000604051905090565b600067ffffffffffffffff821115614d9957614d9861521a565b5b614da282615249565b9050602081019050919050565b600067ffffffffffffffff821115614dca57614dc961521a565b5b614dd382615249565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ee682615064565b9150614ef183615064565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f2657614f2561518d565b5b828201905092915050565b6000614f3c82615064565b9150614f4783615064565b925082614f5757614f566151bc565b5b828204905092915050565b6000614f6d82615064565b9150614f7883615064565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fb157614fb061518d565b5b828202905092915050565b6000614fc782615064565b9150614fd283615064565b925082821015614fe557614fe461518d565b5b828203905092915050565b6000614ffb82615044565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561509b578082015181840152602081019050615080565b838111156150aa576000848401525b50505050565b600060028204905060018216806150c857607f821691505b602082108114156150dc576150db6151eb565b5b50919050565b6150eb82615249565b810181811067ffffffffffffffff8211171561510a5761510961521a565b5b80604052505050565b600061511e82615064565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151515761515061518d565b5b600182019050919050565b600061516782615064565b915061517283615064565b925082615182576151816151bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f43484f4f5345204120504f535345204d454d4245522057495448494e2052414e60008201527f4745000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204d656d62657273000000000000000000000000000000000000000000602082015250565b7f43686f6f7365206120706f737365206d656d6265722077697468696e2072616e60008201527f6765000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420706f737360008201527f65206d656d626572730000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008201527f7320747265652100000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6577206e616d652069732073616d65206173207468652063757272656e742060008201527f6f6e650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615a9e81614ff0565b8114615aa957600080fd5b50565b615ab581615002565b8114615ac057600080fd5b50565b615acc8161500e565b8114615ad757600080fd5b50565b615ae381615018565b8114615aee57600080fd5b50565b615afa81615064565b8114615b0557600080fd5b5056fea2646970667358221220840879af40d5ec9f945e1a8d947727129d1b61a3630a4f537ebc251042bf92d564736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102675760003560e01c8063885a212711610144578063c50b1126116100b6578063e73ae5901161007a578063e73ae590146108fb578063e985e9c514610938578063ea0e35b114610975578063eb8d2444146109a0578063f1a3f69d146109cb578063f2fde38b146109f457610267565b8063c50b112614610802578063c87b56dd1461082b578063d082e38114610868578063d9b137b214610893578063e5248261146108d057610267565b80639e2ef763116101085780639e2ef76314610708578063a22cb46514610745578063b09904b51461076e578063b88d4fde14610797578063bae5c779146107c0578063bf4702fc146107eb57610267565b8063885a21271461061f5780638da5cb5b1461065c57806395d89b4114610687578063978cceb2146106b25780639c3e72bd146106dd57610267565b80633f4ba83a116101dd5780636352211e116101a15780636352211e1461050f578063636e746b1461054c57806370a0823114610577578063715018a6146105b45780638456cb59146105cb5780638462151c146105e257610267565b80633f4ba83a1461043e57806342842e0e146104555780634f6ccce71461047e57806355f804b3146104bb5780635c975abb146104e457610267565b8063109695231161022f578063109695231461035657806318160ddd1461037f57806323b872dd146103aa5780632f745c59146103d357806334918dfd146104105780633ccfd60b1461042757610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630be146c91461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613f30565b610a1d565b6040516102a091906148ff565b60405180910390f35b3480156102b557600080fd5b506102be610a2f565b6040516102cb919061491a565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613fc3565b610ac1565b6040516103089190614816565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613ecb565b610b46565b005b610354600480360381019061034f9190613fc3565b610c5e565b005b34801561036257600080fd5b5061037d60048036038101906103789190613f82565b610df5565b005b34801561038b57600080fd5b50610394610e8b565b6040516103a19190614d3e565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613dc5565b610e98565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190613ecb565b610ef8565b6040516104079190614d3e565b60405180910390f35b34801561041c57600080fd5b50610425610f9d565b005b34801561043357600080fd5b5061043c611045565b005b34801561044a57600080fd5b50610453611110565b005b34801561046157600080fd5b5061047c60048036038101906104779190613dc5565b611196565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613fc3565b6111b6565b6040516104b29190614d3e565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd9190613f82565b61124d565b005b3480156104f057600080fd5b506104f96112d5565b60405161050691906148ff565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613fc3565b6112ec565b6040516105439190614816565b60405180910390f35b34801561055857600080fd5b5061056161139e565b60405161056e9190614d3e565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613d60565b6113aa565b6040516105ab9190614d3e565b60405180910390f35b3480156105c057600080fd5b506105c9611462565b005b3480156105d757600080fd5b506105e06114ea565b005b3480156105ee57600080fd5b5061060960048036038101906106049190613d60565b611570565b60405161061691906148dd565b60405180910390f35b34801561062b57600080fd5b5061064660048036038101906106419190613fc3565b6116ec565b604051610653919061491a565b60405180910390f35b34801561066857600080fd5b506106716117da565b60405161067e9190614816565b60405180910390f35b34801561069357600080fd5b5061069c611804565b6040516106a9919061491a565b60405180910390f35b3480156106be57600080fd5b506106c7611896565b6040516106d49190614d3e565b60405180910390f35b3480156106e957600080fd5b506106f261189c565b6040516106ff919061491a565b60405180910390f35b34801561071457600080fd5b5061072f600480360381019061072a9190613d60565b61192a565b60405161073c91906148bb565b60405180910390f35b34801561075157600080fd5b5061076c60048036038101906107679190613e8f565b611b4a565b005b34801561077a57600080fd5b5061079560048036038101906107909190613f82565b611b60565b005b3480156107a357600080fd5b506107be60048036038101906107b99190613e14565b611c4c565b005b3480156107cc57600080fd5b506107d5611cae565b6040516107e2919061491a565b60405180910390f35b3480156107f757600080fd5b50610800611d3c565b005b34801561080e57600080fd5b5061082960048036038101906108249190613fec565b611e0d565b005b34801561083757600080fd5b50610852600480360381019061084d9190613fc3565b611fdd565b60405161085f919061491a565b60405180910390f35b34801561087457600080fd5b5061087d611fef565b60405161088a9190614d3e565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613fc3565b611ff5565b6040516108c7919061491a565b60405180910390f35b3480156108dc57600080fd5b506108e56120d2565b6040516108f29190614d3e565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d9190613fc3565b6120d7565b60405161092f919061491a565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613d89565b612177565b60405161096c91906148ff565b60405180910390f35b34801561098157600080fd5b5061098a61220b565b6040516109979190614d3e565b60405180910390f35b3480156109ac57600080fd5b506109b5612211565b6040516109c291906148ff565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed9190613ecb565b612224565b005b348015610a0057600080fd5b50610a1b6004803603810190610a169190613d60565b61234a565b005b6000610a2882612442565b9050919050565b606060008054610a3e906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6a906150b0565b8015610ab75780601f10610a8c57610100808354040283529160200191610ab7565b820191906000526020600020905b815481529060010190602001808311610a9a57829003601f168201915b5050505050905090565b6000610acc826124bc565b610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0290614c1e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b51826112ec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb990614cbe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be1612528565b73ffffffffffffffffffffffffffffffffffffffff161480610c105750610c0f81610c0a612528565b612177565b5b610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690614b5e565b60405180910390fd5b610c598383612530565b505050565b600f60019054906101000a900460ff16610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca490614b1e565b60405180910390fd5b600081118015610cbe575060098111155b610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf490614afe565b60405180910390fd5b6107c581610d09610e8b565b610d139190614edb565b1115610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b9061499e565b60405180910390fd5b8067013c310749028000610d689190614f62565b341015610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190614abe565b60405180910390fd5b60005b81811015610df1576000610dbf610e8b565b90506107c5610dcc610e8b565b1015610ddd57610ddc33826125e9565b5b508080610de990615113565b915050610dad565b5050565b610dfd612528565b73ffffffffffffffffffffffffffffffffffffffff16610e1b6117da565b73ffffffffffffffffffffffffffffffffffffffff1614610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890614c3e565b60405180910390fd5b80600d9080519060200190610e87929190613b6f565b5050565b6000600a80549050905090565b610ea9610ea3612528565b82612607565b610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90614cfe565b60405180910390fd5b610ef38383836126e5565b505050565b6000610f03836113aa565b8210610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906149de565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fa5612528565b73ffffffffffffffffffffffffffffffffffffffff16610fc36117da565b73ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090614c3e565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b61104d612528565b73ffffffffffffffffffffffffffffffffffffffff1661106b6117da565b73ffffffffffffffffffffffffffffffffffffffff16146110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890614c3e565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561110c573d6000803e3d6000fd5b5050565b611118612528565b73ffffffffffffffffffffffffffffffffffffffff166111366117da565b73ffffffffffffffffffffffffffffffffffffffff161461118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390614c3e565b60405180910390fd5b611194612941565b565b6111b183838360405180602001604052806000815250611c4c565b505050565b60006111c0610e8b565b8210611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890614d1e565b60405180910390fd5b600a828154811061123b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611255612528565b73ffffffffffffffffffffffffffffffffffffffff166112736117da565b73ffffffffffffffffffffffffffffffffffffffff16146112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090614c3e565b60405180910390fd5b6112d2816129e3565b50565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90614b9e565b60405180910390fd5b80915050919050565b67013c31074902800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290614b7e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61146a612528565b73ffffffffffffffffffffffffffffffffffffffff166114886117da565b73ffffffffffffffffffffffffffffffffffffffff16146114de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d590614c3e565b60405180910390fd5b6114e860006129fd565b565b6114f2612528565b73ffffffffffffffffffffffffffffffffffffffff166115106117da565b73ffffffffffffffffffffffffffffffffffffffff1614611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90614c3e565b60405180910390fd5b61156e612ac3565b565b6060600061157d836113aa565b9050600081141561160057600067ffffffffffffffff8111156115c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115f75781602001602082028036833780820191505090505b509150506116e7565b60008167ffffffffffffffff811115611642577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116705781602001602082028036833780820191505090505b50905060005b828110156116e0576116888582610ef8565b8282815181106116c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806116d890615113565b915050611676565b8193505050505b919050565b60606116f6610e8b565b8210611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e906149be565b60405180910390fd5b601160008381526020019081526020016000208054611755906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611781906150b0565b80156117ce5780601f106117a3576101008083540402835291602001916117ce565b820191906000526020600020905b8154815290600101906020018083116117b157829003601f168201915b50505050509050919050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611813906150b0565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906150b0565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b60125481565b600e80546118a9906150b0565b80601f01602080910402602001604051908101604052809291908181526020018280546118d5906150b0565b80156119225780601f106118f757610100808354040283529160200191611922565b820191906000526020600020905b81548152906001019060200180831161190557829003601f168201915b505050505081565b60606000611937836113aa565b905060008114156119bf57600067ffffffffffffffff811115611983577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119b657816020015b60608152602001906001900390816119a15790505b50915050611b45565b60008167ffffffffffffffff811115611a01577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611a3457816020015b6060815260200190600190039081611a1f5790505b50905060005b82811015611b3e5760116000611a508784610ef8565b81526020019081526020016000208054611a69906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611a95906150b0565b8015611ae25780601f10611ab757610100808354040283529160200191611ae2565b820191906000526020600020905b815481529060010190602001808311611ac557829003601f168201915b5050505050828281518110611b20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052508080611b3690615113565b915050611a3a565b8193505050505b919050565b611b5c611b55612528565b8383612b66565b5050565b611b68612528565b73ffffffffffffffffffffffffffffffffffffffff16611b866117da565b73ffffffffffffffffffffffffffffffffffffffff1614611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd390614c3e565b60405180910390fd5b60001515600f60009054906101000a900460ff16151514611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990614cde565b60405180910390fd5b80600e9080519060200190611c48929190613b6f565b5050565b611c5d611c57612528565b83612607565b611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9390614cfe565b60405180910390fd5b611ca884848484612cd3565b50505050565b600d8054611cbb906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce7906150b0565b8015611d345780601f10611d0957610100808354040283529160200191611d34565b820191906000526020600020905b815481529060010190602001808311611d1757829003601f168201915b505050505081565b611d44612528565b73ffffffffffffffffffffffffffffffffffffffff16611d626117da565b73ffffffffffffffffffffffffffffffffffffffff1614611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf90614c3e565b60405180910390fd5b6001600f60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600e604051611e03919061493c565b60405180910390a1565b3373ffffffffffffffffffffffffffffffffffffffff16611e2d836112ec565b73ffffffffffffffffffffffffffffffffffffffff1614611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a90614bbe565b60405180910390fd5b600260116000848152602001908152602001600020604051611ea591906147db565b602060405180830381855afa158015611ec2573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611ee59190613f07565b600282604051611ef591906147c4565b602060405180830381855afa158015611f12573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611f359190613f07565b1415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d90614c9e565b60405180910390fd5b80601160008481526020019081526020016000209080519060200190611f9d929190613b6f565b507f56902d885d51c5e1fecd478dc901f6781b376aaa74a47178772284f72ab4921e338383604051611fd19392919061487d565b60405180910390a15050565b6060611fe882612d2f565b9050919050565b60135481565b6060611fff610e8b565b8210612040576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120379061495e565b60405180910390fd5b600e805461204d906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612079906150b0565b80156120c65780601f1061209b576101008083540402835291602001916120c6565b820191906000526020600020905b8154815290600101906020018083116120a957829003601f168201915b50505050509050919050565b600981565b601160205280600052604060002060009150905080546120f6906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612122906150b0565b801561216f5780601f106121445761010080835404028352916020019161216f565b820191906000526020600020905b81548152906001019060200180831161215257829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6107c581565b600f60019054906101000a900460ff1681565b61222c612528565b73ffffffffffffffffffffffffffffffffffffffff1661224a6117da565b73ffffffffffffffffffffffffffffffffffffffff16146122a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229790614c3e565b60405180910390fd5b60006122aa610e8b565b90506000821180156122be57506012548211155b6122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f490614a5e565b60405180910390fd5b60005b828110156123305761231d8482846123189190614edb565b6125e9565b808061232890615113565b915050612300565b508160125461233f9190614fbc565b601281905550505050565b612352612528565b73ffffffffffffffffffffffffffffffffffffffff166123706117da565b73ffffffffffffffffffffffffffffffffffffffff16146123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bd90614c3e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90614a1e565b60405180910390fd5b61243f816129fd565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124b557506124b482612e81565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125a3836112ec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612603828260405180602001604052806000815250612f63565b5050565b6000612612826124bc565b612651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264890614ade565b60405180910390fd5b600061265c836112ec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126cb57508373ffffffffffffffffffffffffffffffffffffffff166126b384610ac1565b73ffffffffffffffffffffffffffffffffffffffff16145b806126dc57506126db8185612177565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612705826112ec565b73ffffffffffffffffffffffffffffffffffffffff161461275b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275290614c5e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290614a7e565b60405180910390fd5b6127d6838383612fbe565b6127e1600082612530565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128319190614fbc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128889190614edb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129496112d5565b612988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297f9061497e565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129cc612528565b6040516129d99190614816565b60405180910390a1565b80601090805190602001906129f9929190613b6f565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612acb6112d5565b15612b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0290614b3e565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b4f612528565b604051612b5c9190614816565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcc90614a9e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612cc691906148ff565b60405180910390a3505050565b612cde8484846126e5565b612cea84848484613016565b612d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d20906149fe565b60405180910390fd5b50505050565b6060612d3a826124bc565b612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7090614bfe565b60405180910390fd5b6000600760008481526020019081526020016000208054612d99906150b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc5906150b0565b8015612e125780601f10612de757610100808354040283529160200191612e12565b820191906000526020600020905b815481529060010190602001808311612df557829003601f168201915b505050505090506000612e236131ad565b9050600081511415612e39578192505050612e7c565b600082511115612e6e578082604051602001612e569291906147f2565b60405160208183030381529060405292505050612e7c565b612e778461323f565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f4c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f5c5750612f5b826132e6565b5b9050919050565b612f6d8383613350565b612f7a6000848484613016565b612fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb0906149fe565b60405180910390fd5b505050565b612fc66112d5565b15613006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffd90614b3e565b60405180910390fd5b61301183838361351e565b505050565b60006130378473ffffffffffffffffffffffffffffffffffffffff16613632565b156131a0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613060612528565b8786866040518563ffffffff1660e01b81526004016130829493929190614831565b602060405180830381600087803b15801561309c57600080fd5b505af19250505080156130cd57506040513d601f19601f820116820180604052508101906130ca9190613f59565b60015b613150573d80600081146130fd576040519150601f19603f3d011682016040523d82523d6000602084013e613102565b606091505b50600081511415613148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313f906149fe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131a5565b600190505b949350505050565b6060601080546131bc906150b0565b80601f01602080910402602001604051908101604052809291908181526020018280546131e8906150b0565b80156132355780601f1061320a57610100808354040283529160200191613235565b820191906000526020600020905b81548152906001019060200180831161321857829003601f168201915b5050505050905090565b606061324a826124bc565b613289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328090614c7e565b60405180910390fd5b60006132936131ad565b905060008151116132b357604051806020016040528060008152506132de565b806132bd84613645565b6040516020016132ce9291906147f2565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b790614bde565b60405180910390fd5b6133c9816124bc565b15613409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340090614a3e565b60405180910390fd5b61341560008383612fbe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134659190614edb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6135298383836137f2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561356c57613567816137f7565b6135ab565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135aa576135a98382613840565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135ee576135e9816139ad565b61362d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461362c5761362b8282613af0565b5b5b505050565b600080823b905060008111915050919050565b6060600082141561368d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506137ed565b600082905060005b600082146136bf5780806136a890615113565b915050600a826136b89190614f31565b9150613695565b60008167ffffffffffffffff811115613701577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137335781602001600182028036833780820191505090505b5090505b600085146137e65760018261374c9190614fbc565b9150600a8561375b919061515c565b60306137679190614edb565b60f81b8183815181106137a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137df9190614f31565b9450613737565b8093505050505b919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161384d846113aa565b6138579190614fbc565b905060006009600084815260200190815260200160002054905081811461393c576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506139c19190614fbc565b90506000600b60008481526020019081526020016000205490506000600a8381548110613a17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a8381548110613a5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613ad4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613afb836113aa565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b828054613b7b906150b0565b90600052602060002090601f016020900481019282613b9d5760008555613be4565b82601f10613bb657805160ff1916838001178555613be4565b82800160010185558215613be4579182015b82811115613be3578251825591602001919060010190613bc8565b5b509050613bf19190613bf5565b5090565b5b80821115613c0e576000816000905550600101613bf6565b5090565b6000613c25613c2084614d7e565b614d59565b905082815260208101848484011115613c3d57600080fd5b613c4884828561506e565b509392505050565b6000613c63613c5e84614daf565b614d59565b905082815260208101848484011115613c7b57600080fd5b613c8684828561506e565b509392505050565b600081359050613c9d81615a95565b92915050565b600081359050613cb281615aac565b92915050565b600081519050613cc781615ac3565b92915050565b600081359050613cdc81615ada565b92915050565b600081519050613cf181615ada565b92915050565b600082601f830112613d0857600080fd5b8135613d18848260208601613c12565b91505092915050565b600082601f830112613d3257600080fd5b8135613d42848260208601613c50565b91505092915050565b600081359050613d5a81615af1565b92915050565b600060208284031215613d7257600080fd5b6000613d8084828501613c8e565b91505092915050565b60008060408385031215613d9c57600080fd5b6000613daa85828601613c8e565b9250506020613dbb85828601613c8e565b9150509250929050565b600080600060608486031215613dda57600080fd5b6000613de886828701613c8e565b9350506020613df986828701613c8e565b9250506040613e0a86828701613d4b565b9150509250925092565b60008060008060808587031215613e2a57600080fd5b6000613e3887828801613c8e565b9450506020613e4987828801613c8e565b9350506040613e5a87828801613d4b565b925050606085013567ffffffffffffffff811115613e7757600080fd5b613e8387828801613cf7565b91505092959194509250565b60008060408385031215613ea257600080fd5b6000613eb085828601613c8e565b9250506020613ec185828601613ca3565b9150509250929050565b60008060408385031215613ede57600080fd5b6000613eec85828601613c8e565b9250506020613efd85828601613d4b565b9150509250929050565b600060208284031215613f1957600080fd5b6000613f2784828501613cb8565b91505092915050565b600060208284031215613f4257600080fd5b6000613f5084828501613ccd565b91505092915050565b600060208284031215613f6b57600080fd5b6000613f7984828501613ce2565b91505092915050565b600060208284031215613f9457600080fd5b600082013567ffffffffffffffff811115613fae57600080fd5b613fba84828501613d21565b91505092915050565b600060208284031215613fd557600080fd5b6000613fe384828501613d4b565b91505092915050565b60008060408385031215613fff57600080fd5b600061400d85828601613d4b565b925050602083013567ffffffffffffffff81111561402a57600080fd5b61403685828601613d21565b9150509250929050565b600061404c8383614246565b905092915050565b600061406083836147a6565b60208301905092915050565b61407581614ff0565b82525050565b600061408682614e2a565b6140908185614e70565b9350836020820285016140a285614de0565b8060005b858110156140de57848403895281516140bf8582614040565b94506140ca83614e56565b925060208a019950506001810190506140a6565b50829750879550505050505092915050565b60006140fb82614e35565b6141058185614e81565b935061411083614df0565b8060005b838110156141415781516141288882614054565b975061413383614e63565b925050600181019050614114565b5085935050505092915050565b61415781615002565b82525050565b600061416882614e40565b6141728185614e92565b935061418281856020860161507d565b61418b81615249565b840191505092915050565b60006141a182614e40565b6141ab8185614ea3565b93506141bb81856020860161507d565b80840191505092915050565b600081546141d4816150b0565b6141de8186614ea3565b945060018216600081146141f9576001811461420a5761423d565b60ff1983168652818601935061423d565b61421385614e00565b60005b8381101561423557815481890152600182019150602081019050614216565b838801955050505b50505092915050565b600061425182614e4b565b61425b8185614eae565b935061426b81856020860161507d565b61427481615249565b840191505092915050565b600061428a82614e4b565b6142948185614ebf565b93506142a481856020860161507d565b6142ad81615249565b840191505092915050565b60006142c382614e4b565b6142cd8185614ed0565b93506142dd81856020860161507d565b80840191505092915050565b600081546142f6816150b0565b6143008186614ebf565b9450600182166000811461431b576001811461432d57614360565b60ff1983168652602086019350614360565b61433685614e15565b60005b8381101561435857815481890152600182019150602081019050614339565b808801955050505b50505092915050565b6000614376602283614ebf565b91506143818261525a565b604082019050919050565b6000614399601483614ebf565b91506143a4826152a9565b602082019050919050565b60006143bc602b83614ebf565b91506143c7826152d2565b604082019050919050565b60006143df602283614ebf565b91506143ea82615321565b604082019050919050565b6000614402602b83614ebf565b915061440d82615370565b604082019050919050565b6000614425603283614ebf565b9150614430826153bf565b604082019050919050565b6000614448602683614ebf565b91506144538261540e565b604082019050919050565b600061446b601c83614ebf565b91506144768261545d565b602082019050919050565b600061448e602083614ebf565b915061449982615486565b602082019050919050565b60006144b1602483614ebf565b91506144bc826154af565b604082019050919050565b60006144d4601983614ebf565b91506144df826154fe565b602082019050919050565b60006144f7601f83614ebf565b915061450282615527565b602082019050919050565b600061451a602c83614ebf565b915061452582615550565b604082019050919050565b600061453d602183614ebf565b91506145488261559f565b604082019050919050565b6000614560602983614ebf565b915061456b826155ee565b604082019050919050565b6000614583601083614ebf565b915061458e8261563d565b602082019050919050565b60006145a6603883614ebf565b91506145b182615666565b604082019050919050565b60006145c9602a83614ebf565b91506145d4826156b5565b604082019050919050565b60006145ec602983614ebf565b91506145f782615704565b604082019050919050565b600061460f602783614ebf565b915061461a82615753565b604082019050919050565b6000614632602083614ebf565b915061463d826157a2565b602082019050919050565b6000614655603183614ebf565b9150614660826157cb565b604082019050919050565b6000614678602c83614ebf565b91506146838261581a565b604082019050919050565b600061469b602083614ebf565b91506146a682615869565b602082019050919050565b60006146be602983614ebf565b91506146c982615892565b604082019050919050565b60006146e1602f83614ebf565b91506146ec826158e1565b604082019050919050565b6000614704602383614ebf565b915061470f82615930565b604082019050919050565b6000614727602183614ebf565b91506147328261597f565b604082019050919050565b600061474a601683614ebf565b9150614755826159ce565b602082019050919050565b600061476d603183614ebf565b9150614778826159f7565b604082019050919050565b6000614790602c83614ebf565b915061479b82615a46565b604082019050919050565b6147af81615064565b82525050565b6147be81615064565b82525050565b60006147d08284614196565b915081905092915050565b60006147e782846141c7565b915081905092915050565b60006147fe82856142b8565b915061480a82846142b8565b91508190509392505050565b600060208201905061482b600083018461406c565b92915050565b6000608082019050614846600083018761406c565b614853602083018661406c565b61486060408301856147b5565b8181036060830152614872818461415d565b905095945050505050565b6000606082019050614892600083018661406c565b61489f60208301856147b5565b81810360408301526148b1818461427f565b9050949350505050565b600060208201905081810360008301526148d5818461407b565b905092915050565b600060208201905081810360008301526148f781846140f0565b905092915050565b6000602082019050614914600083018461414e565b92915050565b60006020820190508181036000830152614934818461427f565b905092915050565b6000602082019050818103600083015261495681846142e9565b905092915050565b6000602082019050818103600083015261497781614369565b9050919050565b600060208201905081810360008301526149978161438c565b9050919050565b600060208201905081810360008301526149b7816143af565b9050919050565b600060208201905081810360008301526149d7816143d2565b9050919050565b600060208201905081810360008301526149f7816143f5565b9050919050565b60006020820190508181036000830152614a1781614418565b9050919050565b60006020820190508181036000830152614a378161443b565b9050919050565b60006020820190508181036000830152614a578161445e565b9050919050565b60006020820190508181036000830152614a7781614481565b9050919050565b60006020820190508181036000830152614a97816144a4565b9050919050565b60006020820190508181036000830152614ab7816144c7565b9050919050565b60006020820190508181036000830152614ad7816144ea565b9050919050565b60006020820190508181036000830152614af78161450d565b9050919050565b60006020820190508181036000830152614b1781614530565b9050919050565b60006020820190508181036000830152614b3781614553565b9050919050565b60006020820190508181036000830152614b5781614576565b9050919050565b60006020820190508181036000830152614b7781614599565b9050919050565b60006020820190508181036000830152614b97816145bc565b9050919050565b60006020820190508181036000830152614bb7816145df565b9050919050565b60006020820190508181036000830152614bd781614602565b9050919050565b60006020820190508181036000830152614bf781614625565b9050919050565b60006020820190508181036000830152614c1781614648565b9050919050565b60006020820190508181036000830152614c378161466b565b9050919050565b60006020820190508181036000830152614c578161468e565b9050919050565b60006020820190508181036000830152614c77816146b1565b9050919050565b60006020820190508181036000830152614c97816146d4565b9050919050565b60006020820190508181036000830152614cb7816146f7565b9050919050565b60006020820190508181036000830152614cd78161471a565b9050919050565b60006020820190508181036000830152614cf78161473d565b9050919050565b60006020820190508181036000830152614d1781614760565b9050919050565b60006020820190508181036000830152614d3781614783565b9050919050565b6000602082019050614d5360008301846147b5565b92915050565b6000614d63614d74565b9050614d6f82826150e2565b919050565b6000604051905090565b600067ffffffffffffffff821115614d9957614d9861521a565b5b614da282615249565b9050602081019050919050565b600067ffffffffffffffff821115614dca57614dc961521a565b5b614dd382615249565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ee682615064565b9150614ef183615064565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f2657614f2561518d565b5b828201905092915050565b6000614f3c82615064565b9150614f4783615064565b925082614f5757614f566151bc565b5b828204905092915050565b6000614f6d82615064565b9150614f7883615064565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fb157614fb061518d565b5b828202905092915050565b6000614fc782615064565b9150614fd283615064565b925082821015614fe557614fe461518d565b5b828203905092915050565b6000614ffb82615044565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561509b578082015181840152602081019050615080565b838111156150aa576000848401525b50505050565b600060028204905060018216806150c857607f821691505b602082108114156150dc576150db6151eb565b5b50919050565b6150eb82615249565b810181811067ffffffffffffffff8211171561510a5761510961521a565b5b80604052505050565b600061511e82615064565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151515761515061518d565b5b600182019050919050565b600061516782615064565b915061517283615064565b925082615182576151816151bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f43484f4f5345204120504f535345204d454d4245522057495448494e2052414e60008201527f4745000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204d656d62657273000000000000000000000000000000000000000000602082015250565b7f43686f6f7365206120706f737365206d656d6265722077697468696e2072616e60008201527f6765000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420706f737360008201527f65206d656d626572730000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008201527f7320747265652100000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6577206e616d652069732073616d65206173207468652063757272656e742060008201527f6f6e650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615a9e81614ff0565b8114615aa957600080fd5b50565b615ab581615002565b8114615ac057600080fd5b50565b615acc8161500e565b8114615ad757600080fd5b50565b615ae381615018565b8114615aee57600080fd5b50565b615afa81615064565b8114615b0557600080fd5b5056fea2646970667358221220840879af40d5ec9f945e1a8d947727129d1b61a3630a4f537ebc251042bf92d564736f6c63430008040033

Deployed Bytecode Sourcemap

50337:7188:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57308:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29543:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31102:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30625:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53969:702;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52003:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42689:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31852:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42357:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52476:89;;;;;;;;;;;;;:::i;:::-;;51444:140;;;;;;;;;;;;;:::i;:::-;;56673:65;;;;;;;;;;;;;:::i;:::-;;32262:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42879:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52373:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5614:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29237:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50699:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28967:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8513:103;;;;;;;;;;;;;:::i;:::-;;56604:61;;;;;;;;;;;;;:::i;:::-;;52573:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55102:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7862:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29712:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51071:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50572;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55449:557;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31395:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53572:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32518:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50527:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53408:125;;;;;;;;;;;;;:::i;:::-;;54679:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57104:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51243:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53160:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50776:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50958;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31621:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50827:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50878:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51592:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8771:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57308:212;57447:4;57476:36;57500:11;57476:23;:36::i;:::-;57469:43;;57308:212;;;:::o;29543:100::-;29597:13;29630:5;29623:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29543:100;:::o;31102:221::-;31178:7;31206:16;31214:7;31206;:16::i;:::-;31198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31291:15;:24;31307:7;31291:24;;;;;;;;;;;;;;;;;;;;;31284:31;;31102:221;;;:::o;30625:411::-;30706:13;30722:23;30737:7;30722:14;:23::i;:::-;30706:39;;30770:5;30764:11;;:2;:11;;;;30756:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30864:5;30848:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30873:37;30890:5;30897:12;:10;:12::i;:::-;30873:16;:37::i;:::-;30848:62;30826:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31007:21;31016:2;31020:7;31007:8;:21::i;:::-;30625:411;;;:::o;53969:702::-;54049:12;;;;;;;;;;;54041:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54143:1;54126:14;:18;:57;;;;;50817:1;54148:14;:35;;54126:57;54118:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50865:4;54256:14;54240:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:45;;54232:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;54379:14;50737:17;54365:28;;;;:::i;:::-;54352:9;:41;;54344:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;54454:6;54450:212;54470:14;54466:1;:18;54450:212;;;54506:14;54523:13;:11;:13::i;:::-;54506:30;;50865:4;54555:13;:11;:13::i;:::-;:27;54551:100;;;54603:32;54613:10;54625:9;54603;:32::i;:::-;54551:100;54450:212;54486:3;;;;;:::i;:::-;;;;54450:212;;;;53969:702;:::o;52003:127::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52108:14:::1;52088:17;:34;;;;;;;;;;;;:::i;:::-;;52003:127:::0;:::o;42689:113::-;42750:7;42777:10;:17;;;;42770:24;;42689:113;:::o;31852:339::-;32047:41;32066:12;:10;:12::i;:::-;32080:7;32047:18;:41::i;:::-;32039:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32155:28;32165:4;32171:2;32175:7;32155:9;:28::i;:::-;31852:339;;;:::o;42357:256::-;42454:7;42490:23;42507:5;42490:16;:23::i;:::-;42482:5;:31;42474:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42579:12;:19;42592:5;42579:19;;;;;;;;;;;;;;;:26;42599:5;42579:26;;;;;;;;;;;;42572:33;;42357:256;;;;:::o;52476:89::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52545:12:::1;;;;;;;;;;;52544:13;52529:12;;:28;;;;;;;;;;;;;;;;;;52476:89::o:0;51444:140::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51492:12:::1;51507:21;51492:36;;51547:10;51539:28;;:37;51568:7;51539:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;8153:1;51444:140::o:0;56673:65::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56720:10:::1;:8;:10::i;:::-;56673:65::o:0;32262:185::-;32400:39;32417:4;32423:2;32427:7;32400:39;;;;;;;;;;;;:16;:39::i;:::-;32262:185;;;:::o;42879:233::-;42954:7;42990:30;:28;:30::i;:::-;42982:5;:38;42974:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43087:10;43098:5;43087:17;;;;;;;;;;;;;;;;;;;;;;;;43080:24;;42879:233;;;:::o;52373:93::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52440:20:::1;52452:7;52440:11;:20::i;:::-;52373:93:::0;:::o;5614:86::-;5661:4;5685:7;;;;;;;;;;;5678:14;;5614:86;:::o;29237:239::-;29309:7;29329:13;29345:7;:16;29353:7;29345:16;;;;;;;;;;;;;;;;;;;;;29329:32;;29397:1;29380:19;;:5;:19;;;;29372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29463:5;29456:12;;;29237:239;;;:::o;50699:55::-;50737:17;50699:55;:::o;28967:208::-;29039:7;29084:1;29067:19;;:5;:19;;;;29059:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29151:9;:16;29161:5;29151:16;;;;;;;;;;;;;;;;29144:23;;28967:208;;;:::o;8513:103::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8578:30:::1;8605:1;8578:18;:30::i;:::-;8513:103::o:0;56604:61::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56649:8:::1;:6;:8::i;:::-;56604:61::o:0;52573:540::-;52634:16;52664:18;52685:17;52695:6;52685:9;:17::i;:::-;52664:38;;52731:1;52717:10;:15;52713:393;;;52808:1;52794:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52787:23;;;;;52713:393;52843:23;52883:10;52869:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52843:51;;52909:13;52937:130;52961:10;52953:5;:18;52937:130;;;53017:34;53037:6;53045:5;53017:19;:34::i;:::-;53001:6;53008:5;53001:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;52973:7;;;;;:::i;:::-;;;;52937:130;;;53088:6;53081:13;;;;;52573:540;;;;:::o;55102:206::-;55162:13;55208;:11;:13::i;:::-;55197:8;:24;55188:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55279:11;:21;55291:8;55279:21;;;;;;;;;;;55272:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55102:206;;;:::o;7862:87::-;7908:7;7935:6;;;;;;;;;;;7928:13;;7862:87;:::o;29712:104::-;29768:13;29801:7;29794:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29712:104;:::o;51071:31::-;;;;:::o;50572:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55449:557::-;55515:15;55544:18;55565:17;55575:6;55565:9;:17::i;:::-;55544:38;;55611:1;55597:10;:15;55593:406;;;55687:1;55674:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55667:22;;;;;55593:406;55722:22;55760:10;55747:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55722:49;;55786:13;55814:146;55838:10;55830:5;:18;55814:146;;;55894:11;:49;55907:34;55927:6;55935:5;55907:19;:34::i;:::-;55894:49;;;;;;;;;;;55878:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;55885:5;55878:13;;;;;;;;;;;;;;;;;;;;;:65;;;;55850:7;;;;;:::i;:::-;;;;55814:146;;;55981:6;55974:13;;;;;55449:557;;;;:::o;31395:155::-;31490:52;31509:12;:10;:12::i;:::-;31523:8;31533;31490:18;:52::i;:::-;31395:155;;:::o;53572:174::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53672:5:::1;53655:22;;:13;;;;;;;;;;;:22;;;53647:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53730:8;53715:12;:23;;;;;;;;;;;;:::i;:::-;;53572:174:::0;:::o;32518:328::-;32693:41;32712:12;:10;:12::i;:::-;32726:7;32693:18;:41::i;:::-;32685:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32799:39;32813:4;32819:2;32823:7;32832:5;32799:13;:39::i;:::-;32518:328;;;;:::o;50527:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53408:125::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53476:4:::1;53459:13;;:21;;;;;;;;;;;;;;;;;;53496:29;53512:12;53496:29;;;;;;:::i;:::-;;;;;;;;53408:125::o:0;54679:411::-;54788:10;54767:31;;:17;54775:8;54767:7;:17::i;:::-;:31;;;54759:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54885:36;54898:11;:21;54910:8;54898:21;;;;;;;;;;;54885:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54861:20;54874:5;54861:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;54853:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;54996:5;54972:11;:21;54984:8;54972:21;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;55027:45;55044:10;55056:8;55066:5;55027:45;;;;;;;;:::i;:::-;;;;;;;;54679:411;;:::o;57104:196::-;57231:13;57269:23;57284:7;57269:14;:23::i;:::-;57262:30;;57104:196;;;:::o;51243:27::-;;;;:::o;53160:182::-;53212:13;53252;:11;:13::i;:::-;53246:3;:19;53238:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53322:12;53315:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53160:182;;;:::o;50776:42::-;50817:1;50776:42;:::o;50958:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31621:164::-;31718:4;31742:18;:25;31761:5;31742:25;;;;;;;;;;;;;;;:35;31768:8;31742:35;;;;;;;;;;;;;;;;;;;;;;;;;31735:42;;31621:164;;;;:::o;50827:42::-;50865:4;50827:42;:::o;50878:32::-;;;;;;;;;;;;;:::o;51592:403::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51689:11:::1;51703:13;:11;:13::i;:::-;51689:27;;51752:1;51735:14;:18;:53;;;;;51775:13;;51757:14;:31;;51735:53;51727:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;51841:6;51836:95;51857:14;51853:1;:18;51836:95;;;51893:26;51903:3;51917:1;51908:6;:10;;;;:::i;:::-;51893:9;:26::i;:::-;51873:3;;;;;:::i;:::-;;;;51836:95;;;;51973:14;51957:13;;:30;;;;:::i;:::-;51941:13;:46;;;;8153:1;51592:403:::0;;:::o;8771:201::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8880:1:::1;8860:22;;:8;:22;;;;8852:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8936:28;8955:8;8936:18;:28::i;:::-;8771:201:::0;:::o;42049:224::-;42151:4;42190:35;42175:50;;;:11;:50;;;;:90;;;;42229:36;42253:11;42229:23;:36::i;:::-;42175:90;42168:97;;42049:224;;;:::o;34356:127::-;34421:4;34473:1;34445:30;;:7;:16;34453:7;34445:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34438:37;;34356:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;38338:174::-;38440:2;38413:15;:24;38429:7;38413:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38496:7;38492:2;38458:46;;38467:23;38482:7;38467:14;:23::i;:::-;38458:46;;;;;;;;;;;;38338:174;;:::o;35340:110::-;35416:26;35426:2;35430:7;35416:26;;;;;;;;;;;;:9;:26::i;:::-;35340:110;;:::o;34650:348::-;34743:4;34768:16;34776:7;34768;:16::i;:::-;34760:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34844:13;34860:23;34875:7;34860:14;:23::i;:::-;34844:39;;34913:5;34902:16;;:7;:16;;;:51;;;;34946:7;34922:31;;:20;34934:7;34922:11;:20::i;:::-;:31;;;34902:51;:87;;;;34957:32;34974:5;34981:7;34957:16;:32::i;:::-;34902:87;34894:96;;;34650:348;;;;:::o;37642:578::-;37801:4;37774:31;;:23;37789:7;37774:14;:23::i;:::-;:31;;;37766:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37884:1;37870:16;;:2;:16;;;;37862:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37940:39;37961:4;37967:2;37971:7;37940:20;:39::i;:::-;38044:29;38061:1;38065:7;38044:8;:29::i;:::-;38105:1;38086:9;:15;38096:4;38086:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38134:1;38117:9;:13;38127:2;38117:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38165:2;38146:7;:16;38154:7;38146:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38204:7;38200:2;38185:27;;38194:4;38185:27;;;;;;;;;;;;37642:578;;;:::o;6673:120::-;6217:8;:6;:8::i;:::-;6209:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;6742:5:::1;6732:7;;:15;;;;;;;;;;;;;;;;;;6763:22;6772:12;:10;:12::i;:::-;6763:22;;;;;;:::i;:::-;;;;;;;;6673:120::o:0;52138:97::-;52222:7;52206:13;:23;;;;;;;;;;;;:::i;:::-;;52138:97;:::o;9132:191::-;9206:16;9225:6;;;;;;;;;;;9206:25;;9251:8;9242:6;;:17;;;;;;;;;;;;;;;;;;9306:8;9275:40;;9296:8;9275:40;;;;;;;;;;;;9132:191;;:::o;6414:118::-;5940:8;:6;:8::i;:::-;5939:9;5931:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;6484:4:::1;6474:7;;:14;;;;;;;;;;;;;;;;;;6504:20;6511:12;:10;:12::i;:::-;6504:20;;;;;;:::i;:::-;;;;;;;;6414:118::o:0;38654:315::-;38809:8;38800:17;;:5;:17;;;;38792:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38896:8;38858:18;:25;38877:5;38858:25;;;;;;;;;;;;;;;:35;38884:8;38858:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38942:8;38920:41;;38935:5;38920:41;;;38952:8;38920:41;;;;;;:::i;:::-;;;;;;;;38654:315;;;:::o;33728:::-;33885:28;33895:4;33901:2;33905:7;33885:9;:28::i;:::-;33932:48;33955:4;33961:2;33965:7;33974:5;33932:22;:48::i;:::-;33924:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33728:315;;;;:::o;48708:679::-;48781:13;48815:16;48823:7;48815;:16::i;:::-;48807:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48898:23;48924:10;:19;48935:7;48924:19;;;;;;;;;;;48898:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48954:18;48975:10;:8;:10::i;:::-;48954:31;;49083:1;49067:4;49061:18;:23;49057:72;;;49108:9;49101:16;;;;;;49057:72;49259:1;49239:9;49233:23;:27;49229:108;;;49308:4;49314:9;49291:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49277:48;;;;;;49229:108;49356:23;49371:7;49356:14;:23::i;:::-;49349:30;;;;48708:679;;;;:::o;28598:305::-;28700:4;28752:25;28737:40;;;:11;:40;;;;:105;;;;28809:33;28794:48;;;:11;:48;;;;28737:105;:158;;;;28859:36;28883:11;28859:23;:36::i;:::-;28737:158;28717:178;;28598:305;;;:::o;35677:321::-;35807:18;35813:2;35817:7;35807:5;:18::i;:::-;35858:54;35889:1;35893:2;35897:7;35906:5;35858:22;:54::i;:::-;35836:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35677:321;;;:::o;56746:227::-;5940:8;:6;:8::i;:::-;5939:9;5931:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56920:45:::1;56947:4;56953:2;56957:7;56920:26;:45::i;:::-;56746:227:::0;;;:::o;39534:799::-;39689:4;39710:15;:2;:13;;;:15::i;:::-;39706:620;;;39762:2;39746:36;;;39783:12;:10;:12::i;:::-;39797:4;39803:7;39812:5;39746:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39742:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40005:1;39988:6;:13;:18;39984:272;;;40031:60;;;;;;;;;;:::i;:::-;;;;;;;;39984:272;40206:6;40200:13;40191:6;40187:2;40183:15;40176:38;39742:529;39879:41;;;39869:51;;;:6;:51;;;;39862:58;;;;;39706:620;40310:4;40303:11;;39534:799;;;;;;;:::o;52241:100::-;52293:13;52322;52315:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52241:100;:::o;29887:334::-;29960:13;29994:16;30002:7;29994;:16::i;:::-;29986:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30075:21;30099:10;:8;:10::i;:::-;30075:34;;30151:1;30133:7;30127:21;:25;:86;;;;;;;;;;;;;;;;;30179:7;30188:18;:7;:16;:18::i;:::-;30162:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30127:86;30120:93;;;29887:334;;;:::o;20294:157::-;20379:4;20418:25;20403:40;;;:11;:40;;;;20396:47;;20294:157;;;:::o;36334:382::-;36428:1;36414:16;;:2;:16;;;;36406:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36487:16;36495:7;36487;:16::i;:::-;36486:17;36478:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36549:45;36578:1;36582:2;36586:7;36549:20;:45::i;:::-;36624:1;36607:9;:13;36617:2;36607:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36655:2;36636:7;:16;36644:7;36636:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36700:7;36696:2;36675:33;;36692:1;36675:33;;;;;;;;;;;;36334:382;;:::o;43725:589::-;43869:45;43896:4;43902:2;43906:7;43869:26;:45::i;:::-;43947:1;43931:18;;:4;:18;;;43927:187;;;43966:40;43998:7;43966:31;:40::i;:::-;43927:187;;;44036:2;44028:10;;:4;:10;;;44024:90;;44055:47;44088:4;44094:7;44055:32;:47::i;:::-;44024:90;43927:187;44142:1;44128:16;;:2;:16;;;44124:183;;;44161:45;44198:7;44161:36;:45::i;:::-;44124:183;;;44234:4;44228:10;;:2;:10;;;44224:83;;44255:40;44283:2;44287:7;44255:27;:40::i;:::-;44224:83;44124:183;43725:589;;;:::o;10150:387::-;10210:4;10418:12;10485:7;10473:20;10465:28;;10528:1;10521:4;:8;10514:15;;;10150:387;;;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;40905:126::-;;;;:::o;45037:164::-;45141:10;:17;;;;45114:15;:24;45130:7;45114:24;;;;;;;;;;;:44;;;;45169:10;45185:7;45169:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45037:164;:::o;45828:988::-;46094:22;46144:1;46119:22;46136:4;46119:16;:22::i;:::-;:26;;;;:::i;:::-;46094:51;;46156:18;46177:17;:26;46195:7;46177:26;;;;;;;;;;;;46156:47;;46324:14;46310:10;:28;46306:328;;46355:19;46377:12;:18;46390:4;46377:18;;;;;;;;;;;;;;;:34;46396:14;46377:34;;;;;;;;;;;;46355:56;;46461:11;46428:12;:18;46441:4;46428:18;;;;;;;;;;;;;;;:30;46447:10;46428:30;;;;;;;;;;;:44;;;;46578:10;46545:17;:30;46563:11;46545:30;;;;;;;;;;;:43;;;;46306:328;;46730:17;:26;46748:7;46730:26;;;;;;;;;;;46723:33;;;46774:12;:18;46787:4;46774:18;;;;;;;;;;;;;;;:34;46793:14;46774:34;;;;;;;;;;;46767:41;;;45828:988;;;;:::o;47111:1079::-;47364:22;47409:1;47389:10;:17;;;;:21;;;;:::i;:::-;47364:46;;47421:18;47442:15;:24;47458:7;47442:24;;;;;;;;;;;;47421:45;;47793:19;47815:10;47826:14;47815:26;;;;;;;;;;;;;;;;;;;;;;;;47793:48;;47879:11;47854:10;47865;47854:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;47990:10;47959:15;:28;47975:11;47959:28;;;;;;;;;;;:41;;;;48131:15;:24;48147:7;48131:24;;;;;;;;;;;48124:31;;;48166:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47111:1079;;;;:::o;44615:221::-;44700:14;44717:20;44734:2;44717:16;:20::i;:::-;44700:37;;44775:7;44748:12;:16;44761:2;44748:16;;;;;;;;;;;;;;;:24;44765:6;44748:24;;;;;;;;;;;:34;;;;44822:6;44793:17;:26;44811:7;44793:26;;;;;;;;;;;:35;;;;44615:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:143::-;1048:5;1079:6;1073:13;1064:22;;1095:33;1122:5;1095:33;:::i;:::-;1054:80;;;;:::o;1140:137::-;1185:5;1223:6;1210:20;1201:29;;1239:32;1265:5;1239:32;:::i;:::-;1191:86;;;;:::o;1283:141::-;1339:5;1370:6;1364:13;1355:22;;1386:32;1412:5;1386:32;:::i;:::-;1345:79;;;;:::o;1443:271::-;1498:5;1547:3;1540:4;1532:6;1528:17;1524:27;1514:2;;1565:1;1562;1555:12;1514:2;1605:6;1592:20;1630:78;1704:3;1696:6;1689:4;1681:6;1677:17;1630:78;:::i;:::-;1621:87;;1504:210;;;;;:::o;1734:273::-;1790:5;1839:3;1832:4;1824:6;1820:17;1816:27;1806:2;;1857:1;1854;1847:12;1806:2;1897:6;1884:20;1922:79;1997:3;1989:6;1982:4;1974:6;1970:17;1922:79;:::i;:::-;1913:88;;1796:211;;;;;:::o;2013:139::-;2059:5;2097:6;2084:20;2075:29;;2113:33;2140:5;2113:33;:::i;:::-;2065:87;;;;:::o;2158:262::-;2217:6;2266:2;2254:9;2245:7;2241:23;2237:32;2234:2;;;2282:1;2279;2272:12;2234:2;2325:1;2350:53;2395:7;2386:6;2375:9;2371:22;2350:53;:::i;:::-;2340:63;;2296:117;2224:196;;;;:::o;2426:407::-;2494:6;2502;2551:2;2539:9;2530:7;2526:23;2522:32;2519:2;;;2567:1;2564;2557:12;2519:2;2610:1;2635:53;2680:7;2671:6;2660:9;2656:22;2635:53;:::i;:::-;2625:63;;2581:117;2737:2;2763:53;2808:7;2799:6;2788:9;2784:22;2763:53;:::i;:::-;2753:63;;2708:118;2509:324;;;;;:::o;2839:552::-;2916:6;2924;2932;2981:2;2969:9;2960:7;2956:23;2952:32;2949:2;;;2997:1;2994;2987:12;2949:2;3040:1;3065:53;3110:7;3101:6;3090:9;3086:22;3065:53;:::i;:::-;3055:63;;3011:117;3167:2;3193:53;3238:7;3229:6;3218:9;3214:22;3193:53;:::i;:::-;3183:63;;3138:118;3295:2;3321:53;3366:7;3357:6;3346:9;3342:22;3321:53;:::i;:::-;3311:63;;3266:118;2939:452;;;;;:::o;3397:809::-;3492:6;3500;3508;3516;3565:3;3553:9;3544:7;3540:23;3536:33;3533:2;;;3582:1;3579;3572:12;3533:2;3625:1;3650:53;3695:7;3686:6;3675:9;3671:22;3650:53;:::i;:::-;3640:63;;3596:117;3752:2;3778:53;3823:7;3814:6;3803:9;3799:22;3778:53;:::i;:::-;3768:63;;3723:118;3880:2;3906:53;3951:7;3942:6;3931:9;3927:22;3906:53;:::i;:::-;3896:63;;3851:118;4036:2;4025:9;4021:18;4008:32;4067:18;4059:6;4056:30;4053:2;;;4099:1;4096;4089:12;4053:2;4127:62;4181:7;4172:6;4161:9;4157:22;4127:62;:::i;:::-;4117:72;;3979:220;3523:683;;;;;;;:::o;4212:401::-;4277:6;4285;4334:2;4322:9;4313:7;4309:23;4305:32;4302:2;;;4350:1;4347;4340:12;4302:2;4393:1;4418:53;4463:7;4454:6;4443:9;4439:22;4418:53;:::i;:::-;4408:63;;4364:117;4520:2;4546:50;4588:7;4579:6;4568:9;4564:22;4546:50;:::i;:::-;4536:60;;4491:115;4292:321;;;;;:::o;4619:407::-;4687:6;4695;4744:2;4732:9;4723:7;4719:23;4715:32;4712:2;;;4760:1;4757;4750:12;4712:2;4803:1;4828:53;4873:7;4864:6;4853:9;4849:22;4828:53;:::i;:::-;4818:63;;4774:117;4930:2;4956:53;5001:7;4992:6;4981:9;4977:22;4956:53;:::i;:::-;4946:63;;4901:118;4702:324;;;;;:::o;5032:284::-;5102:6;5151:2;5139:9;5130:7;5126:23;5122:32;5119:2;;;5167:1;5164;5157:12;5119:2;5210:1;5235:64;5291:7;5282:6;5271:9;5267:22;5235:64;:::i;:::-;5225:74;;5181:128;5109:207;;;;:::o;5322:260::-;5380:6;5429:2;5417:9;5408:7;5404:23;5400:32;5397:2;;;5445:1;5442;5435:12;5397:2;5488:1;5513:52;5557:7;5548:6;5537:9;5533:22;5513:52;:::i;:::-;5503:62;;5459:116;5387:195;;;;:::o;5588:282::-;5657:6;5706:2;5694:9;5685:7;5681:23;5677:32;5674:2;;;5722:1;5719;5712:12;5674:2;5765:1;5790:63;5845:7;5836:6;5825:9;5821:22;5790:63;:::i;:::-;5780:73;;5736:127;5664:206;;;;:::o;5876:375::-;5945:6;5994:2;5982:9;5973:7;5969:23;5965:32;5962:2;;;6010:1;6007;6000:12;5962:2;6081:1;6070:9;6066:17;6053:31;6111:18;6103:6;6100:30;6097:2;;;6143:1;6140;6133:12;6097:2;6171:63;6226:7;6217:6;6206:9;6202:22;6171:63;:::i;:::-;6161:73;;6024:220;5952:299;;;;:::o;6257:262::-;6316:6;6365:2;6353:9;6344:7;6340:23;6336:32;6333:2;;;6381:1;6378;6371:12;6333:2;6424:1;6449:53;6494:7;6485:6;6474:9;6470:22;6449:53;:::i;:::-;6439:63;;6395:117;6323:196;;;;:::o;6525:520::-;6603:6;6611;6660:2;6648:9;6639:7;6635:23;6631:32;6628:2;;;6676:1;6673;6666:12;6628:2;6719:1;6744:53;6789:7;6780:6;6769:9;6765:22;6744:53;:::i;:::-;6734:63;;6690:117;6874:2;6863:9;6859:18;6846:32;6905:18;6897:6;6894:30;6891:2;;;6937:1;6934;6927:12;6891:2;6965:63;7020:7;7011:6;7000:9;6996:22;6965:63;:::i;:::-;6955:73;;6817:221;6618:427;;;;;:::o;7051:196::-;7140:10;7175:66;7237:3;7229:6;7175:66;:::i;:::-;7161:80;;7151:96;;;;:::o;7253:179::-;7322:10;7343:46;7385:3;7377:6;7343:46;:::i;:::-;7421:4;7416:3;7412:14;7398:28;;7333:99;;;;:::o;7438:118::-;7525:24;7543:5;7525:24;:::i;:::-;7520:3;7513:37;7503:53;;:::o;7590:991::-;7729:3;7758:64;7816:5;7758:64;:::i;:::-;7838:96;7927:6;7922:3;7838:96;:::i;:::-;7831:103;;7960:3;8005:4;7997:6;7993:17;7988:3;7984:27;8035:66;8095:5;8035:66;:::i;:::-;8124:7;8155:1;8140:396;8165:6;8162:1;8159:13;8140:396;;;8236:9;8230:4;8226:20;8221:3;8214:33;8287:6;8281:13;8315:84;8394:4;8379:13;8315:84;:::i;:::-;8307:92;;8422:70;8485:6;8422:70;:::i;:::-;8412:80;;8521:4;8516:3;8512:14;8505:21;;8200:336;8187:1;8184;8180:9;8175:14;;8140:396;;;8144:14;8552:4;8545:11;;8572:3;8565:10;;7734:847;;;;;;;;;:::o;8617:732::-;8736:3;8765:54;8813:5;8765:54;:::i;:::-;8835:86;8914:6;8909:3;8835:86;:::i;:::-;8828:93;;8945:56;8995:5;8945:56;:::i;:::-;9024:7;9055:1;9040:284;9065:6;9062:1;9059:13;9040:284;;;9141:6;9135:13;9168:63;9227:3;9212:13;9168:63;:::i;:::-;9161:70;;9254:60;9307:6;9254:60;:::i;:::-;9244:70;;9100:224;9087:1;9084;9080:9;9075:14;;9040:284;;;9044:14;9340:3;9333:10;;8741:608;;;;;;;:::o;9355:109::-;9436:21;9451:5;9436:21;:::i;:::-;9431:3;9424:34;9414:50;;:::o;9470:360::-;9556:3;9584:38;9616:5;9584:38;:::i;:::-;9638:70;9701:6;9696:3;9638:70;:::i;:::-;9631:77;;9717:52;9762:6;9757:3;9750:4;9743:5;9739:16;9717:52;:::i;:::-;9794:29;9816:6;9794:29;:::i;:::-;9789:3;9785:39;9778:46;;9560:270;;;;;:::o;9836:373::-;9940:3;9968:38;10000:5;9968:38;:::i;:::-;10022:88;10103:6;10098:3;10022:88;:::i;:::-;10015:95;;10119:52;10164:6;10159:3;10152:4;10145:5;10141:16;10119:52;:::i;:::-;10196:6;10191:3;10187:16;10180:23;;9944:265;;;;;:::o;10237:849::-;10342:3;10379:5;10373:12;10408:36;10434:9;10408:36;:::i;:::-;10460:88;10541:6;10536:3;10460:88;:::i;:::-;10453:95;;10579:1;10568:9;10564:17;10595:1;10590:137;;;;10741:1;10736:344;;;;10557:523;;10590:137;10674:4;10670:9;10659;10655:25;10650:3;10643:38;10710:6;10705:3;10701:16;10694:23;;10590:137;;10736:344;10803:41;10838:5;10803:41;:::i;:::-;10866:1;10880:154;10894:6;10891:1;10888:13;10880:154;;;10968:7;10962:14;10958:1;10953:3;10949:11;10942:35;11018:1;11009:7;11005:15;10994:26;;10916:4;10913:1;10909:12;10904:17;;10880:154;;;11063:6;11058:3;11054:16;11047:23;;10743:337;;10557:523;;10346:740;;;;;;:::o;11092:344::-;11170:3;11198:39;11231:5;11198:39;:::i;:::-;11253:61;11307:6;11302:3;11253:61;:::i;:::-;11246:68;;11323:52;11368:6;11363:3;11356:4;11349:5;11345:16;11323:52;:::i;:::-;11400:29;11422:6;11400:29;:::i;:::-;11395:3;11391:39;11384:46;;11174:262;;;;;:::o;11442:364::-;11530:3;11558:39;11591:5;11558:39;:::i;:::-;11613:71;11677:6;11672:3;11613:71;:::i;:::-;11606:78;;11693:52;11738:6;11733:3;11726:4;11719:5;11715:16;11693:52;:::i;:::-;11770:29;11792:6;11770:29;:::i;:::-;11765:3;11761:39;11754:46;;11534:272;;;;;:::o;11812:377::-;11918:3;11946:39;11979:5;11946:39;:::i;:::-;12001:89;12083:6;12078:3;12001:89;:::i;:::-;11994:96;;12099:52;12144:6;12139:3;12132:4;12125:5;12121:16;12099:52;:::i;:::-;12176:6;12171:3;12167:16;12160:23;;11922:267;;;;;:::o;12219:802::-;12304:3;12341:5;12335:12;12370:36;12396:9;12370:36;:::i;:::-;12422:71;12486:6;12481:3;12422:71;:::i;:::-;12415:78;;12524:1;12513:9;12509:17;12540:1;12535:135;;;;12684:1;12679:336;;;;12502:513;;12535:135;12619:4;12615:9;12604;12600:25;12595:3;12588:38;12655:4;12650:3;12646:14;12639:21;;12535:135;;12679:336;12746:38;12778:5;12746:38;:::i;:::-;12806:1;12820:154;12834:6;12831:1;12828:13;12820:154;;;12908:7;12902:14;12898:1;12893:3;12889:11;12882:35;12958:1;12949:7;12945:15;12934:26;;12856:4;12853:1;12849:12;12844:17;;12820:154;;;13003:1;12998:3;12994:11;12987:18;;12686:329;;12502:513;;12308:713;;;;;;:::o;13027:366::-;13169:3;13190:67;13254:2;13249:3;13190:67;:::i;:::-;13183:74;;13266:93;13355:3;13266:93;:::i;:::-;13384:2;13379:3;13375:12;13368:19;;13173:220;;;:::o;13399:366::-;13541:3;13562:67;13626:2;13621:3;13562:67;:::i;:::-;13555:74;;13638:93;13727:3;13638:93;:::i;:::-;13756:2;13751:3;13747:12;13740:19;;13545:220;;;:::o;13771:366::-;13913:3;13934:67;13998:2;13993:3;13934:67;:::i;:::-;13927:74;;14010:93;14099:3;14010:93;:::i;:::-;14128:2;14123:3;14119:12;14112:19;;13917:220;;;:::o;14143:366::-;14285:3;14306:67;14370:2;14365:3;14306:67;:::i;:::-;14299:74;;14382:93;14471:3;14382:93;:::i;:::-;14500:2;14495:3;14491:12;14484:19;;14289:220;;;:::o;14515:366::-;14657:3;14678:67;14742:2;14737:3;14678:67;:::i;:::-;14671:74;;14754:93;14843:3;14754:93;:::i;:::-;14872:2;14867:3;14863:12;14856:19;;14661:220;;;:::o;14887:366::-;15029:3;15050:67;15114:2;15109:3;15050:67;:::i;:::-;15043:74;;15126:93;15215:3;15126:93;:::i;:::-;15244:2;15239:3;15235:12;15228:19;;15033:220;;;:::o;15259:366::-;15401:3;15422:67;15486:2;15481:3;15422:67;:::i;:::-;15415:74;;15498:93;15587:3;15498:93;:::i;:::-;15616:2;15611:3;15607:12;15600:19;;15405:220;;;:::o;15631:366::-;15773:3;15794:67;15858:2;15853:3;15794:67;:::i;:::-;15787:74;;15870:93;15959:3;15870:93;:::i;:::-;15988:2;15983:3;15979:12;15972:19;;15777:220;;;:::o;16003:366::-;16145:3;16166:67;16230:2;16225:3;16166:67;:::i;:::-;16159:74;;16242:93;16331:3;16242:93;:::i;:::-;16360:2;16355:3;16351:12;16344:19;;16149:220;;;:::o;16375:366::-;16517:3;16538:67;16602:2;16597:3;16538:67;:::i;:::-;16531:74;;16614:93;16703:3;16614:93;:::i;:::-;16732:2;16727:3;16723:12;16716:19;;16521:220;;;:::o;16747:366::-;16889:3;16910:67;16974:2;16969:3;16910:67;:::i;:::-;16903:74;;16986:93;17075:3;16986:93;:::i;:::-;17104:2;17099:3;17095:12;17088:19;;16893:220;;;:::o;17119:366::-;17261:3;17282:67;17346:2;17341:3;17282:67;:::i;:::-;17275:74;;17358:93;17447:3;17358:93;:::i;:::-;17476:2;17471:3;17467:12;17460:19;;17265:220;;;:::o;17491:366::-;17633:3;17654:67;17718:2;17713:3;17654:67;:::i;:::-;17647:74;;17730:93;17819:3;17730:93;:::i;:::-;17848:2;17843:3;17839:12;17832:19;;17637:220;;;:::o;17863:366::-;18005:3;18026:67;18090:2;18085:3;18026:67;:::i;:::-;18019:74;;18102:93;18191:3;18102:93;:::i;:::-;18220:2;18215:3;18211:12;18204:19;;18009:220;;;:::o;18235:366::-;18377:3;18398:67;18462:2;18457:3;18398:67;:::i;:::-;18391:74;;18474:93;18563:3;18474:93;:::i;:::-;18592:2;18587:3;18583:12;18576:19;;18381:220;;;:::o;18607:366::-;18749:3;18770:67;18834:2;18829:3;18770:67;:::i;:::-;18763:74;;18846:93;18935:3;18846:93;:::i;:::-;18964:2;18959:3;18955:12;18948:19;;18753:220;;;:::o;18979:366::-;19121:3;19142:67;19206:2;19201:3;19142:67;:::i;:::-;19135:74;;19218:93;19307:3;19218:93;:::i;:::-;19336:2;19331:3;19327:12;19320:19;;19125:220;;;:::o;19351:366::-;19493:3;19514:67;19578:2;19573:3;19514:67;:::i;:::-;19507:74;;19590:93;19679:3;19590:93;:::i;:::-;19708:2;19703:3;19699:12;19692:19;;19497:220;;;:::o;19723:366::-;19865:3;19886:67;19950:2;19945:3;19886:67;:::i;:::-;19879:74;;19962:93;20051:3;19962:93;:::i;:::-;20080:2;20075:3;20071:12;20064:19;;19869:220;;;:::o;20095:366::-;20237:3;20258:67;20322:2;20317:3;20258:67;:::i;:::-;20251:74;;20334:93;20423:3;20334:93;:::i;:::-;20452:2;20447:3;20443:12;20436:19;;20241:220;;;:::o;20467:366::-;20609:3;20630:67;20694:2;20689:3;20630:67;:::i;:::-;20623:74;;20706:93;20795:3;20706:93;:::i;:::-;20824:2;20819:3;20815:12;20808:19;;20613:220;;;:::o;20839:366::-;20981:3;21002:67;21066:2;21061:3;21002:67;:::i;:::-;20995:74;;21078:93;21167:3;21078:93;:::i;:::-;21196:2;21191:3;21187:12;21180:19;;20985:220;;;:::o;21211:366::-;21353:3;21374:67;21438:2;21433:3;21374:67;:::i;:::-;21367:74;;21450:93;21539:3;21450:93;:::i;:::-;21568:2;21563:3;21559:12;21552:19;;21357:220;;;:::o;21583:366::-;21725:3;21746:67;21810:2;21805:3;21746:67;:::i;:::-;21739:74;;21822:93;21911:3;21822:93;:::i;:::-;21940:2;21935:3;21931:12;21924:19;;21729:220;;;:::o;21955:366::-;22097:3;22118:67;22182:2;22177:3;22118:67;:::i;:::-;22111:74;;22194:93;22283:3;22194:93;:::i;:::-;22312:2;22307:3;22303:12;22296:19;;22101:220;;;:::o;22327:366::-;22469:3;22490:67;22554:2;22549:3;22490:67;:::i;:::-;22483:74;;22566:93;22655:3;22566:93;:::i;:::-;22684:2;22679:3;22675:12;22668:19;;22473:220;;;:::o;22699:366::-;22841:3;22862:67;22926:2;22921:3;22862:67;:::i;:::-;22855:74;;22938:93;23027:3;22938:93;:::i;:::-;23056:2;23051:3;23047:12;23040:19;;22845:220;;;:::o;23071:366::-;23213:3;23234:67;23298:2;23293:3;23234:67;:::i;:::-;23227:74;;23310:93;23399:3;23310:93;:::i;:::-;23428:2;23423:3;23419:12;23412:19;;23217:220;;;:::o;23443:366::-;23585:3;23606:67;23670:2;23665:3;23606:67;:::i;:::-;23599:74;;23682:93;23771:3;23682:93;:::i;:::-;23800:2;23795:3;23791:12;23784:19;;23589:220;;;:::o;23815:366::-;23957:3;23978:67;24042:2;24037:3;23978:67;:::i;:::-;23971:74;;24054:93;24143:3;24054:93;:::i;:::-;24172:2;24167:3;24163:12;24156:19;;23961:220;;;:::o;24187:366::-;24329:3;24350:67;24414:2;24409:3;24350:67;:::i;:::-;24343:74;;24426:93;24515:3;24426:93;:::i;:::-;24544:2;24539:3;24535:12;24528:19;;24333:220;;;:::o;24559:108::-;24636:24;24654:5;24636:24;:::i;:::-;24631:3;24624:37;24614:53;;:::o;24673:118::-;24760:24;24778:5;24760:24;:::i;:::-;24755:3;24748:37;24738:53;;:::o;24797:271::-;24927:3;24949:93;25038:3;25029:6;24949:93;:::i;:::-;24942:100;;25059:3;25052:10;;24931:137;;;;:::o;25074:273::-;25205:3;25227:94;25317:3;25308:6;25227:94;:::i;:::-;25220:101;;25338:3;25331:10;;25209:138;;;;:::o;25353:435::-;25533:3;25555:95;25646:3;25637:6;25555:95;:::i;:::-;25548:102;;25667:95;25758:3;25749:6;25667:95;:::i;:::-;25660:102;;25779:3;25772:10;;25537:251;;;;;:::o;25794:222::-;25887:4;25925:2;25914:9;25910:18;25902:26;;25938:71;26006:1;25995:9;25991:17;25982:6;25938:71;:::i;:::-;25892:124;;;;:::o;26022:640::-;26217:4;26255:3;26244:9;26240:19;26232:27;;26269:71;26337:1;26326:9;26322:17;26313:6;26269:71;:::i;:::-;26350:72;26418:2;26407:9;26403:18;26394:6;26350:72;:::i;:::-;26432;26500:2;26489:9;26485:18;26476:6;26432:72;:::i;:::-;26551:9;26545:4;26541:20;26536:2;26525:9;26521:18;26514:48;26579:76;26650:4;26641:6;26579:76;:::i;:::-;26571:84;;26222:440;;;;;;;:::o;26668:533::-;26837:4;26875:2;26864:9;26860:18;26852:26;;26888:71;26956:1;26945:9;26941:17;26932:6;26888:71;:::i;:::-;26969:72;27037:2;27026:9;27022:18;27013:6;26969:72;:::i;:::-;27088:9;27082:4;27078:20;27073:2;27062:9;27058:18;27051:48;27116:78;27189:4;27180:6;27116:78;:::i;:::-;27108:86;;26842:359;;;;;;:::o;27207:413::-;27370:4;27408:2;27397:9;27393:18;27385:26;;27457:9;27451:4;27447:20;27443:1;27432:9;27428:17;27421:47;27485:128;27608:4;27599:6;27485:128;:::i;:::-;27477:136;;27375:245;;;;:::o;27626:373::-;27769:4;27807:2;27796:9;27792:18;27784:26;;27856:9;27850:4;27846:20;27842:1;27831:9;27827:17;27820:47;27884:108;27987:4;27978:6;27884:108;:::i;:::-;27876:116;;27774:225;;;;:::o;28005:210::-;28092:4;28130:2;28119:9;28115:18;28107:26;;28143:65;28205:1;28194:9;28190:17;28181:6;28143:65;:::i;:::-;28097:118;;;;:::o;28221:313::-;28334:4;28372:2;28361:9;28357:18;28349:26;;28421:9;28415:4;28411:20;28407:1;28396:9;28392:17;28385:47;28449:78;28522:4;28513:6;28449:78;:::i;:::-;28441:86;;28339:195;;;;:::o;28540:307::-;28650:4;28688:2;28677:9;28673:18;28665:26;;28737:9;28731:4;28727:20;28723:1;28712:9;28708:17;28701:47;28765:75;28835:4;28826:6;28765:75;:::i;:::-;28757:83;;28655:192;;;;:::o;28853:419::-;29019:4;29057:2;29046:9;29042:18;29034:26;;29106:9;29100:4;29096:20;29092:1;29081:9;29077:17;29070:47;29134:131;29260:4;29134:131;:::i;:::-;29126:139;;29024:248;;;:::o;29278:419::-;29444:4;29482:2;29471:9;29467:18;29459:26;;29531:9;29525:4;29521:20;29517:1;29506:9;29502:17;29495:47;29559:131;29685:4;29559:131;:::i;:::-;29551:139;;29449:248;;;:::o;29703:419::-;29869:4;29907:2;29896:9;29892:18;29884:26;;29956:9;29950:4;29946:20;29942:1;29931:9;29927:17;29920:47;29984:131;30110:4;29984:131;:::i;:::-;29976:139;;29874:248;;;:::o;30128:419::-;30294:4;30332:2;30321:9;30317:18;30309:26;;30381:9;30375:4;30371:20;30367:1;30356:9;30352:17;30345:47;30409:131;30535:4;30409:131;:::i;:::-;30401:139;;30299:248;;;:::o;30553:419::-;30719:4;30757:2;30746:9;30742:18;30734:26;;30806:9;30800:4;30796:20;30792:1;30781:9;30777:17;30770:47;30834:131;30960:4;30834:131;:::i;:::-;30826:139;;30724:248;;;:::o;30978:419::-;31144:4;31182:2;31171:9;31167:18;31159:26;;31231:9;31225:4;31221:20;31217:1;31206:9;31202:17;31195:47;31259:131;31385:4;31259:131;:::i;:::-;31251:139;;31149:248;;;:::o;31403:419::-;31569:4;31607:2;31596:9;31592:18;31584:26;;31656:9;31650:4;31646:20;31642:1;31631:9;31627:17;31620:47;31684:131;31810:4;31684:131;:::i;:::-;31676:139;;31574:248;;;:::o;31828:419::-;31994:4;32032:2;32021:9;32017:18;32009:26;;32081:9;32075:4;32071:20;32067:1;32056:9;32052:17;32045:47;32109:131;32235:4;32109:131;:::i;:::-;32101:139;;31999:248;;;:::o;32253:419::-;32419:4;32457:2;32446:9;32442:18;32434:26;;32506:9;32500:4;32496:20;32492:1;32481:9;32477:17;32470:47;32534:131;32660:4;32534:131;:::i;:::-;32526:139;;32424:248;;;:::o;32678:419::-;32844:4;32882:2;32871:9;32867:18;32859:26;;32931:9;32925:4;32921:20;32917:1;32906:9;32902:17;32895:47;32959:131;33085:4;32959:131;:::i;:::-;32951:139;;32849:248;;;:::o;33103:419::-;33269:4;33307:2;33296:9;33292:18;33284:26;;33356:9;33350:4;33346:20;33342:1;33331:9;33327:17;33320:47;33384:131;33510:4;33384:131;:::i;:::-;33376:139;;33274:248;;;:::o;33528:419::-;33694:4;33732:2;33721:9;33717:18;33709:26;;33781:9;33775:4;33771:20;33767:1;33756:9;33752:17;33745:47;33809:131;33935:4;33809:131;:::i;:::-;33801:139;;33699:248;;;:::o;33953:419::-;34119:4;34157:2;34146:9;34142:18;34134:26;;34206:9;34200:4;34196:20;34192:1;34181:9;34177:17;34170:47;34234:131;34360:4;34234:131;:::i;:::-;34226:139;;34124:248;;;:::o;34378:419::-;34544:4;34582:2;34571:9;34567:18;34559:26;;34631:9;34625:4;34621:20;34617:1;34606:9;34602:17;34595:47;34659:131;34785:4;34659:131;:::i;:::-;34651:139;;34549:248;;;:::o;34803:419::-;34969:4;35007:2;34996:9;34992:18;34984:26;;35056:9;35050:4;35046:20;35042:1;35031:9;35027:17;35020:47;35084:131;35210:4;35084:131;:::i;:::-;35076:139;;34974:248;;;:::o;35228:419::-;35394:4;35432:2;35421:9;35417:18;35409:26;;35481:9;35475:4;35471:20;35467:1;35456:9;35452:17;35445:47;35509:131;35635:4;35509:131;:::i;:::-;35501:139;;35399:248;;;:::o;35653:419::-;35819:4;35857:2;35846:9;35842:18;35834:26;;35906:9;35900:4;35896:20;35892:1;35881:9;35877:17;35870:47;35934:131;36060:4;35934:131;:::i;:::-;35926:139;;35824:248;;;:::o;36078:419::-;36244:4;36282:2;36271:9;36267:18;36259:26;;36331:9;36325:4;36321:20;36317:1;36306:9;36302:17;36295:47;36359:131;36485:4;36359:131;:::i;:::-;36351:139;;36249:248;;;:::o;36503:419::-;36669:4;36707:2;36696:9;36692:18;36684:26;;36756:9;36750:4;36746:20;36742:1;36731:9;36727:17;36720:47;36784:131;36910:4;36784:131;:::i;:::-;36776:139;;36674:248;;;:::o;36928:419::-;37094:4;37132:2;37121:9;37117:18;37109:26;;37181:9;37175:4;37171:20;37167:1;37156:9;37152:17;37145:47;37209:131;37335:4;37209:131;:::i;:::-;37201:139;;37099:248;;;:::o;37353:419::-;37519:4;37557:2;37546:9;37542:18;37534:26;;37606:9;37600:4;37596:20;37592:1;37581:9;37577:17;37570:47;37634:131;37760:4;37634:131;:::i;:::-;37626:139;;37524:248;;;:::o;37778:419::-;37944:4;37982:2;37971:9;37967:18;37959:26;;38031:9;38025:4;38021:20;38017:1;38006:9;38002:17;37995:47;38059:131;38185:4;38059:131;:::i;:::-;38051:139;;37949:248;;;:::o;38203:419::-;38369:4;38407:2;38396:9;38392:18;38384:26;;38456:9;38450:4;38446:20;38442:1;38431:9;38427:17;38420:47;38484:131;38610:4;38484:131;:::i;:::-;38476:139;;38374:248;;;:::o;38628:419::-;38794:4;38832:2;38821:9;38817:18;38809:26;;38881:9;38875:4;38871:20;38867:1;38856:9;38852:17;38845:47;38909:131;39035:4;38909:131;:::i;:::-;38901:139;;38799:248;;;:::o;39053:419::-;39219:4;39257:2;39246:9;39242:18;39234:26;;39306:9;39300:4;39296:20;39292:1;39281:9;39277:17;39270:47;39334:131;39460:4;39334:131;:::i;:::-;39326:139;;39224:248;;;:::o;39478:419::-;39644:4;39682:2;39671:9;39667:18;39659:26;;39731:9;39725:4;39721:20;39717:1;39706:9;39702:17;39695:47;39759:131;39885:4;39759:131;:::i;:::-;39751:139;;39649:248;;;:::o;39903:419::-;40069:4;40107:2;40096:9;40092:18;40084:26;;40156:9;40150:4;40146:20;40142:1;40131:9;40127:17;40120:47;40184:131;40310:4;40184:131;:::i;:::-;40176:139;;40074:248;;;:::o;40328:419::-;40494:4;40532:2;40521:9;40517:18;40509:26;;40581:9;40575:4;40571:20;40567:1;40556:9;40552:17;40545:47;40609:131;40735:4;40609:131;:::i;:::-;40601:139;;40499:248;;;:::o;40753:419::-;40919:4;40957:2;40946:9;40942:18;40934:26;;41006:9;41000:4;40996:20;40992:1;40981:9;40977:17;40970:47;41034:131;41160:4;41034:131;:::i;:::-;41026:139;;40924:248;;;:::o;41178:419::-;41344:4;41382:2;41371:9;41367:18;41359:26;;41431:9;41425:4;41421:20;41417:1;41406:9;41402:17;41395:47;41459:131;41585:4;41459:131;:::i;:::-;41451:139;;41349:248;;;:::o;41603:419::-;41769:4;41807:2;41796:9;41792:18;41784:26;;41856:9;41850:4;41846:20;41842:1;41831:9;41827:17;41820:47;41884:131;42010:4;41884:131;:::i;:::-;41876:139;;41774:248;;;:::o;42028:222::-;42121:4;42159:2;42148:9;42144:18;42136:26;;42172:71;42240:1;42229:9;42225:17;42216:6;42172:71;:::i;:::-;42126:124;;;;:::o;42256:129::-;42290:6;42317:20;;:::i;:::-;42307:30;;42346:33;42374:4;42366:6;42346:33;:::i;:::-;42297:88;;;:::o;42391:75::-;42424:6;42457:2;42451:9;42441:19;;42431:35;:::o;42472:307::-;42533:4;42623:18;42615:6;42612:30;42609:2;;;42645:18;;:::i;:::-;42609:2;42683:29;42705:6;42683:29;:::i;:::-;42675:37;;42767:4;42761;42757:15;42749:23;;42538:241;;;:::o;42785:308::-;42847:4;42937:18;42929:6;42926:30;42923:2;;;42959:18;;:::i;:::-;42923:2;42997:29;43019:6;42997:29;:::i;:::-;42989:37;;43081:4;43075;43071:15;43063:23;;42852:241;;;:::o;43099:142::-;43176:4;43199:3;43191:11;;43229:4;43224:3;43220:14;43212:22;;43181:60;;;:::o;43247:132::-;43314:4;43337:3;43329:11;;43367:4;43362:3;43358:14;43350:22;;43319:60;;;:::o;43385:144::-;43437:4;43460:3;43452:11;;43483:3;43480:1;43473:14;43517:4;43514:1;43504:18;43496:26;;43442:87;;;:::o;43535:141::-;43584:4;43607:3;43599:11;;43630:3;43627:1;43620:14;43664:4;43661:1;43651:18;43643:26;;43589:87;;;:::o;43682:124::-;43759:6;43793:5;43787:12;43777:22;;43766:40;;;:::o;43812:114::-;43879:6;43913:5;43907:12;43897:22;;43886:40;;;:::o;43932:98::-;43983:6;44017:5;44011:12;44001:22;;43990:40;;;:::o;44036:99::-;44088:6;44122:5;44116:12;44106:22;;44095:40;;;:::o;44141:123::-;44221:4;44253;44248:3;44244:14;44236:22;;44226:38;;;:::o;44270:113::-;44340:4;44372;44367:3;44363:14;44355:22;;44345:38;;;:::o;44389:194::-;44498:11;44532:6;44527:3;44520:19;44572:4;44567:3;44563:14;44548:29;;44510:73;;;;:::o;44589:184::-;44688:11;44722:6;44717:3;44710:19;44762:4;44757:3;44753:14;44738:29;;44700:73;;;;:::o;44779:168::-;44862:11;44896:6;44891:3;44884:19;44936:4;44931:3;44927:14;44912:29;;44874:73;;;;:::o;44953:147::-;45054:11;45091:3;45076:18;;45066:34;;;;:::o;45106:159::-;45180:11;45214:6;45209:3;45202:19;45254:4;45249:3;45245:14;45230:29;;45192:73;;;;:::o;45271:169::-;45355:11;45389:6;45384:3;45377:19;45429:4;45424:3;45420:14;45405:29;;45367:73;;;;:::o;45446:148::-;45548:11;45585:3;45570:18;;45560:34;;;;:::o;45600:305::-;45640:3;45659:20;45677:1;45659:20;:::i;:::-;45654:25;;45693:20;45711:1;45693:20;:::i;:::-;45688:25;;45847:1;45779:66;45775:74;45772:1;45769:81;45766:2;;;45853:18;;:::i;:::-;45766:2;45897:1;45894;45890:9;45883:16;;45644:261;;;;:::o;45911:185::-;45951:1;45968:20;45986:1;45968:20;:::i;:::-;45963:25;;46002:20;46020:1;46002:20;:::i;:::-;45997:25;;46041:1;46031:2;;46046:18;;:::i;:::-;46031:2;46088:1;46085;46081:9;46076:14;;45953:143;;;;:::o;46102:348::-;46142:7;46165:20;46183:1;46165:20;:::i;:::-;46160:25;;46199:20;46217:1;46199:20;:::i;:::-;46194:25;;46387:1;46319:66;46315:74;46312:1;46309:81;46304:1;46297:9;46290:17;46286:105;46283:2;;;46394:18;;:::i;:::-;46283:2;46442:1;46439;46435:9;46424:20;;46150:300;;;;:::o;46456:191::-;46496:4;46516:20;46534:1;46516:20;:::i;:::-;46511:25;;46550:20;46568:1;46550:20;:::i;:::-;46545:25;;46589:1;46586;46583:8;46580:2;;;46594:18;;:::i;:::-;46580:2;46639:1;46636;46632:9;46624:17;;46501:146;;;;:::o;46653:96::-;46690:7;46719:24;46737:5;46719:24;:::i;:::-;46708:35;;46698:51;;;:::o;46755:90::-;46789:7;46832:5;46825:13;46818:21;46807:32;;46797:48;;;:::o;46851:77::-;46888:7;46917:5;46906:16;;46896:32;;;:::o;46934:149::-;46970:7;47010:66;47003:5;46999:78;46988:89;;46978:105;;;:::o;47089:126::-;47126:7;47166:42;47159:5;47155:54;47144:65;;47134:81;;;:::o;47221:77::-;47258:7;47287:5;47276:16;;47266:32;;;:::o;47304:154::-;47388:6;47383:3;47378;47365:30;47450:1;47441:6;47436:3;47432:16;47425:27;47355:103;;;:::o;47464:307::-;47532:1;47542:113;47556:6;47553:1;47550:13;47542:113;;;47641:1;47636:3;47632:11;47626:18;47622:1;47617:3;47613:11;47606:39;47578:2;47575:1;47571:10;47566:15;;47542:113;;;47673:6;47670:1;47667:13;47664:2;;;47753:1;47744:6;47739:3;47735:16;47728:27;47664:2;47513:258;;;;:::o;47777:320::-;47821:6;47858:1;47852:4;47848:12;47838:22;;47905:1;47899:4;47895:12;47926:18;47916:2;;47982:4;47974:6;47970:17;47960:27;;47916:2;48044;48036:6;48033:14;48013:18;48010:38;48007:2;;;48063:18;;:::i;:::-;48007:2;47828:269;;;;:::o;48103:281::-;48186:27;48208:4;48186:27;:::i;:::-;48178:6;48174:40;48316:6;48304:10;48301:22;48280:18;48268:10;48265:34;48262:62;48259:2;;;48327:18;;:::i;:::-;48259:2;48367:10;48363:2;48356:22;48146:238;;;:::o;48390:233::-;48429:3;48452:24;48470:5;48452:24;:::i;:::-;48443:33;;48498:66;48491:5;48488:77;48485:2;;;48568:18;;:::i;:::-;48485:2;48615:1;48608:5;48604:13;48597:20;;48433:190;;;:::o;48629:176::-;48661:1;48678:20;48696:1;48678:20;:::i;:::-;48673:25;;48712:20;48730:1;48712:20;:::i;:::-;48707:25;;48751:1;48741:2;;48756:18;;:::i;:::-;48741:2;48797:1;48794;48790:9;48785:14;;48663:142;;;;:::o;48811:180::-;48859:77;48856:1;48849:88;48956:4;48953:1;48946:15;48980:4;48977:1;48970:15;48997:180;49045:77;49042:1;49035:88;49142:4;49139:1;49132:15;49166:4;49163:1;49156:15;49183:180;49231:77;49228:1;49221:88;49328:4;49325:1;49318:15;49352:4;49349:1;49342:15;49369:180;49417:77;49414:1;49407:88;49514:4;49511:1;49504:15;49538:4;49535:1;49528:15;49555:102;49596:6;49647:2;49643:7;49638:2;49631:5;49627:14;49623:28;49613:38;;49603:54;;;:::o;49663:221::-;49803:34;49799:1;49791:6;49787:14;49780:58;49872:4;49867:2;49859:6;49855:15;49848:29;49769:115;:::o;49890:170::-;50030:22;50026:1;50018:6;50014:14;50007:46;49996:64;:::o;50066:230::-;50206:34;50202:1;50194:6;50190:14;50183:58;50275:13;50270:2;50262:6;50258:15;50251:38;50172:124;:::o;50302:221::-;50442:34;50438:1;50430:6;50426:14;50419:58;50511:4;50506:2;50498:6;50494:15;50487:29;50408:115;:::o;50529:230::-;50669:34;50665:1;50657:6;50653:14;50646:58;50738:13;50733:2;50725:6;50721:15;50714:38;50635:124;:::o;50765:237::-;50905:34;50901:1;50893:6;50889:14;50882:58;50974:20;50969:2;50961:6;50957:15;50950:45;50871:131;:::o;51008:225::-;51148:34;51144:1;51136:6;51132:14;51125:58;51217:8;51212:2;51204:6;51200:15;51193:33;51114:119;:::o;51239:178::-;51379:30;51375:1;51367:6;51363:14;51356:54;51345:72;:::o;51423:182::-;51563:34;51559:1;51551:6;51547:14;51540:58;51529:76;:::o;51611:223::-;51751:34;51747:1;51739:6;51735:14;51728:58;51820:6;51815:2;51807:6;51803:15;51796:31;51717:117;:::o;51840:175::-;51980:27;51976:1;51968:6;51964:14;51957:51;51946:69;:::o;52021:181::-;52161:33;52157:1;52149:6;52145:14;52138:57;52127:75;:::o;52208:231::-;52348:34;52344:1;52336:6;52332:14;52325:58;52417:14;52412:2;52404:6;52400:15;52393:39;52314:125;:::o;52445:220::-;52585:34;52581:1;52573:6;52569:14;52562:58;52654:3;52649:2;52641:6;52637:15;52630:28;52551:114;:::o;52671:228::-;52811:34;52807:1;52799:6;52795:14;52788:58;52880:11;52875:2;52867:6;52863:15;52856:36;52777:122;:::o;52905:166::-;53045:18;53041:1;53033:6;53029:14;53022:42;53011:60;:::o;53077:243::-;53217:34;53213:1;53205:6;53201:14;53194:58;53286:26;53281:2;53273:6;53269:15;53262:51;53183:137;:::o;53326:229::-;53466:34;53462:1;53454:6;53450:14;53443:58;53535:12;53530:2;53522:6;53518:15;53511:37;53432:123;:::o;53561:228::-;53701:34;53697:1;53689:6;53685:14;53678:58;53770:11;53765:2;53757:6;53753:15;53746:36;53667:122;:::o;53795:226::-;53935:34;53931:1;53923:6;53919:14;53912:58;54004:9;53999:2;53991:6;53987:15;53980:34;53901:120;:::o;54027:182::-;54167:34;54163:1;54155:6;54151:14;54144:58;54133:76;:::o;54215:236::-;54355:34;54351:1;54343:6;54339:14;54332:58;54424:19;54419:2;54411:6;54407:15;54400:44;54321:130;:::o;54457:231::-;54597:34;54593:1;54585:6;54581:14;54574:58;54666:14;54661:2;54653:6;54649:15;54642:39;54563:125;:::o;54694:182::-;54834:34;54830:1;54822:6;54818:14;54811:58;54800:76;:::o;54882:228::-;55022:34;55018:1;55010:6;55006:14;54999:58;55091:11;55086:2;55078:6;55074:15;55067:36;54988:122;:::o;55116:234::-;55256:34;55252:1;55244:6;55240:14;55233:58;55325:17;55320:2;55312:6;55308:15;55301:42;55222:128;:::o;55356:222::-;55496:34;55492:1;55484:6;55480:14;55473:58;55565:5;55560:2;55552:6;55548:15;55541:30;55462:116;:::o;55584:220::-;55724:34;55720:1;55712:6;55708:14;55701:58;55793:3;55788:2;55780:6;55776:15;55769:28;55690:114;:::o;55810:172::-;55950:24;55946:1;55938:6;55934:14;55927:48;55916:66;:::o;55988:236::-;56128:34;56124:1;56116:6;56112:14;56105:58;56197:19;56192:2;56184:6;56180:15;56173:44;56094:130;:::o;56230:231::-;56370:34;56366:1;56358:6;56354:14;56347:58;56439:14;56434:2;56426:6;56422:15;56415:39;56336:125;:::o;56467:122::-;56540:24;56558:5;56540:24;:::i;:::-;56533:5;56530:35;56520:2;;56579:1;56576;56569:12;56520:2;56510:79;:::o;56595:116::-;56665:21;56680:5;56665:21;:::i;:::-;56658:5;56655:32;56645:2;;56701:1;56698;56691:12;56645:2;56635:76;:::o;56717:122::-;56790:24;56808:5;56790:24;:::i;:::-;56783:5;56780:35;56770:2;;56829:1;56826;56819:12;56770:2;56760:79;:::o;56845:120::-;56917:23;56934:5;56917:23;:::i;:::-;56910:5;56907:34;56897:2;;56955:1;56952;56945:12;56897:2;56887:78;:::o;56971:122::-;57044:24;57062:5;57044:24;:::i;:::-;57037:5;57034:35;57024:2;;57083:1;57080;57073:12;57024:2;57014:79;:::o

Swarm Source

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