ETH Price: $3,226.30 (+2.98%)

Token

OnChainFramedStains (OCFS)
 

Overview

Max Total Supply

13 OCFS

Holders

7

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
0xburnz.eth
Balance
2 OCFS
0x5Df222B967b0C609573Df5e71339616722935303
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:
cmonnow

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-07
*/

// 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.8.0) (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`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// 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/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/Base64.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (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) {
        _requireMinted(tokenId);

        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 See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

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

// File: contracts/MyToken.sol


pragma solidity ^0.8.4;








contract cmonnow is ERC721URIStorage, Ownable {

    constructor() ERC721("OnChainFramedStains", "OCFS") {}

    receive() external payable {}
    
    
    mapping(address => uint256) private _addressTokenCount;
    mapping(uint256 => bool) private _minted;
    uint256 public tokensMinted = 0;
    uint256 public lastBlockMinted = 0;

    function svgToImageURI(string memory _source) public pure returns (string memory) {
        string memory baseURL = "data:image/svg+xml;base64,";
        string memory svgBase64Encoded = Base64.encode(bytes(string(abi.encodePacked(_source))));
        return string(abi.encodePacked(baseURL, svgBase64Encoded));
    }

    function totalSupply() public view returns (uint256) {
        return tokensMinted;
    }

    function formatTokenURI(string memory _imageURI, string memory _name, string memory _description, string memory _properties) public pure returns (string memory) {
        return string(
            abi.encodePacked(
                "data:application/json;base64,",
                Base64.encode(
                    bytes(
                        abi.encodePacked(
                            '{"name":"', _name,
                            '", "description": "', _description, '"',
                            ', "attributes": "', _properties,
                            '", "image":"', _imageURI, '"}'
                        )
                    )
                )
            )
        );
    }

    function generateSVG(string memory color, string memory background, string memory stain, string memory stainOp, string memory stainth, string memory staincolor) internal view returns (string memory) {
        uint256 rand = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender))) % 2;
        if (rand == 0) {
            return string(abi.encodePacked(
                '<svg width="500" height="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><rect x="0" y="0" width="500" height="500" stroke=', '"', color, '"', ' stroke-width="15" fill=', '"', background, '"', '/><path d=', '"', 'M 250 250 ', stain , ' ', stainOp, ' ', stainth, ' z', '"', ' fill=', '"', staincolor, '"', '/></svg>'
            ));
        } else {
            return string(abi.encodePacked(
                '<svg width="500" height="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><circle cx="250" cy="250" r="200" stroke=', '"', color, '"', ' stroke-width="15" fill=', '"', background, '"', '/><path d=', '"', 'M 250 250 ', stain , ' ', stainOp, ' ', stainth, ' z', '"', ' fill=', '"', staincolor, '"', '/></svg>'
            ));
        }
    }

    function mint() public payable {
        uint256 numMinted = totalSupply();
        require(numMinted < 999, "all minted out!");
        require(_addressTokenCount[msg.sender] < 3, "3 is plenty!");
        require(!_minted[numMinted], "If you see this I probably messed up");
        require(msg.value >= 0.0042 ether, "Minting fee of 0.0042 ether required");
        _minted[numMinted] = true;
        string memory color = generateRandomColor("framed");
        string memory staincolor = generateRandomColor("stain");
        string memory stain = getStain("onchain");
        string memory stainOp = getStain("framed");
        string memory stainth = getStain("stain");
        string memory background = addRandomOpacity(color);
        string memory imageURI = svgToImageURI(generateSVG(color, background, stain, stainOp, stainth, staincolor));
        string memory name = string(abi.encodePacked("OnChainFrameStain - ", Strings.toString(numMinted)));
        string memory description = "Framed Stains Onchain!";
        string memory properties = getProperties(color, background);
        string memory tokenURI = formatTokenURI(imageURI, name, description, properties);
        _mint(msg.sender, numMinted);
        _setTokenURI(numMinted, tokenURI);
        _addressTokenCount[msg.sender]++;
        tokensMinted = numMinted + 1;
    }

function getStain(string memory change) public view returns (string memory) {
    uint256 x1 = random(10, 140, string(abi.encodePacked(change, "1")));
    uint256 y1 = random(10, 140, string(abi.encodePacked(change, "2")));
    uint256 x2 = random(10, 140, string(abi.encodePacked(change, "3")));
    uint256 y2 = random(10, 140, string(abi.encodePacked(change, "4")));
    uint256 x3 = random(10, 140, string(abi.encodePacked(change, "5")));
    uint256 y3 = random(10, 140, string(abi.encodePacked(change, "6")));
    string memory str = string(abi.encodePacked("c -", Strings.toString(x1), " -", Strings.toString(y1), ", ", Strings.toString(x2), " ", Strings.toString(y2), ", ", "0 0"));
    return str;
}

function random(uint256 _min, uint256 _max, string memory seed) public view returns (uint256) {
    uint256 randomnumber = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, seed))) % (_max - _min + 1);
    randomnumber = randomnumber + _min;
    return randomnumber;
}


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

    function getProperties(string memory color, string memory background) public view returns (string memory) {
        return string(
            abi.encodePacked(
                "data:application/json;base64,",
                Base64.encode(
                    bytes(
                        abi.encodePacked(
                            '{"color":"', color,
                            '", "background":"', background, '"}'
                        )
                    )
                )
            )
        );
    }

    function generateRandomColor(string memory seed) public view returns (string memory) {
        bytes memory color = new bytes(3);
        uint256 rand = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, seed))) % 16777216;
        color[0] = bytes1(uint8(rand >> 16));
        color[1] = bytes1(uint8(rand >> 8));
        color[2] = bytes1(uint8(rand));
        return string(abi.encodePacked("#", bytesToHex(color)));
    }

    function getArLength(bytes memory b) public view returns(uint256 count) {
        return b.length;
    }
    function bytesToHex(bytes memory b) private pure returns (string memory) {
        bytes memory hexAlphabet = "0123456789abcdef";
        uint len = b.length;
        bytes memory hexy = new bytes(2 * len);
        uint j = 0;
        for (uint i = 0; i < len; i++) {
            uint8 c = uint8(b[i]);
            if (c != 0) {
                hexy[2*j] = hexAlphabet[c >> 4];
                hexy[2*j+1] = hexAlphabet[c & 0x0f];
                j++;
            }
        }
        return string(hexy);
    }


    function addRandomOpacity(string memory color) public view returns (string memory) {
        bytes memory colorBytes = bytes(color);
        require(colorBytes.length == 7 && colorBytes[0] == "#", "Invalid hex color string");
        bytes memory opacity = new bytes(1);
        uint256 rand = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender))) % 256;
        opacity[0] = bytes1(uint8(rand));
        return string(abi.encodePacked(color, bytesToHex(opacity)));
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"color","type":"string"}],"name":"addRandomOpacity","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":"_imageURI","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_description","type":"string"},{"internalType":"string","name":"_properties","type":"string"}],"name":"formatTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"seed","type":"string"}],"name":"generateRandomColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"b","type":"bytes"}],"name":"getArLength","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"color","type":"string"},{"internalType":"string","name":"background","type":"string"}],"name":"getProperties","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"change","type":"string"}],"name":"getStain","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"lastBlockMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"string","name":"seed","type":"string"}],"name":"random","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_source","type":"string"}],"name":"svgToImageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600a556000600b553480156200001b57600080fd5b506040518060400160405280601381526020017f4f6e436861696e4672616d6564537461696e73000000000000000000000000008152506040518060400160405280600481526020017f4f4346530000000000000000000000000000000000000000000000000000000081525081600090816200009991906200041c565b508060019081620000ab91906200041c565b505050620000ce620000c2620000d460201b60201c565b620000dc60201b60201c565b62000503565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022457607f821691505b6020821081036200023a5762000239620001dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000265565b620002b0868362000265565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002fd620002f7620002f184620002c8565b620002d2565b620002c8565b9050919050565b6000819050919050565b6200031983620002dc565b62000331620003288262000304565b84845462000272565b825550505050565b600090565b6200034862000339565b620003558184846200030e565b505050565b5b818110156200037d57620003716000826200033e565b6001810190506200035b565b5050565b601f821115620003cc57620003968162000240565b620003a18462000255565b81016020851015620003b1578190505b620003c9620003c08562000255565b8301826200035a565b50505b505050565b600082821c905092915050565b6000620003f160001984600802620003d1565b1980831691505092915050565b60006200040c8383620003de565b9150826002028217905092915050565b6200042782620001a2565b67ffffffffffffffff811115620004435762000442620001ad565b5b6200044f82546200020b565b6200045c82828562000381565b600060209050601f8311600181146200049457600084156200047f578287015190505b6200048b8582620003fe565b865550620004fb565b601f198416620004a48662000240565b60005b82811015620004ce57848901518255600182019150602085019450602081019050620004a7565b86831015620004ee5784890151620004ea601f891682620003de565b8355505b6001600288020188555050505b505050505050565b61575980620005136000396000f3fe6080604052600436106101c65760003560e01c806370a08231116100f7578063c87b56dd11610095578063e5bb287511610064578063e5bb287514610678578063e985e9c5146106b5578063f2fde38b146106f2578063f66d61a31461071b576101cd565b8063c87b56dd14610584578063ce52c115146105c1578063d17f0132146105fe578063dd41df8e1461063b576101cd565b806395d89b41116100d157806395d89b41146104ca578063a05b48db146104f5578063a22cb46514610532578063b88d4fde1461055b576101cd565b806370a082311461044b578063715018a6146104885780638da5cb5b1461049f576101cd565b806323b872dd116101645780633ccfd60b1161013e5780633ccfd60b146103a357806342842e0e146103ba5780636352211e146103e35780636de9f32b14610420576101cd565b806323b872dd1461030057806330d871c614610329578063341b9b9214610366576101cd565b8063081812fc116101a0578063081812fc14610265578063095ea7b3146102a25780631249c58b146102cb57806318160ddd146102d5576101cd565b806301ffc9a7146101d257806306fdde031461020f578063078afb9d1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612f88565b610758565b6040516102069190612fd0565b60405180910390f35b34801561021b57600080fd5b5061022461083a565b604051610231919061307b565b60405180910390f35b34801561024657600080fd5b5061024f6108cc565b60405161025c91906130b6565b60405180910390f35b34801561027157600080fd5b5061028c600480360381019061028791906130fd565b6108d2565b604051610299919061316b565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c491906131b2565b610918565b005b6102d3610a2f565b005b3480156102e157600080fd5b506102ea610e57565b6040516102f791906130b6565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906131f2565b610e61565b005b34801561033557600080fd5b50610350600480360381019061034b919061337a565b610ec1565b60405161035d919061307b565b60405180910390f35b34801561037257600080fd5b5061038d600480360381019061038891906133c3565b610f54565b60405161039a91906130b6565b60405180910390f35b3480156103af57600080fd5b506103b8610fc2565b005b3480156103c657600080fd5b506103e160048036038101906103dc91906131f2565b611013565b005b3480156103ef57600080fd5b5061040a600480360381019061040591906130fd565b611033565b604051610417919061316b565b60405180910390f35b34801561042c57600080fd5b506104356110b9565b60405161044291906130b6565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d9190613432565b6110bf565b60405161047f91906130b6565b60405180910390f35b34801561049457600080fd5b5061049d611176565b005b3480156104ab57600080fd5b506104b461118a565b6040516104c1919061316b565b60405180910390f35b3480156104d657600080fd5b506104df6111b4565b6040516104ec919061307b565b60405180910390f35b34801561050157600080fd5b5061051c6004803603810190610517919061345f565b611246565b604051610529919061307b565b60405180910390f35b34801561053e57600080fd5b5061055960048036038101906105549190613503565b611299565b005b34801561056757600080fd5b50610582600480360381019061057d91906135e4565b6112af565b005b34801561059057600080fd5b506105ab60048036038101906105a691906130fd565b611311565b6040516105b8919061307b565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e3919061337a565b611423565b6040516105f5919061307b565b60405180910390f35b34801561060a57600080fd5b506106256004803603810190610620919061337a565b61159e565b604051610632919061307b565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190613667565b61175e565b60405161066f91906130b6565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a919061337a565b611769565b6040516106ac919061307b565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d791906136b0565b61190c565b6040516106e99190612fd0565b60405180910390f35b3480156106fe57600080fd5b5061071960048036038101906107149190613432565b6119a0565b005b34801561072757600080fd5b50610742600480360381019061073d91906136f0565b611a23565b60405161074f919061307b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610833575061083282611a7c565b5b9050919050565b606060008054610849906137f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610875906137f6565b80156108c25780601f10610897576101008083540402835291602001916108c2565b820191906000526020600020905b8154815290600101906020018083116108a557829003601f168201915b5050505050905090565b600b5481565b60006108dd82611ae6565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092382611033565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098a90613899565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b2611b31565b73ffffffffffffffffffffffffffffffffffffffff1614806109e157506109e0816109db611b31565b61190c565b5b610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a179061392b565b60405180910390fd5b610a2a8383611b39565b505050565b6000610a39610e57565b90506103e78110610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7690613997565b60405180910390fd5b6003600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890613a03565b60405180910390fd5b6009600082815260200190815260200160002060009054906101000a900460ff1615610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613a95565b60405180910390fd5b660eebe0b40e8000341015610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390613b27565b60405180910390fd5b60016009600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610c186040518060400160405280600681526020017f6672616d65640000000000000000000000000000000000000000000000000000815250611769565b90506000610c5a6040518060400160405280600581526020017f737461696e000000000000000000000000000000000000000000000000000000815250611769565b90506000610c9c6040518060400160405280600781526020017f6f6e636861696e00000000000000000000000000000000000000000000000000815250611423565b90506000610cde6040518060400160405280600681526020017f6672616d65640000000000000000000000000000000000000000000000000000815250611423565b90506000610d206040518060400160405280600581526020017f737461696e000000000000000000000000000000000000000000000000000000815250611423565b90506000610d2d8661159e565b90506000610d47610d4288848888888c611bf2565b610ec1565b90506000610d5489611ca2565b604051602001610d649190613bcf565b604051602081830303815290604052905060006040518060400160405280601681526020017f4672616d656420537461696e73204f6e636861696e210000000000000000000081525090506000610dbb8a86611246565b90506000610dcb85858585611a23565b9050610dd7338d611d70565b610de18c82611f8d565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610e3190613c20565b919050555060018c610e439190613c68565b600a81905550505050505050505050505050565b6000600a54905090565b610e72610e6c611b31565b82611ffa565b610eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea890613d0e565b60405180910390fd5b610ebc83838361208f565b505050565b606060006040518060400160405280601a81526020017f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525090506000610f2784604051602001610f139190613d2e565b604051602081830303815290604052612388565b90508181604051602001610f3c929190613d45565b60405160208183030381529060405292505050919050565b60008060018585610f659190613d69565b610f6f9190613c68565b423385604051602001610f8493929190613e06565b6040516020818303038152906040528051906020012060001c610fa79190613e6e565b90508481610fb59190613c68565b9050809150509392505050565b610fca6124eb565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611010573d6000803e3d6000fd5b50565b61102e838383604051806020016040528060008152506112af565b505050565b60008061103f83612569565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a790613eeb565b60405180910390fd5b80915050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690613f7d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61117e6124eb565b61118860006125a6565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111c3906137f6565b80601f01602080910402602001604051908101604052809291908181526020018280546111ef906137f6565b801561123c5780601f106112115761010080835404028352916020019161123c565b820191906000526020600020905b81548152906001019060200180831161121f57829003601f168201915b5050505050905090565b6060611272838360405160200161125e929190614081565b604051602081830303815290604052612388565b6040516020016112829190614112565b604051602081830303815290604052905092915050565b6112ab6112a4611b31565b838361266c565b5050565b6112c06112ba611b31565b83611ffa565b6112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613d0e565b60405180910390fd5b61130b848484846127d8565b50505050565b606061131c82611ae6565b600060066000848152602001908152602001600020805461133c906137f6565b80601f0160208091040260200160405190810160405280929190818152602001828054611368906137f6565b80156113b55780601f1061138a576101008083540402835291602001916113b5565b820191906000526020600020905b81548152906001019060200180831161139857829003601f168201915b5050505050905060006113c6612834565b905060008151036113db57819250505061141e565b6000825111156114105780826040516020016113f8929190613d45565b6040516020818303038152906040529250505061141e565b6114198461284b565b925050505b919050565b60606000611453600a608c8560405160200161143f9190614180565b604051602081830303815290604052610f54565b90506000611483600a608c8660405160200161146f91906141ee565b604051602081830303815290604052610f54565b905060006114b3600a608c8760405160200161149f919061425c565b604051602081830303815290604052610f54565b905060006114e3600a608c886040516020016114cf91906142ca565b604051602081830303815290604052610f54565b90506000611513600a608c896040516020016114ff9190614338565b604051602081830303815290604052610f54565b90506000611543600a608c8a60405160200161152f91906143a6565b604051602081830303815290604052610f54565b9050600061155087611ca2565b61155987611ca2565b61156287611ca2565b61156b87611ca2565b60405160200161157e9493929190614544565b604051602081830303815290604052905080975050505050505050919050565b606060008290506007815114801561161557507f2300000000000000000000000000000000000000000000000000000000000000816000815181106115e6576115e56145c4565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b9061463f565b60405180910390fd5b6000600167ffffffffffffffff8111156116715761167061324f565b5b6040519080825280601f01601f1916602001820160405280156116a35781602001600182028036833780820191505090505b509050600061010042336040516020016116be92919061465f565b6040516020818303038152906040528051906020012060001c6116e19190613e6e565b90508060f81b826000815181106116fb576116fa6145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535084611734836128b3565b604051602001611745929190613d45565b6040516020818303038152906040529350505050919050565b600081519050919050565b60606000600367ffffffffffffffff8111156117885761178761324f565b5b6040519080825280601f01601f1916602001820160405280156117ba5781602001600182028036833780820191505090505b509050600063010000004233866040516020016117d993929190613e06565b6040516020818303038152906040528051906020012060001c6117fc9190613e6e565b9050601081901c60f81b8260008151811061181a576118196145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600881901c60f81b82600181518110611865576118646145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060f81b826002815181106118ac576118ab6145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506118e4826128b3565b6040516020016118f491906146d7565b60405160208183030381529060405292505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119a86124eb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e9061476b565b60405180910390fd5b611a20816125a6565b50565b6060611a5384848488604051602001611a3f9493929190614907565b604051602081830303815290604052612388565b604051602001611a639190614112565b6040516020818303038152906040529050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611aef81612ab2565b611b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2590613eeb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bac83611033565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600060024233604051602001611c0b92919061465f565b6040516020818303038152906040528051906020012060001c611c2e9190613e6e565b905060008103611c6a57878787878787604051602001611c5396959493929190614c33565b604051602081830303815290604052915050611c98565b878787878787604051602001611c8596959493929190614e04565b6040516020818303038152906040529150505b9695505050505050565b606060006001611cb184612af3565b01905060008167ffffffffffffffff811115611cd057611ccf61324f565b5b6040519080825280601f01601f191660200182016040528015611d025781602001600182028036833780820191505090505b509050600082602001820190505b600115611d65578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d5957611d58613e3f565b5b04945060008503611d10575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614f63565b60405180910390fd5b611de881612ab2565b15611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f90614fcf565b60405180910390fd5b611e36600083836001612c46565b611e3f81612ab2565b15611e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7690614fcf565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f89600083836001612d6c565b5050565b611f9682612ab2565b611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc90615061565b60405180910390fd5b80600660008481526020019081526020016000209081611ff5919061522d565b505050565b60008061200683611033565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120485750612047818561190c565b5b8061208657508373ffffffffffffffffffffffffffffffffffffffff1661206e846108d2565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120af82611033565b73ffffffffffffffffffffffffffffffffffffffff1614612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90615371565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b90615403565b60405180910390fd5b6121818383836001612c46565b8273ffffffffffffffffffffffffffffffffffffffff166121a182611033565b73ffffffffffffffffffffffffffffffffffffffff16146121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee90615371565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123838383836001612d6c565b505050565b606060008251036123aa576040518060200160405280600081525090506124e6565b60006040518060600160405280604081526020016156e460409139905060006003600285516123d99190613c68565b6123e39190615423565b60046123ef9190615454565b67ffffffffffffffff8111156124085761240761324f565b5b6040519080825280601f01601f19166020018201604052801561243a5781602001600182028036833780820191505090505b509050600182016020820185865187015b808210156124a6576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184536001840193505061244b565b50506003865106600181146124c257600281146124d5576124dd565b603d6001830353603d60028303536124dd565b603d60018303535b50505080925050505b919050565b6124f3611b31565b73ffffffffffffffffffffffffffffffffffffffff1661251161118a565b73ffffffffffffffffffffffffffffffffffffffff1614612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255e906154e2565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d19061554e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127cb9190612fd0565b60405180910390a3505050565b6127e384848461208f565b6127ef84848484612d72565b61282e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612825906155e0565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606061285682611ae6565b6000612860612834565b9050600081511161288057604051806020016040528060008152506128ab565b8061288a84611ca2565b60405160200161289b929190613d45565b6040516020818303038152906040525b915050919050565b606060006040518060400160405280601081526020017f3031323334353637383961626364656600000000000000000000000000000000815250905060008351905060008160026129049190615454565b67ffffffffffffffff81111561291d5761291c61324f565b5b6040519080825280601f01601f19166020018201604052801561294f5781602001600182028036833780820191505090505b5090506000805b83811015612aa5576000878281518110612973576129726145c4565b5b602001015160f81c60f81b60f81c905060008160ff1614612a91578560048260ff16901c60ff16815181106129ab576129aa6145c4565b5b602001015160f81c60f81b848460026129c49190615454565b815181106129d5576129d46145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535085600f821660ff1681518110612a1d57612a1c6145c4565b5b602001015160f81c60f81b846001856002612a389190615454565b612a429190613c68565b81518110612a5357612a526145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508280612a8d90613c20565b9350505b508080612a9d90613c20565b915050612956565b5081945050505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612ad483612569565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b51577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b4757612b46613e3f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612b8e576d04ee2d6d415b85acef81000000008381612b8457612b83613e3f565b5b0492506020810190505b662386f26fc100008310612bbd57662386f26fc100008381612bb357612bb2613e3f565b5b0492506010810190505b6305f5e1008310612be6576305f5e1008381612bdc57612bdb613e3f565b5b0492506008810190505b6127108310612c0b576127108381612c0157612c00613e3f565b5b0492506004810190505b60648310612c2e5760648381612c2457612c23613e3f565b5b0492506002810190505b600a8310612c3d576001810190505b80915050919050565b6001811115612d6657600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cda5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cd29190613d69565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d655780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5d9190613c68565b925050819055505b5b50505050565b50505050565b6000612d938473ffffffffffffffffffffffffffffffffffffffff16612ef9565b15612eec578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dbc611b31565b8786866040518563ffffffff1660e01b8152600401612dde9493929190615655565b6020604051808303816000875af1925050508015612e1a57506040513d601f19601f82011682018060405250810190612e1791906156b6565b60015b612e9c573d8060008114612e4a576040519150601f19603f3d011682016040523d82523d6000602084013e612e4f565b606091505b506000815103612e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8b906155e0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ef1565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f6581612f30565b8114612f7057600080fd5b50565b600081359050612f8281612f5c565b92915050565b600060208284031215612f9e57612f9d612f26565b5b6000612fac84828501612f73565b91505092915050565b60008115159050919050565b612fca81612fb5565b82525050565b6000602082019050612fe56000830184612fc1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561302557808201518184015260208101905061300a565b60008484015250505050565b6000601f19601f8301169050919050565b600061304d82612feb565b6130578185612ff6565b9350613067818560208601613007565b61307081613031565b840191505092915050565b600060208201905081810360008301526130958184613042565b905092915050565b6000819050919050565b6130b08161309d565b82525050565b60006020820190506130cb60008301846130a7565b92915050565b6130da8161309d565b81146130e557600080fd5b50565b6000813590506130f7816130d1565b92915050565b60006020828403121561311357613112612f26565b5b6000613121848285016130e8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131558261312a565b9050919050565b6131658161314a565b82525050565b6000602082019050613180600083018461315c565b92915050565b61318f8161314a565b811461319a57600080fd5b50565b6000813590506131ac81613186565b92915050565b600080604083850312156131c9576131c8612f26565b5b60006131d78582860161319d565b92505060206131e8858286016130e8565b9150509250929050565b60008060006060848603121561320b5761320a612f26565b5b60006132198682870161319d565b935050602061322a8682870161319d565b925050604061323b868287016130e8565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61328782613031565b810181811067ffffffffffffffff821117156132a6576132a561324f565b5b80604052505050565b60006132b9612f1c565b90506132c5828261327e565b919050565b600067ffffffffffffffff8211156132e5576132e461324f565b5b6132ee82613031565b9050602081019050919050565b82818337600083830152505050565b600061331d613318846132ca565b6132af565b9050828152602081018484840111156133395761333861324a565b5b6133448482856132fb565b509392505050565b600082601f83011261336157613360613245565b5b813561337184826020860161330a565b91505092915050565b6000602082840312156133905761338f612f26565b5b600082013567ffffffffffffffff8111156133ae576133ad612f2b565b5b6133ba8482850161334c565b91505092915050565b6000806000606084860312156133dc576133db612f26565b5b60006133ea868287016130e8565b93505060206133fb868287016130e8565b925050604084013567ffffffffffffffff81111561341c5761341b612f2b565b5b6134288682870161334c565b9150509250925092565b60006020828403121561344857613447612f26565b5b60006134568482850161319d565b91505092915050565b6000806040838503121561347657613475612f26565b5b600083013567ffffffffffffffff81111561349457613493612f2b565b5b6134a08582860161334c565b925050602083013567ffffffffffffffff8111156134c1576134c0612f2b565b5b6134cd8582860161334c565b9150509250929050565b6134e081612fb5565b81146134eb57600080fd5b50565b6000813590506134fd816134d7565b92915050565b6000806040838503121561351a57613519612f26565b5b60006135288582860161319d565b9250506020613539858286016134ee565b9150509250929050565b600067ffffffffffffffff82111561355e5761355d61324f565b5b61356782613031565b9050602081019050919050565b600061358761358284613543565b6132af565b9050828152602081018484840111156135a3576135a261324a565b5b6135ae8482856132fb565b509392505050565b600082601f8301126135cb576135ca613245565b5b81356135db848260208601613574565b91505092915050565b600080600080608085870312156135fe576135fd612f26565b5b600061360c8782880161319d565b945050602061361d8782880161319d565b935050604061362e878288016130e8565b925050606085013567ffffffffffffffff81111561364f5761364e612f2b565b5b61365b878288016135b6565b91505092959194509250565b60006020828403121561367d5761367c612f26565b5b600082013567ffffffffffffffff81111561369b5761369a612f2b565b5b6136a7848285016135b6565b91505092915050565b600080604083850312156136c7576136c6612f26565b5b60006136d58582860161319d565b92505060206136e68582860161319d565b9150509250929050565b6000806000806080858703121561370a57613709612f26565b5b600085013567ffffffffffffffff81111561372857613727612f2b565b5b6137348782880161334c565b945050602085013567ffffffffffffffff81111561375557613754612f2b565b5b6137618782880161334c565b935050604085013567ffffffffffffffff81111561378257613781612f2b565b5b61378e8782880161334c565b925050606085013567ffffffffffffffff8111156137af576137ae612f2b565b5b6137bb8782880161334c565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061380e57607f821691505b602082108103613821576138206137c7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613883602183612ff6565b915061388e82613827565b604082019050919050565b600060208201905081810360008301526138b281613876565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613915603d83612ff6565b9150613920826138b9565b604082019050919050565b6000602082019050818103600083015261394481613908565b9050919050565b7f616c6c206d696e746564206f7574210000000000000000000000000000000000600082015250565b6000613981600f83612ff6565b915061398c8261394b565b602082019050919050565b600060208201905081810360008301526139b081613974565b9050919050565b7f3320697320706c656e7479210000000000000000000000000000000000000000600082015250565b60006139ed600c83612ff6565b91506139f8826139b7565b602082019050919050565b60006020820190508181036000830152613a1c816139e0565b9050919050565b7f496620796f7520736565207468697320492070726f6261626c79206d6573736560008201527f6420757000000000000000000000000000000000000000000000000000000000602082015250565b6000613a7f602483612ff6565b9150613a8a82613a23565b604082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b7f4d696e74696e6720666565206f6620302e30303432206574686572207265717560008201527f6972656400000000000000000000000000000000000000000000000000000000602082015250565b6000613b11602483612ff6565b9150613b1c82613ab5565b604082019050919050565b60006020820190508181036000830152613b4081613b04565b9050919050565b600081905092915050565b7f4f6e436861696e4672616d65537461696e202d20000000000000000000000000600082015250565b6000613b88601483613b47565b9150613b9382613b52565b601482019050919050565b6000613ba982612feb565b613bb38185613b47565b9350613bc3818560208601613007565b80840191505092915050565b6000613bda82613b7b565b9150613be68284613b9e565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613c2b8261309d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c5d57613c5c613bf1565b5b600182019050919050565b6000613c738261309d565b9150613c7e8361309d565b9250828201905080821115613c9657613c95613bf1565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613cf8602d83612ff6565b9150613d0382613c9c565b604082019050919050565b60006020820190508181036000830152613d2781613ceb565b9050919050565b6000613d3a8284613b9e565b915081905092915050565b6000613d518285613b9e565b9150613d5d8284613b9e565b91508190509392505050565b6000613d748261309d565b9150613d7f8361309d565b9250828203905081811115613d9757613d96613bf1565b5b92915050565b6000819050919050565b613db8613db38261309d565b613d9d565b82525050565b60008160601b9050919050565b6000613dd682613dbe565b9050919050565b6000613de882613dcb565b9050919050565b613e00613dfb8261314a565b613ddd565b82525050565b6000613e128286613da7565b602082019150613e228285613def565b601482019150613e328284613b9e565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e798261309d565b9150613e848361309d565b925082613e9457613e93613e3f565b5b828206905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ed5601883612ff6565b9150613ee082613e9f565b602082019050919050565b60006020820190508181036000830152613f0481613ec8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f67602983612ff6565b9150613f7282613f0b565b604082019050919050565b60006020820190508181036000830152613f9681613f5a565b9050919050565b7f7b22636f6c6f72223a2200000000000000000000000000000000000000000000600082015250565b6000613fd3600a83613b47565b9150613fde82613f9d565b600a82019050919050565b7f222c20226261636b67726f756e64223a22000000000000000000000000000000600082015250565b600061401f601183613b47565b915061402a82613fe9565b601182019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061406b600283613b47565b915061407682614035565b600282019050919050565b600061408c82613fc6565b91506140988285613b9e565b91506140a382614012565b91506140af8284613b9e565b91506140ba8261405e565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006140fc601d83613b47565b9150614107826140c6565b601d82019050919050565b600061411d826140ef565b91506141298284613b9e565b915081905092915050565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b600061416a600183613b47565b915061417582614134565b600182019050919050565b600061418c8284613b9e565b91506141978261415d565b915081905092915050565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b60006141d8600183613b47565b91506141e3826141a2565b600182019050919050565b60006141fa8284613b9e565b9150614205826141cb565b915081905092915050565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614246600183613b47565b915061425182614210565b600182019050919050565b60006142688284613b9e565b915061427382614239565b915081905092915050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b60006142b4600183613b47565b91506142bf8261427e565b600182019050919050565b60006142d68284613b9e565b91506142e1826142a7565b915081905092915050565b7f3500000000000000000000000000000000000000000000000000000000000000600082015250565b6000614322600183613b47565b915061432d826142ec565b600182019050919050565b60006143448284613b9e565b915061434f82614315565b915081905092915050565b7f3600000000000000000000000000000000000000000000000000000000000000600082015250565b6000614390600183613b47565b915061439b8261435a565b600182019050919050565b60006143b28284613b9e565b91506143bd82614383565b915081905092915050565b7f63202d0000000000000000000000000000000000000000000000000000000000600082015250565b60006143fe600383613b47565b9150614409826143c8565b600382019050919050565b7f202d000000000000000000000000000000000000000000000000000000000000600082015250565b600061444a600283613b47565b915061445582614414565b600282019050919050565b7f2c20000000000000000000000000000000000000000000000000000000000000600082015250565b6000614496600283613b47565b91506144a182614460565b600282019050919050565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b60006144e2600183613b47565b91506144ed826144ac565b600182019050919050565b7f3020300000000000000000000000000000000000000000000000000000000000600082015250565b600061452e600383613b47565b9150614539826144f8565b600382019050919050565b600061454f826143f1565b915061455b8287613b9e565b91506145668261443d565b91506145728286613b9e565b915061457d82614489565b91506145898285613b9e565b9150614594826144d5565b91506145a08284613b9e565b91506145ab82614489565b91506145b682614521565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c69642068657820636f6c6f7220737472696e670000000000000000600082015250565b6000614629601883612ff6565b9150614634826145f3565b602082019050919050565b600060208201905081810360008301526146588161461c565b9050919050565b600061466b8285613da7565b60208201915061467b8284613def565b6014820191508190509392505050565b7f2300000000000000000000000000000000000000000000000000000000000000600082015250565b60006146c1600183613b47565b91506146cc8261468b565b600182019050919050565b60006146e2826146b4565b91506146ee8284613b9e565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614755602683612ff6565b9150614760826146f9565b604082019050919050565b6000602082019050818103600083015261478481614748565b9050919050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b60006147c1600983613b47565b91506147cc8261478b565b600982019050919050565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b600061480d601383613b47565b9150614818826147d7565b601382019050919050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b6000614859600183613b47565b915061486482614823565b600182019050919050565b7f2c202261747472696275746573223a2022000000000000000000000000000000600082015250565b60006148a5601183613b47565b91506148b08261486f565b601182019050919050565b7f222c2022696d616765223a220000000000000000000000000000000000000000600082015250565b60006148f1600c83613b47565b91506148fc826148bb565b600c82019050919050565b6000614912826147b4565b915061491e8287613b9e565b915061492982614800565b91506149358286613b9e565b91506149408261484c565b915061494b82614898565b91506149578285613b9e565b9150614962826148e4565b915061496e8284613b9e565b91506149798261405e565b915081905095945050505050565b7f3c7376672077696474683d2235303022206865696768743d223530302220766960008201527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e3c7265637420783d2260408201527f302220793d2230222077696474683d2235303022206865696768743d2235303060608201527f22207374726f6b653d0000000000000000000000000000000000000000000000608082015250565b6000614a55608983613b47565b9150614a6082614987565b608982019050919050565b7f207374726f6b652d77696474683d223135222066696c6c3d0000000000000000600082015250565b6000614aa1601883613b47565b9150614aac82614a6b565b601882019050919050565b7f2f3e3c7061746820643d00000000000000000000000000000000000000000000600082015250565b6000614aed600a83613b47565b9150614af882614ab7565b600a82019050919050565b7f4d20323530203235302000000000000000000000000000000000000000000000600082015250565b6000614b39600a83613b47565b9150614b4482614b03565b600a82019050919050565b7f207a000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b85600283613b47565b9150614b9082614b4f565b600282019050919050565b7f2066696c6c3d0000000000000000000000000000000000000000000000000000600082015250565b6000614bd1600683613b47565b9150614bdc82614b9b565b600682019050919050565b7f2f3e3c2f7376673e000000000000000000000000000000000000000000000000600082015250565b6000614c1d600883613b47565b9150614c2882614be7565b600882019050919050565b6000614c3e82614a48565b9150614c498261484c565b9150614c558289613b9e565b9150614c608261484c565b9150614c6b82614a94565b9150614c768261484c565b9150614c828288613b9e565b9150614c8d8261484c565b9150614c9882614ae0565b9150614ca38261484c565b9150614cae82614b2c565b9150614cba8287613b9e565b9150614cc5826144d5565b9150614cd18286613b9e565b9150614cdc826144d5565b9150614ce88285613b9e565b9150614cf382614b78565b9150614cfe8261484c565b9150614d0982614bc4565b9150614d148261484c565b9150614d208284613b9e565b9150614d2b8261484c565b9150614d3682614c10565b9150819050979650505050505050565b7f3c7376672077696474683d2235303022206865696768743d223530302220766960008201527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e3c636972636c65206360408201527f783d22323530222063793d223235302220723d2232303022207374726f6b653d606082015250565b6000614dee608083613b47565b9150614df982614d46565b608082019050919050565b6000614e0f82614de1565b9150614e1a8261484c565b9150614e268289613b9e565b9150614e318261484c565b9150614e3c82614a94565b9150614e478261484c565b9150614e538288613b9e565b9150614e5e8261484c565b9150614e6982614ae0565b9150614e748261484c565b9150614e7f82614b2c565b9150614e8b8287613b9e565b9150614e96826144d5565b9150614ea28286613b9e565b9150614ead826144d5565b9150614eb98285613b9e565b9150614ec482614b78565b9150614ecf8261484c565b9150614eda82614bc4565b9150614ee58261484c565b9150614ef18284613b9e565b9150614efc8261484c565b9150614f0782614c10565b9150819050979650505050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614f4d602083612ff6565b9150614f5882614f17565b602082019050919050565b60006020820190508181036000830152614f7c81614f40565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614fb9601c83612ff6565b9150614fc482614f83565b602082019050919050565b60006020820190508181036000830152614fe881614fac565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b600061504b602e83612ff6565b915061505682614fef565b604082019050919050565b6000602082019050818103600083015261507a8161503e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026150e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826150a6565b6150ed86836150a6565b95508019841693508086168417925050509392505050565b6000819050919050565b600061512a6151256151208461309d565b615105565b61309d565b9050919050565b6000819050919050565b6151448361510f565b61515861515082615131565b8484546150b3565b825550505050565b600090565b61516d615160565b61517881848461513b565b505050565b5b8181101561519c57615191600082615165565b60018101905061517e565b5050565b601f8211156151e1576151b281615081565b6151bb84615096565b810160208510156151ca578190505b6151de6151d685615096565b83018261517d565b50505b505050565b600082821c905092915050565b6000615204600019846008026151e6565b1980831691505092915050565b600061521d83836151f3565b9150826002028217905092915050565b61523682612feb565b67ffffffffffffffff81111561524f5761524e61324f565b5b61525982546137f6565b6152648282856151a0565b600060209050601f8311600181146152975760008415615285578287015190505b61528f8582615211565b8655506152f7565b601f1984166152a586615081565b60005b828110156152cd578489015182556001820191506020850194506020810190506152a8565b868310156152ea57848901516152e6601f8916826151f3565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061535b602583612ff6565b9150615366826152ff565b604082019050919050565b6000602082019050818103600083015261538a8161534e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153ed602483612ff6565b91506153f882615391565b604082019050919050565b6000602082019050818103600083015261541c816153e0565b9050919050565b600061542e8261309d565b91506154398361309d565b92508261544957615448613e3f565b5b828204905092915050565b600061545f8261309d565b915061546a8361309d565b92508282026154788161309d565b9150828204841483151761548f5761548e613bf1565b5b5092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006154cc602083612ff6565b91506154d782615496565b602082019050919050565b600060208201905081810360008301526154fb816154bf565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615538601983612ff6565b915061554382615502565b602082019050919050565b600060208201905081810360008301526155678161552b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006155ca603283612ff6565b91506155d58261556e565b604082019050919050565b600060208201905081810360008301526155f9816155bd565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061562782615600565b615631818561560b565b9350615641818560208601613007565b61564a81613031565b840191505092915050565b600060808201905061566a600083018761315c565b615677602083018661315c565b61568460408301856130a7565b8181036060830152615696818461561c565b905095945050505050565b6000815190506156b081612f5c565b92915050565b6000602082840312156156cc576156cb612f26565b5b60006156da848285016156a1565b9150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c6d687dcee9b761b84143ad57c4d41ec9bf8e32e9fd9e607f154955626409cda64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101c65760003560e01c806370a08231116100f7578063c87b56dd11610095578063e5bb287511610064578063e5bb287514610678578063e985e9c5146106b5578063f2fde38b146106f2578063f66d61a31461071b576101cd565b8063c87b56dd14610584578063ce52c115146105c1578063d17f0132146105fe578063dd41df8e1461063b576101cd565b806395d89b41116100d157806395d89b41146104ca578063a05b48db146104f5578063a22cb46514610532578063b88d4fde1461055b576101cd565b806370a082311461044b578063715018a6146104885780638da5cb5b1461049f576101cd565b806323b872dd116101645780633ccfd60b1161013e5780633ccfd60b146103a357806342842e0e146103ba5780636352211e146103e35780636de9f32b14610420576101cd565b806323b872dd1461030057806330d871c614610329578063341b9b9214610366576101cd565b8063081812fc116101a0578063081812fc14610265578063095ea7b3146102a25780631249c58b146102cb57806318160ddd146102d5576101cd565b806301ffc9a7146101d257806306fdde031461020f578063078afb9d1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612f88565b610758565b6040516102069190612fd0565b60405180910390f35b34801561021b57600080fd5b5061022461083a565b604051610231919061307b565b60405180910390f35b34801561024657600080fd5b5061024f6108cc565b60405161025c91906130b6565b60405180910390f35b34801561027157600080fd5b5061028c600480360381019061028791906130fd565b6108d2565b604051610299919061316b565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c491906131b2565b610918565b005b6102d3610a2f565b005b3480156102e157600080fd5b506102ea610e57565b6040516102f791906130b6565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906131f2565b610e61565b005b34801561033557600080fd5b50610350600480360381019061034b919061337a565b610ec1565b60405161035d919061307b565b60405180910390f35b34801561037257600080fd5b5061038d600480360381019061038891906133c3565b610f54565b60405161039a91906130b6565b60405180910390f35b3480156103af57600080fd5b506103b8610fc2565b005b3480156103c657600080fd5b506103e160048036038101906103dc91906131f2565b611013565b005b3480156103ef57600080fd5b5061040a600480360381019061040591906130fd565b611033565b604051610417919061316b565b60405180910390f35b34801561042c57600080fd5b506104356110b9565b60405161044291906130b6565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d9190613432565b6110bf565b60405161047f91906130b6565b60405180910390f35b34801561049457600080fd5b5061049d611176565b005b3480156104ab57600080fd5b506104b461118a565b6040516104c1919061316b565b60405180910390f35b3480156104d657600080fd5b506104df6111b4565b6040516104ec919061307b565b60405180910390f35b34801561050157600080fd5b5061051c6004803603810190610517919061345f565b611246565b604051610529919061307b565b60405180910390f35b34801561053e57600080fd5b5061055960048036038101906105549190613503565b611299565b005b34801561056757600080fd5b50610582600480360381019061057d91906135e4565b6112af565b005b34801561059057600080fd5b506105ab60048036038101906105a691906130fd565b611311565b6040516105b8919061307b565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e3919061337a565b611423565b6040516105f5919061307b565b60405180910390f35b34801561060a57600080fd5b506106256004803603810190610620919061337a565b61159e565b604051610632919061307b565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190613667565b61175e565b60405161066f91906130b6565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a919061337a565b611769565b6040516106ac919061307b565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d791906136b0565b61190c565b6040516106e99190612fd0565b60405180910390f35b3480156106fe57600080fd5b5061071960048036038101906107149190613432565b6119a0565b005b34801561072757600080fd5b50610742600480360381019061073d91906136f0565b611a23565b60405161074f919061307b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610833575061083282611a7c565b5b9050919050565b606060008054610849906137f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610875906137f6565b80156108c25780601f10610897576101008083540402835291602001916108c2565b820191906000526020600020905b8154815290600101906020018083116108a557829003601f168201915b5050505050905090565b600b5481565b60006108dd82611ae6565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092382611033565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098a90613899565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b2611b31565b73ffffffffffffffffffffffffffffffffffffffff1614806109e157506109e0816109db611b31565b61190c565b5b610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a179061392b565b60405180910390fd5b610a2a8383611b39565b505050565b6000610a39610e57565b90506103e78110610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7690613997565b60405180910390fd5b6003600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890613a03565b60405180910390fd5b6009600082815260200190815260200160002060009054906101000a900460ff1615610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613a95565b60405180910390fd5b660eebe0b40e8000341015610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390613b27565b60405180910390fd5b60016009600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610c186040518060400160405280600681526020017f6672616d65640000000000000000000000000000000000000000000000000000815250611769565b90506000610c5a6040518060400160405280600581526020017f737461696e000000000000000000000000000000000000000000000000000000815250611769565b90506000610c9c6040518060400160405280600781526020017f6f6e636861696e00000000000000000000000000000000000000000000000000815250611423565b90506000610cde6040518060400160405280600681526020017f6672616d65640000000000000000000000000000000000000000000000000000815250611423565b90506000610d206040518060400160405280600581526020017f737461696e000000000000000000000000000000000000000000000000000000815250611423565b90506000610d2d8661159e565b90506000610d47610d4288848888888c611bf2565b610ec1565b90506000610d5489611ca2565b604051602001610d649190613bcf565b604051602081830303815290604052905060006040518060400160405280601681526020017f4672616d656420537461696e73204f6e636861696e210000000000000000000081525090506000610dbb8a86611246565b90506000610dcb85858585611a23565b9050610dd7338d611d70565b610de18c82611f8d565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610e3190613c20565b919050555060018c610e439190613c68565b600a81905550505050505050505050505050565b6000600a54905090565b610e72610e6c611b31565b82611ffa565b610eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea890613d0e565b60405180910390fd5b610ebc83838361208f565b505050565b606060006040518060400160405280601a81526020017f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525090506000610f2784604051602001610f139190613d2e565b604051602081830303815290604052612388565b90508181604051602001610f3c929190613d45565b60405160208183030381529060405292505050919050565b60008060018585610f659190613d69565b610f6f9190613c68565b423385604051602001610f8493929190613e06565b6040516020818303038152906040528051906020012060001c610fa79190613e6e565b90508481610fb59190613c68565b9050809150509392505050565b610fca6124eb565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611010573d6000803e3d6000fd5b50565b61102e838383604051806020016040528060008152506112af565b505050565b60008061103f83612569565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a790613eeb565b60405180910390fd5b80915050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690613f7d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61117e6124eb565b61118860006125a6565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111c3906137f6565b80601f01602080910402602001604051908101604052809291908181526020018280546111ef906137f6565b801561123c5780601f106112115761010080835404028352916020019161123c565b820191906000526020600020905b81548152906001019060200180831161121f57829003601f168201915b5050505050905090565b6060611272838360405160200161125e929190614081565b604051602081830303815290604052612388565b6040516020016112829190614112565b604051602081830303815290604052905092915050565b6112ab6112a4611b31565b838361266c565b5050565b6112c06112ba611b31565b83611ffa565b6112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613d0e565b60405180910390fd5b61130b848484846127d8565b50505050565b606061131c82611ae6565b600060066000848152602001908152602001600020805461133c906137f6565b80601f0160208091040260200160405190810160405280929190818152602001828054611368906137f6565b80156113b55780601f1061138a576101008083540402835291602001916113b5565b820191906000526020600020905b81548152906001019060200180831161139857829003601f168201915b5050505050905060006113c6612834565b905060008151036113db57819250505061141e565b6000825111156114105780826040516020016113f8929190613d45565b6040516020818303038152906040529250505061141e565b6114198461284b565b925050505b919050565b60606000611453600a608c8560405160200161143f9190614180565b604051602081830303815290604052610f54565b90506000611483600a608c8660405160200161146f91906141ee565b604051602081830303815290604052610f54565b905060006114b3600a608c8760405160200161149f919061425c565b604051602081830303815290604052610f54565b905060006114e3600a608c886040516020016114cf91906142ca565b604051602081830303815290604052610f54565b90506000611513600a608c896040516020016114ff9190614338565b604051602081830303815290604052610f54565b90506000611543600a608c8a60405160200161152f91906143a6565b604051602081830303815290604052610f54565b9050600061155087611ca2565b61155987611ca2565b61156287611ca2565b61156b87611ca2565b60405160200161157e9493929190614544565b604051602081830303815290604052905080975050505050505050919050565b606060008290506007815114801561161557507f2300000000000000000000000000000000000000000000000000000000000000816000815181106115e6576115e56145c4565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b9061463f565b60405180910390fd5b6000600167ffffffffffffffff8111156116715761167061324f565b5b6040519080825280601f01601f1916602001820160405280156116a35781602001600182028036833780820191505090505b509050600061010042336040516020016116be92919061465f565b6040516020818303038152906040528051906020012060001c6116e19190613e6e565b90508060f81b826000815181106116fb576116fa6145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535084611734836128b3565b604051602001611745929190613d45565b6040516020818303038152906040529350505050919050565b600081519050919050565b60606000600367ffffffffffffffff8111156117885761178761324f565b5b6040519080825280601f01601f1916602001820160405280156117ba5781602001600182028036833780820191505090505b509050600063010000004233866040516020016117d993929190613e06565b6040516020818303038152906040528051906020012060001c6117fc9190613e6e565b9050601081901c60f81b8260008151811061181a576118196145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600881901c60f81b82600181518110611865576118646145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060f81b826002815181106118ac576118ab6145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506118e4826128b3565b6040516020016118f491906146d7565b60405160208183030381529060405292505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119a86124eb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e9061476b565b60405180910390fd5b611a20816125a6565b50565b6060611a5384848488604051602001611a3f9493929190614907565b604051602081830303815290604052612388565b604051602001611a639190614112565b6040516020818303038152906040529050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611aef81612ab2565b611b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2590613eeb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bac83611033565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600060024233604051602001611c0b92919061465f565b6040516020818303038152906040528051906020012060001c611c2e9190613e6e565b905060008103611c6a57878787878787604051602001611c5396959493929190614c33565b604051602081830303815290604052915050611c98565b878787878787604051602001611c8596959493929190614e04565b6040516020818303038152906040529150505b9695505050505050565b606060006001611cb184612af3565b01905060008167ffffffffffffffff811115611cd057611ccf61324f565b5b6040519080825280601f01601f191660200182016040528015611d025781602001600182028036833780820191505090505b509050600082602001820190505b600115611d65578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d5957611d58613e3f565b5b04945060008503611d10575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614f63565b60405180910390fd5b611de881612ab2565b15611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f90614fcf565b60405180910390fd5b611e36600083836001612c46565b611e3f81612ab2565b15611e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7690614fcf565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f89600083836001612d6c565b5050565b611f9682612ab2565b611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc90615061565b60405180910390fd5b80600660008481526020019081526020016000209081611ff5919061522d565b505050565b60008061200683611033565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120485750612047818561190c565b5b8061208657508373ffffffffffffffffffffffffffffffffffffffff1661206e846108d2565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120af82611033565b73ffffffffffffffffffffffffffffffffffffffff1614612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90615371565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b90615403565b60405180910390fd5b6121818383836001612c46565b8273ffffffffffffffffffffffffffffffffffffffff166121a182611033565b73ffffffffffffffffffffffffffffffffffffffff16146121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee90615371565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123838383836001612d6c565b505050565b606060008251036123aa576040518060200160405280600081525090506124e6565b60006040518060600160405280604081526020016156e460409139905060006003600285516123d99190613c68565b6123e39190615423565b60046123ef9190615454565b67ffffffffffffffff8111156124085761240761324f565b5b6040519080825280601f01601f19166020018201604052801561243a5781602001600182028036833780820191505090505b509050600182016020820185865187015b808210156124a6576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184536001840193505061244b565b50506003865106600181146124c257600281146124d5576124dd565b603d6001830353603d60028303536124dd565b603d60018303535b50505080925050505b919050565b6124f3611b31565b73ffffffffffffffffffffffffffffffffffffffff1661251161118a565b73ffffffffffffffffffffffffffffffffffffffff1614612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255e906154e2565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d19061554e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127cb9190612fd0565b60405180910390a3505050565b6127e384848461208f565b6127ef84848484612d72565b61282e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612825906155e0565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606061285682611ae6565b6000612860612834565b9050600081511161288057604051806020016040528060008152506128ab565b8061288a84611ca2565b60405160200161289b929190613d45565b6040516020818303038152906040525b915050919050565b606060006040518060400160405280601081526020017f3031323334353637383961626364656600000000000000000000000000000000815250905060008351905060008160026129049190615454565b67ffffffffffffffff81111561291d5761291c61324f565b5b6040519080825280601f01601f19166020018201604052801561294f5781602001600182028036833780820191505090505b5090506000805b83811015612aa5576000878281518110612973576129726145c4565b5b602001015160f81c60f81b60f81c905060008160ff1614612a91578560048260ff16901c60ff16815181106129ab576129aa6145c4565b5b602001015160f81c60f81b848460026129c49190615454565b815181106129d5576129d46145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535085600f821660ff1681518110612a1d57612a1c6145c4565b5b602001015160f81c60f81b846001856002612a389190615454565b612a429190613c68565b81518110612a5357612a526145c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508280612a8d90613c20565b9350505b508080612a9d90613c20565b915050612956565b5081945050505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612ad483612569565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b51577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b4757612b46613e3f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612b8e576d04ee2d6d415b85acef81000000008381612b8457612b83613e3f565b5b0492506020810190505b662386f26fc100008310612bbd57662386f26fc100008381612bb357612bb2613e3f565b5b0492506010810190505b6305f5e1008310612be6576305f5e1008381612bdc57612bdb613e3f565b5b0492506008810190505b6127108310612c0b576127108381612c0157612c00613e3f565b5b0492506004810190505b60648310612c2e5760648381612c2457612c23613e3f565b5b0492506002810190505b600a8310612c3d576001810190505b80915050919050565b6001811115612d6657600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cda5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cd29190613d69565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d655780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5d9190613c68565b925050819055505b5b50505050565b50505050565b6000612d938473ffffffffffffffffffffffffffffffffffffffff16612ef9565b15612eec578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dbc611b31565b8786866040518563ffffffff1660e01b8152600401612dde9493929190615655565b6020604051808303816000875af1925050508015612e1a57506040513d601f19601f82011682018060405250810190612e1791906156b6565b60015b612e9c573d8060008114612e4a576040519150601f19603f3d011682016040523d82523d6000602084013e612e4f565b606091505b506000815103612e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8b906155e0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ef1565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f6581612f30565b8114612f7057600080fd5b50565b600081359050612f8281612f5c565b92915050565b600060208284031215612f9e57612f9d612f26565b5b6000612fac84828501612f73565b91505092915050565b60008115159050919050565b612fca81612fb5565b82525050565b6000602082019050612fe56000830184612fc1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561302557808201518184015260208101905061300a565b60008484015250505050565b6000601f19601f8301169050919050565b600061304d82612feb565b6130578185612ff6565b9350613067818560208601613007565b61307081613031565b840191505092915050565b600060208201905081810360008301526130958184613042565b905092915050565b6000819050919050565b6130b08161309d565b82525050565b60006020820190506130cb60008301846130a7565b92915050565b6130da8161309d565b81146130e557600080fd5b50565b6000813590506130f7816130d1565b92915050565b60006020828403121561311357613112612f26565b5b6000613121848285016130e8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131558261312a565b9050919050565b6131658161314a565b82525050565b6000602082019050613180600083018461315c565b92915050565b61318f8161314a565b811461319a57600080fd5b50565b6000813590506131ac81613186565b92915050565b600080604083850312156131c9576131c8612f26565b5b60006131d78582860161319d565b92505060206131e8858286016130e8565b9150509250929050565b60008060006060848603121561320b5761320a612f26565b5b60006132198682870161319d565b935050602061322a8682870161319d565b925050604061323b868287016130e8565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61328782613031565b810181811067ffffffffffffffff821117156132a6576132a561324f565b5b80604052505050565b60006132b9612f1c565b90506132c5828261327e565b919050565b600067ffffffffffffffff8211156132e5576132e461324f565b5b6132ee82613031565b9050602081019050919050565b82818337600083830152505050565b600061331d613318846132ca565b6132af565b9050828152602081018484840111156133395761333861324a565b5b6133448482856132fb565b509392505050565b600082601f83011261336157613360613245565b5b813561337184826020860161330a565b91505092915050565b6000602082840312156133905761338f612f26565b5b600082013567ffffffffffffffff8111156133ae576133ad612f2b565b5b6133ba8482850161334c565b91505092915050565b6000806000606084860312156133dc576133db612f26565b5b60006133ea868287016130e8565b93505060206133fb868287016130e8565b925050604084013567ffffffffffffffff81111561341c5761341b612f2b565b5b6134288682870161334c565b9150509250925092565b60006020828403121561344857613447612f26565b5b60006134568482850161319d565b91505092915050565b6000806040838503121561347657613475612f26565b5b600083013567ffffffffffffffff81111561349457613493612f2b565b5b6134a08582860161334c565b925050602083013567ffffffffffffffff8111156134c1576134c0612f2b565b5b6134cd8582860161334c565b9150509250929050565b6134e081612fb5565b81146134eb57600080fd5b50565b6000813590506134fd816134d7565b92915050565b6000806040838503121561351a57613519612f26565b5b60006135288582860161319d565b9250506020613539858286016134ee565b9150509250929050565b600067ffffffffffffffff82111561355e5761355d61324f565b5b61356782613031565b9050602081019050919050565b600061358761358284613543565b6132af565b9050828152602081018484840111156135a3576135a261324a565b5b6135ae8482856132fb565b509392505050565b600082601f8301126135cb576135ca613245565b5b81356135db848260208601613574565b91505092915050565b600080600080608085870312156135fe576135fd612f26565b5b600061360c8782880161319d565b945050602061361d8782880161319d565b935050604061362e878288016130e8565b925050606085013567ffffffffffffffff81111561364f5761364e612f2b565b5b61365b878288016135b6565b91505092959194509250565b60006020828403121561367d5761367c612f26565b5b600082013567ffffffffffffffff81111561369b5761369a612f2b565b5b6136a7848285016135b6565b91505092915050565b600080604083850312156136c7576136c6612f26565b5b60006136d58582860161319d565b92505060206136e68582860161319d565b9150509250929050565b6000806000806080858703121561370a57613709612f26565b5b600085013567ffffffffffffffff81111561372857613727612f2b565b5b6137348782880161334c565b945050602085013567ffffffffffffffff81111561375557613754612f2b565b5b6137618782880161334c565b935050604085013567ffffffffffffffff81111561378257613781612f2b565b5b61378e8782880161334c565b925050606085013567ffffffffffffffff8111156137af576137ae612f2b565b5b6137bb8782880161334c565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061380e57607f821691505b602082108103613821576138206137c7565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613883602183612ff6565b915061388e82613827565b604082019050919050565b600060208201905081810360008301526138b281613876565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613915603d83612ff6565b9150613920826138b9565b604082019050919050565b6000602082019050818103600083015261394481613908565b9050919050565b7f616c6c206d696e746564206f7574210000000000000000000000000000000000600082015250565b6000613981600f83612ff6565b915061398c8261394b565b602082019050919050565b600060208201905081810360008301526139b081613974565b9050919050565b7f3320697320706c656e7479210000000000000000000000000000000000000000600082015250565b60006139ed600c83612ff6565b91506139f8826139b7565b602082019050919050565b60006020820190508181036000830152613a1c816139e0565b9050919050565b7f496620796f7520736565207468697320492070726f6261626c79206d6573736560008201527f6420757000000000000000000000000000000000000000000000000000000000602082015250565b6000613a7f602483612ff6565b9150613a8a82613a23565b604082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b7f4d696e74696e6720666565206f6620302e30303432206574686572207265717560008201527f6972656400000000000000000000000000000000000000000000000000000000602082015250565b6000613b11602483612ff6565b9150613b1c82613ab5565b604082019050919050565b60006020820190508181036000830152613b4081613b04565b9050919050565b600081905092915050565b7f4f6e436861696e4672616d65537461696e202d20000000000000000000000000600082015250565b6000613b88601483613b47565b9150613b9382613b52565b601482019050919050565b6000613ba982612feb565b613bb38185613b47565b9350613bc3818560208601613007565b80840191505092915050565b6000613bda82613b7b565b9150613be68284613b9e565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613c2b8261309d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c5d57613c5c613bf1565b5b600182019050919050565b6000613c738261309d565b9150613c7e8361309d565b9250828201905080821115613c9657613c95613bf1565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613cf8602d83612ff6565b9150613d0382613c9c565b604082019050919050565b60006020820190508181036000830152613d2781613ceb565b9050919050565b6000613d3a8284613b9e565b915081905092915050565b6000613d518285613b9e565b9150613d5d8284613b9e565b91508190509392505050565b6000613d748261309d565b9150613d7f8361309d565b9250828203905081811115613d9757613d96613bf1565b5b92915050565b6000819050919050565b613db8613db38261309d565b613d9d565b82525050565b60008160601b9050919050565b6000613dd682613dbe565b9050919050565b6000613de882613dcb565b9050919050565b613e00613dfb8261314a565b613ddd565b82525050565b6000613e128286613da7565b602082019150613e228285613def565b601482019150613e328284613b9e565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e798261309d565b9150613e848361309d565b925082613e9457613e93613e3f565b5b828206905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ed5601883612ff6565b9150613ee082613e9f565b602082019050919050565b60006020820190508181036000830152613f0481613ec8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f67602983612ff6565b9150613f7282613f0b565b604082019050919050565b60006020820190508181036000830152613f9681613f5a565b9050919050565b7f7b22636f6c6f72223a2200000000000000000000000000000000000000000000600082015250565b6000613fd3600a83613b47565b9150613fde82613f9d565b600a82019050919050565b7f222c20226261636b67726f756e64223a22000000000000000000000000000000600082015250565b600061401f601183613b47565b915061402a82613fe9565b601182019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061406b600283613b47565b915061407682614035565b600282019050919050565b600061408c82613fc6565b91506140988285613b9e565b91506140a382614012565b91506140af8284613b9e565b91506140ba8261405e565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006140fc601d83613b47565b9150614107826140c6565b601d82019050919050565b600061411d826140ef565b91506141298284613b9e565b915081905092915050565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b600061416a600183613b47565b915061417582614134565b600182019050919050565b600061418c8284613b9e565b91506141978261415d565b915081905092915050565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b60006141d8600183613b47565b91506141e3826141a2565b600182019050919050565b60006141fa8284613b9e565b9150614205826141cb565b915081905092915050565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614246600183613b47565b915061425182614210565b600182019050919050565b60006142688284613b9e565b915061427382614239565b915081905092915050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b60006142b4600183613b47565b91506142bf8261427e565b600182019050919050565b60006142d68284613b9e565b91506142e1826142a7565b915081905092915050565b7f3500000000000000000000000000000000000000000000000000000000000000600082015250565b6000614322600183613b47565b915061432d826142ec565b600182019050919050565b60006143448284613b9e565b915061434f82614315565b915081905092915050565b7f3600000000000000000000000000000000000000000000000000000000000000600082015250565b6000614390600183613b47565b915061439b8261435a565b600182019050919050565b60006143b28284613b9e565b91506143bd82614383565b915081905092915050565b7f63202d0000000000000000000000000000000000000000000000000000000000600082015250565b60006143fe600383613b47565b9150614409826143c8565b600382019050919050565b7f202d000000000000000000000000000000000000000000000000000000000000600082015250565b600061444a600283613b47565b915061445582614414565b600282019050919050565b7f2c20000000000000000000000000000000000000000000000000000000000000600082015250565b6000614496600283613b47565b91506144a182614460565b600282019050919050565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b60006144e2600183613b47565b91506144ed826144ac565b600182019050919050565b7f3020300000000000000000000000000000000000000000000000000000000000600082015250565b600061452e600383613b47565b9150614539826144f8565b600382019050919050565b600061454f826143f1565b915061455b8287613b9e565b91506145668261443d565b91506145728286613b9e565b915061457d82614489565b91506145898285613b9e565b9150614594826144d5565b91506145a08284613b9e565b91506145ab82614489565b91506145b682614521565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c69642068657820636f6c6f7220737472696e670000000000000000600082015250565b6000614629601883612ff6565b9150614634826145f3565b602082019050919050565b600060208201905081810360008301526146588161461c565b9050919050565b600061466b8285613da7565b60208201915061467b8284613def565b6014820191508190509392505050565b7f2300000000000000000000000000000000000000000000000000000000000000600082015250565b60006146c1600183613b47565b91506146cc8261468b565b600182019050919050565b60006146e2826146b4565b91506146ee8284613b9e565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614755602683612ff6565b9150614760826146f9565b604082019050919050565b6000602082019050818103600083015261478481614748565b9050919050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b60006147c1600983613b47565b91506147cc8261478b565b600982019050919050565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b600061480d601383613b47565b9150614818826147d7565b601382019050919050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b6000614859600183613b47565b915061486482614823565b600182019050919050565b7f2c202261747472696275746573223a2022000000000000000000000000000000600082015250565b60006148a5601183613b47565b91506148b08261486f565b601182019050919050565b7f222c2022696d616765223a220000000000000000000000000000000000000000600082015250565b60006148f1600c83613b47565b91506148fc826148bb565b600c82019050919050565b6000614912826147b4565b915061491e8287613b9e565b915061492982614800565b91506149358286613b9e565b91506149408261484c565b915061494b82614898565b91506149578285613b9e565b9150614962826148e4565b915061496e8284613b9e565b91506149798261405e565b915081905095945050505050565b7f3c7376672077696474683d2235303022206865696768743d223530302220766960008201527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e3c7265637420783d2260408201527f302220793d2230222077696474683d2235303022206865696768743d2235303060608201527f22207374726f6b653d0000000000000000000000000000000000000000000000608082015250565b6000614a55608983613b47565b9150614a6082614987565b608982019050919050565b7f207374726f6b652d77696474683d223135222066696c6c3d0000000000000000600082015250565b6000614aa1601883613b47565b9150614aac82614a6b565b601882019050919050565b7f2f3e3c7061746820643d00000000000000000000000000000000000000000000600082015250565b6000614aed600a83613b47565b9150614af882614ab7565b600a82019050919050565b7f4d20323530203235302000000000000000000000000000000000000000000000600082015250565b6000614b39600a83613b47565b9150614b4482614b03565b600a82019050919050565b7f207a000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b85600283613b47565b9150614b9082614b4f565b600282019050919050565b7f2066696c6c3d0000000000000000000000000000000000000000000000000000600082015250565b6000614bd1600683613b47565b9150614bdc82614b9b565b600682019050919050565b7f2f3e3c2f7376673e000000000000000000000000000000000000000000000000600082015250565b6000614c1d600883613b47565b9150614c2882614be7565b600882019050919050565b6000614c3e82614a48565b9150614c498261484c565b9150614c558289613b9e565b9150614c608261484c565b9150614c6b82614a94565b9150614c768261484c565b9150614c828288613b9e565b9150614c8d8261484c565b9150614c9882614ae0565b9150614ca38261484c565b9150614cae82614b2c565b9150614cba8287613b9e565b9150614cc5826144d5565b9150614cd18286613b9e565b9150614cdc826144d5565b9150614ce88285613b9e565b9150614cf382614b78565b9150614cfe8261484c565b9150614d0982614bc4565b9150614d148261484c565b9150614d208284613b9e565b9150614d2b8261484c565b9150614d3682614c10565b9150819050979650505050505050565b7f3c7376672077696474683d2235303022206865696768743d223530302220766960008201527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e3c636972636c65206360408201527f783d22323530222063793d223235302220723d2232303022207374726f6b653d606082015250565b6000614dee608083613b47565b9150614df982614d46565b608082019050919050565b6000614e0f82614de1565b9150614e1a8261484c565b9150614e268289613b9e565b9150614e318261484c565b9150614e3c82614a94565b9150614e478261484c565b9150614e538288613b9e565b9150614e5e8261484c565b9150614e6982614ae0565b9150614e748261484c565b9150614e7f82614b2c565b9150614e8b8287613b9e565b9150614e96826144d5565b9150614ea28286613b9e565b9150614ead826144d5565b9150614eb98285613b9e565b9150614ec482614b78565b9150614ecf8261484c565b9150614eda82614bc4565b9150614ee58261484c565b9150614ef18284613b9e565b9150614efc8261484c565b9150614f0782614c10565b9150819050979650505050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614f4d602083612ff6565b9150614f5882614f17565b602082019050919050565b60006020820190508181036000830152614f7c81614f40565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614fb9601c83612ff6565b9150614fc482614f83565b602082019050919050565b60006020820190508181036000830152614fe881614fac565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b600061504b602e83612ff6565b915061505682614fef565b604082019050919050565b6000602082019050818103600083015261507a8161503e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026150e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826150a6565b6150ed86836150a6565b95508019841693508086168417925050509392505050565b6000819050919050565b600061512a6151256151208461309d565b615105565b61309d565b9050919050565b6000819050919050565b6151448361510f565b61515861515082615131565b8484546150b3565b825550505050565b600090565b61516d615160565b61517881848461513b565b505050565b5b8181101561519c57615191600082615165565b60018101905061517e565b5050565b601f8211156151e1576151b281615081565b6151bb84615096565b810160208510156151ca578190505b6151de6151d685615096565b83018261517d565b50505b505050565b600082821c905092915050565b6000615204600019846008026151e6565b1980831691505092915050565b600061521d83836151f3565b9150826002028217905092915050565b61523682612feb565b67ffffffffffffffff81111561524f5761524e61324f565b5b61525982546137f6565b6152648282856151a0565b600060209050601f8311600181146152975760008415615285578287015190505b61528f8582615211565b8655506152f7565b601f1984166152a586615081565b60005b828110156152cd578489015182556001820191506020850194506020810190506152a8565b868310156152ea57848901516152e6601f8916826151f3565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061535b602583612ff6565b9150615366826152ff565b604082019050919050565b6000602082019050818103600083015261538a8161534e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153ed602483612ff6565b91506153f882615391565b604082019050919050565b6000602082019050818103600083015261541c816153e0565b9050919050565b600061542e8261309d565b91506154398361309d565b92508261544957615448613e3f565b5b828204905092915050565b600061545f8261309d565b915061546a8361309d565b92508282026154788161309d565b9150828204841483151761548f5761548e613bf1565b5b5092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006154cc602083612ff6565b91506154d782615496565b602082019050919050565b600060208201905081810360008301526154fb816154bf565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615538601983612ff6565b915061554382615502565b602082019050919050565b600060208201905081810360008301526155678161552b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006155ca603283612ff6565b91506155d58261556e565b604082019050919050565b600060208201905081810360008301526155f9816155bd565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061562782615600565b615631818561560b565b9350615641818560208601613007565b61564a81613031565b840191505092915050565b600060808201905061566a600083018761315c565b615677602083018661315c565b61568460408301856130a7565b8181036060830152615696818461561c565b905095945050505050565b6000815190506156b081612f5c565b92915050565b6000602082840312156156cc576156cb612f26565b5b60006156da848285016156a1565b9150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c6d687dcee9b761b84143ad57c4d41ec9bf8e32e9fd9e607f154955626409cda64736f6c63430008120033

Deployed Bytecode Sourcemap

61537:7326:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43659:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44587:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61847:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46099:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45617:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64219:1369;;;:::i;:::-;;62219:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46799:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61890:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66313:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66609:107;;;;;;;;;;;;;:::i;:::-;;47205:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44297:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61809:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44028:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2776:103;;;;;;;;;;;;;:::i;:::-;;2128:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44756:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66724:535;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46342:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47461:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60025:624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65592:717;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68366:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67720:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67267:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46568:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3034:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62318:717;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43659:305;43761:4;43813:25;43798:40;;;:11;:40;;;;:105;;;;43870:33;43855:48;;;:11;:48;;;;43798:105;:158;;;;43920:36;43944:11;43920:23;:36::i;:::-;43798:158;43778:178;;43659:305;;;:::o;44587:100::-;44641:13;44674:5;44667:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44587:100;:::o;61847:34::-;;;;:::o;46099:171::-;46175:7;46195:23;46210:7;46195:14;:23::i;:::-;46238:15;:24;46254:7;46238:24;;;;;;;;;;;;;;;;;;;;;46231:31;;46099:171;;;:::o;45617:416::-;45698:13;45714:23;45729:7;45714:14;:23::i;:::-;45698:39;;45762:5;45756:11;;:2;:11;;;45748:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45856:5;45840:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45865:37;45882:5;45889:12;:10;:12::i;:::-;45865:16;:37::i;:::-;45840:62;45818:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;46004:21;46013:2;46017:7;46004:8;:21::i;:::-;45687:346;45617:416;;:::o;64219:1369::-;64261:17;64281:13;:11;:13::i;:::-;64261:33;;64325:3;64313:9;:15;64305:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;64400:1;64367:18;:30;64386:10;64367:30;;;;;;;;;;;;;;;;:34;64359:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;64438:7;:18;64446:9;64438:18;;;;;;;;;;;;;;;;;;;;;64437:19;64429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64529:12;64516:9;:25;;64508:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;64614:4;64593:7;:18;64601:9;64593:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;64629:19;64651:29;;;;;;;;;;;;;;;;;;:19;:29::i;:::-;64629:51;;64691:24;64718:28;;;;;;;;;;;;;;;;;;:19;:28::i;:::-;64691:55;;64757:19;64779;;;;;;;;;;;;;;;;;;:8;:19::i;:::-;64757:41;;64809:21;64833:18;;;;;;;;;;;;;;;;;;:8;:18::i;:::-;64809:42;;64862:21;64886:17;;;;;;;;;;;;;;;;;;:8;:17::i;:::-;64862:41;;64914:24;64941:23;64958:5;64941:16;:23::i;:::-;64914:50;;64975:22;65000:82;65014:67;65026:5;65033:10;65045:5;65052:7;65061;65070:10;65014:11;:67::i;:::-;65000:13;:82::i;:::-;64975:107;;65093:18;65162:27;65179:9;65162:16;:27::i;:::-;65121:69;;;;;;;;:::i;:::-;;;;;;;;;;;;;65093:98;;65202:25;:52;;;;;;;;;;;;;;;;;;;65265:24;65292:32;65306:5;65313:10;65292:13;:32::i;:::-;65265:59;;65335:22;65360:55;65375:8;65385:4;65391:11;65404:10;65360:14;:55::i;:::-;65335:80;;65426:28;65432:10;65444:9;65426:5;:28::i;:::-;65465:33;65478:9;65489:8;65465:12;:33::i;:::-;65509:18;:30;65528:10;65509:30;;;;;;;;;;;;;;;;:32;;;;;;;;;:::i;:::-;;;;;;65579:1;65567:9;:13;;;;:::i;:::-;65552:12;:28;;;;64250:1338;;;;;;;;;;;;64219:1369::o;62219:91::-;62263:7;62290:12;;62283:19;;62219:91;:::o;46799:335::-;46994:41;47013:12;:10;:12::i;:::-;47027:7;46994:18;:41::i;:::-;46986:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47098:28;47108:4;47114:2;47118:7;47098:9;:28::i;:::-;46799:335;;;:::o;61890:321::-;61957:13;61983:21;:52;;;;;;;;;;;;;;;;;;;62046:30;62079:55;62123:7;62106:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;62079:13;:55::i;:::-;62046:88;;62176:7;62185:16;62159:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62145:58;;;;61890:321;;;:::o;66313:286::-;66398:7;66414:20;66526:1;66519:4;66512;:11;;;;:::i;:::-;:15;;;;:::i;:::-;66472;66489:10;66501:4;66455:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66445:62;;;;;;66437:71;;:91;;;;:::i;:::-;66414:114;;66565:4;66550:12;:19;;;;:::i;:::-;66535:34;;66583:12;66576:19;;;66313:286;;;;;:::o;66609:107::-;2014:13;:11;:13::i;:::-;66665:10:::1;66657:28;;:51;66686:21;66657:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66609:107::o:0;47205:185::-;47343:39;47360:4;47366:2;47370:7;47343:39;;;;;;;;;;;;:16;:39::i;:::-;47205:185;;;:::o;44297:223::-;44369:7;44389:13;44405:17;44414:7;44405:8;:17::i;:::-;44389:33;;44458:1;44441:19;;:5;:19;;;44433:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44507:5;44500:12;;;44297:223;;;:::o;61809:31::-;;;;:::o;44028:207::-;44100:7;44145:1;44128:19;;:5;:19;;;44120:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44211:9;:16;44221:5;44211:16;;;;;;;;;;;;;;;;44204:23;;44028:207;;;:::o;2776:103::-;2014:13;:11;:13::i;:::-;2841:30:::1;2868:1;2841:18;:30::i;:::-;2776:103::o:0;2128:87::-;2174:7;2201:6;;;;;;;;;;;2194:13;;2128:87;:::o;44756:104::-;44812:13;44845:7;44838:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44756:104;:::o;66724:535::-;66815:13;66954:271;67083:5;67140:10;67022:161;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66954:13;:271::i;:::-;66869:371;;;;;;;;:::i;:::-;;;;;;;;;;;;;66841:410;;66724:535;;;;:::o;46342:155::-;46437:52;46456:12;:10;:12::i;:::-;46470:8;46480;46437:18;:52::i;:::-;46342:155;;:::o;47461:322::-;47635:41;47654:12;:10;:12::i;:::-;47668:7;47635:18;:41::i;:::-;47627:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47737:38;47751:4;47757:2;47761:7;47770:4;47737:13;:38::i;:::-;47461:322;;;;:::o;60025:624::-;60098:13;60124:23;60139:7;60124:14;:23::i;:::-;60160;60186:10;:19;60197:7;60186:19;;;;;;;;;;;60160:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60216:18;60237:10;:8;:10::i;:::-;60216:31;;60345:1;60329:4;60323:18;:23;60319:72;;60370:9;60363:16;;;;;;60319:72;60521:1;60501:9;60495:23;:27;60491:108;;;60570:4;60576:9;60553:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60539:48;;;;;;60491:108;60618:23;60633:7;60618:14;:23::i;:::-;60611:30;;;;60025:624;;;;:::o;65592:717::-;65653:13;65675:10;65688:54;65695:2;65699:3;65728:6;65711:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;65688:6;:54::i;:::-;65675:67;;65749:10;65762:54;65769:2;65773:3;65802:6;65785:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;65762:6;:54::i;:::-;65749:67;;65823:10;65836:54;65843:2;65847:3;65876:6;65859:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;65836:6;:54::i;:::-;65823:67;;65897:10;65910:54;65917:2;65921:3;65950:6;65933:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;65910:6;:54::i;:::-;65897:67;;65971:10;65984:54;65991:2;65995:3;66024:6;66007:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;65984:6;:54::i;:::-;65971:67;;66045:10;66058:54;66065:2;66069:3;66098:6;66081:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;66058:6;:54::i;:::-;66045:67;;66119:17;66170:20;66187:2;66170:16;:20::i;:::-;66198;66215:2;66198:16;:20::i;:::-;66226;66243:2;66226:16;:20::i;:::-;66253;66270:2;66253:16;:20::i;:::-;66146:141;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66119:169;;66302:3;66295:10;;;;;;;;;65592:717;;;:::o;68366:490::-;68434:13;68460:23;68492:5;68460:38;;68538:1;68517:10;:17;:22;:46;;;;;68543:20;:10;68554:1;68543:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;68517:46;68509:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;68603:20;68636:1;68626:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68603:35;;68649:12;68732:3;68699:15;68716:10;68682:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68672:56;;;;;;68664:65;;:71;;;;:::i;:::-;68649:86;;68772:4;68759:19;;68746:7;68754:1;68746:10;;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;;;68820:5;68827:19;68838:7;68827:10;:19::i;:::-;68803:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68789:59;;;;;68366:490;;;:::o;67720:106::-;67777:13;67810:1;:8;67803:15;;67720:106;;;:::o;67267:445::-;67337:13;67363:18;67394:1;67384:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67363:33;;67407:12;67496:8;67457:15;67474:10;67486:4;67440:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67430:62;;;;;;67422:71;;:82;;;;:::i;:::-;67407:97;;67547:2;67539:4;:10;;67526:25;;67515:5;67521:1;67515:8;;;;;;;;:::i;:::-;;;;;:36;;;;;;;;;;;67594:1;67586:4;:9;;67573:24;;67562:5;67568:1;67562:8;;;;;;;;:::i;:::-;;;;;:35;;;;;;;;;;;67632:4;67619:19;;67608:5;67614:1;67608:8;;;;;;;;:::i;:::-;;;;;:30;;;;;;;;;;;67685:17;67696:5;67685:10;:17::i;:::-;67663:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;67649:55;;;;67267:445;;;:::o;46568:164::-;46665:4;46689:18;:25;46708:5;46689:25;;;;;;;;;;;;;;;:35;46715:8;46689:35;;;;;;;;;;;;;;;;;;;;;;;;;46682:42;;46568:164;;;;:::o;3034:201::-;2014:13;:11;:13::i;:::-;3143:1:::1;3123:22;;:8;:22;;::::0;3115:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3199:28;3218:8;3199:18;:28::i;:::-;3034:201:::0;:::o;62318:717::-;62464:13;62603:398;62731:5;62790:12;62859:11;62917:9;62671:288;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62603:13;:398::i;:::-;62518:498;;;;;;;;:::i;:::-;;;;;;;;;;;;;62490:537;;62318:717;;;;;;:::o;15857:157::-;15942:4;15981:25;15966:40;;;:11;:40;;;;15959:47;;15857:157;;;:::o;55918:135::-;56000:16;56008:7;56000;:16::i;:::-;55992:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;55918:135;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;55197:174::-;55299:2;55272:15;:24;55288:7;55272:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55355:7;55351:2;55317:46;;55326:23;55341:7;55326:14;:23::i;:::-;55317:46;;;;;;;;;;;;55197:174;;:::o;63043:1168::-;63227:13;63253:12;63336:1;63303:15;63320:10;63286:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63276:56;;;;;;63268:65;;:69;;;;:::i;:::-;63253:84;;63360:1;63352:4;:9;63348:856;;63573:5;63618:10;63668:5;63681:7;63695;63730:10;63392:380;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63378:395;;;;;63348:856;63992:5;64037:10;64087:5;64100:7;64114;64149:10;63820:371;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63806:386;;;63043:1168;;;;;;;;;:::o;40358:716::-;40414:13;40465:14;40502:1;40482:17;40493:5;40482:10;:17::i;:::-;:21;40465:38;;40518:20;40552:6;40541:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40518:41;;40574:11;40703:6;40699:2;40695:15;40687:6;40683:28;40676:35;;40740:288;40747:4;40740:288;;;40772:5;;;;;;;;40914:8;40909:2;40902:5;40898:14;40893:30;40888:3;40880:44;40970:2;40961:11;;;;;;:::i;:::-;;;;;41004:1;40995:5;:10;40740:288;40991:21;40740:288;41049:6;41042:13;;;;;40358:716;;;:::o;51414:942::-;51508:1;51494:16;;:2;:16;;;51486:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51567:16;51575:7;51567;:16::i;:::-;51566:17;51558:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51629:48;51658:1;51662:2;51666:7;51675:1;51629:20;:48::i;:::-;51776:16;51784:7;51776;:16::i;:::-;51775:17;51767:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52191:1;52174:9;:13;52184:2;52174:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52235:2;52216:7;:16;52224:7;52216:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52280:7;52276:2;52255:33;;52272:1;52255:33;;;;;;;;;;;;52301:47;52329:1;52333:2;52337:7;52346:1;52301:19;:47::i;:::-;51414:942;;:::o;60805:217::-;60905:16;60913:7;60905;:16::i;:::-;60897:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;61005:9;60983:10;:19;60994:7;60983:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;60805:217;;:::o;49816:264::-;49909:4;49926:13;49942:23;49957:7;49942:14;:23::i;:::-;49926:39;;49995:5;49984:16;;:7;:16;;;:52;;;;50004:32;50021:5;50028:7;50004:16;:32::i;:::-;49984:52;:87;;;;50064:7;50040:31;;:20;50052:7;50040:11;:20::i;:::-;:31;;;49984:87;49976:96;;;49816:264;;;;:::o;53815:1263::-;53974:4;53947:31;;:23;53962:7;53947:14;:23::i;:::-;:31;;;53939:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54053:1;54039:16;;:2;:16;;;54031:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54109:42;54130:4;54136:2;54140:7;54149:1;54109:20;:42::i;:::-;54281:4;54254:31;;:23;54269:7;54254:14;:23::i;:::-;:31;;;54246:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54399:15;:24;54415:7;54399:24;;;;;;;;;;;;54392:31;;;;;;;;;;;54894:1;54875:9;:15;54885:4;54875:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;54927:1;54910:9;:13;54920:2;54910:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;54969:2;54950:7;:16;54958:7;54950:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55008:7;55004:2;54989:27;;54998:4;54989:27;;;;;;;;;;;;55029:41;55049:4;55055:2;55059:7;55068:1;55029:19;:41::i;:::-;53815:1263;;;:::o;23949:3097::-;24007:13;24259:1;24244:4;:11;:16;24240:31;;24262:9;;;;;;;;;;;;;;;;24240:31;24324:19;24346:6;;;;;;;;;;;;;;;;;24324:28;;24763:20;24822:1;24817;24803:4;:11;:15;;;;:::i;:::-;24802:21;;;;:::i;:::-;24797:1;:27;;;;:::i;:::-;24786:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24763:62;;25005:1;24998:5;24994:13;25109:2;25101:6;25097:15;25220:4;25272;25266:11;25260:4;25256:22;25182:1432;25306:6;25297:7;25294:19;25182:1432;;;25412:1;25403:7;25399:15;25388:26;;25451:7;25445:14;26104:4;26096:5;26092:2;26088:14;26084:25;26074:8;26070:40;26064:47;26053:9;26045:67;26158:1;26147:9;26143:17;26130:30;;26250:4;26242:5;26238:2;26234:14;26230:25;26220:8;26216:40;26210:47;26199:9;26191:67;26304:1;26293:9;26289:17;26276:30;;26395:4;26387:5;26384:1;26380:13;26376:24;26366:8;26362:39;26356:46;26345:9;26337:66;26449:1;26438:9;26434:17;26421:30;;26532:4;26525:5;26521:16;26511:8;26507:31;26501:38;26490:9;26482:58;26586:1;26575:9;26571:17;26558:30;;25333:1281;25182:1432;;;25186:107;;26776:1;26769:4;26763:11;26759:19;26797:1;26792:123;;;;26934:1;26929:73;;;;26752:250;;26792:123;26845:4;26841:1;26830:9;26826:17;26818:32;26895:4;26891:1;26880:9;26876:17;26868:32;26792:123;;26929:73;26982:4;26978:1;26967:9;26963:17;26955:32;26752:250;;24891:2122;;27032:6;27025:13;;;;23949:3097;;;;:::o;2293:132::-;2368:12;:10;:12::i;:::-;2357:23;;:7;:5;:7::i;:::-;:23;;;2349:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2293:132::o;49091:117::-;49157:7;49184;:16;49192:7;49184:16;;;;;;;;;;;;;;;;;;;;;49177:23;;49091:117;;;:::o;3395:191::-;3469:16;3488:6;;;;;;;;;;;3469:25;;3514:8;3505:6;;:17;;;;;;;;;;;;;;;;;;3569:8;3538:40;;3559:8;3538:40;;;;;;;;;;;;3458:128;3395:191;:::o;55514:315::-;55669:8;55660:17;;:5;:17;;;55652:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55756:8;55718:18;:25;55737:5;55718:25;;;;;;;;;;;;;;;:35;55744:8;55718:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55802:8;55780:41;;55795:5;55780:41;;;55812:8;55780:41;;;;;;:::i;:::-;;;;;;;;55514:315;;;:::o;48664:313::-;48820:28;48830:4;48836:2;48840:7;48820:9;:28::i;:::-;48867:47;48890:4;48896:2;48900:7;48909:4;48867:22;:47::i;:::-;48859:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;48664:313;;;;:::o;45461:94::-;45512:13;45538:9;;;;;;;;;;;;;;45461:94;:::o;44931:281::-;45004:13;45030:23;45045:7;45030:14;:23::i;:::-;45066:21;45090:10;:8;:10::i;:::-;45066:34;;45142:1;45124:7;45118:21;:25;:86;;;;;;;;;;;;;;;;;45170:7;45179:18;:7;:16;:18::i;:::-;45153:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45118:86;45111:93;;;44931:281;;;:::o;67832:524::-;67890:13;67916:24;:45;;;;;;;;;;;;;;;;;;;67972:8;67983:1;:8;67972:19;;68002:17;68036:3;68032:1;:7;;;;:::i;:::-;68022:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68002:38;;68051:6;68077;68072:247;68093:3;68089:1;:7;68072:247;;;68118:7;68134:1;68136;68134:4;;;;;;;;:::i;:::-;;;;;;;;;;68128:11;;68118:21;;68163:1;68158;:6;;;68154:154;;68197:11;68214:1;68209;:6;;;;68197:19;;;;;;;;;;:::i;:::-;;;;;;;;;;68185:4;68192:1;68190;:3;;;;:::i;:::-;68185:9;;;;;;;;:::i;:::-;;;;;:31;;;;;;;;;;;68249:11;68265:4;68261:1;:8;68249:21;;;;;;;;;;:::i;:::-;;;;;;;;;;68235:4;68244:1;68242;68240;:3;;;;:::i;:::-;:5;;;;:::i;:::-;68235:11;;;;;;;;:::i;:::-;;;;;:35;;;;;;;;;;;68289:3;;;;;:::i;:::-;;;;68154:154;68103:216;68098:3;;;;;:::i;:::-;;;;68072:247;;;;68343:4;68329:19;;;;;;67832:524;;;:::o;49521:128::-;49586:4;49639:1;49610:31;;:17;49619:7;49610:8;:17::i;:::-;:31;;;;49603:38;;49521:128;;;:::o;37224:922::-;37277:7;37297:14;37314:1;37297:18;;37364:6;37355:5;:15;37351:102;;37400:6;37391:15;;;;;;:::i;:::-;;;;;37435:2;37425:12;;;;37351:102;37480:6;37471:5;:15;37467:102;;37516:6;37507:15;;;;;;:::i;:::-;;;;;37551:2;37541:12;;;;37467:102;37596:6;37587:5;:15;37583:102;;37632:6;37623:15;;;;;;:::i;:::-;;;;;37667:2;37657:12;;;;37583:102;37712:5;37703;:14;37699:99;;37747:5;37738:14;;;;;;:::i;:::-;;;;;37781:1;37771:11;;;;37699:99;37825:5;37816;:14;37812:99;;37860:5;37851:14;;;;;;:::i;:::-;;;;;37894:1;37884:11;;;;37812:99;37938:5;37929;:14;37925:99;;37973:5;37964:14;;;;;;:::i;:::-;;;;;38007:1;37997:11;;;;37925:99;38051:5;38042;:14;38038:66;;38087:1;38077:11;;;;38038:66;38132:6;38125:13;;;37224:922;;;:::o;58202:410::-;58392:1;58380:9;:13;58376:229;;;58430:1;58414:18;;:4;:18;;;58410:87;;58472:9;58453;:15;58463:4;58453:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;58410:87;58529:1;58515:16;;:2;:16;;;58511:83;;58569:9;58552;:13;58562:2;58552:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;58511:83;58376:229;58202:410;;;;:::o;59334:158::-;;;;;:::o;56617:853::-;56771:4;56792:15;:2;:13;;;:15::i;:::-;56788:675;;;56844:2;56828:36;;;56865:12;:10;:12::i;:::-;56879:4;56885:7;56894:4;56828:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56824:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57086:1;57069:6;:13;:18;57065:328;;57112:60;;;;;;;;;;:::i;:::-;;;;;;;;57065:328;57343:6;57337:13;57328:6;57324:2;57320:15;57313:38;56824:584;56960:41;;;56950:51;;;:6;:51;;;;56943:58;;;;;56788:675;57447:4;57440:11;;56617:853;;;;;;;:::o;4826:326::-;4886:4;5143:1;5121:7;:19;;;:23;5114:30;;4826:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:118::-;3030:24;3048:5;3030:24;:::i;:::-;3025:3;3018:37;2943:118;;:::o;3067:222::-;3160:4;3198:2;3187:9;3183:18;3175:26;;3211:71;3279:1;3268:9;3264:17;3255:6;3211:71;:::i;:::-;3067:222;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:509::-;8047:6;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8250:1;8239:9;8235:17;8222:31;8280:18;8272:6;8269:30;8266:117;;;8302:79;;:::i;:::-;8266:117;8407:63;8462:7;8453:6;8442:9;8438:22;8407:63;:::i;:::-;8397:73;;8193:287;7978:509;;;;:::o;8493:799::-;8580:6;8588;8596;8645:2;8633:9;8624:7;8620:23;8616:32;8613:119;;;8651:79;;:::i;:::-;8613:119;8771:1;8796:53;8841:7;8832:6;8821:9;8817:22;8796:53;:::i;:::-;8786:63;;8742:117;8898:2;8924:53;8969:7;8960:6;8949:9;8945:22;8924:53;:::i;:::-;8914:63;;8869:118;9054:2;9043:9;9039:18;9026:32;9085:18;9077:6;9074:30;9071:117;;;9107:79;;:::i;:::-;9071:117;9212:63;9267:7;9258:6;9247:9;9243:22;9212:63;:::i;:::-;9202:73;;8997:288;8493:799;;;;;:::o;9298:329::-;9357:6;9406:2;9394:9;9385:7;9381:23;9377:32;9374:119;;;9412:79;;:::i;:::-;9374:119;9532:1;9557:53;9602:7;9593:6;9582:9;9578:22;9557:53;:::i;:::-;9547:63;;9503:117;9298:329;;;;:::o;9633:834::-;9721:6;9729;9778:2;9766:9;9757:7;9753:23;9749:32;9746:119;;;9784:79;;:::i;:::-;9746:119;9932:1;9921:9;9917:17;9904:31;9962:18;9954:6;9951:30;9948:117;;;9984:79;;:::i;:::-;9948:117;10089:63;10144:7;10135:6;10124:9;10120:22;10089:63;:::i;:::-;10079:73;;9875:287;10229:2;10218:9;10214:18;10201:32;10260:18;10252:6;10249:30;10246:117;;;10282:79;;:::i;:::-;10246:117;10387:63;10442:7;10433:6;10422:9;10418:22;10387:63;:::i;:::-;10377:73;;10172:288;9633:834;;;;;:::o;10473:116::-;10543:21;10558:5;10543:21;:::i;:::-;10536:5;10533:32;10523:60;;10579:1;10576;10569:12;10523:60;10473:116;:::o;10595:133::-;10638:5;10676:6;10663:20;10654:29;;10692:30;10716:5;10692:30;:::i;:::-;10595:133;;;;:::o;10734:468::-;10799:6;10807;10856:2;10844:9;10835:7;10831:23;10827:32;10824:119;;;10862:79;;:::i;:::-;10824:119;10982:1;11007:53;11052:7;11043:6;11032:9;11028:22;11007:53;:::i;:::-;10997:63;;10953:117;11109:2;11135:50;11177:7;11168:6;11157:9;11153:22;11135:50;:::i;:::-;11125:60;;11080:115;10734:468;;;;;:::o;11208:307::-;11269:4;11359:18;11351:6;11348:30;11345:56;;;11381:18;;:::i;:::-;11345:56;11419:29;11441:6;11419:29;:::i;:::-;11411:37;;11503:4;11497;11493:15;11485:23;;11208:307;;;:::o;11521:423::-;11598:5;11623:65;11639:48;11680:6;11639:48;:::i;:::-;11623:65;:::i;:::-;11614:74;;11711:6;11704:5;11697:21;11749:4;11742:5;11738:16;11787:3;11778:6;11773:3;11769:16;11766:25;11763:112;;;11794:79;;:::i;:::-;11763:112;11884:54;11931:6;11926:3;11921;11884:54;:::i;:::-;11604:340;11521:423;;;;;:::o;11963:338::-;12018:5;12067:3;12060:4;12052:6;12048:17;12044:27;12034:122;;12075:79;;:::i;:::-;12034:122;12192:6;12179:20;12217:78;12291:3;12283:6;12276:4;12268:6;12264:17;12217:78;:::i;:::-;12208:87;;12024:277;11963:338;;;;:::o;12307:943::-;12402:6;12410;12418;12426;12475:3;12463:9;12454:7;12450:23;12446:33;12443:120;;;12482:79;;:::i;:::-;12443:120;12602:1;12627:53;12672:7;12663:6;12652:9;12648:22;12627:53;:::i;:::-;12617:63;;12573:117;12729:2;12755:53;12800:7;12791:6;12780:9;12776:22;12755:53;:::i;:::-;12745:63;;12700:118;12857:2;12883:53;12928:7;12919:6;12908:9;12904:22;12883:53;:::i;:::-;12873:63;;12828:118;13013:2;13002:9;12998:18;12985:32;13044:18;13036:6;13033:30;13030:117;;;13066:79;;:::i;:::-;13030:117;13171:62;13225:7;13216:6;13205:9;13201:22;13171:62;:::i;:::-;13161:72;;12956:287;12307:943;;;;;;;:::o;13256:507::-;13324:6;13373:2;13361:9;13352:7;13348:23;13344:32;13341:119;;;13379:79;;:::i;:::-;13341:119;13527:1;13516:9;13512:17;13499:31;13557:18;13549:6;13546:30;13543:117;;;13579:79;;:::i;:::-;13543:117;13684:62;13738:7;13729:6;13718:9;13714:22;13684:62;:::i;:::-;13674:72;;13470:286;13256:507;;;;:::o;13769:474::-;13837:6;13845;13894:2;13882:9;13873:7;13869:23;13865:32;13862:119;;;13900:79;;:::i;:::-;13862:119;14020:1;14045:53;14090:7;14081:6;14070:9;14066:22;14045:53;:::i;:::-;14035:63;;13991:117;14147:2;14173:53;14218:7;14209:6;14198:9;14194:22;14173:53;:::i;:::-;14163:63;;14118:118;13769:474;;;;;:::o;14249:1485::-;14375:6;14383;14391;14399;14448:3;14436:9;14427:7;14423:23;14419:33;14416:120;;;14455:79;;:::i;:::-;14416:120;14603:1;14592:9;14588:17;14575:31;14633:18;14625:6;14622:30;14619:117;;;14655:79;;:::i;:::-;14619:117;14760:63;14815:7;14806:6;14795:9;14791:22;14760:63;:::i;:::-;14750:73;;14546:287;14900:2;14889:9;14885:18;14872:32;14931:18;14923:6;14920:30;14917:117;;;14953:79;;:::i;:::-;14917:117;15058:63;15113:7;15104:6;15093:9;15089:22;15058:63;:::i;:::-;15048:73;;14843:288;15198:2;15187:9;15183:18;15170:32;15229:18;15221:6;15218:30;15215:117;;;15251:79;;:::i;:::-;15215:117;15356:63;15411:7;15402:6;15391:9;15387:22;15356:63;:::i;:::-;15346:73;;15141:288;15496:2;15485:9;15481:18;15468:32;15527:18;15519:6;15516:30;15513:117;;;15549:79;;:::i;:::-;15513:117;15654:63;15709:7;15700:6;15689:9;15685:22;15654:63;:::i;:::-;15644:73;;15439:288;14249:1485;;;;;;;:::o;15740:180::-;15788:77;15785:1;15778:88;15885:4;15882:1;15875:15;15909:4;15906:1;15899:15;15926:320;15970:6;16007:1;16001:4;15997:12;15987:22;;16054:1;16048:4;16044:12;16075:18;16065:81;;16131:4;16123:6;16119:17;16109:27;;16065:81;16193:2;16185:6;16182:14;16162:18;16159:38;16156:84;;16212:18;;:::i;:::-;16156:84;15977:269;15926:320;;;:::o;16252:220::-;16392:34;16388:1;16380:6;16376:14;16369:58;16461:3;16456:2;16448:6;16444:15;16437:28;16252:220;:::o;16478:366::-;16620:3;16641:67;16705:2;16700:3;16641:67;:::i;:::-;16634:74;;16717:93;16806:3;16717:93;:::i;:::-;16835:2;16830:3;16826:12;16819:19;;16478:366;;;:::o;16850:419::-;17016:4;17054:2;17043:9;17039:18;17031:26;;17103:9;17097:4;17093:20;17089:1;17078:9;17074:17;17067:47;17131:131;17257:4;17131:131;:::i;:::-;17123:139;;16850:419;;;:::o;17275:248::-;17415:34;17411:1;17403:6;17399:14;17392:58;17484:31;17479:2;17471:6;17467:15;17460:56;17275:248;:::o;17529:366::-;17671:3;17692:67;17756:2;17751:3;17692:67;:::i;:::-;17685:74;;17768:93;17857:3;17768:93;:::i;:::-;17886:2;17881:3;17877:12;17870:19;;17529:366;;;:::o;17901:419::-;18067:4;18105:2;18094:9;18090:18;18082:26;;18154:9;18148:4;18144:20;18140:1;18129:9;18125:17;18118:47;18182:131;18308:4;18182:131;:::i;:::-;18174:139;;17901:419;;;:::o;18326:165::-;18466:17;18462:1;18454:6;18450:14;18443:41;18326:165;:::o;18497:366::-;18639:3;18660:67;18724:2;18719:3;18660:67;:::i;:::-;18653:74;;18736:93;18825:3;18736:93;:::i;:::-;18854:2;18849:3;18845:12;18838:19;;18497:366;;;:::o;18869:419::-;19035:4;19073:2;19062:9;19058:18;19050:26;;19122:9;19116:4;19112:20;19108:1;19097:9;19093:17;19086:47;19150:131;19276:4;19150:131;:::i;:::-;19142:139;;18869:419;;;:::o;19294:162::-;19434:14;19430:1;19422:6;19418:14;19411:38;19294:162;:::o;19462:366::-;19604:3;19625:67;19689:2;19684:3;19625:67;:::i;:::-;19618:74;;19701:93;19790:3;19701:93;:::i;:::-;19819:2;19814:3;19810:12;19803:19;;19462:366;;;:::o;19834:419::-;20000:4;20038:2;20027:9;20023:18;20015:26;;20087:9;20081:4;20077:20;20073:1;20062:9;20058:17;20051:47;20115:131;20241:4;20115:131;:::i;:::-;20107:139;;19834:419;;;:::o;20259:223::-;20399:34;20395:1;20387:6;20383:14;20376:58;20468:6;20463:2;20455:6;20451:15;20444:31;20259:223;:::o;20488:366::-;20630:3;20651:67;20715:2;20710:3;20651:67;:::i;:::-;20644:74;;20727:93;20816:3;20727:93;:::i;:::-;20845:2;20840:3;20836:12;20829:19;;20488:366;;;:::o;20860:419::-;21026:4;21064:2;21053:9;21049:18;21041:26;;21113:9;21107:4;21103:20;21099:1;21088:9;21084:17;21077:47;21141:131;21267:4;21141:131;:::i;:::-;21133:139;;20860:419;;;:::o;21285:223::-;21425:34;21421:1;21413:6;21409:14;21402:58;21494:6;21489:2;21481:6;21477:15;21470:31;21285:223;:::o;21514:366::-;21656:3;21677:67;21741:2;21736:3;21677:67;:::i;:::-;21670:74;;21753:93;21842:3;21753:93;:::i;:::-;21871:2;21866:3;21862:12;21855:19;;21514:366;;;:::o;21886:419::-;22052:4;22090:2;22079:9;22075:18;22067:26;;22139:9;22133:4;22129:20;22125:1;22114:9;22110:17;22103:47;22167:131;22293:4;22167:131;:::i;:::-;22159:139;;21886:419;;;:::o;22311:148::-;22413:11;22450:3;22435:18;;22311:148;;;;:::o;22465:170::-;22605:22;22601:1;22593:6;22589:14;22582:46;22465:170;:::o;22641:402::-;22801:3;22822:85;22904:2;22899:3;22822:85;:::i;:::-;22815:92;;22916:93;23005:3;22916:93;:::i;:::-;23034:2;23029:3;23025:12;23018:19;;22641:402;;;:::o;23049:390::-;23155:3;23183:39;23216:5;23183:39;:::i;:::-;23238:89;23320:6;23315:3;23238:89;:::i;:::-;23231:96;;23336:65;23394:6;23389:3;23382:4;23375:5;23371:16;23336:65;:::i;:::-;23426:6;23421:3;23417:16;23410:23;;23159:280;23049:390;;;;:::o;23445:541::-;23678:3;23700:148;23844:3;23700:148;:::i;:::-;23693:155;;23865:95;23956:3;23947:6;23865:95;:::i;:::-;23858:102;;23977:3;23970:10;;23445:541;;;;:::o;23992:180::-;24040:77;24037:1;24030:88;24137:4;24134:1;24127:15;24161:4;24158:1;24151:15;24178:233;24217:3;24240:24;24258:5;24240:24;:::i;:::-;24231:33;;24286:66;24279:5;24276:77;24273:103;;24356:18;;:::i;:::-;24273:103;24403:1;24396:5;24392:13;24385:20;;24178:233;;;:::o;24417:191::-;24457:3;24476:20;24494:1;24476:20;:::i;:::-;24471:25;;24510:20;24528:1;24510:20;:::i;:::-;24505:25;;24553:1;24550;24546:9;24539:16;;24574:3;24571:1;24568:10;24565:36;;;24581:18;;:::i;:::-;24565:36;24417:191;;;;:::o;24614:232::-;24754:34;24750:1;24742:6;24738:14;24731:58;24823:15;24818:2;24810:6;24806:15;24799:40;24614:232;:::o;24852:366::-;24994:3;25015:67;25079:2;25074:3;25015:67;:::i;:::-;25008:74;;25091:93;25180:3;25091:93;:::i;:::-;25209:2;25204:3;25200:12;25193:19;;24852:366;;;:::o;25224:419::-;25390:4;25428:2;25417:9;25413:18;25405:26;;25477:9;25471:4;25467:20;25463:1;25452:9;25448:17;25441:47;25505:131;25631:4;25505:131;:::i;:::-;25497:139;;25224:419;;;:::o;25649:275::-;25781:3;25803:95;25894:3;25885:6;25803:95;:::i;:::-;25796:102;;25915:3;25908:10;;25649:275;;;;:::o;25930:435::-;26110:3;26132:95;26223:3;26214:6;26132:95;:::i;:::-;26125:102;;26244:95;26335:3;26326:6;26244:95;:::i;:::-;26237:102;;26356:3;26349:10;;25930:435;;;;;:::o;26371:194::-;26411:4;26431:20;26449:1;26431:20;:::i;:::-;26426:25;;26465:20;26483:1;26465:20;:::i;:::-;26460:25;;26509:1;26506;26502:9;26494:17;;26533:1;26527:4;26524:11;26521:37;;;26538:18;;:::i;:::-;26521:37;26371:194;;;;:::o;26571:79::-;26610:7;26639:5;26628:16;;26571:79;;;:::o;26656:157::-;26761:45;26781:24;26799:5;26781:24;:::i;:::-;26761:45;:::i;:::-;26756:3;26749:58;26656:157;;:::o;26819:94::-;26852:8;26900:5;26896:2;26892:14;26871:35;;26819:94;;;:::o;26919:::-;26958:7;26987:20;27001:5;26987:20;:::i;:::-;26976:31;;26919:94;;;:::o;27019:100::-;27058:7;27087:26;27107:5;27087:26;:::i;:::-;27076:37;;27019:100;;;:::o;27125:157::-;27230:45;27250:24;27268:5;27250:24;:::i;:::-;27230:45;:::i;:::-;27225:3;27218:58;27125:157;;:::o;27288:557::-;27476:3;27491:75;27562:3;27553:6;27491:75;:::i;:::-;27591:2;27586:3;27582:12;27575:19;;27604:75;27675:3;27666:6;27604:75;:::i;:::-;27704:2;27699:3;27695:12;27688:19;;27724:95;27815:3;27806:6;27724:95;:::i;:::-;27717:102;;27836:3;27829:10;;27288:557;;;;;;:::o;27851:180::-;27899:77;27896:1;27889:88;27996:4;27993:1;27986:15;28020:4;28017:1;28010:15;28037:176;28069:1;28086:20;28104:1;28086:20;:::i;:::-;28081:25;;28120:20;28138:1;28120:20;:::i;:::-;28115:25;;28159:1;28149:35;;28164:18;;:::i;:::-;28149:35;28205:1;28202;28198:9;28193:14;;28037:176;;;;:::o;28219:174::-;28359:26;28355:1;28347:6;28343:14;28336:50;28219:174;:::o;28399:366::-;28541:3;28562:67;28626:2;28621:3;28562:67;:::i;:::-;28555:74;;28638:93;28727:3;28638:93;:::i;:::-;28756:2;28751:3;28747:12;28740:19;;28399:366;;;:::o;28771:419::-;28937:4;28975:2;28964:9;28960:18;28952:26;;29024:9;29018:4;29014:20;29010:1;28999:9;28995:17;28988:47;29052:131;29178:4;29052:131;:::i;:::-;29044:139;;28771:419;;;:::o;29196:228::-;29336:34;29332:1;29324:6;29320:14;29313:58;29405:11;29400:2;29392:6;29388:15;29381:36;29196:228;:::o;29430:366::-;29572:3;29593:67;29657:2;29652:3;29593:67;:::i;:::-;29586:74;;29669:93;29758:3;29669:93;:::i;:::-;29787:2;29782:3;29778:12;29771:19;;29430:366;;;:::o;29802:419::-;29968:4;30006:2;29995:9;29991:18;29983:26;;30055:9;30049:4;30045:20;30041:1;30030:9;30026:17;30019:47;30083:131;30209:4;30083:131;:::i;:::-;30075:139;;29802:419;;;:::o;30227:214::-;30367:66;30363:1;30355:6;30351:14;30344:90;30227:214;:::o;30447:402::-;30607:3;30628:85;30710:2;30705:3;30628:85;:::i;:::-;30621:92;;30722:93;30811:3;30722:93;:::i;:::-;30840:2;30835:3;30831:12;30824:19;;30447:402;;;:::o;30855:214::-;30995:66;30991:1;30983:6;30979:14;30972:90;30855:214;:::o;31075:402::-;31235:3;31256:85;31338:2;31333:3;31256:85;:::i;:::-;31249:92;;31350:93;31439:3;31350:93;:::i;:::-;31468:2;31463:3;31459:12;31452:19;;31075:402;;;:::o;31483:214::-;31623:66;31619:1;31611:6;31607:14;31600:90;31483:214;:::o;31703:400::-;31863:3;31884:84;31966:1;31961:3;31884:84;:::i;:::-;31877:91;;31977:93;32066:3;31977:93;:::i;:::-;32095:1;32090:3;32086:11;32079:18;;31703:400;;;:::o;32109:1233::-;32592:3;32614:148;32758:3;32614:148;:::i;:::-;32607:155;;32779:95;32870:3;32861:6;32779:95;:::i;:::-;32772:102;;32891:148;33035:3;32891:148;:::i;:::-;32884:155;;33056:95;33147:3;33138:6;33056:95;:::i;:::-;33049:102;;33168:148;33312:3;33168:148;:::i;:::-;33161:155;;33333:3;33326:10;;32109:1233;;;;;:::o;33348:179::-;33488:31;33484:1;33476:6;33472:14;33465:55;33348:179;:::o;33533:402::-;33693:3;33714:85;33796:2;33791:3;33714:85;:::i;:::-;33707:92;;33808:93;33897:3;33808:93;:::i;:::-;33926:2;33921:3;33917:12;33910:19;;33533:402;;;:::o;33941:541::-;34174:3;34196:148;34340:3;34196:148;:::i;:::-;34189:155;;34361:95;34452:3;34443:6;34361:95;:::i;:::-;34354:102;;34473:3;34466:10;;33941:541;;;;:::o;34488:151::-;34628:3;34624:1;34616:6;34612:14;34605:27;34488:151;:::o;34645:400::-;34805:3;34826:84;34908:1;34903:3;34826:84;:::i;:::-;34819:91;;34919:93;35008:3;34919:93;:::i;:::-;35037:1;35032:3;35028:11;35021:18;;34645:400;;;:::o;35051:541::-;35284:3;35306:95;35397:3;35388:6;35306:95;:::i;:::-;35299:102;;35418:148;35562:3;35418:148;:::i;:::-;35411:155;;35583:3;35576:10;;35051:541;;;;:::o;35598:151::-;35738:3;35734:1;35726:6;35722:14;35715:27;35598:151;:::o;35755:400::-;35915:3;35936:84;36018:1;36013:3;35936:84;:::i;:::-;35929:91;;36029:93;36118:3;36029:93;:::i;:::-;36147:1;36142:3;36138:11;36131:18;;35755:400;;;:::o;36161:541::-;36394:3;36416:95;36507:3;36498:6;36416:95;:::i;:::-;36409:102;;36528:148;36672:3;36528:148;:::i;:::-;36521:155;;36693:3;36686:10;;36161:541;;;;:::o;36708:151::-;36848:3;36844:1;36836:6;36832:14;36825:27;36708:151;:::o;36865:400::-;37025:3;37046:84;37128:1;37123:3;37046:84;:::i;:::-;37039:91;;37139:93;37228:3;37139:93;:::i;:::-;37257:1;37252:3;37248:11;37241:18;;36865:400;;;:::o;37271:541::-;37504:3;37526:95;37617:3;37608:6;37526:95;:::i;:::-;37519:102;;37638:148;37782:3;37638:148;:::i;:::-;37631:155;;37803:3;37796:10;;37271:541;;;;:::o;37818:151::-;37958:3;37954:1;37946:6;37942:14;37935:27;37818:151;:::o;37975:400::-;38135:3;38156:84;38238:1;38233:3;38156:84;:::i;:::-;38149:91;;38249:93;38338:3;38249:93;:::i;:::-;38367:1;38362:3;38358:11;38351:18;;37975:400;;;:::o;38381:541::-;38614:3;38636:95;38727:3;38718:6;38636:95;:::i;:::-;38629:102;;38748:148;38892:3;38748:148;:::i;:::-;38741:155;;38913:3;38906:10;;38381:541;;;;:::o;38928:151::-;39068:3;39064:1;39056:6;39052:14;39045:27;38928:151;:::o;39085:400::-;39245:3;39266:84;39348:1;39343:3;39266:84;:::i;:::-;39259:91;;39359:93;39448:3;39359:93;:::i;:::-;39477:1;39472:3;39468:11;39461:18;;39085:400;;;:::o;39491:541::-;39724:3;39746:95;39837:3;39828:6;39746:95;:::i;:::-;39739:102;;39858:148;40002:3;39858:148;:::i;:::-;39851:155;;40023:3;40016:10;;39491:541;;;;:::o;40038:151::-;40178:3;40174:1;40166:6;40162:14;40155:27;40038:151;:::o;40195:400::-;40355:3;40376:84;40458:1;40453:3;40376:84;:::i;:::-;40369:91;;40469:93;40558:3;40469:93;:::i;:::-;40587:1;40582:3;40578:11;40571:18;;40195:400;;;:::o;40601:541::-;40834:3;40856:95;40947:3;40938:6;40856:95;:::i;:::-;40849:102;;40968:148;41112:3;40968:148;:::i;:::-;40961:155;;41133:3;41126:10;;40601:541;;;;:::o;41148:153::-;41288:5;41284:1;41276:6;41272:14;41265:29;41148:153;:::o;41307:400::-;41467:3;41488:84;41570:1;41565:3;41488:84;:::i;:::-;41481:91;;41581:93;41670:3;41581:93;:::i;:::-;41699:1;41694:3;41690:11;41683:18;;41307:400;;;:::o;41713:152::-;41853:4;41849:1;41841:6;41837:14;41830:28;41713:152;:::o;41871:400::-;42031:3;42052:84;42134:1;42129:3;42052:84;:::i;:::-;42045:91;;42145:93;42234:3;42145:93;:::i;:::-;42263:1;42258:3;42254:11;42247:18;;41871:400;;;:::o;42277:152::-;42417:4;42413:1;42405:6;42401:14;42394:28;42277:152;:::o;42435:400::-;42595:3;42616:84;42698:1;42693:3;42616:84;:::i;:::-;42609:91;;42709:93;42798:3;42709:93;:::i;:::-;42827:1;42822:3;42818:11;42811:18;;42435:400;;;:::o;42841:151::-;42981:3;42977:1;42969:6;42965:14;42958:27;42841:151;:::o;42998:400::-;43158:3;43179:84;43261:1;43256:3;43179:84;:::i;:::-;43172:91;;43272:93;43361:3;43272:93;:::i;:::-;43390:1;43385:3;43381:11;43374:18;;42998:400;;;:::o;43404:153::-;43544:5;43540:1;43532:6;43528:14;43521:29;43404:153;:::o;43563:400::-;43723:3;43744:84;43826:1;43821:3;43744:84;:::i;:::-;43737:91;;43837:93;43926:3;43837:93;:::i;:::-;43955:1;43950:3;43946:11;43939:18;;43563:400;;;:::o;43969:2351::-;44851:3;44873:148;45017:3;44873:148;:::i;:::-;44866:155;;45038:95;45129:3;45120:6;45038:95;:::i;:::-;45031:102;;45150:148;45294:3;45150:148;:::i;:::-;45143:155;;45315:95;45406:3;45397:6;45315:95;:::i;:::-;45308:102;;45427:148;45571:3;45427:148;:::i;:::-;45420:155;;45592:95;45683:3;45674:6;45592:95;:::i;:::-;45585:102;;45704:148;45848:3;45704:148;:::i;:::-;45697:155;;45869:95;45960:3;45951:6;45869:95;:::i;:::-;45862:102;;45981:148;46125:3;45981:148;:::i;:::-;45974:155;;46146:148;46290:3;46146:148;:::i;:::-;46139:155;;46311:3;46304:10;;43969:2351;;;;;;;:::o;46326:180::-;46374:77;46371:1;46364:88;46471:4;46468:1;46461:15;46495:4;46492:1;46485:15;46512:174;46652:26;46648:1;46640:6;46636:14;46629:50;46512:174;:::o;46692:366::-;46834:3;46855:67;46919:2;46914:3;46855:67;:::i;:::-;46848:74;;46931:93;47020:3;46931:93;:::i;:::-;47049:2;47044:3;47040:12;47033:19;;46692:366;;;:::o;47064:419::-;47230:4;47268:2;47257:9;47253:18;47245:26;;47317:9;47311:4;47307:20;47303:1;47292:9;47288:17;47281:47;47345:131;47471:4;47345:131;:::i;:::-;47337:139;;47064:419;;;:::o;47489:397::-;47629:3;47644:75;47715:3;47706:6;47644:75;:::i;:::-;47744:2;47739:3;47735:12;47728:19;;47757:75;47828:3;47819:6;47757:75;:::i;:::-;47857:2;47852:3;47848:12;47841:19;;47877:3;47870:10;;47489:397;;;;;:::o;47892:151::-;48032:3;48028:1;48020:6;48016:14;48009:27;47892:151;:::o;48049:400::-;48209:3;48230:84;48312:1;48307:3;48230:84;:::i;:::-;48223:91;;48323:93;48412:3;48323:93;:::i;:::-;48441:1;48436:3;48432:11;48425:18;;48049:400;;;:::o;48455:541::-;48688:3;48710:148;48854:3;48710:148;:::i;:::-;48703:155;;48875:95;48966:3;48957:6;48875:95;:::i;:::-;48868:102;;48987:3;48980:10;;48455:541;;;;:::o;49002:225::-;49142:34;49138:1;49130:6;49126:14;49119:58;49211:8;49206:2;49198:6;49194:15;49187:33;49002:225;:::o;49233:366::-;49375:3;49396:67;49460:2;49455:3;49396:67;:::i;:::-;49389:74;;49472:93;49561:3;49472:93;:::i;:::-;49590:2;49585:3;49581:12;49574:19;;49233:366;;;:::o;49605:419::-;49771:4;49809:2;49798:9;49794:18;49786:26;;49858:9;49852:4;49848:20;49844:1;49833:9;49829:17;49822:47;49886:131;50012:4;49886:131;:::i;:::-;49878:139;;49605:419;;;:::o;50030:214::-;50170:66;50166:1;50158:6;50154:14;50147:90;50030:214;:::o;50250:400::-;50410:3;50431:84;50513:1;50508:3;50431:84;:::i;:::-;50424:91;;50524:93;50613:3;50524:93;:::i;:::-;50642:1;50637:3;50633:11;50626:18;;50250:400;;;:::o;50656:214::-;50796:66;50792:1;50784:6;50780:14;50773:90;50656:214;:::o;50876:402::-;51036:3;51057:85;51139:2;51134:3;51057:85;:::i;:::-;51050:92;;51151:93;51240:3;51151:93;:::i;:::-;51269:2;51264:3;51260:12;51253:19;;50876:402;;;:::o;51284:214::-;51424:66;51420:1;51412:6;51408:14;51401:90;51284:214;:::o;51504:400::-;51664:3;51685:84;51767:1;51762:3;51685:84;:::i;:::-;51678:91;;51778:93;51867:3;51778:93;:::i;:::-;51896:1;51891:3;51887:11;51880:18;;51504:400;;;:::o;51910:214::-;52050:66;52046:1;52038:6;52034:14;52027:90;51910:214;:::o;52130:402::-;52290:3;52311:85;52393:2;52388:3;52311:85;:::i;:::-;52304:92;;52405:93;52494:3;52405:93;:::i;:::-;52523:2;52518:3;52514:12;52507:19;;52130:402;;;:::o;52538:214::-;52678:66;52674:1;52666:6;52662:14;52655:90;52538:214;:::o;52758:402::-;52918:3;52939:85;53021:2;53016:3;52939:85;:::i;:::-;52932:92;;53033:93;53122:3;53033:93;:::i;:::-;53151:2;53146:3;53142:12;53135:19;;52758:402;;;:::o;53166:2351::-;54048:3;54070:148;54214:3;54070:148;:::i;:::-;54063:155;;54235:95;54326:3;54317:6;54235:95;:::i;:::-;54228:102;;54347:148;54491:3;54347:148;:::i;:::-;54340:155;;54512:95;54603:3;54594:6;54512:95;:::i;:::-;54505:102;;54624:148;54768:3;54624:148;:::i;:::-;54617:155;;54789:148;54933:3;54789:148;:::i;:::-;54782:155;;54954:95;55045:3;55036:6;54954:95;:::i;:::-;54947:102;;55066:148;55210:3;55066:148;:::i;:::-;55059:155;;55231:95;55322:3;55313:6;55231:95;:::i;:::-;55224:102;;55343:148;55487:3;55343:148;:::i;:::-;55336:155;;55508:3;55501:10;;53166:2351;;;;;;;:::o;55523:619::-;55663:66;55659:1;55651:6;55647:14;55640:90;55764:66;55759:2;55751:6;55747:15;55740:91;55865:66;55860:2;55852:6;55848:15;55841:91;55966:66;55961:2;55953:6;55949:15;55942:91;56068:66;56062:3;56054:6;56050:16;56043:92;55523:619;:::o;56148:404::-;56308:3;56329:86;56411:3;56406;56329:86;:::i;:::-;56322:93;;56424;56513:3;56424:93;:::i;:::-;56542:3;56537;56533:13;56526:20;;56148:404;;;:::o;56558:214::-;56698:66;56694:1;56686:6;56682:14;56675:90;56558:214;:::o;56778:402::-;56938:3;56959:85;57041:2;57036:3;56959:85;:::i;:::-;56952:92;;57053:93;57142:3;57053:93;:::i;:::-;57171:2;57166:3;57162:12;57155:19;;56778:402;;;:::o;57186:160::-;57326:12;57322:1;57314:6;57310:14;57303:36;57186:160;:::o;57352:402::-;57512:3;57533:85;57615:2;57610:3;57533:85;:::i;:::-;57526:92;;57627:93;57716:3;57627:93;:::i;:::-;57745:2;57740:3;57736:12;57729:19;;57352:402;;;:::o;57760:160::-;57900:12;57896:1;57888:6;57884:14;57877:36;57760:160;:::o;57926:402::-;58086:3;58107:85;58189:2;58184:3;58107:85;:::i;:::-;58100:92;;58201:93;58290:3;58201:93;:::i;:::-;58319:2;58314:3;58310:12;58303:19;;57926:402;;;:::o;58334:152::-;58474:4;58470:1;58462:6;58458:14;58451:28;58334:152;:::o;58492:400::-;58652:3;58673:84;58755:1;58750:3;58673:84;:::i;:::-;58666:91;;58766:93;58855:3;58766:93;:::i;:::-;58884:1;58879:3;58875:11;58868:18;;58492:400;;;:::o;58898:156::-;59038:8;59034:1;59026:6;59022:14;59015:32;58898:156;:::o;59060:400::-;59220:3;59241:84;59323:1;59318:3;59241:84;:::i;:::-;59234:91;;59334:93;59423:3;59334:93;:::i;:::-;59452:1;59447:3;59443:11;59436:18;;59060:400;;;:::o;59466:158::-;59606:10;59602:1;59594:6;59590:14;59583:34;59466:158;:::o;59630:400::-;59790:3;59811:84;59893:1;59888:3;59811:84;:::i;:::-;59804:91;;59904:93;59993:3;59904:93;:::i;:::-;60022:1;60017:3;60013:11;60006:18;;59630:400;;;:::o;60036:5597::-;62125:3;62147:148;62291:3;62147:148;:::i;:::-;62140:155;;62312:148;62456:3;62312:148;:::i;:::-;62305:155;;62477:95;62568:3;62559:6;62477:95;:::i;:::-;62470:102;;62589:148;62733:3;62589:148;:::i;:::-;62582:155;;62754:148;62898:3;62754:148;:::i;:::-;62747:155;;62919:148;63063:3;62919:148;:::i;:::-;62912:155;;63084:95;63175:3;63166:6;63084:95;:::i;:::-;63077:102;;63196:148;63340:3;63196:148;:::i;:::-;63189:155;;63361:148;63505:3;63361:148;:::i;:::-;63354:155;;63526:148;63670:3;63526:148;:::i;:::-;63519:155;;63691:148;63835:3;63691:148;:::i;:::-;63684:155;;63856:95;63947:3;63938:6;63856:95;:::i;:::-;63849:102;;63968:148;64112:3;63968:148;:::i;:::-;63961:155;;64133:95;64224:3;64215:6;64133:95;:::i;:::-;64126:102;;64245:148;64389:3;64245:148;:::i;:::-;64238:155;;64410:95;64501:3;64492:6;64410:95;:::i;:::-;64403:102;;64522:148;64666:3;64522:148;:::i;:::-;64515:155;;64687:148;64831:3;64687:148;:::i;:::-;64680:155;;64852:148;64996:3;64852:148;:::i;:::-;64845:155;;65017:148;65161:3;65017:148;:::i;:::-;65010:155;;65182:95;65273:3;65264:6;65182:95;:::i;:::-;65175:102;;65294:148;65438:3;65294:148;:::i;:::-;65287:155;;65459:148;65603:3;65459:148;:::i;:::-;65452:155;;65624:3;65617:10;;60036:5597;;;;;;;;;:::o;65639:517::-;65779:66;65775:1;65767:6;65763:14;65756:90;65880:66;65875:2;65867:6;65863:15;65856:91;65981:66;65976:2;65968:6;65964:15;65957:91;66082:66;66077:2;66069:6;66065:15;66058:91;65639:517;:::o;66162:404::-;66322:3;66343:86;66425:3;66420;66343:86;:::i;:::-;66336:93;;66438;66527:3;66438:93;:::i;:::-;66556:3;66551;66547:13;66540:20;;66162:404;;;:::o;66572:5597::-;68661:3;68683:148;68827:3;68683:148;:::i;:::-;68676:155;;68848:148;68992:3;68848:148;:::i;:::-;68841:155;;69013:95;69104:3;69095:6;69013:95;:::i;:::-;69006:102;;69125:148;69269:3;69125:148;:::i;:::-;69118:155;;69290:148;69434:3;69290:148;:::i;:::-;69283:155;;69455:148;69599:3;69455:148;:::i;:::-;69448:155;;69620:95;69711:3;69702:6;69620:95;:::i;:::-;69613:102;;69732:148;69876:3;69732:148;:::i;:::-;69725:155;;69897:148;70041:3;69897:148;:::i;:::-;69890:155;;70062:148;70206:3;70062:148;:::i;:::-;70055:155;;70227:148;70371:3;70227:148;:::i;:::-;70220:155;;70392:95;70483:3;70474:6;70392:95;:::i;:::-;70385:102;;70504:148;70648:3;70504:148;:::i;:::-;70497:155;;70669:95;70760:3;70751:6;70669:95;:::i;:::-;70662:102;;70781:148;70925:3;70781:148;:::i;:::-;70774:155;;70946:95;71037:3;71028:6;70946:95;:::i;:::-;70939:102;;71058:148;71202:3;71058:148;:::i;:::-;71051:155;;71223:148;71367:3;71223:148;:::i;:::-;71216:155;;71388:148;71532:3;71388:148;:::i;:::-;71381:155;;71553:148;71697:3;71553:148;:::i;:::-;71546:155;;71718:95;71809:3;71800:6;71718:95;:::i;:::-;71711:102;;71830:148;71974:3;71830:148;:::i;:::-;71823:155;;71995:148;72139:3;71995:148;:::i;:::-;71988:155;;72160:3;72153:10;;66572:5597;;;;;;;;;:::o;72175:182::-;72315:34;72311:1;72303:6;72299:14;72292:58;72175:182;:::o;72363:366::-;72505:3;72526:67;72590:2;72585:3;72526:67;:::i;:::-;72519:74;;72602:93;72691:3;72602:93;:::i;:::-;72720:2;72715:3;72711:12;72704:19;;72363:366;;;:::o;72735:419::-;72901:4;72939:2;72928:9;72924:18;72916:26;;72988:9;72982:4;72978:20;72974:1;72963:9;72959:17;72952:47;73016:131;73142:4;73016:131;:::i;:::-;73008:139;;72735:419;;;:::o;73160:178::-;73300:30;73296:1;73288:6;73284:14;73277:54;73160:178;:::o;73344:366::-;73486:3;73507:67;73571:2;73566:3;73507:67;:::i;:::-;73500:74;;73583:93;73672:3;73583:93;:::i;:::-;73701:2;73696:3;73692:12;73685:19;;73344:366;;;:::o;73716:419::-;73882:4;73920:2;73909:9;73905:18;73897:26;;73969:9;73963:4;73959:20;73955:1;73944:9;73940:17;73933:47;73997:131;74123:4;73997:131;:::i;:::-;73989:139;;73716:419;;;:::o;74141:233::-;74281:34;74277:1;74269:6;74265:14;74258:58;74350:16;74345:2;74337:6;74333:15;74326:41;74141:233;:::o;74380:366::-;74522:3;74543:67;74607:2;74602:3;74543:67;:::i;:::-;74536:74;;74619:93;74708:3;74619:93;:::i;:::-;74737:2;74732:3;74728:12;74721:19;;74380:366;;;:::o;74752:419::-;74918:4;74956:2;74945:9;74941:18;74933:26;;75005:9;74999:4;74995:20;74991:1;74980:9;74976:17;74969:47;75033:131;75159:4;75033:131;:::i;:::-;75025:139;;74752:419;;;:::o;75177:141::-;75226:4;75249:3;75241:11;;75272:3;75269:1;75262:14;75306:4;75303:1;75293:18;75285:26;;75177:141;;;:::o;75324:93::-;75361:6;75408:2;75403;75396:5;75392:14;75388:23;75378:33;;75324:93;;;:::o;75423:107::-;75467:8;75517:5;75511:4;75507:16;75486:37;;75423:107;;;;:::o;75536:393::-;75605:6;75655:1;75643:10;75639:18;75678:97;75708:66;75697:9;75678:97;:::i;:::-;75796:39;75826:8;75815:9;75796:39;:::i;:::-;75784:51;;75868:4;75864:9;75857:5;75853:21;75844:30;;75917:4;75907:8;75903:19;75896:5;75893:30;75883:40;;75612:317;;75536:393;;;;;:::o;75935:60::-;75963:3;75984:5;75977:12;;75935:60;;;:::o;76001:142::-;76051:9;76084:53;76102:34;76111:24;76129:5;76111:24;:::i;:::-;76102:34;:::i;:::-;76084:53;:::i;:::-;76071:66;;76001:142;;;:::o;76149:75::-;76192:3;76213:5;76206:12;;76149:75;;;:::o;76230:269::-;76340:39;76371:7;76340:39;:::i;:::-;76401:91;76450:41;76474:16;76450:41;:::i;:::-;76442:6;76435:4;76429:11;76401:91;:::i;:::-;76395:4;76388:105;76306:193;76230:269;;;:::o;76505:73::-;76550:3;76505:73;:::o;76584:189::-;76661:32;;:::i;:::-;76702:65;76760:6;76752;76746:4;76702:65;:::i;:::-;76637:136;76584:189;;:::o;76779:186::-;76839:120;76856:3;76849:5;76846:14;76839:120;;;76910:39;76947:1;76940:5;76910:39;:::i;:::-;76883:1;76876:5;76872:13;76863:22;;76839:120;;;76779:186;;:::o;76971:543::-;77072:2;77067:3;77064:11;77061:446;;;77106:38;77138:5;77106:38;:::i;:::-;77190:29;77208:10;77190:29;:::i;:::-;77180:8;77176:44;77373:2;77361:10;77358:18;77355:49;;;77394:8;77379:23;;77355:49;77417:80;77473:22;77491:3;77473:22;:::i;:::-;77463:8;77459:37;77446:11;77417:80;:::i;:::-;77076:431;;77061:446;76971:543;;;:::o;77520:117::-;77574:8;77624:5;77618:4;77614:16;77593:37;;77520:117;;;;:::o;77643:169::-;77687:6;77720:51;77768:1;77764:6;77756:5;77753:1;77749:13;77720:51;:::i;:::-;77716:56;77801:4;77795;77791:15;77781:25;;77694:118;77643:169;;;;:::o;77817:295::-;77893:4;78039:29;78064:3;78058:4;78039:29;:::i;:::-;78031:37;;78101:3;78098:1;78094:11;78088:4;78085:21;78077:29;;77817:295;;;;:::o;78117:1395::-;78234:37;78267:3;78234:37;:::i;:::-;78336:18;78328:6;78325:30;78322:56;;;78358:18;;:::i;:::-;78322:56;78402:38;78434:4;78428:11;78402:38;:::i;:::-;78487:67;78547:6;78539;78533:4;78487:67;:::i;:::-;78581:1;78605:4;78592:17;;78637:2;78629:6;78626:14;78654:1;78649:618;;;;79311:1;79328:6;79325:77;;;79377:9;79372:3;79368:19;79362:26;79353:35;;79325:77;79428:67;79488:6;79481:5;79428:67;:::i;:::-;79422:4;79415:81;79284:222;78619:887;;78649:618;78701:4;78697:9;78689:6;78685:22;78735:37;78767:4;78735:37;:::i;:::-;78794:1;78808:208;78822:7;78819:1;78816:14;78808:208;;;78901:9;78896:3;78892:19;78886:26;78878:6;78871:42;78952:1;78944:6;78940:14;78930:24;;78999:2;78988:9;78984:18;78971:31;;78845:4;78842:1;78838:12;78833:17;;78808:208;;;79044:6;79035:7;79032:19;79029:179;;;79102:9;79097:3;79093:19;79087:26;79145:48;79187:4;79179:6;79175:17;79164:9;79145:48;:::i;:::-;79137:6;79130:64;79052:156;79029:179;79254:1;79250;79242:6;79238:14;79234:22;79228:4;79221:36;78656:611;;;78619:887;;78209:1303;;;78117:1395;;:::o;79518:224::-;79658:34;79654:1;79646:6;79642:14;79635:58;79727:7;79722:2;79714:6;79710:15;79703:32;79518:224;:::o;79748:366::-;79890:3;79911:67;79975:2;79970:3;79911:67;:::i;:::-;79904:74;;79987:93;80076:3;79987:93;:::i;:::-;80105:2;80100:3;80096:12;80089:19;;79748:366;;;:::o;80120:419::-;80286:4;80324:2;80313:9;80309:18;80301:26;;80373:9;80367:4;80363:20;80359:1;80348:9;80344:17;80337:47;80401:131;80527:4;80401:131;:::i;:::-;80393:139;;80120:419;;;:::o;80545:223::-;80685:34;80681:1;80673:6;80669:14;80662:58;80754:6;80749:2;80741:6;80737:15;80730:31;80545:223;:::o;80774:366::-;80916:3;80937:67;81001:2;80996:3;80937:67;:::i;:::-;80930:74;;81013:93;81102:3;81013:93;:::i;:::-;81131:2;81126:3;81122:12;81115:19;;80774:366;;;:::o;81146:419::-;81312:4;81350:2;81339:9;81335:18;81327:26;;81399:9;81393:4;81389:20;81385:1;81374:9;81370:17;81363:47;81427:131;81553:4;81427:131;:::i;:::-;81419:139;;81146:419;;;:::o;81571:185::-;81611:1;81628:20;81646:1;81628:20;:::i;:::-;81623:25;;81662:20;81680:1;81662:20;:::i;:::-;81657:25;;81701:1;81691:35;;81706:18;;:::i;:::-;81691:35;81748:1;81745;81741:9;81736:14;;81571:185;;;;:::o;81762:410::-;81802:7;81825:20;81843:1;81825:20;:::i;:::-;81820:25;;81859:20;81877:1;81859:20;:::i;:::-;81854:25;;81914:1;81911;81907:9;81936:30;81954:11;81936:30;:::i;:::-;81925:41;;82115:1;82106:7;82102:15;82099:1;82096:22;82076:1;82069:9;82049:83;82026:139;;82145:18;;:::i;:::-;82026:139;81810:362;81762:410;;;;:::o;82178:182::-;82318:34;82314:1;82306:6;82302:14;82295:58;82178:182;:::o;82366:366::-;82508:3;82529:67;82593:2;82588:3;82529:67;:::i;:::-;82522:74;;82605:93;82694:3;82605:93;:::i;:::-;82723:2;82718:3;82714:12;82707:19;;82366:366;;;:::o;82738:419::-;82904:4;82942:2;82931:9;82927:18;82919:26;;82991:9;82985:4;82981:20;82977:1;82966:9;82962:17;82955:47;83019:131;83145:4;83019:131;:::i;:::-;83011:139;;82738:419;;;:::o;83163:175::-;83303:27;83299:1;83291:6;83287:14;83280:51;83163:175;:::o;83344:366::-;83486:3;83507:67;83571:2;83566:3;83507:67;:::i;:::-;83500:74;;83583:93;83672:3;83583:93;:::i;:::-;83701:2;83696:3;83692:12;83685:19;;83344:366;;;:::o;83716:419::-;83882:4;83920:2;83909:9;83905:18;83897:26;;83969:9;83963:4;83959:20;83955:1;83944:9;83940:17;83933:47;83997:131;84123:4;83997:131;:::i;:::-;83989:139;;83716:419;;;:::o;84141:237::-;84281:34;84277:1;84269:6;84265:14;84258:58;84350:20;84345:2;84337:6;84333:15;84326:45;84141:237;:::o;84384:366::-;84526:3;84547:67;84611:2;84606:3;84547:67;:::i;:::-;84540:74;;84623:93;84712:3;84623:93;:::i;:::-;84741:2;84736:3;84732:12;84725:19;;84384:366;;;:::o;84756:419::-;84922:4;84960:2;84949:9;84945:18;84937:26;;85009:9;85003:4;84999:20;84995:1;84984:9;84980:17;84973:47;85037:131;85163:4;85037:131;:::i;:::-;85029:139;;84756:419;;;:::o;85181:98::-;85232:6;85266:5;85260:12;85250:22;;85181:98;;;:::o;85285:168::-;85368:11;85402:6;85397:3;85390:19;85442:4;85437:3;85433:14;85418:29;;85285:168;;;;:::o;85459:373::-;85545:3;85573:38;85605:5;85573:38;:::i;:::-;85627:70;85690:6;85685:3;85627:70;:::i;:::-;85620:77;;85706:65;85764:6;85759:3;85752:4;85745:5;85741:16;85706:65;:::i;:::-;85796:29;85818:6;85796:29;:::i;:::-;85791:3;85787:39;85780:46;;85549:283;85459:373;;;;:::o;85838:640::-;86033:4;86071:3;86060:9;86056:19;86048:27;;86085:71;86153:1;86142:9;86138:17;86129:6;86085:71;:::i;:::-;86166:72;86234:2;86223:9;86219:18;86210:6;86166:72;:::i;:::-;86248;86316:2;86305:9;86301:18;86292:6;86248:72;:::i;:::-;86367:9;86361:4;86357:20;86352:2;86341:9;86337:18;86330:48;86395:76;86466:4;86457:6;86395:76;:::i;:::-;86387:84;;85838:640;;;;;;;:::o;86484:141::-;86540:5;86571:6;86565:13;86556:22;;86587:32;86613:5;86587:32;:::i;:::-;86484:141;;;;:::o;86631:349::-;86700:6;86749:2;86737:9;86728:7;86724:23;86720:32;86717:119;;;86755:79;;:::i;:::-;86717:119;86875:1;86900:63;86955:7;86946:6;86935:9;86931:22;86900:63;:::i;:::-;86890:73;;86846:127;86631:349;;;;:::o

Swarm Source

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