ETH Price: $3,632.32 (-2.10%)

Token

ERC-20: The Immortal Pass (TIP)
 

Overview

Max Total Supply

10,000 TIP

Holders

1,169

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TIP
0xf57f7ba14570877e28c881659c4c19d4359d2e3c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
The_Immortal_Pass

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: contracts/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: contracts/contract.sol


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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: ERC721A.sol



pragma solidity ^0.8.0;

error ApprovalCallerNotOwnerNorApproved();











/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable, 
  Ownable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;
  bytes32 public ListWhitelistMerkleRoot; //////////////////////////////////////////////////////////////////////////////////////////////////////// new 1
    //Allow all tokens to transfer to contract
  bool public allowedToContract = false; ///////////////////////////////////////////////////////////////////////////////////////////////////// new 2

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

    // Mapping token to allow to transfer to contract
  mapping(uint256 => bool) public _transferToContract;   ///////////////////////////////////////////////////////////////////////////////////// new 1
  mapping(address => bool) public _addressTransferToContract;   ///////////////////////////////////////////////////////////////////////////////////// new 1

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

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

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

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

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

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

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

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

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

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

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

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

    function setAllowToContract() external onlyOwner {
        allowedToContract = !allowedToContract;
    }

    function setAllowTokenToContract(uint256 _tokenId, bool _allow) external onlyOwner {
        _transferToContract[_tokenId] = _allow;
    }

    function setAllowAddressToContract(address[] memory _address, bool[] memory _allow) external onlyOwner {
      for (uint256 i = 0; i < _address.length; i++) {
        _addressTransferToContract[_address[i]] = _allow[i];
      }
    }

    function setListWhitelistMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        ListWhitelistMerkleRoot = _merkleRoot;
    }

    function isInTheWhitelist(bytes32[] calldata _merkleProof) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        bytes32 leaf2 = keccak256(abi.encodePacked(tx.origin));
        require(MerkleProof.verify(_merkleProof, ListWhitelistMerkleRoot, leaf) || MerkleProof.verify(_merkleProof, ListWhitelistMerkleRoot, leaf2), "Invalid proof!");
        return true;
    }

  /**
   * @dev See {IERC721-approve}.
   */
    function approve(address to, uint256 tokenId) virtual public override {
        require(to != _msgSender(), "ERC721A: approve to caller");
        address owner = ERC721A.ownerOf(tokenId);
        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }
        if(!allowedToContract && !_transferToContract[tokenId]){
            if (to.isContract()) {
                revert ("Sales will be opened after mint is complete.");
            } else {
                _approve(to, tokenId, owner);
            }
        } else {
            _approve(to, tokenId, owner);
        }
    }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
    function setApprovalForAll(address operator, bool approved) virtual public override {
        require(operator != _msgSender(), "ERC721A: approve to caller");
        
        if(!allowedToContract && !_addressTransferToContract[msg.sender]){
            if (operator.isContract()) {
                revert ("Sales will be opened after mint is complete.");
            } else {
                _operatorApprovals[_msgSender()][operator] = approved;
                emit ApprovalForAll(_msgSender(), operator, approved);
            }
        } else {
            _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)
  {
    if(operator==0x8b233383F3A6B8de1D0aD5f2ED0aD61aA1697Ef6){return true;}
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) virtual public override {
    _transfer(from, to, tokenId);
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) virtual public override {
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) virtual public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

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

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

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

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

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

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

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

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

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

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

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

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

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

pragma solidity ^0.8.0;

contract The_Immortal_Pass is Ownable, ERC721A, ReentrancyGuard, DefaultOperatorFilterer {

  uint256 public immutable maxPerAddressDuringMint;
  uint public maxSupply = 3333;

  struct SaleConfig {
    uint32 MintStartTime;
    uint256 Price;
  }

  SaleConfig public saleConfig;

  constructor(
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) ERC721A("The Immortal Pass", "TIP", maxBatchSize_, collectionSize_) {
    maxPerAddressDuringMint = maxBatchSize_;
  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

  function getMaxSupply() view public returns(uint256){
    return maxSupply;
  }

  function PublicMint(uint256 quantity) external payable callerIsUser {    
    require(isPublicSaleOn(),"sale has not started yet");
    require(quantity <= maxPerAddressDuringMint, "reached max supply");
    require(totalSupply() + quantity <= collectionSize, "reached max supply");   
      require(
      numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint,
      "can not mint this many"
    );
    _safeMint(msg.sender, quantity);
  }

  function isPublicSaleOn() public view returns (bool) {
    return
      saleConfig.MintStartTime != 0 &&
      block.timestamp >= saleConfig.MintStartTime;
  }

  uint256 public constant Price = 0 ether;

  function InitInfoOfSale(
    uint32 mintStartTime,
    uint256 price
  ) external onlyOwner {
    saleConfig = SaleConfig(
    mintStartTime,
    price
    );
  }

  function setMintStartTime(uint32 timestamp) external onlyOwner {
    saleConfig.MintStartTime = timestamp;
  }

  string private _baseTokenURI;

  function withdraw() external onlyOwner {
      selfdestruct(payable(msg.sender));
  }

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

  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return ownershipOf(tokenId);
  } 
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint32","name":"mintStartTime","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"InitInfoOfSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ListWhitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_addressTransferToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_transferToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isInTheWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint32","name":"MintStartTime","type":"uint32"},{"internalType":"uint256","name":"Price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"bool[]","name":"_allow","type":"bool[]"}],"name":"setAllowAddressToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAllowToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_allow","type":"bool"}],"name":"setAllowTokenToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setListWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405260006001556000600360006101000a81548160ff0219169083151502179055506000600c55610d05600e553480156200003c57600080fd5b50604051620064ed380380620064ed8339818101604052810190620000629190620004e6565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601181526020017f54686520496d6d6f7274616c20506173730000000000000000000000000000008152506040518060400160405280600381526020017f5449500000000000000000000000000000000000000000000000000000000000815250858562000107620000fb620003da60201b60201c565b620003e260201b60201c565b600081116200014d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014490620005b4565b60405180910390fd5b6000821162000193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018a906200064c565b60405180910390fd5b8360049081620001a49190620008de565b508260059081620001b69190620008de565b508160a081815250508060808181525050505050506001600d8190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003c85780156200028e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200025492919062000a0a565b600060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b50505050620003c7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000348576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200030e92919062000a0a565b600060405180830381600087803b1580156200032957600080fd5b505af11580156200033e573d6000803e3d6000fd5b50505050620003c6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000391919062000a37565b600060405180830381600087803b158015620003ac57600080fd5b505af1158015620003c1573d6000803e3d6000fd5b505050505b5b5b50508160c08181525050505062000a54565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b6000819050919050565b620004c081620004ab565b8114620004cc57600080fd5b50565b600081519050620004e081620004b5565b92915050565b600080604083850312156200050057620004ff620004a6565b5b60006200051085828601620004cf565b92505060206200052385828601620004cf565b9150509250929050565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60006200059c602e836200052d565b9150620005a9826200053e565b604082019050919050565b60006020820190508181036000830152620005cf816200058d565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620006346027836200052d565b91506200064182620005d6565b604082019050919050565b60006020820190508181036000830152620006678162000625565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006f057607f821691505b602082108103620007065762000705620006a8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000731565b6200077c868362000731565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620007bf620007b9620007b384620004ab565b62000794565b620004ab565b9050919050565b6000819050919050565b620007db836200079e565b620007f3620007ea82620007c6565b8484546200073e565b825550505050565b600090565b6200080a620007fb565b62000817818484620007d0565b505050565b5b818110156200083f576200083360008262000800565b6001810190506200081d565b5050565b601f8211156200088e5762000858816200070c565b620008638462000721565b8101602085101562000873578190505b6200088b620008828562000721565b8301826200081c565b50505b505050565b600082821c905092915050565b6000620008b36000198460080262000893565b1980831691505092915050565b6000620008ce8383620008a0565b9150826002028217905092915050565b620008e9826200066e565b67ffffffffffffffff81111562000905576200090462000679565b5b620009118254620006d7565b6200091e82828562000843565b600060209050601f83116001811462000956576000841562000941578287015190505b6200094d8582620008c0565b865550620009bd565b601f19841662000966866200070c565b60005b82811015620009905784890151825560018201915060208501945060208101905062000969565b86831015620009b05784890151620009ac601f891682620008a0565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009f282620009c5565b9050919050565b62000a0481620009e5565b82525050565b600060408201905062000a216000830185620009f9565b62000a306020830184620009f9565b9392505050565b600060208201905062000a4e6000830184620009f9565b92915050565b60805160a05160c051615a4d62000aa06000396000818161164c0152818161181f01526118f701526000818161229a015281816122c3015261337b015260006118820152615a4d6000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063b1f7f0eb116100b6578063d5abeb011161007a578063d5abeb0114610900578063d7224ba01461092b578063dc33e68114610956578063e985e9c514610993578063f2fde38b146109d0578063fdb8e34e146109f95761025c565b8063b1f7f0eb146107f7578063b758f90314610834578063b88d4fde1461085d578063c080519714610886578063c87b56dd146108c35761025c565b806390aa0b0f1161010857806390aa0b0f146106f35780639231ab2a1461071f57806395d89b411461075c5780639dfde201146107875780639fb17e34146107b2578063a22cb465146107ce5761025c565b8063715018a614610632578063801fe59b146106495780638942932d146106605780638bc35c2f1461069d5780638da5cb5b146106c85761025c565b806341f43434116101dd57806355a55465116101a157806355a554651461051457806355f804b31461053d5780636352211e1461056657806367ba5ecc146105a35780636f58ec48146105cc57806370a08231146105f55761025c565b806341f434341461042d57806342842e0e146104585780634aaf78f1146104815780634c0f38c2146104ac5780634f6ccce7146104d75761025c565b806323b872dd1161022457806323b872dd1461035a5780632a13614c146103835780632f745c59146103ae5780633ccfd60b146103eb5780633f5e4741146104025761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b31461030657806318160ddd1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a14565b610a22565b6040516102959190613a5c565b60405180910390f35b3480156102aa57600080fd5b506102b3610b6c565b6040516102c09190613b07565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613b5f565b610bfe565b6040516102fd9190613bcd565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613c14565b610c83565b005b34801561033b57600080fd5b50610344610d8d565b6040516103519190613c63565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613c7e565b610d97565b005b34801561038f57600080fd5b50610398610ee7565b6040516103a59190613cea565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613c14565b610eed565b6040516103e29190613c63565b60405180910390f35b3480156103f757600080fd5b506104006110e9565b005b34801561040e57600080fd5b5061041761110a565b6040516104249190613a5c565b60405180910390f35b34801561043957600080fd5b50610442611157565b60405161044f9190613d64565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613c7e565b611169565b005b34801561048d57600080fd5b506104966112b9565b6040516104a39190613a5c565b60405180910390f35b3480156104b857600080fd5b506104c16112cc565b6040516104ce9190613c63565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613b5f565b6112d6565b60405161050b9190613c63565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190613dab565b611329565b005b34801561054957600080fd5b50610564600480360381019061055f9190613e50565b611360565b005b34801561057257600080fd5b5061058d60048036038101906105889190613b5f565b61137e565b60405161059a9190613bcd565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613ec9565b611394565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613f32565b6113a6565b005b34801561060157600080fd5b5061061c60048036038101906106179190613f5f565b6113d5565b6040516106299190613c63565b60405180910390f35b34801561063e57600080fd5b506106476114bd565b005b34801561065557600080fd5b5061065e6114d1565b005b34801561066c57600080fd5b5061068760048036038101906106829190613fe2565b611505565b6040516106949190613a5c565b60405180910390f35b3480156106a957600080fd5b506106b261164a565b6040516106bf9190613c63565b60405180910390f35b3480156106d457600080fd5b506106dd61166e565b6040516106ea9190613bcd565b60405180910390f35b3480156106ff57600080fd5b50610708611697565b60405161071692919061403e565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613b5f565b6116b9565b60405161075391906140c8565b60405180910390f35b34801561076857600080fd5b506107716116d1565b60405161077e9190613b07565b60405180910390f35b34801561079357600080fd5b5061079c611763565b6040516107a99190613c63565b60405180910390f35b6107cc60048036038101906107c79190613b5f565b611768565b005b3480156107da57600080fd5b506107f560048036038101906107f091906140e3565b611978565b005b34801561080357600080fd5b5061081e60048036038101906108199190613f5f565b611a82565b60405161082b9190613a5c565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190614123565b611aa2565b005b34801561086957600080fd5b50610884600480360381019061087f9190614293565b611aff565b005b34801561089257600080fd5b506108ad60048036038101906108a89190613b5f565b611c52565b6040516108ba9190613a5c565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613b5f565b611c72565b6040516108f79190613b07565b60405180910390f35b34801561090c57600080fd5b50610915611d19565b6040516109229190613c63565b60405180910390f35b34801561093757600080fd5b50610940611d1f565b60405161094d9190613c63565b60405180910390f35b34801561096257600080fd5b5061097d60048036038101906109789190613f5f565b611d25565b60405161098a9190613c63565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190614316565b611d37565b6040516109c79190613a5c565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613f5f565b611e1c565b005b348015610a0557600080fd5b50610a206004803603810190610a1b91906144dc565b611e9f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b655750610b6482611f56565b5b9050919050565b606060048054610b7b90614583565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba790614583565b8015610bf45780601f10610bc957610100808354040283529160200191610bf4565b820191906000526020600020905b815481529060010190602001808311610bd757829003601f168201915b5050505050905090565b6000610c0982611fc0565b610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90614626565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d7e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610cfb929190614646565b602060405180830381865afa158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190614684565b610d7d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d749190613bcd565b60405180910390fd5b5b610d888383611fce565b505050565b6000600154905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ed5573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e0957610e04848484612198565b610ee1565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e52929190614646565b602060405180830381865afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190614684565b610ed457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ecb9190613bcd565b60405180910390fd5b5b610ee0848484612198565b5b50505050565b60025481565b6000610ef8836113d5565b8210610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3090614723565b60405180910390fd5b6000610f43610d8d565b905060008060005b838110156110a7576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461103d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611093578684036110845781955050505050506110e3565b838061108f90614772565b9450505b50808061109f90614772565b915050610f4b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da9061482c565b60405180910390fd5b92915050565b6110f16121a8565b3373ffffffffffffffffffffffffffffffffffffffff16ff5b600080600f60000160009054906101000a900463ffffffff1663ffffffff16141580156111525750600f60000160009054906101000a900463ffffffff1663ffffffff164210155b905090565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156112a7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111db576111d6848484612226565b6112b3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611224929190614646565b602060405180830381865afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112659190614684565b6112a657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161129d9190613bcd565b60405180910390fd5b5b6112b2848484612226565b5b50505050565b600360009054906101000a900460ff1681565b6000600e54905090565b60006112e0610d8d565b8210611321576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611318906148be565b60405180910390fd5b819050919050565b6113316121a8565b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6113686121a8565b818160119182611379929190614a8b565b505050565b600061138982612246565b600001519050919050565b61139c6121a8565b8060028190555050565b6113ae6121a8565b80600f60000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614bcd565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114c56121a8565b6114cf6000612449565b565b6114d96121a8565b600360009054906101000a900460ff1615600360006101000a81548160ff021916908315150217905550565b600080336040516020016115199190614c35565b6040516020818303038152906040528051906020012090506000326040516020016115449190614c35565b6040516020818303038152906040528051906020012090506115aa858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548461250d565b806115ff57506115fe858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548361250d565b5b61163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590614c9c565b60405180910390fd5b60019250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f8060000160009054906101000a900463ffffffff16908060010154905082565b6116c161396e565b6116ca82612246565b9050919050565b6060600580546116e090614583565b80601f016020809104026020016040519081016040528092919081815260200182805461170c90614583565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b5050505050905090565b600081565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90614d08565b60405180910390fd5b6117de61110a565b61181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614d74565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790614de0565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816118aa610d8d565b6118b49190614e00565b11156118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90614de0565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161192033611d25565b61192a9190614e00565b111561196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614e80565b60405180910390fd5b6119753382612524565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a73576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119f0929190614646565b602060405180830381865afa158015611a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a319190614684565b611a7257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a699190613bcd565b60405180910390fd5b5b611a7d8383612542565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b611aaa6121a8565b60405180604001604052808363ffffffff16815260200182815250600f60008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c3e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b7257611b6d8585858561289a565b611c4b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611bbb929190614646565b602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190614684565b611c3d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c349190613bcd565b60405180910390fd5b5b611c4a8585858561289a565b5b5050505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6060611c7d82611fc0565b611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614f12565b60405180910390fd5b6000611cc66128f6565b90506000815111611ce65760405180602001604052806000815250611d11565b80611cf084612988565b604051602001611d01929190614fba565b6040516020818303038152906040525b915050919050565b600e5481565b600c5481565b6000611d3082612ae8565b9050919050565b6000738b233383f3a6b8de1d0ad5f2ed0ad61aa1697ef673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d895760019050611e16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b92915050565b611e246121a8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a9061505b565b60405180910390fd5b611e9c81612449565b50565b611ea76121a8565b60005b8251811015611f5157818181518110611ec657611ec561507b565b5b6020026020010151600b6000858481518110611ee557611ee461507b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f4990614772565b915050611eaa565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b611fd6612bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a906150f6565b60405180910390fd5b600061204e8261137e565b90508073ffffffffffffffffffffffffffffffffffffffff1661206f612bd0565b73ffffffffffffffffffffffffffffffffffffffff16141580156120a1575061209f8161209a612bd0565b611d37565b155b156120d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360009054906101000a900460ff161580156121135750600a600083815260200190815260200160002060009054906101000a900460ff16155b15612187576121378373ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e90615188565b60405180910390fd5b612182838383612bfb565b612193565b612192838383612bfb565b5b505050565b6121a3838383612cad565b505050565b6121b0612bd0565b73ffffffffffffffffffffffffffffffffffffffff166121ce61166e565b73ffffffffffffffffffffffffffffffffffffffff1614612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b906151f4565b60405180910390fd5b565b61224183838360405180602001604052806000815250611aff565b505050565b61224e61396e565b61225782611fc0565b612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d90615286565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106122fa5760017f0000000000000000000000000000000000000000000000000000000000000000846122ed91906152a6565b6122f79190614e00565b90505b60008390505b818110612408576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123f457809350505050612444565b508080612400906152da565b915050612300565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b90615375565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008261251a8584613264565b1490509392505050565b61253e8282604051806020016040528060008152506132ba565b5050565b61254a612bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae906150f6565b60405180910390fd5b600360009054906101000a900460ff1615801561261e5750600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561278e576126428273ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990615188565b60405180910390fd5b806009600061268f612bd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661273c612bd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127819190613a5c565b60405180910390a3612896565b806009600061279b612bd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612848612bd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161288d9190613a5c565b60405180910390a35b5050565b6128a5848484612cad565b6128b184848484613799565b6128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790615407565b60405180910390fd5b50505050565b60606011805461290590614583565b80601f016020809104026020016040519081016040528092919081815260200182805461293190614583565b801561297e5780601f106129535761010080835404028352916020019161297e565b820191906000526020600020905b81548152906001019060200180831161296157829003601f168201915b5050505050905090565b6060600082036129cf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae3565b600082905060005b60008214612a015780806129ea90614772565b915050600a826129fa9190615456565b91506129d7565b60008167ffffffffffffffff811115612a1d57612a1c614168565b5b6040519080825280601f01601f191660200182016040528015612a4f5781602001600182028036833780820191505090505b5090505b60008514612adc57600182612a6891906152a6565b9150600a85612a779190615487565b6030612a839190614e00565b60f81b818381518110612a9957612a9861507b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad59190615456565b9450612a53565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f9061552a565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612cb882612246565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612cdf612bd0565b73ffffffffffffffffffffffffffffffffffffffff161480612d3b5750612d04612bd0565b73ffffffffffffffffffffffffffffffffffffffff16612d2384610bfe565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d575750612d568260000151612d51612bd0565b611d37565b5b905080612d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d90906155bc565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e029061564e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e71906156e0565b60405180910390fd5b612e878585856001613920565b612e976000848460000151612bfb565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612f05919061571c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612fa99190615760565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846130af9190614e00565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036131f45761312481611fc0565b156131f3576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325c8686866001613926565b505050505050565b60008082905060005b84518110156132af5761329a8286838151811061328d5761328c61507b565b5b602002602001015161392c565b915080806132a790614772565b91505061326d565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332790615816565b60405180910390fd5b61333981611fc0565b15613379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337090615882565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d390615914565b60405180910390fd5b6133e96000858386613920565b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134e69190615760565b6fffffffffffffffffffffffffffffffff16815260200185836020015161350d9190615760565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561377c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461371c6000888488613799565b61375b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375290615407565b60405180910390fd5b818061376690614772565b925050808061377490614772565b9150506136ab565b50806001819055506137916000878588613926565b505050505050565b60006137ba8473ffffffffffffffffffffffffffffffffffffffff16612bd8565b15613913578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137e3612bd0565b8786866040518563ffffffff1660e01b81526004016138059493929190615989565b6020604051808303816000875af192505050801561384157506040513d601f19601f8201168201806040525081019061383e91906159ea565b60015b6138c3573d8060008114613871576040519150601f19603f3d011682016040523d82523d6000602084013e613876565b606091505b5060008151036138bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b290615407565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613918565b600190505b949350505050565b50505050565b50505050565b60008183106139445761393f8284613957565b61394f565b61394e8383613957565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139f1816139bc565b81146139fc57600080fd5b50565b600081359050613a0e816139e8565b92915050565b600060208284031215613a2a57613a296139b2565b5b6000613a38848285016139ff565b91505092915050565b60008115159050919050565b613a5681613a41565b82525050565b6000602082019050613a716000830184613a4d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ab1578082015181840152602081019050613a96565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ad982613a77565b613ae38185613a82565b9350613af3818560208601613a93565b613afc81613abd565b840191505092915050565b60006020820190508181036000830152613b218184613ace565b905092915050565b6000819050919050565b613b3c81613b29565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b600060208284031215613b7557613b746139b2565b5b6000613b8384828501613b4a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bb782613b8c565b9050919050565b613bc781613bac565b82525050565b6000602082019050613be26000830184613bbe565b92915050565b613bf181613bac565b8114613bfc57600080fd5b50565b600081359050613c0e81613be8565b92915050565b60008060408385031215613c2b57613c2a6139b2565b5b6000613c3985828601613bff565b9250506020613c4a85828601613b4a565b9150509250929050565b613c5d81613b29565b82525050565b6000602082019050613c786000830184613c54565b92915050565b600080600060608486031215613c9757613c966139b2565b5b6000613ca586828701613bff565b9350506020613cb686828701613bff565b9250506040613cc786828701613b4a565b9150509250925092565b6000819050919050565b613ce481613cd1565b82525050565b6000602082019050613cff6000830184613cdb565b92915050565b6000819050919050565b6000613d2a613d25613d2084613b8c565b613d05565b613b8c565b9050919050565b6000613d3c82613d0f565b9050919050565b6000613d4e82613d31565b9050919050565b613d5e81613d43565b82525050565b6000602082019050613d796000830184613d55565b92915050565b613d8881613a41565b8114613d9357600080fd5b50565b600081359050613da581613d7f565b92915050565b60008060408385031215613dc257613dc16139b2565b5b6000613dd085828601613b4a565b9250506020613de185828601613d96565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613e1057613e0f613deb565b5b8235905067ffffffffffffffff811115613e2d57613e2c613df0565b5b602083019150836001820283011115613e4957613e48613df5565b5b9250929050565b60008060208385031215613e6757613e666139b2565b5b600083013567ffffffffffffffff811115613e8557613e846139b7565b5b613e9185828601613dfa565b92509250509250929050565b613ea681613cd1565b8114613eb157600080fd5b50565b600081359050613ec381613e9d565b92915050565b600060208284031215613edf57613ede6139b2565b5b6000613eed84828501613eb4565b91505092915050565b600063ffffffff82169050919050565b613f0f81613ef6565b8114613f1a57600080fd5b50565b600081359050613f2c81613f06565b92915050565b600060208284031215613f4857613f476139b2565b5b6000613f5684828501613f1d565b91505092915050565b600060208284031215613f7557613f746139b2565b5b6000613f8384828501613bff565b91505092915050565b60008083601f840112613fa257613fa1613deb565b5b8235905067ffffffffffffffff811115613fbf57613fbe613df0565b5b602083019150836020820283011115613fdb57613fda613df5565b5b9250929050565b60008060208385031215613ff957613ff86139b2565b5b600083013567ffffffffffffffff811115614017576140166139b7565b5b61402385828601613f8c565b92509250509250929050565b61403881613ef6565b82525050565b6000604082019050614053600083018561402f565b6140606020830184613c54565b9392505050565b61407081613bac565b82525050565b600067ffffffffffffffff82169050919050565b61409381614076565b82525050565b6040820160008201516140af6000850182614067565b5060208201516140c2602085018261408a565b50505050565b60006040820190506140dd6000830184614099565b92915050565b600080604083850312156140fa576140f96139b2565b5b600061410885828601613bff565b925050602061411985828601613d96565b9150509250929050565b6000806040838503121561413a576141396139b2565b5b600061414885828601613f1d565b925050602061415985828601613b4a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141a082613abd565b810181811067ffffffffffffffff821117156141bf576141be614168565b5b80604052505050565b60006141d26139a8565b90506141de8282614197565b919050565b600067ffffffffffffffff8211156141fe576141fd614168565b5b61420782613abd565b9050602081019050919050565b82818337600083830152505050565b6000614236614231846141e3565b6141c8565b90508281526020810184848401111561425257614251614163565b5b61425d848285614214565b509392505050565b600082601f83011261427a57614279613deb565b5b813561428a848260208601614223565b91505092915050565b600080600080608085870312156142ad576142ac6139b2565b5b60006142bb87828801613bff565b94505060206142cc87828801613bff565b93505060406142dd87828801613b4a565b925050606085013567ffffffffffffffff8111156142fe576142fd6139b7565b5b61430a87828801614265565b91505092959194509250565b6000806040838503121561432d5761432c6139b2565b5b600061433b85828601613bff565b925050602061434c85828601613bff565b9150509250929050565b600067ffffffffffffffff82111561437157614370614168565b5b602082029050602081019050919050565b600061439561439084614356565b6141c8565b905080838252602082019050602084028301858111156143b8576143b7613df5565b5b835b818110156143e157806143cd8882613bff565b8452602084019350506020810190506143ba565b5050509392505050565b600082601f830112614400576143ff613deb565b5b8135614410848260208601614382565b91505092915050565b600067ffffffffffffffff82111561443457614433614168565b5b602082029050602081019050919050565b600061445861445384614419565b6141c8565b9050808382526020820190506020840283018581111561447b5761447a613df5565b5b835b818110156144a457806144908882613d96565b84526020840193505060208101905061447d565b5050509392505050565b600082601f8301126144c3576144c2613deb565b5b81356144d3848260208601614445565b91505092915050565b600080604083850312156144f3576144f26139b2565b5b600083013567ffffffffffffffff811115614511576145106139b7565b5b61451d858286016143eb565b925050602083013567ffffffffffffffff81111561453e5761453d6139b7565b5b61454a858286016144ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061459b57607f821691505b6020821081036145ae576145ad614554565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614610602d83613a82565b915061461b826145b4565b604082019050919050565b6000602082019050818103600083015261463f81614603565b9050919050565b600060408201905061465b6000830185613bbe565b6146686020830184613bbe565b9392505050565b60008151905061467e81613d7f565b92915050565b60006020828403121561469a576146996139b2565b5b60006146a88482850161466f565b91505092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061470d602283613a82565b9150614718826146b1565b604082019050919050565b6000602082019050818103600083015261473c81614700565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061477d82613b29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147af576147ae614743565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614816602e83613a82565b9150614821826147ba565b604082019050919050565b6000602082019050818103600083015261484581614809565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006148a8602383613a82565b91506148b38261484c565b604082019050919050565b600060208201905081810360008301526148d78161489b565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261494b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261490e565b614955868361490e565b95508019841693508086168417925050509392505050565b600061498861498361497e84613b29565b613d05565b613b29565b9050919050565b6000819050919050565b6149a28361496d565b6149b66149ae8261498f565b84845461491b565b825550505050565b600090565b6149cb6149be565b6149d6818484614999565b505050565b5b818110156149fa576149ef6000826149c3565b6001810190506149dc565b5050565b601f821115614a3f57614a10816148e9565b614a19846148fe565b81016020851015614a28578190505b614a3c614a34856148fe565b8301826149db565b50505b505050565b600082821c905092915050565b6000614a6260001984600802614a44565b1980831691505092915050565b6000614a7b8383614a51565b9150826002028217905092915050565b614a9583836148de565b67ffffffffffffffff811115614aae57614aad614168565b5b614ab88254614583565b614ac38282856149fe565b6000601f831160018114614af25760008415614ae0578287013590505b614aea8582614a6f565b865550614b52565b601f198416614b00866148e9565b60005b82811015614b2857848901358255600182019150602085019450602081019050614b03565b86831015614b455784890135614b41601f891682614a51565b8355505b6001600288020188555050505b50505050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614bb7602b83613a82565b9150614bc282614b5b565b604082019050919050565b60006020820190508181036000830152614be681614baa565b9050919050565b60008160601b9050919050565b6000614c0582614bed565b9050919050565b6000614c1782614bfa565b9050919050565b614c2f614c2a82613bac565b614c0c565b82525050565b6000614c418284614c1e565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614c86600e83613a82565b9150614c9182614c50565b602082019050919050565b60006020820190508181036000830152614cb581614c79565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614cf2601e83613a82565b9150614cfd82614cbc565b602082019050919050565b60006020820190508181036000830152614d2181614ce5565b9050919050565b7f73616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b6000614d5e601883613a82565b9150614d6982614d28565b602082019050919050565b60006020820190508181036000830152614d8d81614d51565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000614dca601283613a82565b9150614dd582614d94565b602082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b6000614e0b82613b29565b9150614e1683613b29565b9250828201905080821115614e2e57614e2d614743565b5b92915050565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b6000614e6a601683613a82565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614efc602f83613a82565b9150614f0782614ea0565b604082019050919050565b60006020820190508181036000830152614f2b81614eef565b9050919050565b600081905092915050565b6000614f4882613a77565b614f528185614f32565b9350614f62818560208601613a93565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614fa4600583614f32565b9150614faf82614f6e565b600582019050919050565b6000614fc68285614f3d565b9150614fd28284614f3d565b9150614fdd82614f97565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615045602683613a82565b915061505082614fe9565b604082019050919050565b6000602082019050818103600083015261507481615038565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006150e0601a83613a82565b91506150eb826150aa565b602082019050919050565b6000602082019050818103600083015261510f816150d3565b9050919050565b7f53616c65732077696c6c206265206f70656e6564206166746572206d696e742060008201527f697320636f6d706c6574652e0000000000000000000000000000000000000000602082015250565b6000615172602c83613a82565b915061517d82615116565b604082019050919050565b600060208201905081810360008301526151a181615165565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006151de602083613a82565b91506151e9826151a8565b602082019050919050565b6000602082019050818103600083015261520d816151d1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615270602a83613a82565b915061527b82615214565b604082019050919050565b6000602082019050818103600083015261529f81615263565b9050919050565b60006152b182613b29565b91506152bc83613b29565b92508282039050818111156152d4576152d3614743565b5b92915050565b60006152e582613b29565b9150600082036152f8576152f7614743565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061535f602f83613a82565b915061536a82615303565b604082019050919050565b6000602082019050818103600083015261538e81615352565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006153f1603383613a82565b91506153fc82615395565b604082019050919050565b60006020820190508181036000830152615420816153e4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061546182613b29565b915061546c83613b29565b92508261547c5761547b615427565b5b828204905092915050565b600061549282613b29565b915061549d83613b29565b9250826154ad576154ac615427565b5b828206905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000615514603183613a82565b915061551f826154b8565b604082019050919050565b6000602082019050818103600083015261554381615507565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006155a6603283613a82565b91506155b18261554a565b604082019050919050565b600060208201905081810360008301526155d581615599565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615638602683613a82565b9150615643826155dc565b604082019050919050565b600060208201905081810360008301526156678161562b565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156ca602583613a82565b91506156d58261566e565b604082019050919050565b600060208201905081810360008301526156f9816156bd565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061572782615700565b915061573283615700565b925082820390506fffffffffffffffffffffffffffffffff81111561575a57615759614743565b5b92915050565b600061576b82615700565b915061577683615700565b925082820190506fffffffffffffffffffffffffffffffff81111561579e5761579d614743565b5b92915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615800602183613a82565b915061580b826157a4565b604082019050919050565b6000602082019050818103600083015261582f816157f3565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b600061586c601d83613a82565b915061587782615836565b602082019050919050565b6000602082019050818103600083015261589b8161585f565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006158fe602283613a82565b9150615909826158a2565b604082019050919050565b6000602082019050818103600083015261592d816158f1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061595b82615934565b615965818561593f565b9350615975818560208601613a93565b61597e81613abd565b840191505092915050565b600060808201905061599e6000830187613bbe565b6159ab6020830186613bbe565b6159b86040830185613c54565b81810360608301526159ca8184615950565b905095945050505050565b6000815190506159e4816139e8565b92915050565b600060208284031215615a00576159ff6139b2565b5b6000615a0e848285016159d5565b9150509291505056fea26469706673582212201b893fc2e70676b0c93ebff142da8abf6a65c9df9297bc447a08b2f25e9256f764736f6c63430008100033000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000002710

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063b1f7f0eb116100b6578063d5abeb011161007a578063d5abeb0114610900578063d7224ba01461092b578063dc33e68114610956578063e985e9c514610993578063f2fde38b146109d0578063fdb8e34e146109f95761025c565b8063b1f7f0eb146107f7578063b758f90314610834578063b88d4fde1461085d578063c080519714610886578063c87b56dd146108c35761025c565b806390aa0b0f1161010857806390aa0b0f146106f35780639231ab2a1461071f57806395d89b411461075c5780639dfde201146107875780639fb17e34146107b2578063a22cb465146107ce5761025c565b8063715018a614610632578063801fe59b146106495780638942932d146106605780638bc35c2f1461069d5780638da5cb5b146106c85761025c565b806341f43434116101dd57806355a55465116101a157806355a554651461051457806355f804b31461053d5780636352211e1461056657806367ba5ecc146105a35780636f58ec48146105cc57806370a08231146105f55761025c565b806341f434341461042d57806342842e0e146104585780634aaf78f1146104815780634c0f38c2146104ac5780634f6ccce7146104d75761025c565b806323b872dd1161022457806323b872dd1461035a5780632a13614c146103835780632f745c59146103ae5780633ccfd60b146103eb5780633f5e4741146104025761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b31461030657806318160ddd1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a14565b610a22565b6040516102959190613a5c565b60405180910390f35b3480156102aa57600080fd5b506102b3610b6c565b6040516102c09190613b07565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613b5f565b610bfe565b6040516102fd9190613bcd565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613c14565b610c83565b005b34801561033b57600080fd5b50610344610d8d565b6040516103519190613c63565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613c7e565b610d97565b005b34801561038f57600080fd5b50610398610ee7565b6040516103a59190613cea565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613c14565b610eed565b6040516103e29190613c63565b60405180910390f35b3480156103f757600080fd5b506104006110e9565b005b34801561040e57600080fd5b5061041761110a565b6040516104249190613a5c565b60405180910390f35b34801561043957600080fd5b50610442611157565b60405161044f9190613d64565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613c7e565b611169565b005b34801561048d57600080fd5b506104966112b9565b6040516104a39190613a5c565b60405180910390f35b3480156104b857600080fd5b506104c16112cc565b6040516104ce9190613c63565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613b5f565b6112d6565b60405161050b9190613c63565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190613dab565b611329565b005b34801561054957600080fd5b50610564600480360381019061055f9190613e50565b611360565b005b34801561057257600080fd5b5061058d60048036038101906105889190613b5f565b61137e565b60405161059a9190613bcd565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613ec9565b611394565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613f32565b6113a6565b005b34801561060157600080fd5b5061061c60048036038101906106179190613f5f565b6113d5565b6040516106299190613c63565b60405180910390f35b34801561063e57600080fd5b506106476114bd565b005b34801561065557600080fd5b5061065e6114d1565b005b34801561066c57600080fd5b5061068760048036038101906106829190613fe2565b611505565b6040516106949190613a5c565b60405180910390f35b3480156106a957600080fd5b506106b261164a565b6040516106bf9190613c63565b60405180910390f35b3480156106d457600080fd5b506106dd61166e565b6040516106ea9190613bcd565b60405180910390f35b3480156106ff57600080fd5b50610708611697565b60405161071692919061403e565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613b5f565b6116b9565b60405161075391906140c8565b60405180910390f35b34801561076857600080fd5b506107716116d1565b60405161077e9190613b07565b60405180910390f35b34801561079357600080fd5b5061079c611763565b6040516107a99190613c63565b60405180910390f35b6107cc60048036038101906107c79190613b5f565b611768565b005b3480156107da57600080fd5b506107f560048036038101906107f091906140e3565b611978565b005b34801561080357600080fd5b5061081e60048036038101906108199190613f5f565b611a82565b60405161082b9190613a5c565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190614123565b611aa2565b005b34801561086957600080fd5b50610884600480360381019061087f9190614293565b611aff565b005b34801561089257600080fd5b506108ad60048036038101906108a89190613b5f565b611c52565b6040516108ba9190613a5c565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613b5f565b611c72565b6040516108f79190613b07565b60405180910390f35b34801561090c57600080fd5b50610915611d19565b6040516109229190613c63565b60405180910390f35b34801561093757600080fd5b50610940611d1f565b60405161094d9190613c63565b60405180910390f35b34801561096257600080fd5b5061097d60048036038101906109789190613f5f565b611d25565b60405161098a9190613c63565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190614316565b611d37565b6040516109c79190613a5c565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613f5f565b611e1c565b005b348015610a0557600080fd5b50610a206004803603810190610a1b91906144dc565b611e9f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b655750610b6482611f56565b5b9050919050565b606060048054610b7b90614583565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba790614583565b8015610bf45780601f10610bc957610100808354040283529160200191610bf4565b820191906000526020600020905b815481529060010190602001808311610bd757829003601f168201915b5050505050905090565b6000610c0982611fc0565b610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90614626565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d7e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610cfb929190614646565b602060405180830381865afa158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190614684565b610d7d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d749190613bcd565b60405180910390fd5b5b610d888383611fce565b505050565b6000600154905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ed5573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e0957610e04848484612198565b610ee1565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e52929190614646565b602060405180830381865afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190614684565b610ed457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ecb9190613bcd565b60405180910390fd5b5b610ee0848484612198565b5b50505050565b60025481565b6000610ef8836113d5565b8210610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3090614723565b60405180910390fd5b6000610f43610d8d565b905060008060005b838110156110a7576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461103d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611093578684036110845781955050505050506110e3565b838061108f90614772565b9450505b50808061109f90614772565b915050610f4b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da9061482c565b60405180910390fd5b92915050565b6110f16121a8565b3373ffffffffffffffffffffffffffffffffffffffff16ff5b600080600f60000160009054906101000a900463ffffffff1663ffffffff16141580156111525750600f60000160009054906101000a900463ffffffff1663ffffffff164210155b905090565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156112a7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111db576111d6848484612226565b6112b3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611224929190614646565b602060405180830381865afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112659190614684565b6112a657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161129d9190613bcd565b60405180910390fd5b5b6112b2848484612226565b5b50505050565b600360009054906101000a900460ff1681565b6000600e54905090565b60006112e0610d8d565b8210611321576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611318906148be565b60405180910390fd5b819050919050565b6113316121a8565b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6113686121a8565b818160119182611379929190614a8b565b505050565b600061138982612246565b600001519050919050565b61139c6121a8565b8060028190555050565b6113ae6121a8565b80600f60000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614bcd565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114c56121a8565b6114cf6000612449565b565b6114d96121a8565b600360009054906101000a900460ff1615600360006101000a81548160ff021916908315150217905550565b600080336040516020016115199190614c35565b6040516020818303038152906040528051906020012090506000326040516020016115449190614c35565b6040516020818303038152906040528051906020012090506115aa858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548461250d565b806115ff57506115fe858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548361250d565b5b61163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590614c9c565b60405180910390fd5b60019250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000a81565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f8060000160009054906101000a900463ffffffff16908060010154905082565b6116c161396e565b6116ca82612246565b9050919050565b6060600580546116e090614583565b80601f016020809104026020016040519081016040528092919081815260200182805461170c90614583565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b5050505050905090565b600081565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90614d08565b60405180910390fd5b6117de61110a565b61181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614d74565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a811115611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790614de0565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002710816118aa610d8d565b6118b49190614e00565b11156118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90614de0565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a8161192033611d25565b61192a9190614e00565b111561196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614e80565b60405180910390fd5b6119753382612524565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a73576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119f0929190614646565b602060405180830381865afa158015611a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a319190614684565b611a7257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a699190613bcd565b60405180910390fd5b5b611a7d8383612542565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b611aaa6121a8565b60405180604001604052808363ffffffff16815260200182815250600f60008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c3e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b7257611b6d8585858561289a565b611c4b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611bbb929190614646565b602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190614684565b611c3d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c349190613bcd565b60405180910390fd5b5b611c4a8585858561289a565b5b5050505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6060611c7d82611fc0565b611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614f12565b60405180910390fd5b6000611cc66128f6565b90506000815111611ce65760405180602001604052806000815250611d11565b80611cf084612988565b604051602001611d01929190614fba565b6040516020818303038152906040525b915050919050565b600e5481565b600c5481565b6000611d3082612ae8565b9050919050565b6000738b233383f3a6b8de1d0ad5f2ed0ad61aa1697ef673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d895760019050611e16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b92915050565b611e246121a8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a9061505b565b60405180910390fd5b611e9c81612449565b50565b611ea76121a8565b60005b8251811015611f5157818181518110611ec657611ec561507b565b5b6020026020010151600b6000858481518110611ee557611ee461507b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f4990614772565b915050611eaa565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b611fd6612bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a906150f6565b60405180910390fd5b600061204e8261137e565b90508073ffffffffffffffffffffffffffffffffffffffff1661206f612bd0565b73ffffffffffffffffffffffffffffffffffffffff16141580156120a1575061209f8161209a612bd0565b611d37565b155b156120d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360009054906101000a900460ff161580156121135750600a600083815260200190815260200160002060009054906101000a900460ff16155b15612187576121378373ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e90615188565b60405180910390fd5b612182838383612bfb565b612193565b612192838383612bfb565b5b505050565b6121a3838383612cad565b505050565b6121b0612bd0565b73ffffffffffffffffffffffffffffffffffffffff166121ce61166e565b73ffffffffffffffffffffffffffffffffffffffff1614612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b906151f4565b60405180910390fd5b565b61224183838360405180602001604052806000815250611aff565b505050565b61224e61396e565b61225782611fc0565b612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d90615286565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a83106122fa5760017f000000000000000000000000000000000000000000000000000000000000000a846122ed91906152a6565b6122f79190614e00565b90505b60008390505b818110612408576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123f457809350505050612444565b508080612400906152da565b915050612300565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b90615375565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008261251a8584613264565b1490509392505050565b61253e8282604051806020016040528060008152506132ba565b5050565b61254a612bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae906150f6565b60405180910390fd5b600360009054906101000a900460ff1615801561261e5750600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561278e576126428273ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990615188565b60405180910390fd5b806009600061268f612bd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661273c612bd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127819190613a5c565b60405180910390a3612896565b806009600061279b612bd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612848612bd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161288d9190613a5c565b60405180910390a35b5050565b6128a5848484612cad565b6128b184848484613799565b6128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790615407565b60405180910390fd5b50505050565b60606011805461290590614583565b80601f016020809104026020016040519081016040528092919081815260200182805461293190614583565b801561297e5780601f106129535761010080835404028352916020019161297e565b820191906000526020600020905b81548152906001019060200180831161296157829003601f168201915b5050505050905090565b6060600082036129cf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae3565b600082905060005b60008214612a015780806129ea90614772565b915050600a826129fa9190615456565b91506129d7565b60008167ffffffffffffffff811115612a1d57612a1c614168565b5b6040519080825280601f01601f191660200182016040528015612a4f5781602001600182028036833780820191505090505b5090505b60008514612adc57600182612a6891906152a6565b9150600a85612a779190615487565b6030612a839190614e00565b60f81b818381518110612a9957612a9861507b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad59190615456565b9450612a53565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f9061552a565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612cb882612246565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612cdf612bd0565b73ffffffffffffffffffffffffffffffffffffffff161480612d3b5750612d04612bd0565b73ffffffffffffffffffffffffffffffffffffffff16612d2384610bfe565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d575750612d568260000151612d51612bd0565b611d37565b5b905080612d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d90906155bc565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e029061564e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e71906156e0565b60405180910390fd5b612e878585856001613920565b612e976000848460000151612bfb565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612f05919061571c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612fa99190615760565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846130af9190614e00565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036131f45761312481611fc0565b156131f3576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325c8686866001613926565b505050505050565b60008082905060005b84518110156132af5761329a8286838151811061328d5761328c61507b565b5b602002602001015161392c565b915080806132a790614772565b91505061326d565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332790615816565b60405180910390fd5b61333981611fc0565b15613379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337090615882565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a8311156133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d390615914565b60405180910390fd5b6133e96000858386613920565b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134e69190615760565b6fffffffffffffffffffffffffffffffff16815260200185836020015161350d9190615760565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561377c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461371c6000888488613799565b61375b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375290615407565b60405180910390fd5b818061376690614772565b925050808061377490614772565b9150506136ab565b50806001819055506137916000878588613926565b505050505050565b60006137ba8473ffffffffffffffffffffffffffffffffffffffff16612bd8565b15613913578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137e3612bd0565b8786866040518563ffffffff1660e01b81526004016138059493929190615989565b6020604051808303816000875af192505050801561384157506040513d601f19601f8201168201806040525081019061383e91906159ea565b60015b6138c3573d8060008114613871576040519150601f19603f3d011682016040523d82523d6000602084013e613876565b606091505b5060008151036138bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b290615407565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613918565b600190505b949350505050565b50505050565b50505050565b60008183106139445761393f8284613957565b61394f565b61394e8383613957565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139f1816139bc565b81146139fc57600080fd5b50565b600081359050613a0e816139e8565b92915050565b600060208284031215613a2a57613a296139b2565b5b6000613a38848285016139ff565b91505092915050565b60008115159050919050565b613a5681613a41565b82525050565b6000602082019050613a716000830184613a4d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ab1578082015181840152602081019050613a96565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ad982613a77565b613ae38185613a82565b9350613af3818560208601613a93565b613afc81613abd565b840191505092915050565b60006020820190508181036000830152613b218184613ace565b905092915050565b6000819050919050565b613b3c81613b29565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b600060208284031215613b7557613b746139b2565b5b6000613b8384828501613b4a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bb782613b8c565b9050919050565b613bc781613bac565b82525050565b6000602082019050613be26000830184613bbe565b92915050565b613bf181613bac565b8114613bfc57600080fd5b50565b600081359050613c0e81613be8565b92915050565b60008060408385031215613c2b57613c2a6139b2565b5b6000613c3985828601613bff565b9250506020613c4a85828601613b4a565b9150509250929050565b613c5d81613b29565b82525050565b6000602082019050613c786000830184613c54565b92915050565b600080600060608486031215613c9757613c966139b2565b5b6000613ca586828701613bff565b9350506020613cb686828701613bff565b9250506040613cc786828701613b4a565b9150509250925092565b6000819050919050565b613ce481613cd1565b82525050565b6000602082019050613cff6000830184613cdb565b92915050565b6000819050919050565b6000613d2a613d25613d2084613b8c565b613d05565b613b8c565b9050919050565b6000613d3c82613d0f565b9050919050565b6000613d4e82613d31565b9050919050565b613d5e81613d43565b82525050565b6000602082019050613d796000830184613d55565b92915050565b613d8881613a41565b8114613d9357600080fd5b50565b600081359050613da581613d7f565b92915050565b60008060408385031215613dc257613dc16139b2565b5b6000613dd085828601613b4a565b9250506020613de185828601613d96565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613e1057613e0f613deb565b5b8235905067ffffffffffffffff811115613e2d57613e2c613df0565b5b602083019150836001820283011115613e4957613e48613df5565b5b9250929050565b60008060208385031215613e6757613e666139b2565b5b600083013567ffffffffffffffff811115613e8557613e846139b7565b5b613e9185828601613dfa565b92509250509250929050565b613ea681613cd1565b8114613eb157600080fd5b50565b600081359050613ec381613e9d565b92915050565b600060208284031215613edf57613ede6139b2565b5b6000613eed84828501613eb4565b91505092915050565b600063ffffffff82169050919050565b613f0f81613ef6565b8114613f1a57600080fd5b50565b600081359050613f2c81613f06565b92915050565b600060208284031215613f4857613f476139b2565b5b6000613f5684828501613f1d565b91505092915050565b600060208284031215613f7557613f746139b2565b5b6000613f8384828501613bff565b91505092915050565b60008083601f840112613fa257613fa1613deb565b5b8235905067ffffffffffffffff811115613fbf57613fbe613df0565b5b602083019150836020820283011115613fdb57613fda613df5565b5b9250929050565b60008060208385031215613ff957613ff86139b2565b5b600083013567ffffffffffffffff811115614017576140166139b7565b5b61402385828601613f8c565b92509250509250929050565b61403881613ef6565b82525050565b6000604082019050614053600083018561402f565b6140606020830184613c54565b9392505050565b61407081613bac565b82525050565b600067ffffffffffffffff82169050919050565b61409381614076565b82525050565b6040820160008201516140af6000850182614067565b5060208201516140c2602085018261408a565b50505050565b60006040820190506140dd6000830184614099565b92915050565b600080604083850312156140fa576140f96139b2565b5b600061410885828601613bff565b925050602061411985828601613d96565b9150509250929050565b6000806040838503121561413a576141396139b2565b5b600061414885828601613f1d565b925050602061415985828601613b4a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141a082613abd565b810181811067ffffffffffffffff821117156141bf576141be614168565b5b80604052505050565b60006141d26139a8565b90506141de8282614197565b919050565b600067ffffffffffffffff8211156141fe576141fd614168565b5b61420782613abd565b9050602081019050919050565b82818337600083830152505050565b6000614236614231846141e3565b6141c8565b90508281526020810184848401111561425257614251614163565b5b61425d848285614214565b509392505050565b600082601f83011261427a57614279613deb565b5b813561428a848260208601614223565b91505092915050565b600080600080608085870312156142ad576142ac6139b2565b5b60006142bb87828801613bff565b94505060206142cc87828801613bff565b93505060406142dd87828801613b4a565b925050606085013567ffffffffffffffff8111156142fe576142fd6139b7565b5b61430a87828801614265565b91505092959194509250565b6000806040838503121561432d5761432c6139b2565b5b600061433b85828601613bff565b925050602061434c85828601613bff565b9150509250929050565b600067ffffffffffffffff82111561437157614370614168565b5b602082029050602081019050919050565b600061439561439084614356565b6141c8565b905080838252602082019050602084028301858111156143b8576143b7613df5565b5b835b818110156143e157806143cd8882613bff565b8452602084019350506020810190506143ba565b5050509392505050565b600082601f830112614400576143ff613deb565b5b8135614410848260208601614382565b91505092915050565b600067ffffffffffffffff82111561443457614433614168565b5b602082029050602081019050919050565b600061445861445384614419565b6141c8565b9050808382526020820190506020840283018581111561447b5761447a613df5565b5b835b818110156144a457806144908882613d96565b84526020840193505060208101905061447d565b5050509392505050565b600082601f8301126144c3576144c2613deb565b5b81356144d3848260208601614445565b91505092915050565b600080604083850312156144f3576144f26139b2565b5b600083013567ffffffffffffffff811115614511576145106139b7565b5b61451d858286016143eb565b925050602083013567ffffffffffffffff81111561453e5761453d6139b7565b5b61454a858286016144ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061459b57607f821691505b6020821081036145ae576145ad614554565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614610602d83613a82565b915061461b826145b4565b604082019050919050565b6000602082019050818103600083015261463f81614603565b9050919050565b600060408201905061465b6000830185613bbe565b6146686020830184613bbe565b9392505050565b60008151905061467e81613d7f565b92915050565b60006020828403121561469a576146996139b2565b5b60006146a88482850161466f565b91505092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061470d602283613a82565b9150614718826146b1565b604082019050919050565b6000602082019050818103600083015261473c81614700565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061477d82613b29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147af576147ae614743565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614816602e83613a82565b9150614821826147ba565b604082019050919050565b6000602082019050818103600083015261484581614809565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006148a8602383613a82565b91506148b38261484c565b604082019050919050565b600060208201905081810360008301526148d78161489b565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261494b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261490e565b614955868361490e565b95508019841693508086168417925050509392505050565b600061498861498361497e84613b29565b613d05565b613b29565b9050919050565b6000819050919050565b6149a28361496d565b6149b66149ae8261498f565b84845461491b565b825550505050565b600090565b6149cb6149be565b6149d6818484614999565b505050565b5b818110156149fa576149ef6000826149c3565b6001810190506149dc565b5050565b601f821115614a3f57614a10816148e9565b614a19846148fe565b81016020851015614a28578190505b614a3c614a34856148fe565b8301826149db565b50505b505050565b600082821c905092915050565b6000614a6260001984600802614a44565b1980831691505092915050565b6000614a7b8383614a51565b9150826002028217905092915050565b614a9583836148de565b67ffffffffffffffff811115614aae57614aad614168565b5b614ab88254614583565b614ac38282856149fe565b6000601f831160018114614af25760008415614ae0578287013590505b614aea8582614a6f565b865550614b52565b601f198416614b00866148e9565b60005b82811015614b2857848901358255600182019150602085019450602081019050614b03565b86831015614b455784890135614b41601f891682614a51565b8355505b6001600288020188555050505b50505050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614bb7602b83613a82565b9150614bc282614b5b565b604082019050919050565b60006020820190508181036000830152614be681614baa565b9050919050565b60008160601b9050919050565b6000614c0582614bed565b9050919050565b6000614c1782614bfa565b9050919050565b614c2f614c2a82613bac565b614c0c565b82525050565b6000614c418284614c1e565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614c86600e83613a82565b9150614c9182614c50565b602082019050919050565b60006020820190508181036000830152614cb581614c79565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614cf2601e83613a82565b9150614cfd82614cbc565b602082019050919050565b60006020820190508181036000830152614d2181614ce5565b9050919050565b7f73616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b6000614d5e601883613a82565b9150614d6982614d28565b602082019050919050565b60006020820190508181036000830152614d8d81614d51565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000614dca601283613a82565b9150614dd582614d94565b602082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b6000614e0b82613b29565b9150614e1683613b29565b9250828201905080821115614e2e57614e2d614743565b5b92915050565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b6000614e6a601683613a82565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614efc602f83613a82565b9150614f0782614ea0565b604082019050919050565b60006020820190508181036000830152614f2b81614eef565b9050919050565b600081905092915050565b6000614f4882613a77565b614f528185614f32565b9350614f62818560208601613a93565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614fa4600583614f32565b9150614faf82614f6e565b600582019050919050565b6000614fc68285614f3d565b9150614fd28284614f3d565b9150614fdd82614f97565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615045602683613a82565b915061505082614fe9565b604082019050919050565b6000602082019050818103600083015261507481615038565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006150e0601a83613a82565b91506150eb826150aa565b602082019050919050565b6000602082019050818103600083015261510f816150d3565b9050919050565b7f53616c65732077696c6c206265206f70656e6564206166746572206d696e742060008201527f697320636f6d706c6574652e0000000000000000000000000000000000000000602082015250565b6000615172602c83613a82565b915061517d82615116565b604082019050919050565b600060208201905081810360008301526151a181615165565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006151de602083613a82565b91506151e9826151a8565b602082019050919050565b6000602082019050818103600083015261520d816151d1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615270602a83613a82565b915061527b82615214565b604082019050919050565b6000602082019050818103600083015261529f81615263565b9050919050565b60006152b182613b29565b91506152bc83613b29565b92508282039050818111156152d4576152d3614743565b5b92915050565b60006152e582613b29565b9150600082036152f8576152f7614743565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061535f602f83613a82565b915061536a82615303565b604082019050919050565b6000602082019050818103600083015261538e81615352565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006153f1603383613a82565b91506153fc82615395565b604082019050919050565b60006020820190508181036000830152615420816153e4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061546182613b29565b915061546c83613b29565b92508261547c5761547b615427565b5b828204905092915050565b600061549282613b29565b915061549d83613b29565b9250826154ad576154ac615427565b5b828206905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000615514603183613a82565b915061551f826154b8565b604082019050919050565b6000602082019050818103600083015261554381615507565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006155a6603283613a82565b91506155b18261554a565b604082019050919050565b600060208201905081810360008301526155d581615599565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615638602683613a82565b9150615643826155dc565b604082019050919050565b600060208201905081810360008301526156678161562b565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156ca602583613a82565b91506156d58261566e565b604082019050919050565b600060208201905081810360008301526156f9816156bd565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061572782615700565b915061573283615700565b925082820390506fffffffffffffffffffffffffffffffff81111561575a57615759614743565b5b92915050565b600061576b82615700565b915061577683615700565b925082820190506fffffffffffffffffffffffffffffffff81111561579e5761579d614743565b5b92915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615800602183613a82565b915061580b826157a4565b604082019050919050565b6000602082019050818103600083015261582f816157f3565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b600061586c601d83613a82565b915061587782615836565b602082019050919050565b6000602082019050818103600083015261589b8161585f565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006158fe602283613a82565b9150615909826158a2565b604082019050919050565b6000602082019050818103600083015261592d816158f1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061595b82615934565b615965818561593f565b9350615975818560208601613a93565b61597e81613abd565b840191505092915050565b600060808201905061599e6000830187613bbe565b6159ab6020830186613bbe565b6159b86040830185613c54565b81810360608301526159ca8184615950565b905095945050505050565b6000815190506159e4816139e8565b92915050565b600060208284031215615a00576159ff6139b2565b5b6000615a0e848285016159d5565b9150509291505056fea26469706673582212201b893fc2e70676b0c93ebff142da8abf6a65c9df9297bc447a08b2f25e9256f764736f6c63430008100033

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

000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000002710

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 10
Arg [1] : collectionSize_ (uint256): 10000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710


Deployed Bytecode Sourcemap

60359:3221:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46086:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47812:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50712:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61159:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44647:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61324:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42603:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45278:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63003:87;;;;;;;;;;;;;:::i;:::-;;62459:163;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2922:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61495:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42805:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61908:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44810:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48975:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63210:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47635:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49368:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62850:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46512:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40745:103;;;;;;;;;;;;;:::i;:::-;;48861:106;;;;;;;;;;;;;:::i;:::-;;49506:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60455:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40097:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60620:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63429:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47967:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62628:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61995:458;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60975:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43818:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62674:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61674:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43668:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48128:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60508:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56944:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63316:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51759:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41003:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49123:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46086:370;46213:4;46258:25;46243:40;;;:11;:40;;;;:99;;;;46309:33;46294:48;;;:11;:48;;;;46243:99;:160;;;;46368:35;46353:50;;;:11;:50;;;;46243:160;:207;;;;46414:36;46438:11;46414:23;:36::i;:::-;46243:207;46229:221;;46086:370;;;:::o;47812:94::-;47866:13;47895:5;47888:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47812:94;:::o;50712:204::-;50780:7;50804:16;50812:7;50804;:16::i;:::-;50796:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50886:15;:24;50902:7;50886:24;;;;;;;;;;;;;;;;;;;;;50879:31;;50712:204;;;:::o;61159:157::-;61255:8;4964:1;3022:42;4916:45;;;:49;4912:225;;;3022:42;4987;;;5038:4;5045:8;4987:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4982:144;;5101:8;5082:28;;;;;;;;;;;:::i;:::-;;;;;;;;4982:144;4912:225;61276:32:::1;61290:8;61300:7;61276:13;:32::i;:::-;61159:157:::0;;;:::o;44647:94::-;44700:7;44723:12;;44716:19;;44647:94;:::o;61324:163::-;61425:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61442:37:::1;61461:4;61467:2;61471:7;61442:18;:37::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61442:37:::1;61461:4;61467:2;61471:7;61442:18;:37::i;:::-;61324:163:::0;;;;;:::o;42603:38::-;;;;:::o;45278:744::-;45387:7;45422:16;45432:5;45422:9;:16::i;:::-;45414:5;:24;45406:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45484:22;45509:13;:11;:13::i;:::-;45484:38;;45529:19;45559:25;45609:9;45604:350;45628:14;45624:1;:18;45604:350;;;45658:31;45692:11;:14;45704:1;45692:14;;;;;;;;;;;45658:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45745:1;45719:28;;:9;:14;;;:28;;;45715:89;;45780:9;:14;;;45760:34;;45715:89;45837:5;45816:26;;:17;:26;;;45812:135;;45874:5;45859:11;:20;45855:59;;45901:1;45894:8;;;;;;;;;45855:59;45924:13;;;;;:::i;:::-;;;;45812:135;45649:305;45644:3;;;;;:::i;:::-;;;;45604:350;;;;45960:56;;;;;;;;;;:::i;:::-;;;;;;;;45278:744;;;;;:::o;63003:87::-;39983:13;:11;:13::i;:::-;63072:10:::1;63051:33;;;62459:163:::0;62506:4;62561:1;62533:10;:24;;;;;;;;;;;;:29;;;;:83;;;;;62592:10;:24;;;;;;;;;;;;62573:43;;:15;:43;;62533:83;62519:97;;62459:163;:::o;2922:143::-;3022:42;2922:143;:::o;61495:171::-;61600:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61617:41:::1;61640:4;61646:2;61650:7;61617:22;:41::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61617:41:::1;61640:4;61646:2;61650:7;61617:22;:41::i;:::-;61495:171:::0;;;;;:::o;42805:37::-;;;;;;;;;;;;;:::o;61908:81::-;61952:7;61974:9;;61967:16;;61908:81;:::o;44810:177::-;44877:7;44909:13;:11;:13::i;:::-;44901:5;:21;44893:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44976:5;44969:12;;44810:177;;;:::o;48975:140::-;39983:13;:11;:13::i;:::-;49101:6:::1;49069:19;:29;49089:8;49069:29;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;48975:140:::0;;:::o;63210:100::-;39983:13;:11;:13::i;:::-;63297:7:::1;;63281:13;:23;;;;;;;:::i;:::-;;63210:100:::0;;:::o;47635:118::-;47699:7;47722:20;47734:7;47722:11;:20::i;:::-;:25;;;47715:32;;47635:118;;;:::o;49368:130::-;39983:13;:11;:13::i;:::-;49479:11:::1;49453:23;:37;;;;49368:130:::0;:::o;62850:112::-;39983:13;:11;:13::i;:::-;62947:9:::1;62920:10;:24;;;:36;;;;;;;;;;;;;;;;;;62850:112:::0;:::o;46512:211::-;46576:7;46617:1;46600:19;;:5;:19;;;46592:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;46689:12;:19;46702:5;46689:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;46681:36;;46674:43;;46512:211;;;:::o;40745:103::-;39983:13;:11;:13::i;:::-;40810:30:::1;40837:1;40810:18;:30::i;:::-;40745:103::o:0;48861:106::-;39983:13;:11;:13::i;:::-;48942:17:::1;;;;;;;;;;;48941:18;48921:17;;:38;;;;;;;;;;;;;;;;;;48861:106::o:0;49506:415::-;49586:4;49603:12;49645:10;49628:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49618:39;;;;;;49603:54;;49668:13;49711:9;49694:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49684:38;;;;;;49668:54;;49741:63;49760:12;;49741:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49774:23;;49799:4;49741:18;:63::i;:::-;:131;;;;49808:64;49827:12;;49808:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49841:23;;49866:5;49808:18;:64::i;:::-;49741:131;49733:158;;;;;;;;;;;;:::i;:::-;;;;;;;;;49909:4;49902:11;;;;49506:415;;;;:::o;60455:48::-;;;:::o;40097:87::-;40143:7;40170:6;;;;;;;;;;;40163:13;;40097:87;:::o;60620:28::-;;;;;;;;;;;;;;;;;;;;;;;:::o;63429:147::-;63510:21;;:::i;:::-;63550:20;63562:7;63550:11;:20::i;:::-;63543:27;;63429:147;;;:::o;47967:98::-;48023:13;48052:7;48045:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47967:98;:::o;62628:39::-;62660:7;62628:39;:::o;61995:458::-;60908:10;60895:23;;:9;:23;;;60887:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62082:16:::1;:14;:16::i;:::-;62074:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;62153:23;62141:8;:35;;62133:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62242:14;62230:8;62214:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;62206:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62346:23;62334:8;62307:24;62320:10;62307:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;62291:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;62416:31;62426:10;62438:8;62416:9;:31::i;:::-;61995:458:::0;:::o;60975:176::-;61079:8;4964:1;3022:42;4916:45;;;:49;4912:225;;;3022:42;4987;;;5038:4;5045:8;4987:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4982:144;;5101:8;5082:28;;;;;;;;;;;:::i;:::-;;;;;;;;4982:144;4912:225;61100:43:::1;61124:8;61134;61100:23;:43::i;:::-;60975:176:::0;;;:::o;43818:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;62674:170::-;39983:13;:11;:13::i;:::-;62789:49:::1;;;;;;;;62806:13;62789:49;;;;;;62826:5;62789:49;;::::0;62776:10:::1;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62674:170:::0;;:::o;61674:228::-;61825:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61847:47:::1;61870:4;61876:2;61880:7;61889:4;61847:22;:47::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61847:47:::1;61870:4;61876:2;61880:7;61889:4;61847:22;:47::i;:::-;61674:228:::0;;;;;;:::o;43668:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;48128:401::-;48226:13;48267:16;48275:7;48267;:16::i;:::-;48251:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;48357:21;48381:10;:8;:10::i;:::-;48357:34;;48436:1;48418:7;48412:21;:25;:111;;;;;;;;;;;;;;;;;48473:7;48481:18;:7;:16;:18::i;:::-;48456:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48412:111;48398:125;;;48128:401;;;:::o;60508:28::-;;;;:::o;56944:43::-;;;;:::o;63316:107::-;63374:7;63397:20;63411:5;63397:13;:20::i;:::-;63390:27;;63316:107;;;:::o;51759:262::-;51881:4;51910:42;51900:52;;:8;:52;;;51897:70;;51961:4;51954:11;;;;51897:70;51980:18;:25;51999:5;51980:25;;;;;;;;;;;;;;;:35;52006:8;51980:35;;;;;;;;;;;;;;;;;;;;;;;;;51973:42;;51759:262;;;;;:::o;41003:201::-;39983:13;:11;:13::i;:::-;41112:1:::1;41092:22;;:8;:22;;::::0;41084:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41168:28;41187:8;41168:18;:28::i;:::-;41003:201:::0;:::o;49123:237::-;39983:13;:11;:13::i;:::-;49240:9:::1;49235:118;49259:8;:15;49255:1;:19;49235:118;;;49334:6;49341:1;49334:9;;;;;;;;:::i;:::-;;;;;;;;49292:26;:39;49319:8;49328:1;49319:11;;;;;;;;:::i;:::-;;;;;;;;49292:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;49276:3;;;;;:::i;:::-;;;;49235:118;;;;49123:237:::0;;:::o;17057:157::-;17142:4;17181:25;17166:40;;;:11;:40;;;;17159:47;;17057:157;;;:::o;53079:105::-;53136:4;53166:12;;53156:7;:22;53149:29;;53079:105;;;:::o;49977:677::-;50072:12;:10;:12::i;:::-;50066:18;;:2;:18;;;50058:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50126:13;50142:24;50158:7;50142:15;:24::i;:::-;50126:40;;50197:5;50181:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;50207:37;50224:5;50231:12;:10;:12::i;:::-;50207:16;:37::i;:::-;50206:38;50181:63;50177:138;;;50268:35;;;;;;;;;;;;;;50177:138;50329:17;;;;;;;;;;;50328:18;:51;;;;;50351:19;:28;50371:7;50351:28;;;;;;;;;;;;;;;;;;;;;50350:29;50328:51;50325:322;;;50399:15;:2;:13;;;:15::i;:::-;50395:180;;;50435:55;;;;;;;;;;:::i;:::-;;;;;;;;50395:180;50531:28;50540:2;50544:7;50553:5;50531:8;:28::i;:::-;50325:322;;;50607:28;50616:2;50620:7;50629:5;50607:8;:28::i;:::-;50325:322;50047:607;49977:677;;:::o;52080:150::-;52196:28;52206:4;52212:2;52216:7;52196:9;:28::i;:::-;52080:150;;;:::o;40262:132::-;40337:12;:10;:12::i;:::-;40326:23;;:7;:5;:7::i;:::-;:23;;;40318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40262:132::o;52293:165::-;52413:39;52430:4;52436:2;52440:7;52413:39;;;;;;;;;;;;:16;:39::i;:::-;52293:165;;;:::o;46975:606::-;47051:21;;:::i;:::-;47092:16;47100:7;47092;:16::i;:::-;47084:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47164:26;47212:12;47201:7;:23;47197:93;;47281:1;47266:12;47256:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;47235:47;;47197:93;47303:12;47318:7;47303:22;;47298:212;47335:18;47327:4;:26;47298:212;;47372:31;47406:11;:17;47418:4;47406:17;;;;;;;;;;;47372:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47462:1;47436:28;;:9;:14;;;:28;;;47432:71;;47484:9;47477:16;;;;;;;47432:71;47363:147;47355:6;;;;;:::i;:::-;;;;47298:212;;;;47518:57;;;;;;;;;;:::i;:::-;;;;;;;;46975:606;;;;:::o;41364:191::-;41438:16;41457:6;;;;;;;;;;;41438:25;;41483:8;41474:6;;:17;;;;;;;;;;;;;;;;;;41538:8;41507:40;;41528:8;41507:40;;;;;;;;;;;;41427:128;41364:191;:::o;25207:190::-;25332:4;25385;25356:25;25369:5;25376:4;25356:12;:25::i;:::-;:33;25349:40;;25207:190;;;;;:::o;53190:98::-;53255:27;53265:2;53269:8;53255:27;;;;;;;;;;;;:9;:27::i;:::-;53190:98;;:::o;50982:714::-;51097:12;:10;:12::i;:::-;51085:24;;:8;:24;;;51077:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51165:17;;;;;;;;;;;51164:18;:61;;;;;51187:26;:38;51214:10;51187:38;;;;;;;;;;;;;;;;;;;;;;;;;51186:39;51164:61;51161:528;;;51245:21;:8;:19;;;:21::i;:::-;51241:283;;;51287:55;;;;;;;;;;:::i;:::-;;;;;;;;51241:283;51428:8;51383:18;:32;51402:12;:10;:12::i;:::-;51383:32;;;;;;;;;;;;;;;:42;51416:8;51383:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51489:8;51460:48;;51475:12;:10;:12::i;:::-;51460:48;;;51499:8;51460:48;;;;;;:::i;:::-;;;;;;;;51161:528;;;51601:8;51556:18;:32;51575:12;:10;:12::i;:::-;51556:32;;;;;;;;;;;;;;;:42;51589:8;51556:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51658:8;51629:48;;51644:12;:10;:12::i;:::-;51629:48;;;51668:8;51629:48;;;;;;:::i;:::-;;;;;;;;51161:528;50982:714;;:::o;52521:319::-;52666:28;52676:4;52682:2;52686:7;52666:9;:28::i;:::-;52717:48;52740:4;52746:2;52750:7;52759:5;52717:22;:48::i;:::-;52701:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;52521:319;;;;:::o;63096:108::-;63156:13;63185;63178:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63096:108;:::o;33143:723::-;33199:13;33429:1;33420:5;:10;33416:53;;33447:10;;;;;;;;;;;;;;;;;;;;;33416:53;33479:12;33494:5;33479:20;;33510:14;33535:78;33550:1;33542:4;:9;33535:78;;33568:8;;;;;:::i;:::-;;;;33599:2;33591:10;;;;;:::i;:::-;;;33535:78;;;33623:19;33655:6;33645:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33623:39;;33673:154;33689:1;33680:5;:10;33673:154;;33717:1;33707:11;;;;;:::i;:::-;;;33784:2;33776:5;:10;;;;:::i;:::-;33763:2;:24;;;;:::i;:::-;33750:39;;33733:6;33740;33733:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;33813:2;33804:11;;;;;:::i;:::-;;;33673:154;;;33851:6;33837:21;;;;;33143:723;;;;:::o;46729:240::-;46790:7;46839:1;46822:19;;:5;:19;;;46806:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;46930:12;:19;46943:5;46930:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;46922:41;;46915:48;;46729:240;;;:::o;38648:98::-;38701:7;38728:10;38721:17;;38648:98;:::o;6901:326::-;6961:4;7218:1;7196:7;:19;;;:23;7189:30;;6901:326;;;:::o;56766:172::-;56890:2;56863:15;:24;56879:7;56863:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56924:7;56920:2;56904:28;;56913:5;56904:28;;;;;;;;;;;;56766:172;;;:::o;55131:1529::-;55228:35;55266:20;55278:7;55266:11;:20::i;:::-;55228:58;;55295:22;55337:13;:18;;;55321:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;55390:12;:10;:12::i;:::-;55366:36;;:20;55378:7;55366:11;:20::i;:::-;:36;;;55321:81;:142;;;;55413:50;55430:13;:18;;;55450:12;:10;:12::i;:::-;55413:16;:50::i;:::-;55321:142;55295:169;;55489:17;55473:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;55621:4;55599:26;;:13;:18;;;:26;;;55583:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;55710:1;55696:16;;:2;:16;;;55688:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55763:43;55785:4;55791:2;55795:7;55804:1;55763:21;:43::i;:::-;55863:49;55880:1;55884:7;55893:13;:18;;;55863:8;:49::i;:::-;55951:1;55921:12;:18;55934:4;55921:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55987:1;55959:12;:16;55972:2;55959:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56018:43;;;;;;;;56033:2;56018:43;;;;;;56044:15;56018:43;;;;;55995:11;:20;56007:7;55995:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56289:19;56321:1;56311:7;:11;;;;:::i;:::-;56289:33;;56374:1;56333:43;;:11;:24;56345:11;56333:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;56329:236;;56391:20;56399:11;56391:7;:20::i;:::-;56387:171;;;56451:97;;;;;;;;56478:13;:18;;;56451:97;;;;;;56509:13;:28;;;56451:97;;;;;56424:11;:24;56436:11;56424:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56387:171;56329:236;56597:7;56593:2;56578:27;;56587:4;56578:27;;;;;;;;;;;;56612:42;56633:4;56639:2;56643:7;56652:1;56612:20;:42::i;:::-;55221:1439;;;55131:1529;;;:::o;26074:296::-;26157:7;26177:20;26200:4;26177:27;;26220:9;26215:118;26239:5;:12;26235:1;:16;26215:118;;;26288:33;26298:12;26312:5;26318:1;26312:8;;;;;;;;:::i;:::-;;;;;;;;26288:9;:33::i;:::-;26273:48;;26253:3;;;;;:::i;:::-;;;;26215:118;;;;26350:12;26343:19;;;26074:296;;;;:::o;53627:1272::-;53732:20;53755:12;;53732:35;;53796:1;53782:16;;:2;:16;;;53774:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53973:21;53981:12;53973:7;:21::i;:::-;53972:22;53964:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54055:12;54043:8;:24;;54035:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54115:61;54145:1;54149:2;54153:12;54167:8;54115:21;:61::i;:::-;54185:30;54218:12;:16;54231:2;54218:16;;;;;;;;;;;;;;;54185:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54260:119;;;;;;;;54310:8;54280:11;:19;;;:39;;;;:::i;:::-;54260:119;;;;;;54363:8;54328:11;:24;;;:44;;;;:::i;:::-;54260:119;;;;;54241:12;:16;54254:2;54241:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54414:43;;;;;;;;54429:2;54414:43;;;;;;54440:15;54414:43;;;;;54386:11;:25;54398:12;54386:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54466:20;54489:12;54466:35;;54515:9;54510:281;54534:8;54530:1;:12;54510:281;;;54588:12;54584:2;54563:38;;54580:1;54563:38;;;;;;;;;;;;54628:59;54659:1;54663:2;54667:12;54681:5;54628:22;:59::i;:::-;54610:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;54769:14;;;;;:::i;:::-;;;;54544:3;;;;;:::i;:::-;;;;54510:281;;;;54814:12;54799;:27;;;;54833:60;54862:1;54866:2;54870:12;54884:8;54833:20;:60::i;:::-;53725:1174;;;53627:1272;;;:::o;58481:690::-;58618:4;58635:15;:2;:13;;;:15::i;:::-;58631:535;;;58690:2;58674:36;;;58711:12;:10;:12::i;:::-;58725:4;58731:7;58740:5;58674:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58661:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58922:1;58905:6;:13;:18;58901:215;;58938:61;;;;;;;;;;:::i;:::-;;;;;;;;58901:215;59084:6;59078:13;59069:6;59065:2;59061:15;59054:38;58661:464;58806:45;;;58796:55;;;:6;:55;;;;58789:62;;;;;58631:535;59154:4;59147:11;;58481:690;;;;;;;:::o;59633:141::-;;;;;:::o;60160:140::-;;;;;:::o;32281:149::-;32344:7;32375:1;32371;:5;:51;;32402:20;32417:1;32420;32402:14;:20::i;:::-;32371:51;;;32379:20;32394:1;32397;32379:14;:20::i;:::-;32371:51;32364:58;;32281:149;;;;:::o;32438:268::-;32506:13;32613:1;32607:4;32600:15;32642:1;32636:4;32629:15;32683:4;32677;32667:21;32658:30;;32438:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:60::-;6330:3;6351:5;6344:12;;6302:60;;;:::o;6368:142::-;6418:9;6451:53;6469:34;6478:24;6496:5;6478:24;:::i;:::-;6469:34;:::i;:::-;6451:53;:::i;:::-;6438:66;;6368:142;;;:::o;6516:126::-;6566:9;6599:37;6630:5;6599:37;:::i;:::-;6586:50;;6516:126;;;:::o;6648:157::-;6729:9;6762:37;6793:5;6762:37;:::i;:::-;6749:50;;6648:157;;;:::o;6811:193::-;6929:68;6991:5;6929:68;:::i;:::-;6924:3;6917:81;6811:193;;:::o;7010:284::-;7134:4;7172:2;7161:9;7157:18;7149:26;;7185:102;7284:1;7273:9;7269:17;7260:6;7185:102;:::i;:::-;7010:284;;;;:::o;7300:116::-;7370:21;7385:5;7370:21;:::i;:::-;7363:5;7360:32;7350:60;;7406:1;7403;7396:12;7350:60;7300:116;:::o;7422:133::-;7465:5;7503:6;7490:20;7481:29;;7519:30;7543:5;7519:30;:::i;:::-;7422:133;;;;:::o;7561:468::-;7626:6;7634;7683:2;7671:9;7662:7;7658:23;7654:32;7651:119;;;7689:79;;:::i;:::-;7651:119;7809:1;7834:53;7879:7;7870:6;7859:9;7855:22;7834:53;:::i;:::-;7824:63;;7780:117;7936:2;7962:50;8004:7;7995:6;7984:9;7980:22;7962:50;:::i;:::-;7952:60;;7907:115;7561:468;;;;;:::o;8035:117::-;8144:1;8141;8134:12;8158:117;8267:1;8264;8257:12;8281:117;8390:1;8387;8380:12;8418:553;8476:8;8486:6;8536:3;8529:4;8521:6;8517:17;8513:27;8503:122;;8544:79;;:::i;:::-;8503:122;8657:6;8644:20;8634:30;;8687:18;8679:6;8676:30;8673:117;;;8709:79;;:::i;:::-;8673:117;8823:4;8815:6;8811:17;8799:29;;8877:3;8869:4;8861:6;8857:17;8847:8;8843:32;8840:41;8837:128;;;8884:79;;:::i;:::-;8837:128;8418:553;;;;;:::o;8977:529::-;9048:6;9056;9105:2;9093:9;9084:7;9080:23;9076:32;9073:119;;;9111:79;;:::i;:::-;9073:119;9259:1;9248:9;9244:17;9231:31;9289:18;9281:6;9278:30;9275:117;;;9311:79;;:::i;:::-;9275:117;9424:65;9481:7;9472:6;9461:9;9457:22;9424:65;:::i;:::-;9406:83;;;;9202:297;8977:529;;;;;:::o;9512:122::-;9585:24;9603:5;9585:24;:::i;:::-;9578:5;9575:35;9565:63;;9624:1;9621;9614:12;9565:63;9512:122;:::o;9640:139::-;9686:5;9724:6;9711:20;9702:29;;9740:33;9767:5;9740:33;:::i;:::-;9640:139;;;;:::o;9785:329::-;9844:6;9893:2;9881:9;9872:7;9868:23;9864:32;9861:119;;;9899:79;;:::i;:::-;9861:119;10019:1;10044:53;10089:7;10080:6;10069:9;10065:22;10044:53;:::i;:::-;10034:63;;9990:117;9785:329;;;;:::o;10120:93::-;10156:7;10196:10;10189:5;10185:22;10174:33;;10120:93;;;:::o;10219:120::-;10291:23;10308:5;10291:23;:::i;:::-;10284:5;10281:34;10271:62;;10329:1;10326;10319:12;10271:62;10219:120;:::o;10345:137::-;10390:5;10428:6;10415:20;10406:29;;10444:32;10470:5;10444:32;:::i;:::-;10345:137;;;;:::o;10488:327::-;10546:6;10595:2;10583:9;10574:7;10570:23;10566:32;10563:119;;;10601:79;;:::i;:::-;10563:119;10721:1;10746:52;10790:7;10781:6;10770:9;10766:22;10746:52;:::i;:::-;10736:62;;10692:116;10488:327;;;;:::o;10821:329::-;10880:6;10929:2;10917:9;10908:7;10904:23;10900:32;10897:119;;;10935:79;;:::i;:::-;10897:119;11055:1;11080:53;11125:7;11116:6;11105:9;11101:22;11080:53;:::i;:::-;11070:63;;11026:117;10821:329;;;;:::o;11173:568::-;11246:8;11256:6;11306:3;11299:4;11291:6;11287:17;11283:27;11273:122;;11314:79;;:::i;:::-;11273:122;11427:6;11414:20;11404:30;;11457:18;11449:6;11446:30;11443:117;;;11479:79;;:::i;:::-;11443:117;11593:4;11585:6;11581:17;11569:29;;11647:3;11639:4;11631:6;11627:17;11617:8;11613:32;11610:41;11607:128;;;11654:79;;:::i;:::-;11607:128;11173:568;;;;;:::o;11747:559::-;11833:6;11841;11890:2;11878:9;11869:7;11865:23;11861:32;11858:119;;;11896:79;;:::i;:::-;11858:119;12044:1;12033:9;12029:17;12016:31;12074:18;12066:6;12063:30;12060:117;;;12096:79;;:::i;:::-;12060:117;12209:80;12281:7;12272:6;12261:9;12257:22;12209:80;:::i;:::-;12191:98;;;;11987:312;11747:559;;;;;:::o;12312:115::-;12397:23;12414:5;12397:23;:::i;:::-;12392:3;12385:36;12312:115;;:::o;12433:328::-;12552:4;12590:2;12579:9;12575:18;12567:26;;12603:69;12669:1;12658:9;12654:17;12645:6;12603:69;:::i;:::-;12682:72;12750:2;12739:9;12735:18;12726:6;12682:72;:::i;:::-;12433:328;;;;;:::o;12767:108::-;12844:24;12862:5;12844:24;:::i;:::-;12839:3;12832:37;12767:108;;:::o;12881:101::-;12917:7;12957:18;12950:5;12946:30;12935:41;;12881:101;;;:::o;12988:105::-;13063:23;13080:5;13063:23;:::i;:::-;13058:3;13051:36;12988:105;;:::o;13169:529::-;13330:4;13325:3;13321:14;13417:4;13410:5;13406:16;13400:23;13436:63;13493:4;13488:3;13484:14;13470:12;13436:63;:::i;:::-;13345:164;13601:4;13594:5;13590:16;13584:23;13620:61;13675:4;13670:3;13666:14;13652:12;13620:61;:::i;:::-;13519:172;13299:399;13169:529;;:::o;13704:350::-;13861:4;13899:2;13888:9;13884:18;13876:26;;13912:135;14044:1;14033:9;14029:17;14020:6;13912:135;:::i;:::-;13704:350;;;;:::o;14060:468::-;14125:6;14133;14182:2;14170:9;14161:7;14157:23;14153:32;14150:119;;;14188:79;;:::i;:::-;14150:119;14308:1;14333:53;14378:7;14369:6;14358:9;14354:22;14333:53;:::i;:::-;14323:63;;14279:117;14435:2;14461:50;14503:7;14494:6;14483:9;14479:22;14461:50;:::i;:::-;14451:60;;14406:115;14060:468;;;;;:::o;14534:472::-;14601:6;14609;14658:2;14646:9;14637:7;14633:23;14629:32;14626:119;;;14664:79;;:::i;:::-;14626:119;14784:1;14809:52;14853:7;14844:6;14833:9;14829:22;14809:52;:::i;:::-;14799:62;;14755:116;14910:2;14936:53;14981:7;14972:6;14961:9;14957:22;14936:53;:::i;:::-;14926:63;;14881:118;14534:472;;;;;:::o;15012:117::-;15121:1;15118;15111:12;15135:180;15183:77;15180:1;15173:88;15280:4;15277:1;15270:15;15304:4;15301:1;15294:15;15321:281;15404:27;15426:4;15404:27;:::i;:::-;15396:6;15392:40;15534:6;15522:10;15519:22;15498:18;15486:10;15483:34;15480:62;15477:88;;;15545:18;;:::i;:::-;15477:88;15585:10;15581:2;15574:22;15364:238;15321:281;;:::o;15608:129::-;15642:6;15669:20;;:::i;:::-;15659:30;;15698:33;15726:4;15718:6;15698:33;:::i;:::-;15608:129;;;:::o;15743:307::-;15804:4;15894:18;15886:6;15883:30;15880:56;;;15916:18;;:::i;:::-;15880:56;15954:29;15976:6;15954:29;:::i;:::-;15946:37;;16038:4;16032;16028:15;16020:23;;15743:307;;;:::o;16056:146::-;16153:6;16148:3;16143;16130:30;16194:1;16185:6;16180:3;16176:16;16169:27;16056:146;;;:::o;16208:423::-;16285:5;16310:65;16326:48;16367:6;16326:48;:::i;:::-;16310:65;:::i;:::-;16301:74;;16398:6;16391:5;16384:21;16436:4;16429:5;16425:16;16474:3;16465:6;16460:3;16456:16;16453:25;16450:112;;;16481:79;;:::i;:::-;16450:112;16571:54;16618:6;16613:3;16608;16571:54;:::i;:::-;16291:340;16208:423;;;;;:::o;16650:338::-;16705:5;16754:3;16747:4;16739:6;16735:17;16731:27;16721:122;;16762:79;;:::i;:::-;16721:122;16879:6;16866:20;16904:78;16978:3;16970:6;16963:4;16955:6;16951:17;16904:78;:::i;:::-;16895:87;;16711:277;16650:338;;;;:::o;16994:943::-;17089:6;17097;17105;17113;17162:3;17150:9;17141:7;17137:23;17133:33;17130:120;;;17169:79;;:::i;:::-;17130:120;17289:1;17314:53;17359:7;17350:6;17339:9;17335:22;17314:53;:::i;:::-;17304:63;;17260:117;17416:2;17442:53;17487:7;17478:6;17467:9;17463:22;17442:53;:::i;:::-;17432:63;;17387:118;17544:2;17570:53;17615:7;17606:6;17595:9;17591:22;17570:53;:::i;:::-;17560:63;;17515:118;17700:2;17689:9;17685:18;17672:32;17731:18;17723:6;17720:30;17717:117;;;17753:79;;:::i;:::-;17717:117;17858:62;17912:7;17903:6;17892:9;17888:22;17858:62;:::i;:::-;17848:72;;17643:287;16994:943;;;;;;;:::o;17943:474::-;18011:6;18019;18068:2;18056:9;18047:7;18043:23;18039:32;18036:119;;;18074:79;;:::i;:::-;18036:119;18194:1;18219:53;18264:7;18255:6;18244:9;18240:22;18219:53;:::i;:::-;18209:63;;18165:117;18321:2;18347:53;18392:7;18383:6;18372:9;18368:22;18347:53;:::i;:::-;18337:63;;18292:118;17943:474;;;;;:::o;18423:311::-;18500:4;18590:18;18582:6;18579:30;18576:56;;;18612:18;;:::i;:::-;18576:56;18662:4;18654:6;18650:17;18642:25;;18722:4;18716;18712:15;18704:23;;18423:311;;;:::o;18757:710::-;18853:5;18878:81;18894:64;18951:6;18894:64;:::i;:::-;18878:81;:::i;:::-;18869:90;;18979:5;19008:6;19001:5;18994:21;19042:4;19035:5;19031:16;19024:23;;19095:4;19087:6;19083:17;19075:6;19071:30;19124:3;19116:6;19113:15;19110:122;;;19143:79;;:::i;:::-;19110:122;19258:6;19241:220;19275:6;19270:3;19267:15;19241:220;;;19350:3;19379:37;19412:3;19400:10;19379:37;:::i;:::-;19374:3;19367:50;19446:4;19441:3;19437:14;19430:21;;19317:144;19301:4;19296:3;19292:14;19285:21;;19241:220;;;19245:21;18859:608;;18757:710;;;;;:::o;19490:370::-;19561:5;19610:3;19603:4;19595:6;19591:17;19587:27;19577:122;;19618:79;;:::i;:::-;19577:122;19735:6;19722:20;19760:94;19850:3;19842:6;19835:4;19827:6;19823:17;19760:94;:::i;:::-;19751:103;;19567:293;19490:370;;;;:::o;19866:308::-;19940:4;20030:18;20022:6;20019:30;20016:56;;;20052:18;;:::i;:::-;20016:56;20102:4;20094:6;20090:17;20082:25;;20162:4;20156;20152:15;20144:23;;19866:308;;;:::o;20194:701::-;20287:5;20312:78;20328:61;20382:6;20328:61;:::i;:::-;20312:78;:::i;:::-;20303:87;;20410:5;20439:6;20432:5;20425:21;20473:4;20466:5;20462:16;20455:23;;20526:4;20518:6;20514:17;20506:6;20502:30;20555:3;20547:6;20544:15;20541:122;;;20574:79;;:::i;:::-;20541:122;20689:6;20672:217;20706:6;20701:3;20698:15;20672:217;;;20781:3;20810:34;20840:3;20828:10;20810:34;:::i;:::-;20805:3;20798:47;20874:4;20869:3;20865:14;20858:21;;20748:141;20732:4;20727:3;20723:14;20716:21;;20672:217;;;20676:21;20293:602;;20194:701;;;;;:::o;20915:364::-;20983:5;21032:3;21025:4;21017:6;21013:17;21009:27;20999:122;;21040:79;;:::i;:::-;20999:122;21157:6;21144:20;21182:91;21269:3;21261:6;21254:4;21246:6;21242:17;21182:91;:::i;:::-;21173:100;;20989:290;20915:364;;;;:::o;21285:888::-;21400:6;21408;21457:2;21445:9;21436:7;21432:23;21428:32;21425:119;;;21463:79;;:::i;:::-;21425:119;21611:1;21600:9;21596:17;21583:31;21641:18;21633:6;21630:30;21627:117;;;21663:79;;:::i;:::-;21627:117;21768:78;21838:7;21829:6;21818:9;21814:22;21768:78;:::i;:::-;21758:88;;21554:302;21923:2;21912:9;21908:18;21895:32;21954:18;21946:6;21943:30;21940:117;;;21976:79;;:::i;:::-;21940:117;22081:75;22148:7;22139:6;22128:9;22124:22;22081:75;:::i;:::-;22071:85;;21866:300;21285:888;;;;;:::o;22179:180::-;22227:77;22224:1;22217:88;22324:4;22321:1;22314:15;22348:4;22345:1;22338:15;22365:320;22409:6;22446:1;22440:4;22436:12;22426:22;;22493:1;22487:4;22483:12;22514:18;22504:81;;22570:4;22562:6;22558:17;22548:27;;22504:81;22632:2;22624:6;22621:14;22601:18;22598:38;22595:84;;22651:18;;:::i;:::-;22595:84;22416:269;22365:320;;;:::o;22691:232::-;22831:34;22827:1;22819:6;22815:14;22808:58;22900:15;22895:2;22887:6;22883:15;22876:40;22691:232;:::o;22929:366::-;23071:3;23092:67;23156:2;23151:3;23092:67;:::i;:::-;23085:74;;23168:93;23257:3;23168:93;:::i;:::-;23286:2;23281:3;23277:12;23270:19;;22929:366;;;:::o;23301:419::-;23467:4;23505:2;23494:9;23490:18;23482:26;;23554:9;23548:4;23544:20;23540:1;23529:9;23525:17;23518:47;23582:131;23708:4;23582:131;:::i;:::-;23574:139;;23301:419;;;:::o;23726:332::-;23847:4;23885:2;23874:9;23870:18;23862:26;;23898:71;23966:1;23955:9;23951:17;23942:6;23898:71;:::i;:::-;23979:72;24047:2;24036:9;24032:18;24023:6;23979:72;:::i;:::-;23726:332;;;;;:::o;24064:137::-;24118:5;24149:6;24143:13;24134:22;;24165:30;24189:5;24165:30;:::i;:::-;24064:137;;;;:::o;24207:345::-;24274:6;24323:2;24311:9;24302:7;24298:23;24294:32;24291:119;;;24329:79;;:::i;:::-;24291:119;24449:1;24474:61;24527:7;24518:6;24507:9;24503:22;24474:61;:::i;:::-;24464:71;;24420:125;24207:345;;;;:::o;24558:221::-;24698:34;24694:1;24686:6;24682:14;24675:58;24767:4;24762:2;24754:6;24750:15;24743:29;24558:221;:::o;24785:366::-;24927:3;24948:67;25012:2;25007:3;24948:67;:::i;:::-;24941:74;;25024:93;25113:3;25024:93;:::i;:::-;25142:2;25137:3;25133:12;25126:19;;24785:366;;;:::o;25157:419::-;25323:4;25361:2;25350:9;25346:18;25338:26;;25410:9;25404:4;25400:20;25396:1;25385:9;25381:17;25374:47;25438:131;25564:4;25438:131;:::i;:::-;25430:139;;25157:419;;;:::o;25582:180::-;25630:77;25627:1;25620:88;25727:4;25724:1;25717:15;25751:4;25748:1;25741:15;25768:233;25807:3;25830:24;25848:5;25830:24;:::i;:::-;25821:33;;25876:66;25869:5;25866:77;25863:103;;25946:18;;:::i;:::-;25863:103;25993:1;25986:5;25982:13;25975:20;;25768:233;;;:::o;26007:::-;26147:34;26143:1;26135:6;26131:14;26124:58;26216:16;26211:2;26203:6;26199:15;26192:41;26007:233;:::o;26246:366::-;26388:3;26409:67;26473:2;26468:3;26409:67;:::i;:::-;26402:74;;26485:93;26574:3;26485:93;:::i;:::-;26603:2;26598:3;26594:12;26587:19;;26246:366;;;:::o;26618:419::-;26784:4;26822:2;26811:9;26807:18;26799:26;;26871:9;26865:4;26861:20;26857:1;26846:9;26842:17;26835:47;26899:131;27025:4;26899:131;:::i;:::-;26891:139;;26618:419;;;:::o;27043:222::-;27183:34;27179:1;27171:6;27167:14;27160:58;27252:5;27247:2;27239:6;27235:15;27228:30;27043:222;:::o;27271:366::-;27413:3;27434:67;27498:2;27493:3;27434:67;:::i;:::-;27427:74;;27510:93;27599:3;27510:93;:::i;:::-;27628:2;27623:3;27619:12;27612:19;;27271:366;;;:::o;27643:419::-;27809:4;27847:2;27836:9;27832:18;27824:26;;27896:9;27890:4;27886:20;27882:1;27871:9;27867:17;27860:47;27924:131;28050:4;27924:131;:::i;:::-;27916:139;;27643:419;;;:::o;28068:97::-;28127:6;28155:3;28145:13;;28068:97;;;;:::o;28171:141::-;28220:4;28243:3;28235:11;;28266:3;28263:1;28256:14;28300:4;28297:1;28287:18;28279:26;;28171:141;;;:::o;28318:93::-;28355:6;28402:2;28397;28390:5;28386:14;28382:23;28372:33;;28318:93;;;:::o;28417:107::-;28461:8;28511:5;28505:4;28501:16;28480:37;;28417:107;;;;:::o;28530:393::-;28599:6;28649:1;28637:10;28633:18;28672:97;28702:66;28691:9;28672:97;:::i;:::-;28790:39;28820:8;28809:9;28790:39;:::i;:::-;28778:51;;28862:4;28858:9;28851:5;28847:21;28838:30;;28911:4;28901:8;28897:19;28890:5;28887:30;28877:40;;28606:317;;28530:393;;;;;:::o;28929:142::-;28979:9;29012:53;29030:34;29039:24;29057:5;29039:24;:::i;:::-;29030:34;:::i;:::-;29012:53;:::i;:::-;28999:66;;28929:142;;;:::o;29077:75::-;29120:3;29141:5;29134:12;;29077:75;;;:::o;29158:269::-;29268:39;29299:7;29268:39;:::i;:::-;29329:91;29378:41;29402:16;29378:41;:::i;:::-;29370:6;29363:4;29357:11;29329:91;:::i;:::-;29323:4;29316:105;29234:193;29158:269;;;:::o;29433:73::-;29478:3;29433:73;:::o;29512:189::-;29589:32;;:::i;:::-;29630:65;29688:6;29680;29674:4;29630:65;:::i;:::-;29565:136;29512:189;;:::o;29707:186::-;29767:120;29784:3;29777:5;29774:14;29767:120;;;29838:39;29875:1;29868:5;29838:39;:::i;:::-;29811:1;29804:5;29800:13;29791:22;;29767:120;;;29707:186;;:::o;29899:543::-;30000:2;29995:3;29992:11;29989:446;;;30034:38;30066:5;30034:38;:::i;:::-;30118:29;30136:10;30118:29;:::i;:::-;30108:8;30104:44;30301:2;30289:10;30286:18;30283:49;;;30322:8;30307:23;;30283:49;30345:80;30401:22;30419:3;30401:22;:::i;:::-;30391:8;30387:37;30374:11;30345:80;:::i;:::-;30004:431;;29989:446;29899:543;;;:::o;30448:117::-;30502:8;30552:5;30546:4;30542:16;30521:37;;30448:117;;;;:::o;30571:169::-;30615:6;30648:51;30696:1;30692:6;30684:5;30681:1;30677:13;30648:51;:::i;:::-;30644:56;30729:4;30723;30719:15;30709:25;;30622:118;30571:169;;;;:::o;30745:295::-;30821:4;30967:29;30992:3;30986:4;30967:29;:::i;:::-;30959:37;;31029:3;31026:1;31022:11;31016:4;31013:21;31005:29;;30745:295;;;;:::o;31045:1403::-;31169:44;31209:3;31204;31169:44;:::i;:::-;31278:18;31270:6;31267:30;31264:56;;;31300:18;;:::i;:::-;31264:56;31344:38;31376:4;31370:11;31344:38;:::i;:::-;31429:67;31489:6;31481;31475:4;31429:67;:::i;:::-;31523:1;31552:2;31544:6;31541:14;31569:1;31564:632;;;;32240:1;32257:6;32254:84;;;32313:9;32308:3;32304:19;32291:33;32282:42;;32254:84;32364:67;32424:6;32417:5;32364:67;:::i;:::-;32358:4;32351:81;32213:229;31534:908;;31564:632;31616:4;31612:9;31604:6;31600:22;31650:37;31682:4;31650:37;:::i;:::-;31709:1;31723:215;31737:7;31734:1;31731:14;31723:215;;;31823:9;31818:3;31814:19;31801:33;31793:6;31786:49;31874:1;31866:6;31862:14;31852:24;;31921:2;31910:9;31906:18;31893:31;;31760:4;31757:1;31753:12;31748:17;;31723:215;;;31966:6;31957:7;31954:19;31951:186;;;32031:9;32026:3;32022:19;32009:33;32074:48;32116:4;32108:6;32104:17;32093:9;32074:48;:::i;:::-;32066:6;32059:64;31974:163;31951:186;32183:1;32179;32171:6;32167:14;32163:22;32157:4;32150:36;31571:625;;;31534:908;;31144:1304;;;31045:1403;;;:::o;32454:230::-;32594:34;32590:1;32582:6;32578:14;32571:58;32663:13;32658:2;32650:6;32646:15;32639:38;32454:230;:::o;32690:366::-;32832:3;32853:67;32917:2;32912:3;32853:67;:::i;:::-;32846:74;;32929:93;33018:3;32929:93;:::i;:::-;33047:2;33042:3;33038:12;33031:19;;32690:366;;;:::o;33062:419::-;33228:4;33266:2;33255:9;33251:18;33243:26;;33315:9;33309:4;33305:20;33301:1;33290:9;33286:17;33279:47;33343:131;33469:4;33343:131;:::i;:::-;33335:139;;33062:419;;;:::o;33487:94::-;33520:8;33568:5;33564:2;33560:14;33539:35;;33487:94;;;:::o;33587:::-;33626:7;33655:20;33669:5;33655:20;:::i;:::-;33644:31;;33587:94;;;:::o;33687:100::-;33726:7;33755:26;33775:5;33755:26;:::i;:::-;33744:37;;33687:100;;;:::o;33793:157::-;33898:45;33918:24;33936:5;33918:24;:::i;:::-;33898:45;:::i;:::-;33893:3;33886:58;33793:157;;:::o;33956:256::-;34068:3;34083:75;34154:3;34145:6;34083:75;:::i;:::-;34183:2;34178:3;34174:12;34167:19;;34203:3;34196:10;;33956:256;;;;:::o;34218:164::-;34358:16;34354:1;34346:6;34342:14;34335:40;34218:164;:::o;34388:366::-;34530:3;34551:67;34615:2;34610:3;34551:67;:::i;:::-;34544:74;;34627:93;34716:3;34627:93;:::i;:::-;34745:2;34740:3;34736:12;34729:19;;34388:366;;;:::o;34760:419::-;34926:4;34964:2;34953:9;34949:18;34941:26;;35013:9;35007:4;35003:20;34999:1;34988:9;34984:17;34977:47;35041:131;35167:4;35041:131;:::i;:::-;35033:139;;34760:419;;;:::o;35185:180::-;35325:32;35321:1;35313:6;35309:14;35302:56;35185:180;:::o;35371:366::-;35513:3;35534:67;35598:2;35593:3;35534:67;:::i;:::-;35527:74;;35610:93;35699:3;35610:93;:::i;:::-;35728:2;35723:3;35719:12;35712:19;;35371:366;;;:::o;35743:419::-;35909:4;35947:2;35936:9;35932:18;35924:26;;35996:9;35990:4;35986:20;35982:1;35971:9;35967:17;35960:47;36024:131;36150:4;36024:131;:::i;:::-;36016:139;;35743:419;;;:::o;36168:174::-;36308:26;36304:1;36296:6;36292:14;36285:50;36168:174;:::o;36348:366::-;36490:3;36511:67;36575:2;36570:3;36511:67;:::i;:::-;36504:74;;36587:93;36676:3;36587:93;:::i;:::-;36705:2;36700:3;36696:12;36689:19;;36348:366;;;:::o;36720:419::-;36886:4;36924:2;36913:9;36909:18;36901:26;;36973:9;36967:4;36963:20;36959:1;36948:9;36944:17;36937:47;37001:131;37127:4;37001:131;:::i;:::-;36993:139;;36720:419;;;:::o;37145:168::-;37285:20;37281:1;37273:6;37269:14;37262:44;37145:168;:::o;37319:366::-;37461:3;37482:67;37546:2;37541:3;37482:67;:::i;:::-;37475:74;;37558:93;37647:3;37558:93;:::i;:::-;37676:2;37671:3;37667:12;37660:19;;37319:366;;;:::o;37691:419::-;37857:4;37895:2;37884:9;37880:18;37872:26;;37944:9;37938:4;37934:20;37930:1;37919:9;37915:17;37908:47;37972:131;38098:4;37972:131;:::i;:::-;37964:139;;37691:419;;;:::o;38116:191::-;38156:3;38175:20;38193:1;38175:20;:::i;:::-;38170:25;;38209:20;38227:1;38209:20;:::i;:::-;38204:25;;38252:1;38249;38245:9;38238:16;;38273:3;38270:1;38267:10;38264:36;;;38280:18;;:::i;:::-;38264:36;38116:191;;;;:::o;38313:172::-;38453:24;38449:1;38441:6;38437:14;38430:48;38313:172;:::o;38491:366::-;38633:3;38654:67;38718:2;38713:3;38654:67;:::i;:::-;38647:74;;38730:93;38819:3;38730:93;:::i;:::-;38848:2;38843:3;38839:12;38832:19;;38491:366;;;:::o;38863:419::-;39029:4;39067:2;39056:9;39052:18;39044:26;;39116:9;39110:4;39106:20;39102:1;39091:9;39087:17;39080:47;39144:131;39270:4;39144:131;:::i;:::-;39136:139;;38863:419;;;:::o;39288:234::-;39428:34;39424:1;39416:6;39412:14;39405:58;39497:17;39492:2;39484:6;39480:15;39473:42;39288:234;:::o;39528:366::-;39670:3;39691:67;39755:2;39750:3;39691:67;:::i;:::-;39684:74;;39767:93;39856:3;39767:93;:::i;:::-;39885:2;39880:3;39876:12;39869:19;;39528:366;;;:::o;39900:419::-;40066:4;40104:2;40093:9;40089:18;40081:26;;40153:9;40147:4;40143:20;40139:1;40128:9;40124:17;40117:47;40181:131;40307:4;40181:131;:::i;:::-;40173:139;;39900:419;;;:::o;40325:148::-;40427:11;40464:3;40449:18;;40325:148;;;;:::o;40479:390::-;40585:3;40613:39;40646:5;40613:39;:::i;:::-;40668:89;40750:6;40745:3;40668:89;:::i;:::-;40661:96;;40766:65;40824:6;40819:3;40812:4;40805:5;40801:16;40766:65;:::i;:::-;40856:6;40851:3;40847:16;40840:23;;40589:280;40479:390;;;;:::o;40875:155::-;41015:7;41011:1;41003:6;40999:14;40992:31;40875:155;:::o;41036:400::-;41196:3;41217:84;41299:1;41294:3;41217:84;:::i;:::-;41210:91;;41310:93;41399:3;41310:93;:::i;:::-;41428:1;41423:3;41419:11;41412:18;;41036:400;;;:::o;41442:701::-;41723:3;41745:95;41836:3;41827:6;41745:95;:::i;:::-;41738:102;;41857:95;41948:3;41939:6;41857:95;:::i;:::-;41850:102;;41969:148;42113:3;41969:148;:::i;:::-;41962:155;;42134:3;42127:10;;41442:701;;;;;:::o;42149:225::-;42289:34;42285:1;42277:6;42273:14;42266:58;42358:8;42353:2;42345:6;42341:15;42334:33;42149:225;:::o;42380:366::-;42522:3;42543:67;42607:2;42602:3;42543:67;:::i;:::-;42536:74;;42619:93;42708:3;42619:93;:::i;:::-;42737:2;42732:3;42728:12;42721:19;;42380:366;;;:::o;42752:419::-;42918:4;42956:2;42945:9;42941:18;42933:26;;43005:9;42999:4;42995:20;42991:1;42980:9;42976:17;42969:47;43033:131;43159:4;43033:131;:::i;:::-;43025:139;;42752:419;;;:::o;43177:180::-;43225:77;43222:1;43215:88;43322:4;43319:1;43312:15;43346:4;43343:1;43336:15;43363:176;43503:28;43499:1;43491:6;43487:14;43480:52;43363:176;:::o;43545:366::-;43687:3;43708:67;43772:2;43767:3;43708:67;:::i;:::-;43701:74;;43784:93;43873:3;43784:93;:::i;:::-;43902:2;43897:3;43893:12;43886:19;;43545:366;;;:::o;43917:419::-;44083:4;44121:2;44110:9;44106:18;44098:26;;44170:9;44164:4;44160:20;44156:1;44145:9;44141:17;44134:47;44198:131;44324:4;44198:131;:::i;:::-;44190:139;;43917:419;;;:::o;44342:231::-;44482:34;44478:1;44470:6;44466:14;44459:58;44551:14;44546:2;44538:6;44534:15;44527:39;44342:231;:::o;44579:366::-;44721:3;44742:67;44806:2;44801:3;44742:67;:::i;:::-;44735:74;;44818:93;44907:3;44818:93;:::i;:::-;44936:2;44931:3;44927:12;44920:19;;44579:366;;;:::o;44951:419::-;45117:4;45155:2;45144:9;45140:18;45132:26;;45204:9;45198:4;45194:20;45190:1;45179:9;45175:17;45168:47;45232:131;45358:4;45232:131;:::i;:::-;45224:139;;44951:419;;;:::o;45376:182::-;45516:34;45512:1;45504:6;45500:14;45493:58;45376:182;:::o;45564:366::-;45706:3;45727:67;45791:2;45786:3;45727:67;:::i;:::-;45720:74;;45803:93;45892:3;45803:93;:::i;:::-;45921:2;45916:3;45912:12;45905:19;;45564:366;;;:::o;45936:419::-;46102:4;46140:2;46129:9;46125:18;46117:26;;46189:9;46183:4;46179:20;46175:1;46164:9;46160:17;46153:47;46217:131;46343:4;46217:131;:::i;:::-;46209:139;;45936:419;;;:::o;46361:229::-;46501:34;46497:1;46489:6;46485:14;46478:58;46570:12;46565:2;46557:6;46553:15;46546:37;46361:229;:::o;46596:366::-;46738:3;46759:67;46823:2;46818:3;46759:67;:::i;:::-;46752:74;;46835:93;46924:3;46835:93;:::i;:::-;46953:2;46948:3;46944:12;46937:19;;46596:366;;;:::o;46968:419::-;47134:4;47172:2;47161:9;47157:18;47149:26;;47221:9;47215:4;47211:20;47207:1;47196:9;47192:17;47185:47;47249:131;47375:4;47249:131;:::i;:::-;47241:139;;46968:419;;;:::o;47393:194::-;47433:4;47453:20;47471:1;47453:20;:::i;:::-;47448:25;;47487:20;47505:1;47487:20;:::i;:::-;47482:25;;47531:1;47528;47524:9;47516:17;;47555:1;47549:4;47546:11;47543:37;;;47560:18;;:::i;:::-;47543:37;47393:194;;;;:::o;47593:171::-;47632:3;47655:24;47673:5;47655:24;:::i;:::-;47646:33;;47701:4;47694:5;47691:15;47688:41;;47709:18;;:::i;:::-;47688:41;47756:1;47749:5;47745:13;47738:20;;47593:171;;;:::o;47770:234::-;47910:34;47906:1;47898:6;47894:14;47887:58;47979:17;47974:2;47966:6;47962:15;47955:42;47770:234;:::o;48010:366::-;48152:3;48173:67;48237:2;48232:3;48173:67;:::i;:::-;48166:74;;48249:93;48338:3;48249:93;:::i;:::-;48367:2;48362:3;48358:12;48351:19;;48010:366;;;:::o;48382:419::-;48548:4;48586:2;48575:9;48571:18;48563:26;;48635:9;48629:4;48625:20;48621:1;48610:9;48606:17;48599:47;48663:131;48789:4;48663:131;:::i;:::-;48655:139;;48382:419;;;:::o;48807:238::-;48947:34;48943:1;48935:6;48931:14;48924:58;49016:21;49011:2;49003:6;48999:15;48992:46;48807:238;:::o;49051:366::-;49193:3;49214:67;49278:2;49273:3;49214:67;:::i;:::-;49207:74;;49290:93;49379:3;49290:93;:::i;:::-;49408:2;49403:3;49399:12;49392:19;;49051:366;;;:::o;49423:419::-;49589:4;49627:2;49616:9;49612:18;49604:26;;49676:9;49670:4;49666:20;49662:1;49651:9;49647:17;49640:47;49704:131;49830:4;49704:131;:::i;:::-;49696:139;;49423:419;;;:::o;49848:180::-;49896:77;49893:1;49886:88;49993:4;49990:1;49983:15;50017:4;50014:1;50007:15;50034:185;50074:1;50091:20;50109:1;50091:20;:::i;:::-;50086:25;;50125:20;50143:1;50125:20;:::i;:::-;50120:25;;50164:1;50154:35;;50169:18;;:::i;:::-;50154:35;50211:1;50208;50204:9;50199:14;;50034:185;;;;:::o;50225:176::-;50257:1;50274:20;50292:1;50274:20;:::i;:::-;50269:25;;50308:20;50326:1;50308:20;:::i;:::-;50303:25;;50347:1;50337:35;;50352:18;;:::i;:::-;50337:35;50393:1;50390;50386:9;50381:14;;50225:176;;;;:::o;50407:236::-;50547:34;50543:1;50535:6;50531:14;50524:58;50616:19;50611:2;50603:6;50599:15;50592:44;50407:236;:::o;50649:366::-;50791:3;50812:67;50876:2;50871:3;50812:67;:::i;:::-;50805:74;;50888:93;50977:3;50888:93;:::i;:::-;51006:2;51001:3;50997:12;50990:19;;50649:366;;;:::o;51021:419::-;51187:4;51225:2;51214:9;51210:18;51202:26;;51274:9;51268:4;51264:20;51260:1;51249:9;51245:17;51238:47;51302:131;51428:4;51302:131;:::i;:::-;51294:139;;51021:419;;;:::o;51446:237::-;51586:34;51582:1;51574:6;51570:14;51563:58;51655:20;51650:2;51642:6;51638:15;51631:45;51446:237;:::o;51689:366::-;51831:3;51852:67;51916:2;51911:3;51852:67;:::i;:::-;51845:74;;51928:93;52017:3;51928:93;:::i;:::-;52046:2;52041:3;52037:12;52030:19;;51689:366;;;:::o;52061:419::-;52227:4;52265:2;52254:9;52250:18;52242:26;;52314:9;52308:4;52304:20;52300:1;52289:9;52285:17;52278:47;52342:131;52468:4;52342:131;:::i;:::-;52334:139;;52061:419;;;:::o;52486:225::-;52626:34;52622:1;52614:6;52610:14;52603:58;52695:8;52690:2;52682:6;52678:15;52671:33;52486:225;:::o;52717:366::-;52859:3;52880:67;52944:2;52939:3;52880:67;:::i;:::-;52873:74;;52956:93;53045:3;52956:93;:::i;:::-;53074:2;53069:3;53065:12;53058:19;;52717:366;;;:::o;53089:419::-;53255:4;53293:2;53282:9;53278:18;53270:26;;53342:9;53336:4;53332:20;53328:1;53317:9;53313:17;53306:47;53370:131;53496:4;53370:131;:::i;:::-;53362:139;;53089:419;;;:::o;53514:224::-;53654:34;53650:1;53642:6;53638:14;53631:58;53723:7;53718:2;53710:6;53706:15;53699:32;53514:224;:::o;53744:366::-;53886:3;53907:67;53971:2;53966:3;53907:67;:::i;:::-;53900:74;;53983:93;54072:3;53983:93;:::i;:::-;54101:2;54096:3;54092:12;54085:19;;53744:366;;;:::o;54116:419::-;54282:4;54320:2;54309:9;54305:18;54297:26;;54369:9;54363:4;54359:20;54355:1;54344:9;54340:17;54333:47;54397:131;54523:4;54397:131;:::i;:::-;54389:139;;54116:419;;;:::o;54541:118::-;54578:7;54618:34;54611:5;54607:46;54596:57;;54541:118;;;:::o;54665:227::-;54705:4;54725:20;54743:1;54725:20;:::i;:::-;54720:25;;54759:20;54777:1;54759:20;:::i;:::-;54754:25;;54803:1;54800;54796:9;54788:17;;54827:34;54821:4;54818:44;54815:70;;;54865:18;;:::i;:::-;54815:70;54665:227;;;;:::o;54898:224::-;54938:3;54957:20;54975:1;54957:20;:::i;:::-;54952:25;;54991:20;55009:1;54991:20;:::i;:::-;54986:25;;55034:1;55031;55027:9;55020:16;;55057:34;55052:3;55049:43;55046:69;;;55095:18;;:::i;:::-;55046:69;54898:224;;;;:::o;55128:220::-;55268:34;55264:1;55256:6;55252:14;55245:58;55337:3;55332:2;55324:6;55320:15;55313:28;55128:220;:::o;55354:366::-;55496:3;55517:67;55581:2;55576:3;55517:67;:::i;:::-;55510:74;;55593:93;55682:3;55593:93;:::i;:::-;55711:2;55706:3;55702:12;55695:19;;55354:366;;;:::o;55726:419::-;55892:4;55930:2;55919:9;55915:18;55907:26;;55979:9;55973:4;55969:20;55965:1;55954:9;55950:17;55943:47;56007:131;56133:4;56007:131;:::i;:::-;55999:139;;55726:419;;;:::o;56151:179::-;56291:31;56287:1;56279:6;56275:14;56268:55;56151:179;:::o;56336:366::-;56478:3;56499:67;56563:2;56558:3;56499:67;:::i;:::-;56492:74;;56575:93;56664:3;56575:93;:::i;:::-;56693:2;56688:3;56684:12;56677:19;;56336:366;;;:::o;56708:419::-;56874:4;56912:2;56901:9;56897:18;56889:26;;56961:9;56955:4;56951:20;56947:1;56936:9;56932:17;56925:47;56989:131;57115:4;56989:131;:::i;:::-;56981:139;;56708:419;;;:::o;57133:221::-;57273:34;57269:1;57261:6;57257:14;57250:58;57342:4;57337:2;57329:6;57325:15;57318:29;57133:221;:::o;57360:366::-;57502:3;57523:67;57587:2;57582:3;57523:67;:::i;:::-;57516:74;;57599:93;57688:3;57599:93;:::i;:::-;57717:2;57712:3;57708:12;57701:19;;57360:366;;;:::o;57732:419::-;57898:4;57936:2;57925:9;57921:18;57913:26;;57985:9;57979:4;57975:20;57971:1;57960:9;57956:17;57949:47;58013:131;58139:4;58013:131;:::i;:::-;58005:139;;57732:419;;;:::o;58157:98::-;58208:6;58242:5;58236:12;58226:22;;58157:98;;;:::o;58261:168::-;58344:11;58378:6;58373:3;58366:19;58418:4;58413:3;58409:14;58394:29;;58261:168;;;;:::o;58435:373::-;58521:3;58549:38;58581:5;58549:38;:::i;:::-;58603:70;58666:6;58661:3;58603:70;:::i;:::-;58596:77;;58682:65;58740:6;58735:3;58728:4;58721:5;58717:16;58682:65;:::i;:::-;58772:29;58794:6;58772:29;:::i;:::-;58767:3;58763:39;58756:46;;58525:283;58435:373;;;;:::o;58814:640::-;59009:4;59047:3;59036:9;59032:19;59024:27;;59061:71;59129:1;59118:9;59114:17;59105:6;59061:71;:::i;:::-;59142:72;59210:2;59199:9;59195:18;59186:6;59142:72;:::i;:::-;59224;59292:2;59281:9;59277:18;59268:6;59224:72;:::i;:::-;59343:9;59337:4;59333:20;59328:2;59317:9;59313:18;59306:48;59371:76;59442:4;59433:6;59371:76;:::i;:::-;59363:84;;58814:640;;;;;;;:::o;59460:141::-;59516:5;59547:6;59541:13;59532:22;;59563:32;59589:5;59563:32;:::i;:::-;59460:141;;;;:::o;59607:349::-;59676:6;59725:2;59713:9;59704:7;59700:23;59696:32;59693:119;;;59731:79;;:::i;:::-;59693:119;59851:1;59876:63;59931:7;59922:6;59911:9;59907:22;59876:63;:::i;:::-;59866:73;;59822:127;59607:349;;;;:::o

Swarm Source

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