ETH Price: $2,911.28 (-3.93%)
Gas: 1 Gwei

Token

Ailosets (AILOSET)
 

Overview

Max Total Supply

283 AILOSET

Holders

213

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
zybex.eth
Balance
1 AILOSET
0x79de94f7db2800b4d8a56fd8a5becef416bbd02b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Ailoverse is a Modular NFT2.0 Project, that consists of multiple NFTs. See the Ailocat Collection here: https://opensea.io/collection/ailoverse-cats , and the Ailobot Collection here: https://opensea.io/collection/ailoverse-robots

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Contract

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-11
*/

// File: IWhitelist.sol


// Creator: OZ

pragma solidity ^0.8.4;

interface IWhitelist {
    function check(address addr) external view returns(bool);
}

// File: Errors.sol


// Creator: OZ using Chiru Labs

pragma solidity ^0.8.4;

error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error AssetCannotBeTransfered();
error AssetLocked();
error AssetNotLocked();
error BalanceQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error CallerNotOwnerNorApproved();
error Err();
error LackOfMoney();
error LockCallerNotOwnerNorApproved();
error MintShouldBeOpened();
error MintToZeroAddress();
error MintZeroQuantity();
error MintedQueryForZeroAddress();
error OutOfMintBoundaries();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error RootAddressError();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
error WhitelistedOnly();

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: Strings.sol


pragma solidity ^0.8.4;

/**
 * Libraries
 * Used https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol for Strings
 */

library Strings{

    bytes16 private constant _HEXSYMBOLS = "0123456789abcdef";

    function toString(address account) public pure returns(string memory) {
        return toString(abi.encodePacked(account));
    }

    function toString(bytes32 value) public pure returns(string memory) {
        return toString(abi.encodePacked(value));
    }

    function toString(bytes memory data) public pure returns(string memory) {
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint i = 0; i < data.length; i++) {
            str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }

    function toString(uint256 value) internal pure returns(string memory)
    {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    function toHexString(uint256 value) internal pure returns(string memory)
    {
        if (0 == value) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (0 != temp) {
            length++;
            temp >>= 8;
        }
        return toHexString(value,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] = _HEXSYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0);
        return string(buffer);
    }
    
    function concat(string memory self, string memory other) internal pure returns(string memory)
    {
        return string(
        abi.encodePacked(
            self,
            other
        ));
    }
    
}

// File: TokenStorage.sol


// Creator: OZ

pragma solidity ^0.8.4;

contract TokenStorage {

    enum MintStatus {
        NONE,
        PRESALE,
        SALE
    }

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        uint64 numberMintedOnPresale;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    struct ContractData {
        // Token name
        string name;
        // Token description
        string description;
        // Token symbol
        string symbol;
        // Base URL for tokens metadata
        string baseURL;
        // Contract-level metadata URL
        string contractURL;
        // Whitelist Merkle tree root
        bytes32 wl;
        // Is it set or asset?
        bool isEnvelope;
        // Revealed?
        bool isRevealed;
        // Mint status managed by
        bool mintStatusAuto;
        // Status
        MintStatus mintStatus;
    }

    struct EnvelopeTypes {
        address envelope;
        address[] types;
    }

    struct MintSettings {
        uint8 mintOnPresale;
        uint8 maxMintPerUser;
        uint8 minMintPerUser;
        uint64 maxTokenSupply;
        uint256 priceOnPresale;
        uint256 priceOnSale;
        uint256 envelopeConcatPrice;
        uint256 envelopeSplitPrice;
        // MintStatus timing
        uint256 mintStatusPreale;
        uint256 mintStatusSale;
        uint256 mintStatusFinished;
    }

    // Contract root address
    address internal _root;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Contract data
    ContractData internal _contractData;

    // Envelope data
    EnvelopeTypes internal _envelopeTypes;

    // Mint settings
    MintSettings internal _mintSettings;

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

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

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

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

    // Envelope container
    mapping(uint256 => mapping(address => uint256)) internal _assetsEnvelope;
    mapping(address => mapping(uint256 => bool)) internal _assetsEnveloped;

}
// File: IEnvelope.sol


// Creator: OZ

pragma solidity ^0.8.4;

interface IEnvelope {
    function locked(address _asset,uint256 _assetId) external view returns(bool);
    function ownerOfAsset(uint256 _assetId) external view returns(address);
    }

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


// OpenZeppelin Contracts (last updated v4.5.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 functionCall(target, data, "Address: low-level call failed");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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: Ownership.sol


// Creator: OZ using Chiru Labs

pragma solidity ^0.8.4;





contract Ownership is Context, TokenStorage {

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId)
    internal view
    returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    uint256[] private __tokens__;

    function tokensOf(address _owner)
    external
    returns(uint256[] memory tokens)
    {
        unchecked {
            for(uint i=0;i<_currentIndex;i++) {
                TokenOwnership memory ownership = ownershipOf(i);
                if(ownership.addr == _owner) {
                    if (!ownership.burned) {
                        if(_contractData.isEnvelope) {
                            __tokens__.push(i);
                        } else {
                            if(!IEnvelope(_envelopeTypes.envelope).locked(address(this),i)) {
                                __tokens__.push(i);
                            }
                        }
                    }
                }
            }
            return __tokens__;
        }
    }

}
// File: AccessControl.sol


// Creator: OZ

pragma solidity ^0.8.4;




contract AccessControl is Ownership {

    function ActiveMint()
    internal view
    {
        if(MintStatus.NONE == _contractData.mintStatus)
            revert MintShouldBeOpened();
    }

    function ApprovedOnly(address owner)
    internal view
    {
        if (!_operatorApprovals[owner][_msgSender()])
            revert CallerNotOwnerNorApproved();
    }

    function BotProtection()
    internal view
    {
        if(tx.origin != msg.sender)
            revert Err();
    }

    function OwnerOnly(address owner,uint256 tokenId)
    internal view
    {
        if (owner != ownershipOf(tokenId).addr)
            revert CallerNotOwnerNorApproved();
    }

    function RootOnly()
    internal view
    {
        address sender = _msgSender();
        if(
            sender != _root &&
            sender != _envelopeTypes.envelope
        ) revert RootAddressError();
    }

    function Whitelisted(bytes32[] calldata _merkleProof)
    internal view
    {
        address sender = _msgSender();
        bool flag =
            _root == sender ||
            _contractData.mintStatus == MintStatus.SALE
        ;

        /**
         * Set merkle tree root
         */
        if(!flag)
            flag = MerkleProof.verify(_merkleProof, _contractData.wl, keccak256(abi.encodePacked(sender)));

        /**/
        if(!flag)
            revert WhitelistedOnly();
    }

    function setWLRoot(bytes32 _root)
    external
    {
        RootOnly();

        _contractData.wl = _root;
    }

}
// File: Array.sol


// Creator: OZ

pragma solidity ^0.8.4;

contract Array{

    function remove(uint256[] memory arr, uint256 e)
    internal pure
    {
        unchecked {
            uint idx = 0;
            for(uint i = 0; i < arr.length; i++) {
                if(arr[i] == e) {
                    idx = i;
                }
            }
            for (uint i = idx; i < arr.length-1; i++){
                arr[i] = arr[i+1];        
            }
            delete arr[arr.length - 1];
        }
    }
    
}
// File: Math.sol


pragma solidity ^0.8.4;

library Math{

    function max(uint256 a,uint256 b) internal pure returns(uint256)
    {
        return a >= b ? a : b;
    }

    function min(uint256 a,uint256 b) internal pure returns(uint256)
    {
        return a < b ? a : b;
    }

    function average(uint256 a,uint256 b) internal pure returns(uint256)
    {
        return (a & b) + (a ^ b) / 2;
    }

    function ceilDiv(uint256 a,uint256 b) internal pure returns(uint256)
    {
        return a / b + (a % b == 0 ? 0 : 1);
    }

    function mul(uint256 a,uint256 b) internal pure returns(uint256 c)
    {
        if (0 == a) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint256 a,uint256 b) internal pure returns(uint256)
    {
        assert(0 != b);
        return a / b;
    }

    function sub(uint256 a,uint256 b) internal pure returns(uint256)
    {
        assert(b <= a);
        return a - b;
    }

    function add(uint256 a,uint256 b) internal pure returns(uint256 c)
    {
        c = a + b;
        assert(c >= a);
        return c;
    }
}

// File: Payment.sol


// Creator: OZ

pragma solidity ^0.8.4;



contract Payment is TokenStorage {

    function lackOfMoney(uint _quantity)
    internal
    returns(bool)
    {
        return msg.value < Math.mul(_contractData.mintStatus == MintStatus.PRESALE ?
        _mintSettings.priceOnPresale : _mintSettings.priceOnSale
        ,_quantity);
    }

    function lackOfMoneyForConcat()
    internal
    returns(bool)
    {
        return
            _mintSettings.envelopeConcatPrice != 0 &&
            _mintSettings.envelopeConcatPrice > msg.value
            ;
    }

    function lackOfMoneyForSplit()
    internal
    returns(bool)
    {
        return
            _mintSettings.envelopeSplitPrice != 0 &&
            _mintSettings.envelopeSplitPrice > msg.value
            ;
    }

}
// File: Quantity.sol


// Creator: OZ

pragma solidity ^0.8.4;



contract Quantity is TokenStorage {

    function quantityIsGood(uint256 _quantity,uint256 _minted,uint256 _mintedOnPresale)
    internal view
    returns(bool)
    {
        return
            (
                _contractData.mintStatus == MintStatus.PRESALE &&
                _mintSettings.mintOnPresale >= _quantity + _minted
            ) || (
                _contractData.mintStatus == MintStatus.SALE &&
                _mintSettings.maxMintPerUser >= _quantity + _minted - _mintedOnPresale &&
                _mintSettings.minMintPerUser <= _quantity
            )
            ;
    }

    function supplyIsGood()
    internal view
    returns(bool)
    {
        return
            _contractData.isEnvelope || (
                _contractData.isEnvelope == false &&
                _mintSettings.maxTokenSupply > _currentIndex
            )
            ;
    }

}
// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;












//import "hardhat/console.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, AccessControl, Quantity {
    using Address for address;
    using Strings for uint256;

    constructor(
        string memory name_,
        string memory description_,
        string memory symbol_,
        string memory baseURL_,
        string memory contractURL_
    ) {
        _contractData.name = name_;
        _contractData.description = description_;
        _contractData.symbol = symbol_;
        _contractData.baseURL = baseURL_;
        _contractData.contractURL = contractURL_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply()
    public view
    returns(uint256)
    {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @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
    override
    returns(uint256)
    {
        if (owner == address(0))
            revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * returnsthe number of tokens minted by `owner`.
     */
    function _numberMinted(address owner)
    internal view
    returns(uint256)
    {
        if (owner == address(0))
            revert MintedQueryForZeroAddress();
        else return
            uint256(_addressData[owner].numberMinted);
    }

    function _numberMintedOnPresale(address owner)
    internal view
    returns(uint256)
    {
        if (owner == address(0))
            revert MintedQueryForZeroAddress();
        else return
            uint256(_addressData[owner].numberMintedOnPresale);
    }

    /**
     * returnsthe number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner)
    internal view
    returns(uint256)
    {
        if (owner == address(0))
            revert BurnedQueryForZeroAddress();
        else return
            uint256(_addressData[owner].numberBurned);
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
    public view
    override
    returns(address)
    {
        if(!_contractData.isEnvelope) {
            if(IEnvelope(_envelopeTypes.envelope).locked(address(this),tokenId)) {
                return address(0);
            }
        }
        return ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId)
    public
    override
    {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner)
            revert ApprovalToCurrentOwner();
        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender()))
            revert CallerNotOwnerNorApproved();
        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
    public view
    override
    returns(address)
    {
        if (!_exists(tokenId))
            revert ApprovalQueryForNonexistentToken();
        else return
            _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
    public
    override
    {
        if (operator == _msgSender())
            revert ApproveToCaller();
        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        if(!_contractData.isEnvelope)
            if(IEnvelope(_envelopeTypes.envelope).locked(address(this),tokenId))
                revert AssetLocked();
                
        _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 {
        if(!_contractData.isEnvelope)
            if(IEnvelope(_envelopeTypes.envelope).locked(address(this),tokenId))
                revert AssetLocked();

        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data))
            revert TransferToNonERC721ReceiverImplementer();
    }

    /**
     * @dev returnswhether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId)
    internal view
    returns(bool)
    {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if(!supplyIsGood())
            revert OutOfMintBoundaries();
        if (to == address(0))
            revert MintToZeroAddress();
        if (quantity == 0)
            revert MintZeroQuantity();

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);
            if(_contractData.mintStatus == MintStatus.PRESALE)
                _addressData[to].numberMintedOnPresale = _addressData[to].numberMintedOnPresale + uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data))
                    revert TransferToNonERC721ReceiverImplementer();
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
    }

    /**
     * Transfer set and all its assets
     */
    function _transferEnvelope(address _to,uint256 _assetId)
    internal
    {
        unchecked {
            for (uint i = 0; i < _envelopeTypes.types.length; i++) {
                (bool success,bytes memory res) = _envelopeTypes.types[i].call(
                    abi.encodeWithSignature("unlock(uint256,address)",
                        _assetsEnvelope[_assetId][_envelopeTypes.types[i]],
                        _to)
                );
                if(!success)
                    revert AssetCannotBeTransfered();
            }
        }
    }

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

        TokenOwnership memory prevOwnership = ownershipOf(tokenId);
        address sender = _msgSender();

        bool isApprovedOrOwner = (
            sender == _envelopeTypes.envelope ||
            sender == prevOwnership.addr ||
            sender == getApproved(tokenId) ||
            isApprovedForAll(prevOwnership.addr, sender)
        );

        if (!isApprovedOrOwner)
            revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from)
            revert TransferFromIncorrectOwner();
        if (to == address(0))
            revert TransferToZeroAddress();

        /*
        if(
            sender == prevOwnership.addr &&
            _contractData.isEnvelope
        ) _transferEnvelope(to,tokenId);
        */

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

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

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

    function getBalance()
    external view
    returns(uint256)
    {
        if(_root != _msgSender())
            revert RootAddressError();
        return address(this).balance;
    }

    function withdraw(address _to,uint256 _amount)
    external
    {
        if(_root != _msgSender())
            revert RootAddressError();
        if(address(this).balance < _amount)
            revert LackOfMoney();
        payable(_to).transfer(_amount);
    }

}

// File: ERC721AToken.sol


// Creator: Chiru Labs & OZ

pragma solidity ^0.8.4;




/**
 * @title ERC721A Base Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721AToken is Context, Ownership, ERC721A {
    using Strings for uint256;

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

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

    function baseTokenURI()
    external view
    returns(string memory)
    {
        return _contractData.baseURL;
    }
  
    function contractURI()
    external view
    returns(string memory)
    {
        return _contractData.contractURL;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
    external view
    override
    returns(string memory)
    {
        if (!_exists(tokenId))
            revert URIQueryForNonexistentToken();

        return string(
                abi.encodePacked(
                    _contractData.baseURL,
                    "/",
                    Strings.toString(tokenId),
                    ".json"
                ));
    }

    function decimals()
    external pure
    returns(uint8)
    {
        return 0;
    }

    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId)
    internal
    {
        if(!_contractData.isEnvelope)
            if(IEnvelope(_envelopeTypes.envelope).locked(address(this),tokenId))
                revert AssetLocked();
                
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

        if (!isApprovedOrOwner)
            revert TransferCallerNotOwnerNorApproved();

        _burn(tokenId);
    }

}
// File: IAsset.sol


// Creator: OZ

pragma solidity ^0.8.4;

interface IAsset {
    function checkMint(address _owner,uint256 _quantity) external returns(uint256);
    function locked(uint256 _assetId) external view returns(bool);
    function ownerOfAsset(uint256 _assetId) external view returns(address);
    }

// File: ERC721AEnvelope.sol


// Creator: OZ

pragma solidity ^0.8.4;





//import "hardhat/console.sol";

abstract contract ERC721AEnvelope is Array, Context, ERC721AToken {
    using Math for uint256;

    function _mintSetOfAssets(address _owner,uint _quantity)
    internal
    {
        unchecked {
            for(uint i = 0; i < _envelopeTypes.types.length; i++) {
                (bool success,bytes memory res) = _envelopeTypes.types[i].call(
                    abi.encodeWithSignature("safeMint(address,uint256)",
                        _owner,
                        _quantity
                        )
                );
                if(!success)
                    revert Err();
            }
        }
    }

    function _envelopeAssets(uint256 _envelopeId)
    internal view
    returns(address[] memory,uint256[] memory)
    {
        unchecked {
            uint len = 0;
            for (uint i = 0; i < _envelopeTypes.types.length; i++) {
                len++;
            }
            address[] memory addrs = new address[](len);
            uint256[] memory tokens = new uint256[](len);
            len = 0;
            for (uint i = 0; i < _envelopeTypes.types.length; i++) {
                addrs[len] = _envelopeTypes.types[i];
                tokens[len++] = _assetsEnvelope[_envelopeId][_envelopeTypes.types[i]];
            }
            return (addrs,tokens);
        }
    }

    function _envelopeSplit(address _owner,uint256 _envelopeId)
    internal
    returns(address[] memory,uint256[] memory)
    {
        OwnerOnly(_owner,_envelopeId);

        (address[] memory addrs,uint256[] memory tokens) = _envelopeAssets(_envelopeId);
        _burn(_envelopeId);
        _transferEnvelope(_owner,_envelopeId);
        unchecked {
            for(uint i = 0; i < addrs.length; i++) {
                _unlockEnvelopeAsset(
                        _envelopeId,
                        addrs[i],
                        tokens[i]
                        );
            }
        }
        return (addrs,tokens);
    }

    function _unlockEnvelopeAsset(uint256 _envelopeId,address _asset,uint256 _assetId)
    internal
    {
        if(!_locked(_asset,_assetId))
            revert AssetNotLocked();
        if(_msgSender() != IAsset(_asset).ownerOfAsset(_assetId))
            revert CallerNotOwnerNorApproved();

        delete _assetsEnveloped[_asset][_assetId];
        delete _assetsEnvelope[_envelopeId][_asset];
    }

    function _envelopeCreate(address _owner,address[] calldata _assets,uint256[] calldata _assetIds)
    internal
    returns(uint256)
    {
        if(
            _assets.length == 0 &&
            _assets.length != _assetIds.length
        ) revert Err();

        uint256 envelopeId = _currentIndex;
        _safeMint(_owner,1);
        unchecked {
            _assetsEnvelope[envelopeId][_envelopeTypes.envelope] = envelopeId;
            for(uint i = 0; i < _assets.length; i++) {
                if(_locked(_assets[i],_assetIds[i]))
                    revert AssetLocked();
                if(_owner != IAsset(_assets[i]).ownerOfAsset(_assetIds[i]))
                    revert CallerNotOwnerNorApproved();
                _assetsEnvelope[envelopeId][_assets[i]] = _assetIds[i];
                _assetsEnveloped[_assets[i]][_assetIds[i]] = true;
            }
        }
        return envelopeId;
    }

    function _locked(address _asset,uint256 _assetId)
    internal view
    returns(bool)
    {
        if (_contractData.isEnvelope)
            return _assetsEnveloped[_asset][_assetId];
        else
            return IAsset(_envelopeTypes.envelope).locked(_assetId);
    }

}

// File: Master.sol


// Creator: OZ

pragma solidity ^0.8.4;


abstract contract Master is ERC721AEnvelope {

    constructor() {
        _root = _msgSender();
        _contractData.isRevealed = false;
        _contractData.mintStatus = MintStatus.NONE;
        _contractData.mintStatusAuto = true;
        _mintSettings.mintOnPresale = 1; // number of tokens on presale
        _mintSettings.maxMintPerUser = 2; // max tokens on sale
        _mintSettings.minMintPerUser = 1; // min tokens on sale
        _mintSettings.maxTokenSupply = 5000;
        _mintSettings.priceOnPresale = 37500000000000000; // in wei, may be changed later
        _mintSettings.priceOnSale = 47500000000000000; // in wei, may be changed later
        _mintSettings.envelopeConcatPrice = 0; // in wei, may be changed later
        _mintSettings.envelopeSplitPrice = 0; // in wei, may be changed later
        _mintSettings.mintStatusPreale = 1649683800; // Monday, April 11, 2022 2:00:00 PM GMT
        _mintSettings.mintStatusSale = 1649734200; // Tuesday, April 12, 2022 3:30:00 AM
        _mintSettings.mintStatusFinished = 0; //does not specified
    }

    function exists(uint256 tokenId)
    external view
    returns(bool)
    {
        return _exists(tokenId);
    }

    function setRoot(address _owner)
    external
    {
        RootOnly();
        
        _root = _owner;
    }

    function getRoot()
    external view
    returns(address)
    {
        return _root;
    }

    function CheckMintStatus()
    internal
    {
        if(!_contractData.mintStatusAuto)
            return;
        
        uint256 mps = _mintSettings.mintStatusPreale;
        uint256 ms = _mintSettings.mintStatusSale;
        uint256 mf = _mintSettings.mintStatusFinished;
        if (mps <= block.timestamp && block.timestamp < ms) {
            _contractData.mintStatus = MintStatus.PRESALE;
        } else if (ms <= block.timestamp && (block.timestamp < mf || 0 == mf)) {
            _contractData.mintStatus = MintStatus.SALE;
        } else {
            _contractData.mintStatus = MintStatus.NONE;
        }
    }

    function toggleMintStatus(bool _mode)
    external
    {
        RootOnly();

        _contractData.mintStatusAuto = _mode;
    }

    function setMintingIsOnPresale()
    external
    {
        RootOnly();

        _contractData.mintStatus = MintStatus.PRESALE;
    }
    
    function setMintingIsOnSale()
    external
    {
        RootOnly();

        _contractData.mintStatus = MintStatus.SALE;
    }
     
    function stopMinting()
    external
    {
        RootOnly();

        _contractData.mintStatus = MintStatus.NONE;
    }

    function updateContract(
        uint256 _pricePresale,
        uint256 _priceSale,
        uint8 _minMint,
        uint8 _maxMint,
        uint64 _maxSupply
        )
    external
    {
        RootOnly();

        _mintSettings.priceOnPresale = _pricePresale;
        _mintSettings.priceOnSale = _priceSale;
        _mintSettings.maxMintPerUser = _maxMint;
        _mintSettings.minMintPerUser = _minMint;
        _mintSettings.maxTokenSupply = _maxSupply;
    }

    function setRevealed(string calldata _url)
    external
    {
        RootOnly();

        _contractData.isRevealed = true;
        _contractData.baseURL = _url;
    }

    function updateBaseURL(string calldata _url)
    external
    {
        RootOnly();

        _contractData.baseURL = _url;
    }

}
// File: Contract.sol


// Creator: OZ

pragma solidity ^0.8.4;




contract Contract is Master, Payment, IEnvelope {

    constructor(
        string memory name_,
        string memory description_,
        string memory symbol_,
        string memory baseURL_,
        string memory contractURL_
    ) ERC721A(
        name_,
        description_,
        symbol_,
        baseURL_,
        contractURL_
    ) Master() {
        _contractData.isEnvelope = true;
        //_contractData.wl = 0x7355b511eb06aa6d5a11b366b27ed407bc3237cf6e2eafe1799efef4a678756f;
        _contractData.wl = 0xcdab47e163c1eb6040f36523ce1ddb86b732c6e652e159613a6e0b896d4f8232;
    }

    function addAssetType(address _asset)
    external
    {
        RootOnly();

        unchecked {
            _envelopeTypes.types.push(_asset);
        }
    }

    function setEnvelopeConcatPrice(uint256 _price)
    external
    {
        RootOnly();

        _mintSettings.envelopeConcatPrice = _price;
    }

    function setEnvelopeSplitPrice(uint256 _price)
    external
    {
        RootOnly();

        _mintSettings.envelopeSplitPrice = _price;
    }

    function addMint(uint _quantity)
    external payable
    returns(uint256)
    {
        BotProtection();
        CheckMintStatus();
        ActiveMint();

        if(_contractData.mintStatus != MintStatus.SALE)
            revert WhitelistedOnly();

        //
        if (lackOfMoney(_quantity * _envelopeTypes.types.length))
            revert LackOfMoney();
        else {
            _mintSetOfAssets(_msgSender(), _quantity);
            return _quantity;
        }
    }

    function addMint(uint _quantity,bytes32[] calldata _merkleProof)
    external payable
    returns(uint256)
    {
        BotProtection();
        CheckMintStatus();
        ActiveMint();
        Whitelisted(_merkleProof);

        if (lackOfMoney(_quantity * _envelopeTypes.types.length))
            revert LackOfMoney();
        else {
            _mintSetOfAssets(_msgSender(), _quantity);
            return _quantity;
        }
    }

    function addMint(address _owner,uint _quantity)
    external
    {
        RootOnly();
        CheckMintStatus();

        _mintSetOfAssets(_owner, _quantity);
    }

    function envelopeCreate(address[] calldata _assets,uint256[] calldata _assetIds)
    external payable 
    returns(uint256)
    {
        if(lackOfMoneyForConcat())
            revert LackOfMoney();
        else return
            _envelopeCreate(_msgSender(),_assets, _assetIds);
    }

    function envelopeSplit(uint256 _envelopeId)
    external payable
    returns(address[] memory,uint256[] memory)
    {
        OwnerOnly(_msgSender(),_envelopeId);

        if(lackOfMoneyForSplit())
            revert LackOfMoney();
        else return
            _envelopeSplit(_msgSender(),_envelopeId);
    }

    function getAssetTypes()
    external view
    returns(address[] memory)
    {
        return _envelopeTypes.types;
    }

    function getEnvelopeAssets(uint256 _envelopeId)
    external view
    returns(address[] memory,uint256[] memory)
    {
        return _envelopeAssets(_envelopeId);
    }

    function locked(address _asset,uint256 _assetId)
    external view
    override
    returns(bool)
    {
        return _assetsEnveloped[_asset][_assetId];
    }

    function ownerOfAsset(uint256 _assetId)
    external view
    override
    returns(address)
    {
        return ownershipOf(_assetId).addr;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"description_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURL_","type":"string"},{"internalType":"string","name":"contractURL_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"AssetCannotBeTransfered","type":"error"},{"inputs":[],"name":"AssetLocked","type":"error"},{"inputs":[],"name":"AssetNotLocked","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"Err","type":"error"},{"inputs":[],"name":"LackOfMoney","type":"error"},{"inputs":[],"name":"MintShouldBeOpened","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OutOfMintBoundaries","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"RootAddressError","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WhitelistedOnly","type":"error"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"}],"name":"addAssetType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"addMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"addMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"addMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assets","type":"address[]"},{"internalType":"uint256[]","name":"_assetIds","type":"uint256[]"}],"name":"envelopeCreate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_envelopeId","type":"uint256"}],"name":"envelopeSplit","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAssetTypes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_envelopeId","type":"uint256"}],"name":"getEnvelopeAssets","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_assetId","type":"uint256"}],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_assetId","type":"uint256"}],"name":"ownerOfAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setEnvelopeConcatPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setEnvelopeSplitPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintingIsOnPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintingIsOnSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWLRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_mode","type":"bool"}],"name":"toggleMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOf","outputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"stateMutability":"nonpayable","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":"string","name":"_url","type":"string"}],"name":"updateBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pricePresale","type":"uint256"},{"internalType":"uint256","name":"_priceSale","type":"uint256"},{"internalType":"uint8","name":"_minMint","type":"uint8"},{"internalType":"uint8","name":"_maxMint","type":"uint8"},{"internalType":"uint64","name":"_maxSupply","type":"uint64"}],"name":"updateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200628a3803806200628a83398181016040528101906200003791906200051d565b8484848484846003600001908051906020019062000057929190620002d0565b50836003600101908051906020019062000073929190620002d0565b5082600360020190805190602001906200008f929190620002d0565b5081600380019080519060200190620000aa929190620002d0565b508060036004019080519060200190620000c6929190620002d0565b505050505050620000dc620002c860201b60201c565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600360060160016101000a81548160ff0219169083151502179055506000600360060160036101000a81548160ff0219169083600281111562000165576200016462000640565b5b02179055506001600360060160026101000a81548160ff0219169083151502179055506001600c60000160006101000a81548160ff021916908360ff1602179055506002600c60000160016101000a81548160ff021916908360ff1602179055506001600c60000160026101000a81548160ff021916908360ff160217905550611388600c60000160036101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555066853a0d2313c000600c6001018190555066a8c0ff92d4c000600c600201819055506000600c600301819055506000600c600401819055506362542d58600c60050181905550636254f238600c600601819055506000600c600701819055506001600360060160006101000a81548160ff0219169083151502179055507fcdab47e163c1eb6040f36523ce1ddb86b732c6e652e159613a6e0b896d4f823260001b6003600501819055505050505050620006d3565b600033905090565b828054620002de906200069e565b90600052602060002090601f0160209004810192826200030257600085556200034e565b82601f106200031d57805160ff19168380011785556200034e565b828001600101855582156200034e579182015b828111156200034d57825182559160200191906001019062000330565b5b5090506200035d919062000361565b5090565b5b808211156200037c57600081600090555060010162000362565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003e9826200039e565b810181811067ffffffffffffffff821117156200040b576200040a620003af565b5b80604052505050565b60006200042062000380565b90506200042e8282620003de565b919050565b600067ffffffffffffffff821115620004515762000450620003af565b5b6200045c826200039e565b9050602081019050919050565b60005b83811015620004895780820151818401526020810190506200046c565b8381111562000499576000848401525b50505050565b6000620004b6620004b08462000433565b62000414565b905082815260208101848484011115620004d557620004d462000399565b5b620004e284828562000469565b509392505050565b600082601f83011262000502576200050162000394565b5b8151620005148482602086016200049f565b91505092915050565b600080600080600060a086880312156200053c576200053b6200038a565b5b600086015167ffffffffffffffff8111156200055d576200055c6200038f565b5b6200056b88828901620004ea565b955050602086015167ffffffffffffffff8111156200058f576200058e6200038f565b5b6200059d88828901620004ea565b945050604086015167ffffffffffffffff811115620005c157620005c06200038f565b5b620005cf88828901620004ea565b935050606086015167ffffffffffffffff811115620005f357620005f26200038f565b5b6200060188828901620004ea565b925050608086015167ffffffffffffffff8111156200062557620006246200038f565b5b6200063388828901620004ea565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006b757607f821691505b602082108103620006cd57620006cc6200066f565b5b50919050565b615ba780620006e36000396000f3fe60806040526004361061025b5760003560e01c80637fdf5dc411610144578063b4e99839116100b6578063d547cfb71161007a578063d547cfb7146108fc578063daba6f3a14610927578063e0173a6d14610958578063e8a3d48514610988578063e985e9c5146109b3578063f3fef3a3146109f05761025b565b8063b4e9983914610819578063b88d4fde14610830578063bf7bab7314610859578063c2f1dcc814610896578063c87b56dd146108bf5761025b565b8063911e65fa11610108578063911e65fa1461071857806395d89b41146107485780639ece339814610773578063a084c6ad1461078a578063a22cb465146107c7578063b11c7f82146107f05761025b565b80637fdf5dc414610636578063834fd1241461065f5780638525185114610688578063864aa866146106c6578063870d6f9d146106ef5761025b565b80633e6007e0116101dd5780635ca1e165116101a15780635ca1e165146105145780635ecc8e6b1461053f5780636352211e1461056a57806368d4e4ef146105a757806370a08231146105d0578063794100b91461060d5761025b565b80633e6007e014610418578063403398301461044157806342842e0e146104715780634f558e791461049a5780635a3f2672146104d75761025b565b806312065fe01161022457806312065fe01461035757806318160ddd1461038257806323b872dd146103ad578063313ce567146103d65780633e3e0b12146104015761025b565b80623ba1ed1461026057806301ffc9a71461028957806306fdde03146102c6578063081812fc146102f1578063095ea7b31461032e575b600080fd5b34801561026c57600080fd5b5061028760048036038101906102829190614901565b610a19565b005b34801561029557600080fd5b506102b060048036038101906102ab9190614986565b610a64565b6040516102bd91906149ce565b60405180910390f35b3480156102d257600080fd5b506102db610b46565b6040516102e89190614a82565b60405180910390f35b3480156102fd57600080fd5b5061031860048036038101906103139190614ada565b610bdb565b6040516103259190614b16565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190614b31565b610c57565b005b34801561036357600080fd5b5061036c610d61565b6040516103799190614b80565b60405180910390f35b34801561038e57600080fd5b50610397610df5565b6040516103a49190614b80565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190614b9b565b610e03565b005b3480156103e257600080fd5b506103eb610f03565b6040516103f89190614c0a565b60405180910390f35b34801561040d57600080fd5b50610416610f08565b005b34801561042457600080fd5b5061043f600480360381019061043a9190614c51565b610f40565b005b61045b60048036038101906104569190614ada565b610f68565b6040516104689190614b80565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190614b9b565b61105d565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190614ada565b61107d565b6040516104ce91906149ce565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190614901565b61108f565b60405161050b9190614d3c565b60405180910390f35b34801561052057600080fd5b5061052961126a565b6040516105369190614b16565b60405180910390f35b34801561054b57600080fd5b50610554611293565b6040516105619190614e1c565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190614ada565b611324565b60405161059e9190614b16565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190614901565b611402565b005b3480156105dc57600080fd5b506105f760048036038101906105f29190614901565b611473565b6040516106049190614b80565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190614ea3565b611542565b005b34801561064257600080fd5b5061065d60048036038101906106589190614ada565b611580565b005b34801561066b57600080fd5b5061068660048036038101906106819190614ada565b611595565b005b34801561069457600080fd5b506106af60048036038101906106aa9190614ada565b6115aa565b6040516106bd929190614ef0565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190614f93565b6115bf565b005b3480156106fb57600080fd5b5061071660048036038101906107119190614ea3565b61164a565b005b610732600480360381019061072d9190615064565b61166a565b60405161073f9190614b80565b60405180910390f35b34801561075457600080fd5b5061075d6116fc565b60405161076a9190614a82565b60405180910390f35b34801561077f57600080fd5b50610788611791565b005b34801561079657600080fd5b506107b160048036038101906107ac9190614ada565b6117c9565b6040516107be9190614b16565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e991906150c4565b6117df565b005b3480156107fc57600080fd5b506108176004803603810190610812919061513a565b611956565b005b34801561082557600080fd5b5061082e61196b565b005b34801561083c57600080fd5b5061085760048036038101906108529190615297565b6119a3565b005b34801561086557600080fd5b50610880600480360381019061087b9190614b31565b611ae6565b60405161088d91906149ce565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b89190614b31565b611b4e565b005b3480156108cb57600080fd5b506108e660048036038101906108e19190614ada565b611b6c565b6040516108f39190614a82565b60405180910390f35b34801561090857600080fd5b50610911611be1565b60405161091e9190614a82565b60405180910390f35b610941600480360381019061093c9190614ada565b611c75565b60405161094f929190614ef0565b60405180910390f35b610972600480360381019061096d91906153c6565b611ce2565b60405161097f9190614b80565b60405180910390f35b34801561099457600080fd5b5061099d611d41565b6040516109aa9190614a82565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190615447565b611dd6565b6040516109e791906149ce565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190614b31565b611e6a565b005b610a21611f7b565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3f5750610b3e8261206e565b5b9050919050565b606060036000018054610b58906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b84906154b6565b8015610bd15780601f10610ba657610100808354040283529160200191610bd1565b820191906000526020600020905b815481529060010190602001808311610bb457829003601f168201915b5050505050905090565b6000610be6826120d8565b610c1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6015600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6282611324565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce8612113565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d1a5750610d1881610d13612113565b611dd6565b155b15610d51576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5c83838361211b565b505050565b6000610d6b612113565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610def576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b47905090565b600060025460015403905090565b600360060160009054906101000a900460ff16610ef357600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330836040518363ffffffff1660e01b8152600401610e7a9291906154e7565b602060405180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb9190615525565b15610ef2576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610efe8383836121cd565b505050565b600090565b610f10611f7b565b6000600360060160036101000a81548160ff02191690836002811115610f3957610f38615552565b5b0217905550565b610f48611f7b565b80600360060160026101000a81548160ff02191690831515021790555050565b6000610f726126f5565b610f7a61275c565b610f82612861565b600280811115610f9557610f94615552565b5b600360060160039054906101000a900460ff166002811115610fba57610fb9615552565b5b14610ff1576040517f9f167ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61100d600a600101805490508361100891906155b0565b6128d3565b15611044576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105561104f612113565b83612937565b819050919050565b611078838383604051806020016040528060008152506119a3565b505050565b6000611088826120d8565b9050919050565b606060005b6001548110156112115760006110a982612ad4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160361120357806040015161120257600360060160009054906101000a900460ff161561113157601a829080600181540180825580915050600190039060005260206000200160009091909190915055611201565b600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b81526004016111919291906154e7565b602060405180830381865afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d29190615525565b61120057601a8290806001815401808255809150506001900390600052602060002001600090919091909150555b5b5b5b508080600101915050611094565b50601a80548060200260200160405190810160405280929190818152602001828054801561125e57602002820191906000526020600020905b81548152602001906001019080831161124a575b50505050509050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a60010180548060200260200160405190810160405280929190818152602001828054801561131a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112d0575b5050505050905090565b6000600360060160009054906101000a900460ff166113ed57600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b815260040161139d9291906154e7565b602060405180830381865afa1580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de9190615525565b156113ec57600090506113fd565b5b6113f682612ad4565b6000015190505b919050565b61140a611f7b565b600a600101819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114da576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61154a611f7b565b6001600360060160016101000a81548160ff021916908315150217905550818160038001919061157b9291906147a9565b505050565b611588611f7b565b80600c6004018190555050565b61159d611f7b565b80600c6003018190555050565b6060806115b683612d50565b91509150915091565b6115c7611f7b565b84600c6001018190555083600c6002018190555081600c60000160016101000a81548160ff021916908360ff16021790555082600c60000160026101000a81548160ff021916908360ff16021790555080600c60000160036101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050505050565b611652611f7b565b81816003800191906116659291906147a9565b505050565b60006116746126f5565b61167c61275c565b611684612861565b61168e8383612f90565b6116aa600a60010180549050856116a591906155b0565b6128d3565b156116e1576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f26116ec612113565b85612937565b8390509392505050565b60606003600201805461170e906154b6565b80601f016020809104026020016040519081016040528092919081815260200182805461173a906154b6565b80156117875780601f1061175c57610100808354040283529160200191611787565b820191906000526020600020905b81548152906001019060200180831161176a57829003601f168201915b5050505050905090565b611799611f7b565b6002600360060160036101000a81548160ff021916908360028111156117c2576117c1615552565b5b0217905550565b60006117d482612ad4565b600001519050919050565b6117e7612113565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060176000611858612113565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611905612113565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161194a91906149ce565b60405180910390a35050565b61195e611f7b565b8060036005018190555050565b611973611f7b565b6001600360060160036101000a81548160ff0219169083600281111561199c5761199b615552565b5b0217905550565b600360060160009054906101000a900460ff16611a9357600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b8152600401611a1a9291906154e7565b602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b9190615525565b15611a92576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b611a9e8484846121cd565b611aaa848484846130eb565b611ae0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b611b56611f7b565b611b5e61275c565b611b688282612937565b5050565b6060611b77826120d8565b611bad576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038001611bba83613269565b604051602001611bcb929190615772565b6040516020818303038152906040529050919050565b6060600380018054611bf2906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1e906154b6565b8015611c6b5780601f10611c4057610100808354040283529160200191611c6b565b820191906000526020600020905b815481529060010190602001808311611c4e57829003601f168201915b5050505050905090565b606080611c89611c83612113565b846133c9565b611c9161343e565b15611cc8576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd9611cd3612113565b8461345e565b91509150915091565b6000611cec6134f6565b15611d23576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d37611d2e612113565b86868686613516565b9050949350505050565b606060036004018054611d53906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7f906154b6565b8015611dcc5780601f10611da157610100808354040283529160200191611dcc565b820191906000526020600020905b815481529060010190602001808311611daf57829003601f168201915b5050505050905090565b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e72612113565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ef6576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80471015611f30576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f76573d6000803e3d6000fd5b505050565b6000611f85612113565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120345750600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561206b576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006001548210801561210c575060146000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826015600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006121d882612ad4565b905060006121e4612113565b90506000600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806122765750826000015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806122b4575061228584610bdb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806122c957506122c8836000015183611dd6565b5b905080612302576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461236b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123d1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123e1600085856000015161211b565b6001601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846014600086815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600086815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600185019050600073ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612691576001548110156126905783600001516014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602001516014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461275a576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600360060160029054906101000a900460ff161561285f576000600c6005015490506000600c6006015490506000600c6007015490504283111580156127a157508142105b156127d9576001600360060160036101000a81548160ff021916908360028111156127cf576127ce615552565b5b021790555061285b565b4282111580156127f35750804210806127f25750806000145b5b1561282b576002600360060160036101000a81548160ff0219169083600281111561282157612820615552565b5b021790555061285a565b6000600360060160036101000a81548160ff0219169083600281111561285457612853615552565b5b02179055505b5b5050505b565b600360060160039054906101000a900460ff16600281111561288657612885615552565b5b6000600281111561289a57612899615552565b5b036128d1576040517f08a69c7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600061292e600160028111156128ec576128eb615552565b5b600360060160039054906101000a900460ff16600281111561291157612910615552565b5b1461292157600c60020154612928565b600c600101545b836138f9565b34109050919050565b60005b600a60010180549050811015612acf57600080600a6001018381548110612964576129636157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685856040516024016129b89291906154e7565b6040516020818303038152906040527fa1448194000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612a429190615822565b6000604051808303816000865af19150503d8060008114612a7f576040519150601f19603f3d011682016040523d82523d6000602084013e612a84565b606091505b509150915081612ac0576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050808060010191505061293a565b505050565b612adc61482f565b6000829050600154811015612d19576000601460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d1757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bfb578092505050612d4b565b5b600115612d1657818060019003925050601460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d11578092505050612d4b565b612bfc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6060806000805b600a60010180549050811015612d7c5781806001019250508080600101915050612d57565b5060008167ffffffffffffffff811115612d9957612d9861516c565b5b604051908082528060200260200182016040528015612dc75781602001602082028036833780820191505090505b50905060008267ffffffffffffffff811115612de657612de561516c565b5b604051908082528060200260200182016040528015612e145781602001602082028036833780820191505090505b5090506000925060005b600a60010180549050811015612f8157600a6001018181548110612e4557612e446157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838581518110612e8357612e826157ac565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601860008881526020019081526020016000206000600a6001018381548110612ee957612ee86157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828580600101965081518110612f6857612f676157ac565b5b6020026020010181815250508080600101915050612e1e565b50818194509450505050915091565b6000612f9a612113565b905060008173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061302d575060028081111561300657613005615552565b5b600360060160039054906101000a900460ff16600281111561302b5761302a615552565b5b145b9050806130ae576130ab848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600360050154846040516020016130909190615881565b6040516020818303038152906040528051906020012061393c565b90505b806130e5576040517f9f167ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600061310c8473ffffffffffffffffffffffffffffffffffffffff16613953565b1561325c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613135612113565b8786866040518563ffffffff1660e01b815260040161315794939291906158e6565b6020604051808303816000875af192505050801561319357506040513d601f19601f820116820180604052508101906131909190615947565b60015b61320c573d80600081146131c3576040519150601f19603f3d011682016040523d82523d6000602084013e6131c8565b606091505b506000815103613204576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613261565b600190505b949350505050565b6060816000036132b0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133c4565b600082905060005b816000146132e25780806132cb90615974565b915050600a826132db91906159eb565b91506132b8565b60008167ffffffffffffffff8111156132fe576132fd61516c565b5b6040519080825280601f01601f1916602001820160405280156133305781602001600182028036833780820191505090505b5090505b846000146133bd576001826133499190615a1c565b9150600a856133589190615a50565b60306133649190615a81565b60f81b81838151811061337a576133796157ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133b691906159eb565b9450613334565b8093505050505b919050565b6133d281612ad4565b6000015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461343a576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b600080600c6004015414158015613459575034600c60040154115b905090565b60608061346b84846133c9565b60008061347785612d50565b9150915061348485613976565b61348e8686613cf5565b60005b82518110156134e6576134d9868483815181106134b1576134b06157ac565b5b60200260200101518484815181106134cc576134cb6157ac565b5b6020026020010151613f23565b8080600101915050613491565b5081819350935050509250929050565b600080600c6003015414158015613511575034600c60030154115b905090565b600080858590501480156135305750828290508585905014155b15613567576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001549050613579876001614101565b80601860008381526020019081526020016000206000600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b868690508110156138eb5761364b878783818110613617576136166157ac565b5b905060200201602081019061362c9190614901565b86868481811061363f5761363e6157ac565b5b9050602002013561411f565b15613682576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b868682818110613695576136946157ac565b5b90506020020160208101906136aa9190614901565b73ffffffffffffffffffffffffffffffffffffffff1663a084c6ad8686848181106136d8576136d76157ac565b5b905060200201356040518263ffffffff1660e01b81526004016136fb9190614b80565b602060405180830381865afa158015613718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373c9190615aec565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146137a0576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484828181106137b3576137b26157ac565b5b905060200201356018600084815260200190815260200160002060008989858181106137e2576137e16157ac565b5b90506020020160208101906137f79190614901565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016019600089898581811061384e5761384d6157ac565b5b90506020020160208101906138639190614901565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008787858181106138b2576138b16157ac565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506135f6565b508091505095945050505050565b60008260000361390c5760009050613936565b818361391891906155b0565b905081838261392791906159eb565b1461393557613934615b19565b5b5b92915050565b6000826139498584614246565b1490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061398182612ad4565b9050613993600083836000015161211b565b600160166000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160166000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160188282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600001516014600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160146000848152602001908152602001600020600001601c6101000a81548160ff0219169083151502179055506000600183019050600073ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613c7e57600154811015613c7d5781600001516014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602001516014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5081600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46002600081548092919060010191905055505050565b60005b600a60010180549050811015613f1e57600080600a6001018381548110613d2257613d216157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601860008681526020019081526020016000206000600a6001018681548110613d8f57613d8e6157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205486604051602401613e07929190615b48565b6040516020818303038152906040527ff1d2ec1d000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613e919190615822565b6000604051808303816000865af19150503d8060008114613ece576040519150601f19603f3d011682016040523d82523d6000602084013e613ed3565b606091505b509150915081613f0f576040517fb5bc7d7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508080600101915050613cf8565b505050565b613f2d828261411f565b613f63576040517f431d992700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a084c6ad826040518263ffffffff1660e01b8152600401613f9c9190614b80565b602060405180830381865afa158015613fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fdd9190615aec565b73ffffffffffffffffffffffffffffffffffffffff16613ffb612113565b73ffffffffffffffffffffffffffffffffffffffff1614614048576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060006101000a81549060ff02191690556018600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055505050565b61411b8282604051806020016040528060008152506142bb565b5050565b6000600360060160009054906101000a900460ff161561419e57601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff169050614240565b600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b45a3c0e836040518263ffffffff1660e01b81526004016141fc9190614b80565b602060405180830381865afa158015614219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423d9190615525565b90505b92915050565b60008082905060005b84518110156142b057600085828151811061426d5761426c6157ac565b5b6020026020010151905080831161428f5761428883826142cd565b925061429c565b61429981846142cd565b92505b5080806142a890615974565b91505061424f565b508091505092915050565b6142c883838360016142e4565b505050565b600082600052816020526040600020905092915050565b600060015490506142f361473e565b614329576040517f271c929900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361438f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036143c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160028111156144e1576144e0615552565b5b600360060160039054906101000a900460ff16600281111561450657614505615552565b5b036145cd5783601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1601601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b846014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561472e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156146e257506146e060008884886130eb565b155b15614719576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050614667565b5080600181905550505050505050565b6000600360060160009054906101000a900460ff16806147a4575060001515600360060160009054906101000a900460ff1615151480156147a35750600154600c60000160039054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b5b905090565b8280546147b5906154b6565b90600052602060002090601f0160209004810192826147d7576000855561481e565b82601f106147f057803560ff191683800117855561481e565b8280016001018555821561481e579182015b8281111561481d578235825591602001919060010190614802565b5b50905061482b9190614872565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561488b576000816000905550600101614873565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148ce826148a3565b9050919050565b6148de816148c3565b81146148e957600080fd5b50565b6000813590506148fb816148d5565b92915050565b60006020828403121561491757614916614899565b5b6000614925848285016148ec565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6149638161492e565b811461496e57600080fd5b50565b6000813590506149808161495a565b92915050565b60006020828403121561499c5761499b614899565b5b60006149aa84828501614971565b91505092915050565b60008115159050919050565b6149c8816149b3565b82525050565b60006020820190506149e360008301846149bf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a23578082015181840152602081019050614a08565b83811115614a32576000848401525b50505050565b6000601f19601f8301169050919050565b6000614a54826149e9565b614a5e81856149f4565b9350614a6e818560208601614a05565b614a7781614a38565b840191505092915050565b60006020820190508181036000830152614a9c8184614a49565b905092915050565b6000819050919050565b614ab781614aa4565b8114614ac257600080fd5b50565b600081359050614ad481614aae565b92915050565b600060208284031215614af057614aef614899565b5b6000614afe84828501614ac5565b91505092915050565b614b10816148c3565b82525050565b6000602082019050614b2b6000830184614b07565b92915050565b60008060408385031215614b4857614b47614899565b5b6000614b56858286016148ec565b9250506020614b6785828601614ac5565b9150509250929050565b614b7a81614aa4565b82525050565b6000602082019050614b956000830184614b71565b92915050565b600080600060608486031215614bb457614bb3614899565b5b6000614bc2868287016148ec565b9350506020614bd3868287016148ec565b9250506040614be486828701614ac5565b9150509250925092565b600060ff82169050919050565b614c0481614bee565b82525050565b6000602082019050614c1f6000830184614bfb565b92915050565b614c2e816149b3565b8114614c3957600080fd5b50565b600081359050614c4b81614c25565b92915050565b600060208284031215614c6757614c66614899565b5b6000614c7584828501614c3c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614cb381614aa4565b82525050565b6000614cc58383614caa565b60208301905092915050565b6000602082019050919050565b6000614ce982614c7e565b614cf38185614c89565b9350614cfe83614c9a565b8060005b83811015614d2f578151614d168882614cb9565b9750614d2183614cd1565b925050600181019050614d02565b5085935050505092915050565b60006020820190508181036000830152614d568184614cde565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614d93816148c3565b82525050565b6000614da58383614d8a565b60208301905092915050565b6000602082019050919050565b6000614dc982614d5e565b614dd38185614d69565b9350614dde83614d7a565b8060005b83811015614e0f578151614df68882614d99565b9750614e0183614db1565b925050600181019050614de2565b5085935050505092915050565b60006020820190508181036000830152614e368184614dbe565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112614e6357614e62614e3e565b5b8235905067ffffffffffffffff811115614e8057614e7f614e43565b5b602083019150836001820283011115614e9c57614e9b614e48565b5b9250929050565b60008060208385031215614eba57614eb9614899565b5b600083013567ffffffffffffffff811115614ed857614ed761489e565b5b614ee485828601614e4d565b92509250509250929050565b60006040820190508181036000830152614f0a8185614dbe565b90508181036020830152614f1e8184614cde565b90509392505050565b614f3081614bee565b8114614f3b57600080fd5b50565b600081359050614f4d81614f27565b92915050565b600067ffffffffffffffff82169050919050565b614f7081614f53565b8114614f7b57600080fd5b50565b600081359050614f8d81614f67565b92915050565b600080600080600060a08688031215614faf57614fae614899565b5b6000614fbd88828901614ac5565b9550506020614fce88828901614ac5565b9450506040614fdf88828901614f3e565b9350506060614ff088828901614f3e565b925050608061500188828901614f7e565b9150509295509295909350565b60008083601f84011261502457615023614e3e565b5b8235905067ffffffffffffffff81111561504157615040614e43565b5b60208301915083602082028301111561505d5761505c614e48565b5b9250929050565b60008060006040848603121561507d5761507c614899565b5b600061508b86828701614ac5565b935050602084013567ffffffffffffffff8111156150ac576150ab61489e565b5b6150b88682870161500e565b92509250509250925092565b600080604083850312156150db576150da614899565b5b60006150e9858286016148ec565b92505060206150fa85828601614c3c565b9150509250929050565b6000819050919050565b61511781615104565b811461512257600080fd5b50565b6000813590506151348161510e565b92915050565b6000602082840312156151505761514f614899565b5b600061515e84828501615125565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6151a482614a38565b810181811067ffffffffffffffff821117156151c3576151c261516c565b5b80604052505050565b60006151d661488f565b90506151e2828261519b565b919050565b600067ffffffffffffffff8211156152025761520161516c565b5b61520b82614a38565b9050602081019050919050565b82818337600083830152505050565b600061523a615235846151e7565b6151cc565b90508281526020810184848401111561525657615255615167565b5b615261848285615218565b509392505050565b600082601f83011261527e5761527d614e3e565b5b813561528e848260208601615227565b91505092915050565b600080600080608085870312156152b1576152b0614899565b5b60006152bf878288016148ec565b94505060206152d0878288016148ec565b93505060406152e187828801614ac5565b925050606085013567ffffffffffffffff8111156153025761530161489e565b5b61530e87828801615269565b91505092959194509250565b60008083601f8401126153305761532f614e3e565b5b8235905067ffffffffffffffff81111561534d5761534c614e43565b5b60208301915083602082028301111561536957615368614e48565b5b9250929050565b60008083601f84011261538657615385614e3e565b5b8235905067ffffffffffffffff8111156153a3576153a2614e43565b5b6020830191508360208202830111156153bf576153be614e48565b5b9250929050565b600080600080604085870312156153e0576153df614899565b5b600085013567ffffffffffffffff8111156153fe576153fd61489e565b5b61540a8782880161531a565b9450945050602085013567ffffffffffffffff81111561542d5761542c61489e565b5b61543987828801615370565b925092505092959194509250565b6000806040838503121561545e5761545d614899565b5b600061546c858286016148ec565b925050602061547d858286016148ec565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806154ce57607f821691505b6020821081036154e1576154e0615487565b5b50919050565b60006040820190506154fc6000830185614b07565b6155096020830184614b71565b9392505050565b60008151905061551f81614c25565b92915050565b60006020828403121561553b5761553a614899565b5b600061554984828501615510565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006155bb82614aa4565b91506155c683614aa4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155ff576155fe615581565b5b828202905092915050565b600081905092915050565b60008190508160005260206000209050919050565b60008154615637816154b6565b615641818661560a565b9450600182166000811461565c576001811461566d576156a0565b60ff198316865281860193506156a0565b61567685615615565b60005b8381101561569857815481890152600182019150602081019050615679565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006156df60018361560a565b91506156ea826156a9565b600182019050919050565b6000615700826149e9565b61570a818561560a565b935061571a818560208601614a05565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061575c60058361560a565b915061576782615726565b600582019050919050565b600061577e828561562a565b9150615789826156d2565b915061579582846156f5565b91506157a08261574f565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600081905092915050565b60006157fc826157db565b61580681856157e6565b9350615816818560208601614a05565b80840191505092915050565b600061582e82846157f1565b915081905092915050565b60008160601b9050919050565b600061585182615839565b9050919050565b600061586382615846565b9050919050565b61587b615876826148c3565b615858565b82525050565b600061588d828461586a565b60148201915081905092915050565b600082825260208201905092915050565b60006158b8826157db565b6158c2818561589c565b93506158d2818560208601614a05565b6158db81614a38565b840191505092915050565b60006080820190506158fb6000830187614b07565b6159086020830186614b07565b6159156040830185614b71565b818103606083015261592781846158ad565b905095945050505050565b6000815190506159418161495a565b92915050565b60006020828403121561595d5761595c614899565b5b600061596b84828501615932565b91505092915050565b600061597f82614aa4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159b1576159b0615581565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006159f682614aa4565b9150615a0183614aa4565b925082615a1157615a106159bc565b5b828204905092915050565b6000615a2782614aa4565b9150615a3283614aa4565b925082821015615a4557615a44615581565b5b828203905092915050565b6000615a5b82614aa4565b9150615a6683614aa4565b925082615a7657615a756159bc565b5b828206905092915050565b6000615a8c82614aa4565b9150615a9783614aa4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615acc57615acb615581565b5b828201905092915050565b600081519050615ae6816148d5565b92915050565b600060208284031215615b0257615b01614899565b5b6000615b1084828501615ad7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000604082019050615b5d6000830185614b71565b615b6a6020830184614b07565b939250505056fea26469706673582212209b9832035cbe2f11b3ae77aef04a8389d80b163e2966407e0e5e1cc172f43ea964736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000841696c6f7365747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000741494c4f53455400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007568747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d2f73746f726167652f66696c65732f746f6b656e2f393938663666613136333339653839663263666437613861316662343431383231653831666230356236336638646264666339356362633339306138353135620000000000000000000000000000000000000000000000000000000000000000000000000000000000007d68747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d2f73746f726167652f66696c65732f636f6e74726163742f393938663666613136333339653839663263666437613861316662343431383231653831666230356236336638646264666339356362633339306138353135622e6a736f6e000000

Deployed Bytecode

0x60806040526004361061025b5760003560e01c80637fdf5dc411610144578063b4e99839116100b6578063d547cfb71161007a578063d547cfb7146108fc578063daba6f3a14610927578063e0173a6d14610958578063e8a3d48514610988578063e985e9c5146109b3578063f3fef3a3146109f05761025b565b8063b4e9983914610819578063b88d4fde14610830578063bf7bab7314610859578063c2f1dcc814610896578063c87b56dd146108bf5761025b565b8063911e65fa11610108578063911e65fa1461071857806395d89b41146107485780639ece339814610773578063a084c6ad1461078a578063a22cb465146107c7578063b11c7f82146107f05761025b565b80637fdf5dc414610636578063834fd1241461065f5780638525185114610688578063864aa866146106c6578063870d6f9d146106ef5761025b565b80633e6007e0116101dd5780635ca1e165116101a15780635ca1e165146105145780635ecc8e6b1461053f5780636352211e1461056a57806368d4e4ef146105a757806370a08231146105d0578063794100b91461060d5761025b565b80633e6007e014610418578063403398301461044157806342842e0e146104715780634f558e791461049a5780635a3f2672146104d75761025b565b806312065fe01161022457806312065fe01461035757806318160ddd1461038257806323b872dd146103ad578063313ce567146103d65780633e3e0b12146104015761025b565b80623ba1ed1461026057806301ffc9a71461028957806306fdde03146102c6578063081812fc146102f1578063095ea7b31461032e575b600080fd5b34801561026c57600080fd5b5061028760048036038101906102829190614901565b610a19565b005b34801561029557600080fd5b506102b060048036038101906102ab9190614986565b610a64565b6040516102bd91906149ce565b60405180910390f35b3480156102d257600080fd5b506102db610b46565b6040516102e89190614a82565b60405180910390f35b3480156102fd57600080fd5b5061031860048036038101906103139190614ada565b610bdb565b6040516103259190614b16565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190614b31565b610c57565b005b34801561036357600080fd5b5061036c610d61565b6040516103799190614b80565b60405180910390f35b34801561038e57600080fd5b50610397610df5565b6040516103a49190614b80565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190614b9b565b610e03565b005b3480156103e257600080fd5b506103eb610f03565b6040516103f89190614c0a565b60405180910390f35b34801561040d57600080fd5b50610416610f08565b005b34801561042457600080fd5b5061043f600480360381019061043a9190614c51565b610f40565b005b61045b60048036038101906104569190614ada565b610f68565b6040516104689190614b80565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190614b9b565b61105d565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190614ada565b61107d565b6040516104ce91906149ce565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190614901565b61108f565b60405161050b9190614d3c565b60405180910390f35b34801561052057600080fd5b5061052961126a565b6040516105369190614b16565b60405180910390f35b34801561054b57600080fd5b50610554611293565b6040516105619190614e1c565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190614ada565b611324565b60405161059e9190614b16565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190614901565b611402565b005b3480156105dc57600080fd5b506105f760048036038101906105f29190614901565b611473565b6040516106049190614b80565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190614ea3565b611542565b005b34801561064257600080fd5b5061065d60048036038101906106589190614ada565b611580565b005b34801561066b57600080fd5b5061068660048036038101906106819190614ada565b611595565b005b34801561069457600080fd5b506106af60048036038101906106aa9190614ada565b6115aa565b6040516106bd929190614ef0565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190614f93565b6115bf565b005b3480156106fb57600080fd5b5061071660048036038101906107119190614ea3565b61164a565b005b610732600480360381019061072d9190615064565b61166a565b60405161073f9190614b80565b60405180910390f35b34801561075457600080fd5b5061075d6116fc565b60405161076a9190614a82565b60405180910390f35b34801561077f57600080fd5b50610788611791565b005b34801561079657600080fd5b506107b160048036038101906107ac9190614ada565b6117c9565b6040516107be9190614b16565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e991906150c4565b6117df565b005b3480156107fc57600080fd5b506108176004803603810190610812919061513a565b611956565b005b34801561082557600080fd5b5061082e61196b565b005b34801561083c57600080fd5b5061085760048036038101906108529190615297565b6119a3565b005b34801561086557600080fd5b50610880600480360381019061087b9190614b31565b611ae6565b60405161088d91906149ce565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b89190614b31565b611b4e565b005b3480156108cb57600080fd5b506108e660048036038101906108e19190614ada565b611b6c565b6040516108f39190614a82565b60405180910390f35b34801561090857600080fd5b50610911611be1565b60405161091e9190614a82565b60405180910390f35b610941600480360381019061093c9190614ada565b611c75565b60405161094f929190614ef0565b60405180910390f35b610972600480360381019061096d91906153c6565b611ce2565b60405161097f9190614b80565b60405180910390f35b34801561099457600080fd5b5061099d611d41565b6040516109aa9190614a82565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190615447565b611dd6565b6040516109e791906149ce565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190614b31565b611e6a565b005b610a21611f7b565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3f5750610b3e8261206e565b5b9050919050565b606060036000018054610b58906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b84906154b6565b8015610bd15780601f10610ba657610100808354040283529160200191610bd1565b820191906000526020600020905b815481529060010190602001808311610bb457829003601f168201915b5050505050905090565b6000610be6826120d8565b610c1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6015600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6282611324565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce8612113565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d1a5750610d1881610d13612113565b611dd6565b155b15610d51576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5c83838361211b565b505050565b6000610d6b612113565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610def576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b47905090565b600060025460015403905090565b600360060160009054906101000a900460ff16610ef357600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330836040518363ffffffff1660e01b8152600401610e7a9291906154e7565b602060405180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb9190615525565b15610ef2576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610efe8383836121cd565b505050565b600090565b610f10611f7b565b6000600360060160036101000a81548160ff02191690836002811115610f3957610f38615552565b5b0217905550565b610f48611f7b565b80600360060160026101000a81548160ff02191690831515021790555050565b6000610f726126f5565b610f7a61275c565b610f82612861565b600280811115610f9557610f94615552565b5b600360060160039054906101000a900460ff166002811115610fba57610fb9615552565b5b14610ff1576040517f9f167ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61100d600a600101805490508361100891906155b0565b6128d3565b15611044576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105561104f612113565b83612937565b819050919050565b611078838383604051806020016040528060008152506119a3565b505050565b6000611088826120d8565b9050919050565b606060005b6001548110156112115760006110a982612ad4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160361120357806040015161120257600360060160009054906101000a900460ff161561113157601a829080600181540180825580915050600190039060005260206000200160009091909190915055611201565b600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b81526004016111919291906154e7565b602060405180830381865afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d29190615525565b61120057601a8290806001815401808255809150506001900390600052602060002001600090919091909150555b5b5b5b508080600101915050611094565b50601a80548060200260200160405190810160405280929190818152602001828054801561125e57602002820191906000526020600020905b81548152602001906001019080831161124a575b50505050509050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a60010180548060200260200160405190810160405280929190818152602001828054801561131a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112d0575b5050505050905090565b6000600360060160009054906101000a900460ff166113ed57600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b815260040161139d9291906154e7565b602060405180830381865afa1580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de9190615525565b156113ec57600090506113fd565b5b6113f682612ad4565b6000015190505b919050565b61140a611f7b565b600a600101819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114da576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61154a611f7b565b6001600360060160016101000a81548160ff021916908315150217905550818160038001919061157b9291906147a9565b505050565b611588611f7b565b80600c6004018190555050565b61159d611f7b565b80600c6003018190555050565b6060806115b683612d50565b91509150915091565b6115c7611f7b565b84600c6001018190555083600c6002018190555081600c60000160016101000a81548160ff021916908360ff16021790555082600c60000160026101000a81548160ff021916908360ff16021790555080600c60000160036101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050505050565b611652611f7b565b81816003800191906116659291906147a9565b505050565b60006116746126f5565b61167c61275c565b611684612861565b61168e8383612f90565b6116aa600a60010180549050856116a591906155b0565b6128d3565b156116e1576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f26116ec612113565b85612937565b8390509392505050565b60606003600201805461170e906154b6565b80601f016020809104026020016040519081016040528092919081815260200182805461173a906154b6565b80156117875780601f1061175c57610100808354040283529160200191611787565b820191906000526020600020905b81548152906001019060200180831161176a57829003601f168201915b5050505050905090565b611799611f7b565b6002600360060160036101000a81548160ff021916908360028111156117c2576117c1615552565b5b0217905550565b60006117d482612ad4565b600001519050919050565b6117e7612113565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060176000611858612113565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611905612113565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161194a91906149ce565b60405180910390a35050565b61195e611f7b565b8060036005018190555050565b611973611f7b565b6001600360060160036101000a81548160ff0219169083600281111561199c5761199b615552565b5b0217905550565b600360060160009054906101000a900460ff16611a9357600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b8152600401611a1a9291906154e7565b602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b9190615525565b15611a92576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b611a9e8484846121cd565b611aaa848484846130eb565b611ae0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b611b56611f7b565b611b5e61275c565b611b688282612937565b5050565b6060611b77826120d8565b611bad576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038001611bba83613269565b604051602001611bcb929190615772565b6040516020818303038152906040529050919050565b6060600380018054611bf2906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1e906154b6565b8015611c6b5780601f10611c4057610100808354040283529160200191611c6b565b820191906000526020600020905b815481529060010190602001808311611c4e57829003601f168201915b5050505050905090565b606080611c89611c83612113565b846133c9565b611c9161343e565b15611cc8576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd9611cd3612113565b8461345e565b91509150915091565b6000611cec6134f6565b15611d23576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d37611d2e612113565b86868686613516565b9050949350505050565b606060036004018054611d53906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7f906154b6565b8015611dcc5780601f10611da157610100808354040283529160200191611dcc565b820191906000526020600020905b815481529060010190602001808311611daf57829003601f168201915b5050505050905090565b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e72612113565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ef6576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80471015611f30576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f76573d6000803e3d6000fd5b505050565b6000611f85612113565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120345750600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561206b576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006001548210801561210c575060146000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826015600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006121d882612ad4565b905060006121e4612113565b90506000600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806122765750826000015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806122b4575061228584610bdb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806122c957506122c8836000015183611dd6565b5b905080612302576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461236b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123d1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123e1600085856000015161211b565b6001601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846014600086815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600086815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600185019050600073ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612691576001548110156126905783600001516014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602001516014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461275a576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600360060160029054906101000a900460ff161561285f576000600c6005015490506000600c6006015490506000600c6007015490504283111580156127a157508142105b156127d9576001600360060160036101000a81548160ff021916908360028111156127cf576127ce615552565b5b021790555061285b565b4282111580156127f35750804210806127f25750806000145b5b1561282b576002600360060160036101000a81548160ff0219169083600281111561282157612820615552565b5b021790555061285a565b6000600360060160036101000a81548160ff0219169083600281111561285457612853615552565b5b02179055505b5b5050505b565b600360060160039054906101000a900460ff16600281111561288657612885615552565b5b6000600281111561289a57612899615552565b5b036128d1576040517f08a69c7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600061292e600160028111156128ec576128eb615552565b5b600360060160039054906101000a900460ff16600281111561291157612910615552565b5b1461292157600c60020154612928565b600c600101545b836138f9565b34109050919050565b60005b600a60010180549050811015612acf57600080600a6001018381548110612964576129636157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685856040516024016129b89291906154e7565b6040516020818303038152906040527fa1448194000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612a429190615822565b6000604051808303816000865af19150503d8060008114612a7f576040519150601f19603f3d011682016040523d82523d6000602084013e612a84565b606091505b509150915081612ac0576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050808060010191505061293a565b505050565b612adc61482f565b6000829050600154811015612d19576000601460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d1757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bfb578092505050612d4b565b5b600115612d1657818060019003925050601460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d11578092505050612d4b565b612bfc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6060806000805b600a60010180549050811015612d7c5781806001019250508080600101915050612d57565b5060008167ffffffffffffffff811115612d9957612d9861516c565b5b604051908082528060200260200182016040528015612dc75781602001602082028036833780820191505090505b50905060008267ffffffffffffffff811115612de657612de561516c565b5b604051908082528060200260200182016040528015612e145781602001602082028036833780820191505090505b5090506000925060005b600a60010180549050811015612f8157600a6001018181548110612e4557612e446157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838581518110612e8357612e826157ac565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601860008881526020019081526020016000206000600a6001018381548110612ee957612ee86157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828580600101965081518110612f6857612f676157ac565b5b6020026020010181815250508080600101915050612e1e565b50818194509450505050915091565b6000612f9a612113565b905060008173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061302d575060028081111561300657613005615552565b5b600360060160039054906101000a900460ff16600281111561302b5761302a615552565b5b145b9050806130ae576130ab848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600360050154846040516020016130909190615881565b6040516020818303038152906040528051906020012061393c565b90505b806130e5576040517f9f167ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600061310c8473ffffffffffffffffffffffffffffffffffffffff16613953565b1561325c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613135612113565b8786866040518563ffffffff1660e01b815260040161315794939291906158e6565b6020604051808303816000875af192505050801561319357506040513d601f19601f820116820180604052508101906131909190615947565b60015b61320c573d80600081146131c3576040519150601f19603f3d011682016040523d82523d6000602084013e6131c8565b606091505b506000815103613204576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613261565b600190505b949350505050565b6060816000036132b0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133c4565b600082905060005b816000146132e25780806132cb90615974565b915050600a826132db91906159eb565b91506132b8565b60008167ffffffffffffffff8111156132fe576132fd61516c565b5b6040519080825280601f01601f1916602001820160405280156133305781602001600182028036833780820191505090505b5090505b846000146133bd576001826133499190615a1c565b9150600a856133589190615a50565b60306133649190615a81565b60f81b81838151811061337a576133796157ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133b691906159eb565b9450613334565b8093505050505b919050565b6133d281612ad4565b6000015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461343a576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b600080600c6004015414158015613459575034600c60040154115b905090565b60608061346b84846133c9565b60008061347785612d50565b9150915061348485613976565b61348e8686613cf5565b60005b82518110156134e6576134d9868483815181106134b1576134b06157ac565b5b60200260200101518484815181106134cc576134cb6157ac565b5b6020026020010151613f23565b8080600101915050613491565b5081819350935050509250929050565b600080600c6003015414158015613511575034600c60030154115b905090565b600080858590501480156135305750828290508585905014155b15613567576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001549050613579876001614101565b80601860008381526020019081526020016000206000600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b868690508110156138eb5761364b878783818110613617576136166157ac565b5b905060200201602081019061362c9190614901565b86868481811061363f5761363e6157ac565b5b9050602002013561411f565b15613682576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b868682818110613695576136946157ac565b5b90506020020160208101906136aa9190614901565b73ffffffffffffffffffffffffffffffffffffffff1663a084c6ad8686848181106136d8576136d76157ac565b5b905060200201356040518263ffffffff1660e01b81526004016136fb9190614b80565b602060405180830381865afa158015613718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373c9190615aec565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146137a0576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484828181106137b3576137b26157ac565b5b905060200201356018600084815260200190815260200160002060008989858181106137e2576137e16157ac565b5b90506020020160208101906137f79190614901565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016019600089898581811061384e5761384d6157ac565b5b90506020020160208101906138639190614901565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008787858181106138b2576138b16157ac565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506135f6565b508091505095945050505050565b60008260000361390c5760009050613936565b818361391891906155b0565b905081838261392791906159eb565b1461393557613934615b19565b5b5b92915050565b6000826139498584614246565b1490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061398182612ad4565b9050613993600083836000015161211b565b600160166000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160166000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160188282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600001516014600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160146000848152602001908152602001600020600001601c6101000a81548160ff0219169083151502179055506000600183019050600073ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613c7e57600154811015613c7d5781600001516014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602001516014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5081600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46002600081548092919060010191905055505050565b60005b600a60010180549050811015613f1e57600080600a6001018381548110613d2257613d216157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601860008681526020019081526020016000206000600a6001018681548110613d8f57613d8e6157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205486604051602401613e07929190615b48565b6040516020818303038152906040527ff1d2ec1d000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613e919190615822565b6000604051808303816000865af19150503d8060008114613ece576040519150601f19603f3d011682016040523d82523d6000602084013e613ed3565b606091505b509150915081613f0f576040517fb5bc7d7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508080600101915050613cf8565b505050565b613f2d828261411f565b613f63576040517f431d992700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a084c6ad826040518263ffffffff1660e01b8152600401613f9c9190614b80565b602060405180830381865afa158015613fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fdd9190615aec565b73ffffffffffffffffffffffffffffffffffffffff16613ffb612113565b73ffffffffffffffffffffffffffffffffffffffff1614614048576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060006101000a81549060ff02191690556018600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055505050565b61411b8282604051806020016040528060008152506142bb565b5050565b6000600360060160009054906101000a900460ff161561419e57601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff169050614240565b600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b45a3c0e836040518263ffffffff1660e01b81526004016141fc9190614b80565b602060405180830381865afa158015614219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423d9190615525565b90505b92915050565b60008082905060005b84518110156142b057600085828151811061426d5761426c6157ac565b5b6020026020010151905080831161428f5761428883826142cd565b925061429c565b61429981846142cd565b92505b5080806142a890615974565b91505061424f565b508091505092915050565b6142c883838360016142e4565b505050565b600082600052816020526040600020905092915050565b600060015490506142f361473e565b614329576040517f271c929900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361438f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036143c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160028111156144e1576144e0615552565b5b600360060160039054906101000a900460ff16600281111561450657614505615552565b5b036145cd5783601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1601601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b846014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561472e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156146e257506146e060008884886130eb565b155b15614719576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050614667565b5080600181905550505050505050565b6000600360060160009054906101000a900460ff16806147a4575060001515600360060160009054906101000a900460ff1615151480156147a35750600154600c60000160039054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b5b905090565b8280546147b5906154b6565b90600052602060002090601f0160209004810192826147d7576000855561481e565b82601f106147f057803560ff191683800117855561481e565b8280016001018555821561481e579182015b8281111561481d578235825591602001919060010190614802565b5b50905061482b9190614872565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561488b576000816000905550600101614873565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148ce826148a3565b9050919050565b6148de816148c3565b81146148e957600080fd5b50565b6000813590506148fb816148d5565b92915050565b60006020828403121561491757614916614899565b5b6000614925848285016148ec565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6149638161492e565b811461496e57600080fd5b50565b6000813590506149808161495a565b92915050565b60006020828403121561499c5761499b614899565b5b60006149aa84828501614971565b91505092915050565b60008115159050919050565b6149c8816149b3565b82525050565b60006020820190506149e360008301846149bf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a23578082015181840152602081019050614a08565b83811115614a32576000848401525b50505050565b6000601f19601f8301169050919050565b6000614a54826149e9565b614a5e81856149f4565b9350614a6e818560208601614a05565b614a7781614a38565b840191505092915050565b60006020820190508181036000830152614a9c8184614a49565b905092915050565b6000819050919050565b614ab781614aa4565b8114614ac257600080fd5b50565b600081359050614ad481614aae565b92915050565b600060208284031215614af057614aef614899565b5b6000614afe84828501614ac5565b91505092915050565b614b10816148c3565b82525050565b6000602082019050614b2b6000830184614b07565b92915050565b60008060408385031215614b4857614b47614899565b5b6000614b56858286016148ec565b9250506020614b6785828601614ac5565b9150509250929050565b614b7a81614aa4565b82525050565b6000602082019050614b956000830184614b71565b92915050565b600080600060608486031215614bb457614bb3614899565b5b6000614bc2868287016148ec565b9350506020614bd3868287016148ec565b9250506040614be486828701614ac5565b9150509250925092565b600060ff82169050919050565b614c0481614bee565b82525050565b6000602082019050614c1f6000830184614bfb565b92915050565b614c2e816149b3565b8114614c3957600080fd5b50565b600081359050614c4b81614c25565b92915050565b600060208284031215614c6757614c66614899565b5b6000614c7584828501614c3c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614cb381614aa4565b82525050565b6000614cc58383614caa565b60208301905092915050565b6000602082019050919050565b6000614ce982614c7e565b614cf38185614c89565b9350614cfe83614c9a565b8060005b83811015614d2f578151614d168882614cb9565b9750614d2183614cd1565b925050600181019050614d02565b5085935050505092915050565b60006020820190508181036000830152614d568184614cde565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614d93816148c3565b82525050565b6000614da58383614d8a565b60208301905092915050565b6000602082019050919050565b6000614dc982614d5e565b614dd38185614d69565b9350614dde83614d7a565b8060005b83811015614e0f578151614df68882614d99565b9750614e0183614db1565b925050600181019050614de2565b5085935050505092915050565b60006020820190508181036000830152614e368184614dbe565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112614e6357614e62614e3e565b5b8235905067ffffffffffffffff811115614e8057614e7f614e43565b5b602083019150836001820283011115614e9c57614e9b614e48565b5b9250929050565b60008060208385031215614eba57614eb9614899565b5b600083013567ffffffffffffffff811115614ed857614ed761489e565b5b614ee485828601614e4d565b92509250509250929050565b60006040820190508181036000830152614f0a8185614dbe565b90508181036020830152614f1e8184614cde565b90509392505050565b614f3081614bee565b8114614f3b57600080fd5b50565b600081359050614f4d81614f27565b92915050565b600067ffffffffffffffff82169050919050565b614f7081614f53565b8114614f7b57600080fd5b50565b600081359050614f8d81614f67565b92915050565b600080600080600060a08688031215614faf57614fae614899565b5b6000614fbd88828901614ac5565b9550506020614fce88828901614ac5565b9450506040614fdf88828901614f3e565b9350506060614ff088828901614f3e565b925050608061500188828901614f7e565b9150509295509295909350565b60008083601f84011261502457615023614e3e565b5b8235905067ffffffffffffffff81111561504157615040614e43565b5b60208301915083602082028301111561505d5761505c614e48565b5b9250929050565b60008060006040848603121561507d5761507c614899565b5b600061508b86828701614ac5565b935050602084013567ffffffffffffffff8111156150ac576150ab61489e565b5b6150b88682870161500e565b92509250509250925092565b600080604083850312156150db576150da614899565b5b60006150e9858286016148ec565b92505060206150fa85828601614c3c565b9150509250929050565b6000819050919050565b61511781615104565b811461512257600080fd5b50565b6000813590506151348161510e565b92915050565b6000602082840312156151505761514f614899565b5b600061515e84828501615125565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6151a482614a38565b810181811067ffffffffffffffff821117156151c3576151c261516c565b5b80604052505050565b60006151d661488f565b90506151e2828261519b565b919050565b600067ffffffffffffffff8211156152025761520161516c565b5b61520b82614a38565b9050602081019050919050565b82818337600083830152505050565b600061523a615235846151e7565b6151cc565b90508281526020810184848401111561525657615255615167565b5b615261848285615218565b509392505050565b600082601f83011261527e5761527d614e3e565b5b813561528e848260208601615227565b91505092915050565b600080600080608085870312156152b1576152b0614899565b5b60006152bf878288016148ec565b94505060206152d0878288016148ec565b93505060406152e187828801614ac5565b925050606085013567ffffffffffffffff8111156153025761530161489e565b5b61530e87828801615269565b91505092959194509250565b60008083601f8401126153305761532f614e3e565b5b8235905067ffffffffffffffff81111561534d5761534c614e43565b5b60208301915083602082028301111561536957615368614e48565b5b9250929050565b60008083601f84011261538657615385614e3e565b5b8235905067ffffffffffffffff8111156153a3576153a2614e43565b5b6020830191508360208202830111156153bf576153be614e48565b5b9250929050565b600080600080604085870312156153e0576153df614899565b5b600085013567ffffffffffffffff8111156153fe576153fd61489e565b5b61540a8782880161531a565b9450945050602085013567ffffffffffffffff81111561542d5761542c61489e565b5b61543987828801615370565b925092505092959194509250565b6000806040838503121561545e5761545d614899565b5b600061546c858286016148ec565b925050602061547d858286016148ec565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806154ce57607f821691505b6020821081036154e1576154e0615487565b5b50919050565b60006040820190506154fc6000830185614b07565b6155096020830184614b71565b9392505050565b60008151905061551f81614c25565b92915050565b60006020828403121561553b5761553a614899565b5b600061554984828501615510565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006155bb82614aa4565b91506155c683614aa4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155ff576155fe615581565b5b828202905092915050565b600081905092915050565b60008190508160005260206000209050919050565b60008154615637816154b6565b615641818661560a565b9450600182166000811461565c576001811461566d576156a0565b60ff198316865281860193506156a0565b61567685615615565b60005b8381101561569857815481890152600182019150602081019050615679565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006156df60018361560a565b91506156ea826156a9565b600182019050919050565b6000615700826149e9565b61570a818561560a565b935061571a818560208601614a05565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061575c60058361560a565b915061576782615726565b600582019050919050565b600061577e828561562a565b9150615789826156d2565b915061579582846156f5565b91506157a08261574f565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600081905092915050565b60006157fc826157db565b61580681856157e6565b9350615816818560208601614a05565b80840191505092915050565b600061582e82846157f1565b915081905092915050565b60008160601b9050919050565b600061585182615839565b9050919050565b600061586382615846565b9050919050565b61587b615876826148c3565b615858565b82525050565b600061588d828461586a565b60148201915081905092915050565b600082825260208201905092915050565b60006158b8826157db565b6158c2818561589c565b93506158d2818560208601614a05565b6158db81614a38565b840191505092915050565b60006080820190506158fb6000830187614b07565b6159086020830186614b07565b6159156040830185614b71565b818103606083015261592781846158ad565b905095945050505050565b6000815190506159418161495a565b92915050565b60006020828403121561595d5761595c614899565b5b600061596b84828501615932565b91505092915050565b600061597f82614aa4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159b1576159b0615581565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006159f682614aa4565b9150615a0183614aa4565b925082615a1157615a106159bc565b5b828204905092915050565b6000615a2782614aa4565b9150615a3283614aa4565b925082821015615a4557615a44615581565b5b828203905092915050565b6000615a5b82614aa4565b9150615a6683614aa4565b925082615a7657615a756159bc565b5b828206905092915050565b6000615a8c82614aa4565b9150615a9783614aa4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615acc57615acb615581565b5b828201905092915050565b600081519050615ae6816148d5565b92915050565b600060208284031215615b0257615b01614899565b5b6000615b1084828501615ad7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000604082019050615b5d6000830185614b71565b615b6a6020830184614b07565b939250505056fea26469706673582212209b9832035cbe2f11b3ae77aef04a8389d80b163e2966407e0e5e1cc172f43ea964736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000841696c6f7365747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000741494c4f53455400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007568747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d2f73746f726167652f66696c65732f746f6b656e2f393938663666613136333339653839663263666437613861316662343431383231653831666230356236336638646264666339356362633339306138353135620000000000000000000000000000000000000000000000000000000000000000000000000000000000007d68747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d2f73746f726167652f66696c65732f636f6e74726163742f393938663666613136333339653839663263666437613861316662343431383231653831666230356236336638646264666339356362633339306138353135622e6a736f6e000000

-----Decoded View---------------
Arg [0] : name_ (string): Ailosets
Arg [1] : description_ (string):
Arg [2] : symbol_ (string): AILOSET
Arg [3] : baseURL_ (string): https://collection.ailoverse.com/storage/files/token/998f6fa16339e89f2cfd7a8a1fb441821e81fb05b63f8dbdfc95cbc390a8515b
Arg [4] : contractURL_ (string): https://collection.ailoverse.com/storage/files/contract/998f6fa16339e89f2cfd7a8a1fb441821e81fb05b63f8dbdfc95cbc390a8515b.json

-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 41696c6f73657473000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [10] : 41494c4f53455400000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000075
Arg [12] : 68747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d
Arg [13] : 2f73746f726167652f66696c65732f746f6b656e2f3939386636666131363333
Arg [14] : 3965383966326366643761386131666234343138323165383166623035623633
Arg [15] : 6638646264666339356362633339306138353135620000000000000000000000
Arg [16] : 000000000000000000000000000000000000000000000000000000000000007d
Arg [17] : 68747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d
Arg [18] : 2f73746f726167652f66696c65732f636f6e74726163742f3939386636666131
Arg [19] : 3633333965383966326366643761386131666234343138323165383166623035
Arg [20] : 6236336638646264666339356362633339306138353135622e6a736f6e000000


Deployed Bytecode Sourcemap

63104:3534:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60766:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38097:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53358:134;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40577:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40137:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52516:190;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37740:285;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41527:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54466:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62081:126;;;;;;;;;;;;;:::i;:::-;;61641:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64216:495;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41946:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60640:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30453:775;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60890:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65991:126;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39745:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63724:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38485:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62703:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64059:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63900:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66125:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;62215:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62885:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64719:453;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53561:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61935:133;;;;;;;;;;;;;:::i;:::-;;66481:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40901:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32770:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61784:139;;;;;;;;;;;;;:::i;:::-;;42202:491;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66307:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65180:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54037:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53707:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65662:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;65360:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53840:126;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41277:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52714:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60766:116;60829:10;:8;:10::i;:::-;60868:6;60860:5;;:14;;;;;;;;;;;;;;;;;;60766:116;:::o;38097:324::-;38213:4;38270:25;38255:40;;;:11;:40;;;;:105;;;;38327:33;38312:48;;;:11;:48;;;;38255:105;:158;;;;38377:36;38401:11;38377:23;:36::i;:::-;38255:158;38235:178;;38097:324;;;:::o;53358:134::-;53428:13;53466;:18;;53459:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53358:134;:::o;40577:252::-;40659:7;40689:16;40697:7;40689;:16::i;:::-;40684:137;;40727:34;;;;;;;;;;;;;;40684:137;40797:15;:24;40813:7;40797:24;;;;;;;;;;;;;;;;;;;;;40777:44;;40577:252;;;:::o;40137:374::-;40225:13;40241:24;40257:7;40241:15;:24::i;:::-;40225:40;;40286:5;40280:11;;:2;:11;;;40276:61;;40313:24;;;;;;;;;;;;;;40276:61;40368:5;40352:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;40378:37;40395:5;40402:12;:10;:12::i;:::-;40378:16;:37::i;:::-;40377:38;40352:63;40348:116;;;40437:27;;;;;;;;;;;;;;40348:116;40475:28;40484:2;40488:7;40497:5;40475:8;:28::i;:::-;40214:297;40137:374;;:::o;52516:190::-;52570:7;52607:12;:10;:12::i;:::-;52598:21;;:5;;;;;;;;;;:21;;;52595:64;;52641:18;;;;;;;;;;;;;;52595:64;52677:21;52670:28;;52516:190;:::o;37740:285::-;37793:7;37990:12;;37974:13;;:28;37967:35;;37740:285;:::o;41527:348::-;41665:13;:24;;;;;;;;;;;;41661:149;;41717:14;:23;;;;;;;;;;;;41707:41;;;41757:4;41763:7;41707:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41704:106;;;41797:13;;;;;;;;;;;;;;41704:106;41661:149;41839:28;41849:4;41855:2;41859:7;41839:9;:28::i;:::-;41527:348;;;:::o;54466:91::-;54518:5;54466:91;:::o;62081:126::-;62134:10;:8;:10::i;:::-;62184:15;62157:13;:24;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;62081:126::o;61641:135::-;61709:10;:8;:10::i;:::-;61763:5;61732:13;:28;;;:36;;;;;;;;;;;;;;;;;;61641:135;:::o;64216:495::-;64284:7;64309:15;:13;:15::i;:::-;64335:17;:15;:17::i;:::-;64363:12;:10;:12::i;:::-;64419:15;64391:43;;;;;;;;:::i;:::-;;:13;:24;;;;;;;;;;;;:43;;;;;;;;:::i;:::-;;;64388:85;;64456:17;;;;;;;;;;;;;;64388:85;64502:52;64526:14;:20;;:27;;;;64514:9;:39;;;;:::i;:::-;64502:11;:52::i;:::-;64498:206;;;64576:13;;;;;;;;;;;;;;64498:206;64620:41;64637:12;:10;:12::i;:::-;64651:9;64620:16;:41::i;:::-;64683:9;64676:16;;64216:495;;;:::o;41946:185::-;42084:39;42101:4;42107:2;42111:7;42084:39;;;;;;;;;;;;:16;:39::i;:::-;41946:185;;;:::o;60640:118::-;60705:4;60734:16;60742:7;60734;:16::i;:::-;60727:23;;60640:118;;;:::o;30453:775::-;30514:23;30584:6;30580:598;30595:13;;30593:1;:15;30580:598;;;30633:31;30667:14;30679:1;30667:11;:14::i;:::-;30633:48;;30721:6;30703:24;;:9;:14;;;:24;;;30700:463;;30757:9;:16;;;30752:392;;30805:13;:24;;;;;;;;;;;;30802:319;;;30862:10;30878:1;30862:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30802:319;;;30959:14;:23;;;;;;;;;;;;30949:41;;;30999:4;31005:1;30949:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30945:149;;31044:10;31060:1;31044:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30945:149;30802:319;30752:392;30700:463;30614:564;30609:3;;;;;;;30580:598;;;;31199:10;31192:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30453:775;;;:::o;60890:96::-;60941:7;60973:5;;;;;;;;;;;60966:12;;60890:96;:::o;65991:126::-;66048:16;66089:14;:20;;66082:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65991:126;:::o;39745:330::-;39823:7;39852:13;:24;;;;;;;;;;;;39848:177;;39906:14;:23;;;;;;;;;;;;39896:41;;;39946:4;39952:7;39896:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39893:121;;;39996:1;39981:17;;;;39893:121;39848:177;40042:20;40054:7;40042:11;:20::i;:::-;:25;;;40035:32;;39745:330;;;;:::o;63724:168::-;63792:10;:8;:10::i;:::-;63840:14;:20;;63866:6;63840:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63724:168;:::o;38485:238::-;38563:7;38609:1;38592:19;;:5;:19;;;38588:73;;38633:28;;;;;;;;;;;;;;38588:73;38687:12;:19;38700:5;38687:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38679:36;;38672:43;;38485:238;;;:::o;62703:174::-;62776:10;:8;:10::i;:::-;62826:4;62799:13;:24;;;:31;;;;;;;;;;;;;;;;;;62865:4;;62841:13;:21;;:28;;;;;;;:::i;:::-;;62703:174;;:::o;64059:149::-;64136:10;:8;:10::i;:::-;64194:6;64159:13;:32;;:41;;;;64059:149;:::o;63900:151::-;63978:10;:8;:10::i;:::-;64037:6;64001:13;:33;;:42;;;;63900:151;:::o;66125:174::-;66205:16;66222;66263:28;66279:11;66263:15;:28::i;:::-;66256:35;;;;66125:174;;;:::o;62215:480::-;62419:10;:8;:10::i;:::-;62473:13;62442;:28;;:44;;;;62525:10;62497:13;:25;;:38;;;;62577:8;62546:13;:28;;;:39;;;;;;;;;;;;;;;;;;62627:8;62596:13;:28;;;:39;;;;;;;;;;;;;;;;;;62677:10;62646:13;:28;;;:41;;;;;;;;;;;;;;;;;;62215:480;;;;;:::o;62885:134::-;62960:10;:8;:10::i;:::-;63007:4;;62983:13;:21;;:28;;;;;;;:::i;:::-;;62885:134;;:::o;64719:453::-;64819:7;64844:15;:13;:15::i;:::-;64870:17;:15;:17::i;:::-;64898:12;:10;:12::i;:::-;64921:25;64933:12;;64921:11;:25::i;:::-;64963:52;64987:14;:20;;:27;;;;64975:9;:39;;;;:::i;:::-;64963:11;:52::i;:::-;64959:206;;;65037:13;;;;;;;;;;;;;;64959:206;65081:41;65098:12;:10;:12::i;:::-;65112:9;65081:16;:41::i;:::-;65144:9;65137:16;;64719:453;;;;;:::o;53561:138::-;53633:13;53671;:20;;53664:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53561:138;:::o;61935:133::-;61995:10;:8;:10::i;:::-;62045:15;62018:13;:24;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61935:133::o;66481:152::-;66567:7;66599:21;66611:8;66599:11;:21::i;:::-;:26;;;66592:33;;66481:152;;;:::o;40901:305::-;41019:12;:10;:12::i;:::-;41007:24;;:8;:24;;;41003:67;;41053:17;;;;;;;;;;;;;;41003:67;41126:8;41081:18;:32;41100:12;:10;:12::i;:::-;41081:32;;;;;;;;;;;;;;;:42;41114:8;41081:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41179:8;41150:48;;41165:12;:10;:12::i;:::-;41150:48;;;41189:8;41150:48;;;;;;:::i;:::-;;;;;;;;40901:305;;:::o;32770:119::-;32834:10;:8;:10::i;:::-;32876:5;32857:13;:16;;:24;;;;32770:119;:::o;61784:139::-;61847:10;:8;:10::i;:::-;61897:18;61870:13;:24;;;:45;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61784:139::o;42202:491::-;42373:13;:24;;;;;;;;;;;;42369:149;;42425:14;:23;;;;;;;;;;;;42415:41;;;42465:4;42471:7;42415:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42412:106;;;42505:13;;;;;;;;;;;;;;42412:106;42369:149;42531:28;42541:4;42547:2;42551:7;42531:9;:28::i;:::-;42575:48;42598:4;42604:2;42608:7;42617:5;42575:22;:48::i;:::-;42570:115;;42645:40;;;;;;;;;;;;;;42570:115;42202:491;;;;:::o;66307:166::-;66402:4;66431:16;:24;66448:6;66431:24;;;;;;;;;;;;;;;:34;66456:8;66431:34;;;;;;;;;;;;;;;;;;;;;66424:41;;66307:166;;;;:::o;65180:172::-;65258:10;:8;:10::i;:::-;65279:17;:15;:17::i;:::-;65309:35;65326:6;65334:9;65309:16;:35::i;:::-;65180:172;;:::o;54037:421::-;54118:13;54154:16;54162:7;54154;:16::i;:::-;54149:72;;54192:29;;;;;;;;;;;;;;54149:72;54305:13;:21;;54375:25;54392:7;54375:16;:25::i;:::-;54266:183;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54234:216;;54037:421;;;:::o;53707:123::-;53763:13;53801;:21;;53794:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53707:123;:::o;65662:321::-;65741:16;65758;65792:35;65802:12;:10;:12::i;:::-;65815:11;65792:9;:35::i;:::-;65843:21;:19;:21::i;:::-;65840:135;;;65886:13;;;;;;;;;;;;;;65840:135;65935:40;65950:12;:10;:12::i;:::-;65963:11;65935:14;:40::i;:::-;65915:60;;;;65662:321;;;:::o;65360:294::-;65477:7;65505:22;:20;:22::i;:::-;65502:144;;;65549:13;;;;;;;;;;;;;;65502:144;65598:48;65614:12;:10;:12::i;:::-;65627:7;;65636:9;;65598:15;:48::i;:::-;65578:68;;65360:294;;;;;;:::o;53840:126::-;53895:13;53933;:25;;53926:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53840:126;:::o;41277:183::-;41388:4;41417:18;:25;41436:5;41417:25;;;;;;;;;;;;;;;:35;41443:8;41417:35;;;;;;;;;;;;;;;;;;;;;;;;;41410:42;;41277:183;;;;:::o;52714:270::-;52803:12;:10;:12::i;:::-;52794:21;;:5;;;;;;;;;;:21;;;52791:64;;52837:18;;;;;;;;;;;;;;52791:64;52893:7;52869:21;:31;52866:69;;;52922:13;;;;;;;;;;;;;;52866:69;52954:3;52946:21;;:30;52968:7;52946:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52714:270;;:::o;32022:222::-;32077:14;32094:12;:10;:12::i;:::-;32077:29;;32144:5;;;;;;;;;;32134:15;;:6;:15;;;;:65;;;;;32176:14;:23;;;;;;;;;;;;32166:33;;:6;:33;;;;32134:65;32117:119;;;32218:18;;;;;;;;;;;;;;32117:119;32066:178;32022:222::o;21153:157::-;21238:4;21277:25;21262:40;;;:11;:40;;;;21255:47;;21153:157;;;:::o;42947:158::-;43013:4;43052:13;;43042:7;:23;:55;;;;;43070:11;:20;43082:7;43070:20;;;;;;;;;;;:27;;;;;;;;;;;;43069:28;43042:55;43035:62;;42947:158;;;:::o;28751:98::-;28804:7;28831:10;28824:17;;28751:98;:::o;50959:196::-;51101:2;51074:15;:24;51090:7;51074:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51139:7;51135:2;51119:28;;51128:5;51119:28;;;;;;;;;;;;50959:196;;;:::o;46411:2305::-;46529:35;46567:20;46579:7;46567:11;:20::i;:::-;46529:58;;46598:14;46615:12;:10;:12::i;:::-;46598:29;;46640:22;46690:14;:23;;;;;;;;;;;;46680:33;;:6;:33;;;:78;;;;46740:13;:18;;;46730:28;;:6;:28;;;46680:78;:125;;;;46785:20;46797:7;46785:11;:20::i;:::-;46775:30;;:6;:30;;;46680:125;:186;;;;46822:44;46839:13;:18;;;46859:6;46822:16;:44::i;:::-;46680:186;46640:237;;46895:17;46890:79;;46934:35;;;;;;;;;;;;;;46890:79;47006:4;46984:26;;:13;:18;;;:26;;;46980:80;;47032:28;;;;;;;;;;;;;;46980:80;47089:1;47075:16;;:2;:16;;;47071:65;;47113:23;;;;;;;;;;;;;;47071:65;47365:49;47382:1;47386:7;47395:13;:18;;;47365:8;:49::i;:::-;47740:1;47710:12;:18;47723:4;47710:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47784:1;47756:12;:16;47769:2;47756:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47830:2;47802:11;:20;47814:7;47802:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;47892:15;47847:11;:20;47859:7;47847:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;48160:19;48192:1;48182:7;:11;48160:33;;48253:1;48212:43;;:11;:24;48224:11;48212:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;48208:445;;48437:13;;48423:11;:27;48419:219;;;48507:13;:18;;;48475:11;:24;48487:11;48475:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;48590:13;:28;;;48548:11;:24;48560:11;48548:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;48419:219;48208:445;47685:979;48700:7;48696:2;48681:27;;48690:4;48681:27;;;;;;;;;;;;46516:2200;;;46411:2305;;;:::o;31705:121::-;31781:10;31768:23;;:9;:23;;;31765:53;;31813:5;;;;;;;;;;;;;;31765:53;31705:121::o;60994:639::-;61055:13;:28;;;;;;;;;;;;61051:54;61098:7;61051:54;61125:11;61139:13;:30;;;61125:44;;61180:10;61193:13;:28;;;61180:41;;61232:10;61245:13;:32;;;61232:45;;61299:15;61292:3;:22;;:46;;;;;61336:2;61318:15;:20;61292:46;61288:338;;;61382:18;61355:13;:24;;;:45;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61288:338;;;61428:15;61422:2;:21;;:58;;;;;61466:2;61448:15;:20;:31;;;;61477:2;61472:1;:7;61448:31;61422:58;61418:208;;;61524:15;61497:13;:24;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61418:208;;;61599:15;61572:13;:24;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61418:208;61288:338;61040:593;;;60994:639;:::o;31363:153::-;31442:13;:24;;;;;;;;;;;;31423:43;;;;;;;;:::i;:::-;;:15;:43;;;;;;;;:::i;:::-;;;31420:88;;31488:20;;;;;;;;;;;;;;31420:88;31363:153::o;34766:257::-;34830:4;34871:144;34908:18;34880:46;;;;;;;;:::i;:::-;;:13;:24;;;;;;;;;;;;:46;;;;;;;;:::i;:::-;;;:114;;34969:13;:25;;;34880:114;;;34938:13;:28;;;34880:114;35005:9;34871:8;:144::i;:::-;34859:9;:156;34852:163;;34766:257;;;:::o;55920:535::-;56036:6;56032:405;56052:14;:20;;:27;;;;56048:1;:31;56032:405;;;56106:12;56119:16;56139:14;:20;;56160:1;56139:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:28;;56268:6;56301:9;56190:147;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56139:217;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56105:251;;;;56379:7;56375:46;;56416:5;;;;;;;;;;;;;;56375:46;56086:351;;56081:3;;;;;;;56032:405;;;;55920:535;;:::o;29310:1098::-;29381:21;;:::i;:::-;29420:12;29435:7;29420:22;;29491:13;;29484:4;:20;29480:861;;;29525:31;29559:11;:17;29571:4;29559:17;;;;;;;;;;;29525:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29600:9;:16;;;29595:731;;29671:1;29645:28;;:9;:14;;;:28;;;29641:101;;29709:9;29702:16;;;;;;29641:101;30046:261;30053:4;30046:261;;;30086:6;;;;;;;;30131:11;:17;30143:4;30131:17;;;;;;;;;;;30119:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30205:1;30179:28;;:9;:14;;;:28;;;30175:109;;30247:9;30240:16;;;;;;30175:109;30046:261;;;29595:731;29506:835;29480:861;30369:31;;;;;;;;;;;;;;29310:1098;;;;:::o;56463:697::-;56541:16;56558;56617:8;56649:6;56644:95;56665:14;:20;;:27;;;;56661:1;:31;56644:95;;;56718:5;;;;;;;56694:3;;;;;;;56644:95;;;;56753:22;56792:3;56778:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56753:43;;56811:23;56851:3;56837:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56811:44;;56876:1;56870:7;;56897:6;56892:214;56913:14;:20;;:27;;;;56909:1;:31;56892:214;;;56979:14;:20;;57000:1;56979:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56966:5;56972:3;56966:10;;;;;;;;:::i;:::-;;;;;;;:36;;;;;;;;;;;57037:15;:28;57053:11;57037:28;;;;;;;;;;;:53;57066:14;:20;;57087:1;57066:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57037:53;;;;;;;;;;;;;;;;57021:6;57028:5;;;;;;57021:13;;;;;;;;:::i;:::-;;;;;;;:69;;;;;56942:3;;;;;;;56892:214;;;;57128:5;57134:6;57120:21;;;;;;;56463:697;;;:::o;32252:510::-;32341:14;32358:12;:10;:12::i;:::-;32341:29;;32381:9;32415:6;32406:15;;:5;;;;;;;;;;:15;;;:75;;;;32466:15;32438:43;;;;;;;;:::i;:::-;;:13;:24;;;;;;;;;;;;:43;;;;;;;;:::i;:::-;;;32406:75;32381:100;;32567:4;32563:117;;32593:87;32612:12;;32593:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32626:13;:16;;;32671:6;32654:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;32644:35;;;;;;32593:18;:87::i;:::-;32586:94;;32563:117;32711:4;32707:47;;32737:17;;;;;;;;;;;;;;32707:47;32330:432;;32252:510;;:::o;51720:788::-;51874:4;51895:15;:2;:13;;;:15::i;:::-;51891:610;;;51947:2;51931:36;;;51968:12;:10;:12::i;:::-;51982:4;51988:7;51997:5;51931:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51927:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52193:1;52176:6;:13;:18;52172:259;;52226:40;;;;;;;;;;;;;;52172:259;52381:6;52375:13;52366:6;52362:2;52358:15;52351:38;51927:519;52063:45;;;52053:55;;;:6;:55;;;;52046:62;;;;;51891:610;52485:4;52478:11;;51720:788;;;;;;;:::o;4545:727::-;4600:13;4831:5;4826:1;:10;4822:53;;4853:10;;;;;;;;;;;;;;;;;;;;;4822:53;4885:12;4900:5;4885:20;;4916:14;4941:78;4953:4;4948:1;:9;4941:78;;4974:8;;;;;:::i;:::-;;;;5005:2;4997:10;;;;;:::i;:::-;;;4941:78;;;5029:19;5061:6;5051:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5029:39;;5079:154;5091:5;5086:1;:10;5079:154;;5123:1;5113:11;;;;;:::i;:::-;;;5190:2;5182:5;:10;;;;:::i;:::-;5169:2;:24;;;;:::i;:::-;5156:39;;5139:6;5146;5139:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5219:2;5210:11;;;;;:::i;:::-;;;5079:154;;;5257:6;5243:21;;;;;4545:727;;;;:::o;31834:180::-;31932:20;31944:7;31932:11;:20::i;:::-;:25;;;31923:34;;:5;:34;;;31919:87;;31979:27;;;;;;;;;;;;;;31919:87;31834:180;;:::o;35262:220::-;35320:4;35398:1;35362:13;:32;;;:37;;:98;;;;;35451:9;35416:13;:32;;;:44;35362:98;35342:118;;35262:220;:::o;57168:652::-;57255:16;57272;57306:29;57316:6;57323:11;57306:9;:29::i;:::-;57349:22;57372:23;57399:28;57415:11;57399:15;:28::i;:::-;57348:79;;;;57438:18;57444:11;57438:5;:18::i;:::-;57467:37;57485:6;57492:11;57467:17;:37::i;:::-;57544:6;57540:230;57560:5;:12;57556:1;:16;57540:230;;;57598:156;57645:11;57683:5;57689:1;57683:8;;;;;;;;:::i;:::-;;;;;;;;57718:6;57725:1;57718:9;;;;;;;;:::i;:::-;;;;;;;;57598:20;:156::i;:::-;57574:3;;;;;;;57540:230;;;;57799:5;57805:6;57791:21;;;;;;57168:652;;;;;:::o;35031:223::-;35090:4;35169:1;35132:13;:33;;;:38;;:100;;;;;35223:9;35187:13;:33;;;:45;35132:100;35112:120;;35031:223;:::o;58247:928::-;58371:7;58431:1;58413:7;;:14;;:19;:70;;;;;58467:9;;:16;;58449:7;;:14;;:34;;58413:70;58396:111;;;58502:5;;;;;;;;;;;;;;58396:111;58520:18;58541:13;;58520:34;;58565:19;58575:6;58582:1;58565:9;:19::i;:::-;58675:10;58620:15;:27;58636:10;58620:27;;;;;;;;;;;:52;58648:14;:23;;;;;;;;;;;;58620:52;;;;;;;;;;;;;;;:65;;;;58704:6;58700:429;58720:7;;:14;;58716:1;:18;58700:429;;;58763:32;58771:7;;58779:1;58771:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58782:9;;58792:1;58782:12;;;;;;;:::i;:::-;;;;;;;;58763:7;:32::i;:::-;58760:78;;;58825:13;;;;;;;;;;;;;;58760:78;58877:7;;58885:1;58877:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58870:31;;;58902:9;;58912:1;58902:12;;;;;;;:::i;:::-;;;;;;;;58870:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58860:55;;:6;:55;;;58857:115;;58945:27;;;;;;;;;;;;;;58857:115;59033:9;;59043:1;59033:12;;;;;;;:::i;:::-;;;;;;;;58991:15;:27;59007:10;58991:27;;;;;;;;;;;:39;59019:7;;59027:1;59019:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58991:39;;;;;;;;;;;;;;;:54;;;;59109:4;59064:16;:28;59081:7;;59089:1;59081:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;59064:28;;;;;;;;;;;;;;;:42;59093:9;;59103:1;59093:12;;;;;;;:::i;:::-;;;;;;;;59064:42;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;58736:3;;;;;;;58700:429;;;;59157:10;59150:17;;;58247:928;;;;;;;:::o;34017:205::-;34073:9;34109:1;34104;:6;34100:47;;34134:1;34127:8;;;;34100:47;34165:1;34161;:5;;;;:::i;:::-;34157:9;;34193:1;34188;34184;:5;;;;:::i;:::-;:10;34177:18;;;;:::i;:::-;;34017:205;;;;;:::o;2053:190::-;2178:4;2231;2202:25;2215:5;2222:4;2202:12;:25::i;:::-;:33;2195:40;;2053:190;;;;;:::o;11070:326::-;11130:4;11387:1;11365:7;:19;;;:23;11358:30;;11070:326;;;:::o;48945:1896::-;49015:35;49053:20;49065:7;49053:11;:20::i;:::-;49015:58;;49138:49;49155:1;49159:7;49168:13;:18;;;49138:8;:49::i;:::-;49527:1;49483:12;:32;49496:13;:18;;;49483:32;;;;;;;;;;;;;;;:40;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49592:1;49543:12;:32;49556:13;:18;;;49543:32;;;;;;;;;;;;;;;:45;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49720:13;:18;;;49692:11;:20;49704:7;49692:20;;;;;;;;;;;:25;;;:46;;;;;;;;;;;;;;;;;;49798:15;49753:11;:20;49765:7;49753:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;49859:4;49829:11;:20;49841:7;49829:20;;;;;;;;;;;:27;;;:34;;;;;;;;;;;;;;;;;;50111:19;50143:1;50133:7;:11;50111:33;;50204:1;50163:43;;:11;:24;50175:11;50163:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50159:445;;50388:13;;50374:11;:27;50370:219;;;50458:13;:18;;;50426:11;:24;50438:11;50426:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;50541:13;:28;;;50499:11;:24;50511:11;50499:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;50370:219;50159:445;49458:1157;50673:7;50669:1;50632:49;;50641:13;:18;;;50632:49;;;;;;;;;;;;50808:12;;:14;;;;;;;;;;;;;49004:1837;48945:1896;:::o;45591:566::-;45708:6;45703:436;45724:14;:20;;:27;;;;45720:1;:31;45703:436;;;45778:12;45791:16;45811:14;:20;;45832:1;45811:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:28;;45938:15;:25;45954:8;45938:25;;;;;;;;;;;:50;45964:14;:20;;45985:1;45964:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45938:50;;;;;;;;;;;;;;;;46015:3;45862:157;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45811:227;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45777:261;;;;46061:7;46057:66;;46098:25;;;;;;;;;;;;;;46057:66;45758:381;;45753:3;;;;;;;45703:436;;;;45591:566;;:::o;57828:411::-;57945:24;57953:6;57960:8;57945:7;:24::i;:::-;57941:66;;57991:16;;;;;;;;;;;;;;57941:66;58044:6;58037:27;;;58065:8;58037:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58021:53;;:12;:10;:12::i;:::-;:53;;;58018:105;;58096:27;;;;;;;;;;;;;;58018:105;58143:16;:24;58160:6;58143:24;;;;;;;;;;;;;;;:34;58168:8;58143:34;;;;;;;;;;;;58136:41;;;;;;;;;;;58195:15;:28;58211:11;58195:28;;;;;;;;;;;:36;58224:6;58195:36;;;;;;;;;;;;;;;58188:43;;;57828:411;;;:::o;43113:104::-;43182:27;43192:2;43196:8;43182:27;;;;;;;;;;;;:9;:27::i;:::-;43113:104;;:::o;59183:280::-;59265:4;59291:13;:24;;;;;;;;;;;;59287:168;;;59337:16;:24;59354:6;59337:24;;;;;;;;;;;;;;;:34;59362:8;59337:34;;;;;;;;;;;;;;;;;;;;;59330:41;;;;59287:168;59414:14;:23;;;;;;;;;;;;59407:38;;;59446:8;59407:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59400:55;;59183:280;;;;;:::o;2605:675::-;2688:7;2708:20;2731:4;2708:27;;2751:9;2746:497;2770:5;:12;2766:1;:16;2746:497;;;2804:20;2827:5;2833:1;2827:8;;;;;;;;:::i;:::-;;;;;;;;2804:31;;2870:12;2854;:28;2850:382;;2997:42;3012:12;3026;2997:14;:42::i;:::-;2982:57;;2850:382;;;3174:42;3189:12;3203;3174:14;:42::i;:::-;3159:57;;2850:382;2789:454;2784:3;;;;;:::i;:::-;;;;2746:497;;;;3260:12;3253:19;;;2605:675;;;;:::o;43580:163::-;43703:32;43709:2;43713:8;43723:5;43730:4;43703:5;:32::i;:::-;43580:163;;;:::o;3288:224::-;3356:13;3419:1;3413:4;3406:15;3448:1;3442:4;3435:15;3489:4;3483;3473:21;3464:30;;3288:224;;;;:::o;44002:1523::-;44141:20;44164:13;;44141:36;;44192:14;:12;:14::i;:::-;44188:61;;44228:21;;;;;;;;;;;;;;44188:61;44278:1;44264:16;;:2;:16;;;44260:61;;44302:19;;;;;;;;;;;;;;44260:61;44348:1;44336:8;:13;44332:57;;44371:18;;;;;;;;;;;;;;44332:57;44701:8;44666:12;:16;44679:2;44666:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44765:8;44725:12;:16;44738:2;44725:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44820:18;44792:46;;;;;;;;:::i;:::-;;:13;:24;;;;;;;;;;;;:46;;;;;;;;:::i;:::-;;;44789:166;;44946:8;44898:12;:16;44911:2;44898:16;;;;;;;;;;;;;;;:38;;;;;;;;;;;;:57;44857:12;:16;44870:2;44857:16;;;;;;;;;;;;;;;:38;;;:98;;;;;;;;;;;;;;;;;;44789:166;45005:2;44972:11;:25;44984:12;44972:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45072:15;45022:11;:25;45034:12;45022:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;45105:20;45128:12;45105:35;;45160:9;45155:307;45175:8;45171:1;:12;45155:307;;;45239:12;45235:2;45214:38;;45231:1;45214:38;;;;;;;;;;;;45275:4;:68;;;;;45284:59;45315:1;45319:2;45323:12;45337:5;45284:22;:59::i;:::-;45283:60;45275:68;45271:142;;;45373:40;;;;;;;;;;;;;;45271:142;45432:14;;;;;;;45185:3;;;;;;;45155:307;;;;45494:12;45478:13;:28;;;;44641:877;44130:1395;44002:1523;;;;:::o;36181:280::-;36237:4;36279:13;:24;;;;;;;;;;;;:160;;;;36354:5;36326:33;;:13;:24;;;;;;;;;;;;:33;;;:98;;;;;36411:13;;36380;:28;;;;;;;;;;;;:44;;;36326:98;36279:160;36259:180;;36181:280;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:149::-;1212:7;1252:66;1245:5;1241:78;1230:89;;1176:149;;;:::o;1331:120::-;1403:23;1420:5;1403:23;:::i;:::-;1396:5;1393:34;1383:62;;1441:1;1438;1431:12;1383:62;1331:120;:::o;1457:137::-;1502:5;1540:6;1527:20;1518:29;;1556:32;1582:5;1556:32;:::i;:::-;1457:137;;;;:::o;1600:327::-;1658:6;1707:2;1695:9;1686:7;1682:23;1678:32;1675:119;;;1713:79;;:::i;:::-;1675:119;1833:1;1858:52;1902:7;1893:6;1882:9;1878:22;1858:52;:::i;:::-;1848:62;;1804:116;1600:327;;;;:::o;1933:90::-;1967:7;2010:5;2003:13;1996:21;1985:32;;1933:90;;;:::o;2029:109::-;2110:21;2125:5;2110:21;:::i;:::-;2105:3;2098:34;2029:109;;:::o;2144:210::-;2231:4;2269:2;2258:9;2254:18;2246:26;;2282:65;2344:1;2333:9;2329:17;2320:6;2282:65;:::i;:::-;2144:210;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:86::-;6285:7;6325:4;6318:5;6314:16;6303:27;;6250:86;;;:::o;6342:112::-;6425:22;6441:5;6425:22;:::i;:::-;6420:3;6413:35;6342:112;;:::o;6460:214::-;6549:4;6587:2;6576:9;6572:18;6564:26;;6600:67;6664:1;6653:9;6649:17;6640:6;6600:67;:::i;:::-;6460:214;;;;:::o;6680:116::-;6750:21;6765:5;6750:21;:::i;:::-;6743:5;6740:32;6730:60;;6786:1;6783;6776:12;6730:60;6680:116;:::o;6802:133::-;6845:5;6883:6;6870:20;6861:29;;6899:30;6923:5;6899:30;:::i;:::-;6802:133;;;;:::o;6941:323::-;6997:6;7046:2;7034:9;7025:7;7021:23;7017:32;7014:119;;;7052:79;;:::i;:::-;7014:119;7172:1;7197:50;7239:7;7230:6;7219:9;7215:22;7197:50;:::i;:::-;7187:60;;7143:114;6941:323;;;;:::o;7270:114::-;7337:6;7371:5;7365:12;7355:22;;7270:114;;;:::o;7390:184::-;7489:11;7523:6;7518:3;7511:19;7563:4;7558:3;7554:14;7539:29;;7390:184;;;;:::o;7580:132::-;7647:4;7670:3;7662:11;;7700:4;7695:3;7691:14;7683:22;;7580:132;;;:::o;7718:108::-;7795:24;7813:5;7795:24;:::i;:::-;7790:3;7783:37;7718:108;;:::o;7832:179::-;7901:10;7922:46;7964:3;7956:6;7922:46;:::i;:::-;8000:4;7995:3;7991:14;7977:28;;7832:179;;;;:::o;8017:113::-;8087:4;8119;8114:3;8110:14;8102:22;;8017:113;;;:::o;8166:732::-;8285:3;8314:54;8362:5;8314:54;:::i;:::-;8384:86;8463:6;8458:3;8384:86;:::i;:::-;8377:93;;8494:56;8544:5;8494:56;:::i;:::-;8573:7;8604:1;8589:284;8614:6;8611:1;8608:13;8589:284;;;8690:6;8684:13;8717:63;8776:3;8761:13;8717:63;:::i;:::-;8710:70;;8803:60;8856:6;8803:60;:::i;:::-;8793:70;;8649:224;8636:1;8633;8629:9;8624:14;;8589:284;;;8593:14;8889:3;8882:10;;8290:608;;;8166:732;;;;:::o;8904:373::-;9047:4;9085:2;9074:9;9070:18;9062:26;;9134:9;9128:4;9124:20;9120:1;9109:9;9105:17;9098:47;9162:108;9265:4;9256:6;9162:108;:::i;:::-;9154:116;;8904:373;;;;:::o;9283:114::-;9350:6;9384:5;9378:12;9368:22;;9283:114;;;:::o;9403:184::-;9502:11;9536:6;9531:3;9524:19;9576:4;9571:3;9567:14;9552:29;;9403:184;;;;:::o;9593:132::-;9660:4;9683:3;9675:11;;9713:4;9708:3;9704:14;9696:22;;9593:132;;;:::o;9731:108::-;9808:24;9826:5;9808:24;:::i;:::-;9803:3;9796:37;9731:108;;:::o;9845:179::-;9914:10;9935:46;9977:3;9969:6;9935:46;:::i;:::-;10013:4;10008:3;10004:14;9990:28;;9845:179;;;;:::o;10030:113::-;10100:4;10132;10127:3;10123:14;10115:22;;10030:113;;;:::o;10179:732::-;10298:3;10327:54;10375:5;10327:54;:::i;:::-;10397:86;10476:6;10471:3;10397:86;:::i;:::-;10390:93;;10507:56;10557:5;10507:56;:::i;:::-;10586:7;10617:1;10602:284;10627:6;10624:1;10621:13;10602:284;;;10703:6;10697:13;10730:63;10789:3;10774:13;10730:63;:::i;:::-;10723:70;;10816:60;10869:6;10816:60;:::i;:::-;10806:70;;10662:224;10649:1;10646;10642:9;10637:14;;10602:284;;;10606:14;10902:3;10895:10;;10303:608;;;10179:732;;;;:::o;10917:373::-;11060:4;11098:2;11087:9;11083:18;11075:26;;11147:9;11141:4;11137:20;11133:1;11122:9;11118:17;11111:47;11175:108;11278:4;11269:6;11175:108;:::i;:::-;11167:116;;10917:373;;;;:::o;11296:117::-;11405:1;11402;11395:12;11419:117;11528:1;11525;11518:12;11542:117;11651:1;11648;11641:12;11679:553;11737:8;11747:6;11797:3;11790:4;11782:6;11778:17;11774:27;11764:122;;11805:79;;:::i;:::-;11764:122;11918:6;11905:20;11895:30;;11948:18;11940:6;11937:30;11934:117;;;11970:79;;:::i;:::-;11934:117;12084:4;12076:6;12072:17;12060:29;;12138:3;12130:4;12122:6;12118:17;12108:8;12104:32;12101:41;12098:128;;;12145:79;;:::i;:::-;12098:128;11679:553;;;;;:::o;12238:529::-;12309:6;12317;12366:2;12354:9;12345:7;12341:23;12337:32;12334:119;;;12372:79;;:::i;:::-;12334:119;12520:1;12509:9;12505:17;12492:31;12550:18;12542:6;12539:30;12536:117;;;12572:79;;:::i;:::-;12536:117;12685:65;12742:7;12733:6;12722:9;12718:22;12685:65;:::i;:::-;12667:83;;;;12463:297;12238:529;;;;;:::o;12773:634::-;12994:4;13032:2;13021:9;13017:18;13009:26;;13081:9;13075:4;13071:20;13067:1;13056:9;13052:17;13045:47;13109:108;13212:4;13203:6;13109:108;:::i;:::-;13101:116;;13264:9;13258:4;13254:20;13249:2;13238:9;13234:18;13227:48;13292:108;13395:4;13386:6;13292:108;:::i;:::-;13284:116;;12773:634;;;;;:::o;13413:118::-;13484:22;13500:5;13484:22;:::i;:::-;13477:5;13474:33;13464:61;;13521:1;13518;13511:12;13464:61;13413:118;:::o;13537:135::-;13581:5;13619:6;13606:20;13597:29;;13635:31;13660:5;13635:31;:::i;:::-;13537:135;;;;:::o;13678:101::-;13714:7;13754:18;13747:5;13743:30;13732:41;;13678:101;;;:::o;13785:120::-;13857:23;13874:5;13857:23;:::i;:::-;13850:5;13847:34;13837:62;;13895:1;13892;13885:12;13837:62;13785:120;:::o;13911:137::-;13956:5;13994:6;13981:20;13972:29;;14010:32;14036:5;14010:32;:::i;:::-;13911:137;;;;:::o;14054:901::-;14144:6;14152;14160;14168;14176;14225:3;14213:9;14204:7;14200:23;14196:33;14193:120;;;14232:79;;:::i;:::-;14193:120;14352:1;14377:53;14422:7;14413:6;14402:9;14398:22;14377:53;:::i;:::-;14367:63;;14323:117;14479:2;14505:53;14550:7;14541:6;14530:9;14526:22;14505:53;:::i;:::-;14495:63;;14450:118;14607:2;14633:51;14676:7;14667:6;14656:9;14652:22;14633:51;:::i;:::-;14623:61;;14578:116;14733:2;14759:51;14802:7;14793:6;14782:9;14778:22;14759:51;:::i;:::-;14749:61;;14704:116;14859:3;14886:52;14930:7;14921:6;14910:9;14906:22;14886:52;:::i;:::-;14876:62;;14830:118;14054:901;;;;;;;;:::o;14978:568::-;15051:8;15061:6;15111:3;15104:4;15096:6;15092:17;15088:27;15078:122;;15119:79;;:::i;:::-;15078:122;15232:6;15219:20;15209:30;;15262:18;15254:6;15251:30;15248:117;;;15284:79;;:::i;:::-;15248:117;15398:4;15390:6;15386:17;15374:29;;15452:3;15444:4;15436:6;15432:17;15422:8;15418:32;15415:41;15412:128;;;15459:79;;:::i;:::-;15412:128;14978:568;;;;;:::o;15552:704::-;15647:6;15655;15663;15712:2;15700:9;15691:7;15687:23;15683:32;15680:119;;;15718:79;;:::i;:::-;15680:119;15838:1;15863:53;15908:7;15899:6;15888:9;15884:22;15863:53;:::i;:::-;15853:63;;15809:117;15993:2;15982:9;15978:18;15965:32;16024:18;16016:6;16013:30;16010:117;;;16046:79;;:::i;:::-;16010:117;16159:80;16231:7;16222:6;16211:9;16207:22;16159:80;:::i;:::-;16141:98;;;;15936:313;15552:704;;;;;:::o;16262:468::-;16327:6;16335;16384:2;16372:9;16363:7;16359:23;16355:32;16352:119;;;16390:79;;:::i;:::-;16352:119;16510:1;16535:53;16580:7;16571:6;16560:9;16556:22;16535:53;:::i;:::-;16525:63;;16481:117;16637:2;16663:50;16705:7;16696:6;16685:9;16681:22;16663:50;:::i;:::-;16653:60;;16608:115;16262:468;;;;;:::o;16736:77::-;16773:7;16802:5;16791:16;;16736:77;;;:::o;16819:122::-;16892:24;16910:5;16892:24;:::i;:::-;16885:5;16882:35;16872:63;;16931:1;16928;16921:12;16872:63;16819:122;:::o;16947:139::-;16993:5;17031:6;17018:20;17009:29;;17047:33;17074:5;17047:33;:::i;:::-;16947:139;;;;:::o;17092:329::-;17151:6;17200:2;17188:9;17179:7;17175:23;17171:32;17168:119;;;17206:79;;:::i;:::-;17168:119;17326:1;17351:53;17396:7;17387:6;17376:9;17372:22;17351:53;:::i;:::-;17341:63;;17297:117;17092:329;;;;:::o;17427:117::-;17536:1;17533;17526:12;17550:180;17598:77;17595:1;17588:88;17695:4;17692:1;17685:15;17719:4;17716:1;17709:15;17736:281;17819:27;17841:4;17819:27;:::i;:::-;17811:6;17807:40;17949:6;17937:10;17934:22;17913:18;17901:10;17898:34;17895:62;17892:88;;;17960:18;;:::i;:::-;17892:88;18000:10;17996:2;17989:22;17779:238;17736:281;;:::o;18023:129::-;18057:6;18084:20;;:::i;:::-;18074:30;;18113:33;18141:4;18133:6;18113:33;:::i;:::-;18023:129;;;:::o;18158:307::-;18219:4;18309:18;18301:6;18298:30;18295:56;;;18331:18;;:::i;:::-;18295:56;18369:29;18391:6;18369:29;:::i;:::-;18361:37;;18453:4;18447;18443:15;18435:23;;18158:307;;;:::o;18471:154::-;18555:6;18550:3;18545;18532:30;18617:1;18608:6;18603:3;18599:16;18592:27;18471:154;;;:::o;18631:410::-;18708:5;18733:65;18749:48;18790:6;18749:48;:::i;:::-;18733:65;:::i;:::-;18724:74;;18821:6;18814:5;18807:21;18859:4;18852:5;18848:16;18897:3;18888:6;18883:3;18879:16;18876:25;18873:112;;;18904:79;;:::i;:::-;18873:112;18994:41;19028:6;19023:3;19018;18994:41;:::i;:::-;18714:327;18631:410;;;;;:::o;19060:338::-;19115:5;19164:3;19157:4;19149:6;19145:17;19141:27;19131:122;;19172:79;;:::i;:::-;19131:122;19289:6;19276:20;19314:78;19388:3;19380:6;19373:4;19365:6;19361:17;19314:78;:::i;:::-;19305:87;;19121:277;19060:338;;;;:::o;19404:943::-;19499:6;19507;19515;19523;19572:3;19560:9;19551:7;19547:23;19543:33;19540:120;;;19579:79;;:::i;:::-;19540:120;19699:1;19724:53;19769:7;19760:6;19749:9;19745:22;19724:53;:::i;:::-;19714:63;;19670:117;19826:2;19852:53;19897:7;19888:6;19877:9;19873:22;19852:53;:::i;:::-;19842:63;;19797:118;19954:2;19980:53;20025:7;20016:6;20005:9;20001:22;19980:53;:::i;:::-;19970:63;;19925:118;20110:2;20099:9;20095:18;20082:32;20141:18;20133:6;20130:30;20127:117;;;20163:79;;:::i;:::-;20127:117;20268:62;20322:7;20313:6;20302:9;20298:22;20268:62;:::i;:::-;20258:72;;20053:287;19404:943;;;;;;;:::o;20370:568::-;20443:8;20453:6;20503:3;20496:4;20488:6;20484:17;20480:27;20470:122;;20511:79;;:::i;:::-;20470:122;20624:6;20611:20;20601:30;;20654:18;20646:6;20643:30;20640:117;;;20676:79;;:::i;:::-;20640:117;20790:4;20782:6;20778:17;20766:29;;20844:3;20836:4;20828:6;20824:17;20814:8;20810:32;20807:41;20804:128;;;20851:79;;:::i;:::-;20804:128;20370:568;;;;;:::o;20961:::-;21034:8;21044:6;21094:3;21087:4;21079:6;21075:17;21071:27;21061:122;;21102:79;;:::i;:::-;21061:122;21215:6;21202:20;21192:30;;21245:18;21237:6;21234:30;21231:117;;;21267:79;;:::i;:::-;21231:117;21381:4;21373:6;21369:17;21357:29;;21435:3;21427:4;21419:6;21415:17;21405:8;21401:32;21398:41;21395:128;;;21442:79;;:::i;:::-;21395:128;20961:568;;;;;:::o;21535:934::-;21657:6;21665;21673;21681;21730:2;21718:9;21709:7;21705:23;21701:32;21698:119;;;21736:79;;:::i;:::-;21698:119;21884:1;21873:9;21869:17;21856:31;21914:18;21906:6;21903:30;21900:117;;;21936:79;;:::i;:::-;21900:117;22049:80;22121:7;22112:6;22101:9;22097:22;22049:80;:::i;:::-;22031:98;;;;21827:312;22206:2;22195:9;22191:18;22178:32;22237:18;22229:6;22226:30;22223:117;;;22259:79;;:::i;:::-;22223:117;22372:80;22444:7;22435:6;22424:9;22420:22;22372:80;:::i;:::-;22354:98;;;;22149:313;21535:934;;;;;;;:::o;22475:474::-;22543:6;22551;22600:2;22588:9;22579:7;22575:23;22571:32;22568:119;;;22606:79;;:::i;:::-;22568:119;22726:1;22751:53;22796:7;22787:6;22776:9;22772:22;22751:53;:::i;:::-;22741:63;;22697:117;22853:2;22879:53;22924:7;22915:6;22904:9;22900:22;22879:53;:::i;:::-;22869:63;;22824:118;22475:474;;;;;:::o;22955:180::-;23003:77;23000:1;22993:88;23100:4;23097:1;23090:15;23124:4;23121:1;23114:15;23141:320;23185:6;23222:1;23216:4;23212:12;23202:22;;23269:1;23263:4;23259:12;23290:18;23280:81;;23346:4;23338:6;23334:17;23324:27;;23280:81;23408:2;23400:6;23397:14;23377:18;23374:38;23371:84;;23427:18;;:::i;:::-;23371:84;23192:269;23141:320;;;:::o;23467:332::-;23588:4;23626:2;23615:9;23611:18;23603:26;;23639:71;23707:1;23696:9;23692:17;23683:6;23639:71;:::i;:::-;23720:72;23788:2;23777:9;23773:18;23764:6;23720:72;:::i;:::-;23467:332;;;;;:::o;23805:137::-;23859:5;23890:6;23884:13;23875:22;;23906:30;23930:5;23906:30;:::i;:::-;23805:137;;;;:::o;23948:345::-;24015:6;24064:2;24052:9;24043:7;24039:23;24035:32;24032:119;;;24070:79;;:::i;:::-;24032:119;24190:1;24215:61;24268:7;24259:6;24248:9;24244:22;24215:61;:::i;:::-;24205:71;;24161:125;23948:345;;;;:::o;24299:180::-;24347:77;24344:1;24337:88;24444:4;24441:1;24434:15;24468:4;24465:1;24458:15;24485:180;24533:77;24530:1;24523:88;24630:4;24627:1;24620:15;24654:4;24651:1;24644:15;24671:348;24711:7;24734:20;24752:1;24734:20;:::i;:::-;24729:25;;24768:20;24786:1;24768:20;:::i;:::-;24763:25;;24956:1;24888:66;24884:74;24881:1;24878:81;24873:1;24866:9;24859:17;24855:105;24852:131;;;24963:18;;:::i;:::-;24852:131;25011:1;25008;25004:9;24993:20;;24671:348;;;;:::o;25025:148::-;25127:11;25164:3;25149:18;;25025:148;;;;:::o;25179:141::-;25228:4;25251:3;25243:11;;25274:3;25271:1;25264:14;25308:4;25305:1;25295:18;25287:26;;25179:141;;;:::o;25350:845::-;25453:3;25490:5;25484:12;25519:36;25545:9;25519:36;:::i;:::-;25571:89;25653:6;25648:3;25571:89;:::i;:::-;25564:96;;25691:1;25680:9;25676:17;25707:1;25702:137;;;;25853:1;25848:341;;;;25669:520;;25702:137;25786:4;25782:9;25771;25767:25;25762:3;25755:38;25822:6;25817:3;25813:16;25806:23;;25702:137;;25848:341;25915:38;25947:5;25915:38;:::i;:::-;25975:1;25989:154;26003:6;26000:1;25997:13;25989:154;;;26077:7;26071:14;26067:1;26062:3;26058:11;26051:35;26127:1;26118:7;26114:15;26103:26;;26025:4;26022:1;26018:12;26013:17;;25989:154;;;26172:6;26167:3;26163:16;26156:23;;25855:334;;25669:520;;25457:738;;25350:845;;;;:::o;26201:151::-;26341:3;26337:1;26329:6;26325:14;26318:27;26201:151;:::o;26358:400::-;26518:3;26539:84;26621:1;26616:3;26539:84;:::i;:::-;26532:91;;26632:93;26721:3;26632:93;:::i;:::-;26750:1;26745:3;26741:11;26734:18;;26358:400;;;:::o;26764:377::-;26870:3;26898:39;26931:5;26898:39;:::i;:::-;26953:89;27035:6;27030:3;26953:89;:::i;:::-;26946:96;;27051:52;27096:6;27091:3;27084:4;27077:5;27073:16;27051:52;:::i;:::-;27128:6;27123:3;27119:16;27112:23;;26874:267;26764:377;;;;:::o;27147:155::-;27287:7;27283:1;27275:6;27271:14;27264:31;27147:155;:::o;27308:400::-;27468:3;27489:84;27571:1;27566:3;27489:84;:::i;:::-;27482:91;;27582:93;27671:3;27582:93;:::i;:::-;27700:1;27695:3;27691:11;27684:18;;27308:400;;;:::o;27714:961::-;28093:3;28115:92;28203:3;28194:6;28115:92;:::i;:::-;28108:99;;28224:148;28368:3;28224:148;:::i;:::-;28217:155;;28389:95;28480:3;28471:6;28389:95;:::i;:::-;28382:102;;28501:148;28645:3;28501:148;:::i;:::-;28494:155;;28666:3;28659:10;;27714:961;;;;;:::o;28681:180::-;28729:77;28726:1;28719:88;28826:4;28823:1;28816:15;28850:4;28847:1;28840:15;28867:98;28918:6;28952:5;28946:12;28936:22;;28867:98;;;:::o;28971:147::-;29072:11;29109:3;29094:18;;28971:147;;;;:::o;29124:373::-;29228:3;29256:38;29288:5;29256:38;:::i;:::-;29310:88;29391:6;29386:3;29310:88;:::i;:::-;29303:95;;29407:52;29452:6;29447:3;29440:4;29433:5;29429:16;29407:52;:::i;:::-;29484:6;29479:3;29475:16;29468:23;;29232:265;29124:373;;;;:::o;29503:271::-;29633:3;29655:93;29744:3;29735:6;29655:93;:::i;:::-;29648:100;;29765:3;29758:10;;29503:271;;;;:::o;29780:94::-;29813:8;29861:5;29857:2;29853:14;29832:35;;29780:94;;;:::o;29880:::-;29919:7;29948:20;29962:5;29948:20;:::i;:::-;29937:31;;29880:94;;;:::o;29980:100::-;30019:7;30048:26;30068:5;30048:26;:::i;:::-;30037:37;;29980:100;;;:::o;30086:157::-;30191:45;30211:24;30229:5;30211:24;:::i;:::-;30191:45;:::i;:::-;30186:3;30179:58;30086:157;;:::o;30249:256::-;30361:3;30376:75;30447:3;30438:6;30376:75;:::i;:::-;30476:2;30471:3;30467:12;30460:19;;30496:3;30489:10;;30249:256;;;;:::o;30511:168::-;30594:11;30628:6;30623:3;30616:19;30668:4;30663:3;30659:14;30644:29;;30511:168;;;;:::o;30685:360::-;30771:3;30799:38;30831:5;30799:38;:::i;:::-;30853:70;30916:6;30911:3;30853:70;:::i;:::-;30846:77;;30932:52;30977:6;30972:3;30965:4;30958:5;30954:16;30932:52;:::i;:::-;31009:29;31031:6;31009:29;:::i;:::-;31004:3;31000:39;30993:46;;30775:270;30685:360;;;;:::o;31051:640::-;31246:4;31284:3;31273:9;31269:19;31261:27;;31298:71;31366:1;31355:9;31351:17;31342:6;31298:71;:::i;:::-;31379:72;31447:2;31436:9;31432:18;31423:6;31379:72;:::i;:::-;31461;31529:2;31518:9;31514:18;31505:6;31461:72;:::i;:::-;31580:9;31574:4;31570:20;31565:2;31554:9;31550:18;31543:48;31608:76;31679:4;31670:6;31608:76;:::i;:::-;31600:84;;31051:640;;;;;;;:::o;31697:141::-;31753:5;31784:6;31778:13;31769:22;;31800:32;31826:5;31800:32;:::i;:::-;31697:141;;;;:::o;31844:349::-;31913:6;31962:2;31950:9;31941:7;31937:23;31933:32;31930:119;;;31968:79;;:::i;:::-;31930:119;32088:1;32113:63;32168:7;32159:6;32148:9;32144:22;32113:63;:::i;:::-;32103:73;;32059:127;31844:349;;;;:::o;32199:233::-;32238:3;32261:24;32279:5;32261:24;:::i;:::-;32252:33;;32307:66;32300:5;32297:77;32294:103;;32377:18;;:::i;:::-;32294:103;32424:1;32417:5;32413:13;32406:20;;32199:233;;;:::o;32438:180::-;32486:77;32483:1;32476:88;32583:4;32580:1;32573:15;32607:4;32604:1;32597:15;32624:185;32664:1;32681:20;32699:1;32681:20;:::i;:::-;32676:25;;32715:20;32733:1;32715:20;:::i;:::-;32710:25;;32754:1;32744:35;;32759:18;;:::i;:::-;32744:35;32801:1;32798;32794:9;32789:14;;32624:185;;;;:::o;32815:191::-;32855:4;32875:20;32893:1;32875:20;:::i;:::-;32870:25;;32909:20;32927:1;32909:20;:::i;:::-;32904:25;;32948:1;32945;32942:8;32939:34;;;32953:18;;:::i;:::-;32939:34;32998:1;32995;32991:9;32983:17;;32815:191;;;;:::o;33012:176::-;33044:1;33061:20;33079:1;33061:20;:::i;:::-;33056:25;;33095:20;33113:1;33095:20;:::i;:::-;33090:25;;33134:1;33124:35;;33139:18;;:::i;:::-;33124:35;33180:1;33177;33173:9;33168:14;;33012:176;;;;:::o;33194:305::-;33234:3;33253:20;33271:1;33253:20;:::i;:::-;33248:25;;33287:20;33305:1;33287:20;:::i;:::-;33282:25;;33441:1;33373:66;33369:74;33366:1;33363:81;33360:107;;;33447:18;;:::i;:::-;33360:107;33491:1;33488;33484:9;33477:16;;33194:305;;;;:::o;33505:143::-;33562:5;33593:6;33587:13;33578:22;;33609:33;33636:5;33609:33;:::i;:::-;33505:143;;;;:::o;33654:351::-;33724:6;33773:2;33761:9;33752:7;33748:23;33744:32;33741:119;;;33779:79;;:::i;:::-;33741:119;33899:1;33924:64;33980:7;33971:6;33960:9;33956:22;33924:64;:::i;:::-;33914:74;;33870:128;33654:351;;;;:::o;34011:180::-;34059:77;34056:1;34049:88;34156:4;34153:1;34146:15;34180:4;34177:1;34170:15;34197:332;34318:4;34356:2;34345:9;34341:18;34333:26;;34369:71;34437:1;34426:9;34422:17;34413:6;34369:71;:::i;:::-;34450:72;34518:2;34507:9;34503:18;34494:6;34450:72;:::i;:::-;34197:332;;;;;:::o

Swarm Source

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