ETH Price: $3,444.27 (-2.55%)
Gas: 3 Gwei

Token

StayHuman Genesis ()
 

Overview

Max Total Supply

333

Holders

21

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
monkeyfpv.eth
0x1fbde8c8373835eabcf6ccbb6a5155ee9eb55e96
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:
StayhumanGenesis

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: operator-filter-registry/src/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: operator-filter-registry/src/OperatorFilterer.sol

pragma solidity ^0.8.13;

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: operator-filter-registry/src/DefaultOperatorFilterer.sol

pragma solidity ^0.8.13;

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION =
        address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.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/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/ERC1155/IERC1155Receiver.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(
        address indexed account,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        external
        view
        returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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

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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: address zero is not a valid owner"
        );
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(
            fromBalance >= amount,
            "ERC1155: insufficient balance for transfer"
        );
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: insufficient balance for transfer"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            id,
            amount,
            data
        );
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: burn amount exceeds balance"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver.onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        private
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(
                    supply >= amount,
                    "ERC1155: burn amount exceeds totalSupply"
                );
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: contracts/stayhuman.sol

pragma solidity ^0.8.2;

contract StayhumanGenesis is
    ERC1155,
    Ownable,
    ERC1155Supply,
    DefaultOperatorFilterer
{
    uint256 public price = 0.08 ether;
    uint256 public maxSupply = 333;
    bool public presaleActive = false;
    bool public phaseTwoActive = false;
    bool public saleActive = false;
    uint256 public maxPublicPerWallet = 1;
    uint256 public activeTokenID = 1;
    bytes32 public whitelistRoot;
    address private founderWallet = 0x86c4A74e1283AA79504183A8DAF1B4F4D424b9F7;
    address private wallet2 = 0x3BdC8d36c45b2eD12B6038fDFEd63cA9F8D5C70e; //Dev Wallet
    bytes32 public raffleRoot;
    string public name = "StayHuman Genesis";

    mapping(address => bool) public whitelistMinted;
    mapping(address => uint256) public numberMinted;

    constructor() ERC1155("ipfs://QmXW9pnARLHFegbWH8ue611j7PYV2KuL6NaVK965ummxRb") {}

    function mintWhitelist(bytes32[] calldata _merkleProof) public payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(msg.value >= price, "Send correct amount");
        require(presaleActive, "Sale is not active");
        require(
            totalSupply(activeTokenID) + 1 <= maxSupply,
            "Purchase would exceed max supply"
        );
        require(!whitelistMinted[msg.sender], "Whitelist has already claimed");

        require(
            MerkleProof.verify(_merkleProof, whitelistRoot, leaf),
            "Invalid proof"
        );

        whitelistMinted[msg.sender] = true;
        _mint(msg.sender, activeTokenID, 1, "");
    }

    function mintSecondPhase(bytes32[] calldata _merkleProof) public payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(msg.value >= price, "Send correct amount");
        require(phaseTwoActive, "Sale is not active");
        require(
            totalSupply(activeTokenID) + 1 <= maxSupply,
            "Purchase would exceed max supply"
        );
        require(!whitelistMinted[msg.sender], "Whitelist has already claimed");

        require(
            MerkleProof.verify(_merkleProof, raffleRoot, leaf),
            "Invalid proof"
        );

        whitelistMinted[msg.sender] = true;
        _mint(msg.sender, activeTokenID, 1, "");
    }

    // If necessary
    function publicMint(uint256 amount) public payable {
        require(msg.value >= amount * price, "Send correct amount");
        require(saleActive, "Sale is not active");
        require(amount > 0, "Amount must be positive integer");
        require(
            totalSupply(activeTokenID) + amount <= maxSupply,
            "Purchase would exceed max supply"
        );
        require(
            numberMinted[msg.sender] + amount <= maxPublicPerWallet,
            "Max per wallet reached"
        );
        numberMinted[msg.sender] += amount;

        _mint(msg.sender, activeTokenID, amount, "");
    }

    function isWhitelistMinted(address minter) external view returns (bool) {
        return whitelistMinted[minter];
    }

    function getNumberMintedPublic(address minter)
        external
        view
        returns (uint256)
    {
        return numberMinted[minter];
    }

    function setPresaleStatus(bool _presaleActive) public onlyOwner {
        presaleActive = _presaleActive;
    }

    function setSecondPhase(bool _secondPhase) public onlyOwner {
        presaleActive = !presaleActive;
        phaseTwoActive = _secondPhase;
    }

    function setMaxPublic(uint256 _amount) public onlyOwner {
        maxPublicPerWallet = _amount;
    }

    function setSaleStatus(bool _saleActive) public onlyOwner {
        saleActive = _saleActive;
    }

    function setPrice(uint256 _price) public onlyOwner {
        price = _price;
    }

    function setWhitelistRoot(bytes32 _presaleRoot, bytes32 _raffleRoot)
        external
        onlyOwner
    {
        whitelistRoot = _presaleRoot;
        raffleRoot = _raffleRoot;
    }

    function setURI(string memory newuri) public onlyOwner {
        _setURI(newuri);
    }

    function airdrop(address[] calldata receivers) public onlyOwner {
        require(receivers.length > 0, "Need at least one address");
        for (uint256 i; i < receivers.length; ++i) {
            _mint(receivers[i], activeTokenID, 1, "");
        }
    }

 function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        uint256 balance2 = (balance * 934) / 1000;
        uint256 balance3 = (balance * 66) / 1000;

        payable(founderWallet).transfer(balance2);
        payable(wallet2).transfer(balance3);
    }

    // Required overwrite function by solidity
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

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

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

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"getNumberMintedPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"isWhitelistMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintSecondPhase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","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":[],"name":"phaseTwoActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"raffleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_presaleActive","type":"bool"}],"name":"setPresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleActive","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_secondPhase","type":"bool"}],"name":"setSecondPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_presaleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_raffleRoot","type":"bytes32"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267011c37937e08000060055561014d6006556000600760006101000a81548160ff0219169083151502179055506000600760016101000a81548160ff0219169083151502179055506000600760026101000a81548160ff021916908315150217905550600160085560016009557386c4a74e1283aa79504183a8daf1b4f4d424b9f7600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733bdc8d36c45b2ed12b6038fdfed63ca9f8d5c70e600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601181526020017f5374617948756d616e2047656e65736973000000000000000000000000000000815250600e908051906020019062000168929190620004c1565b503480156200017657600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060600160405280603581526020016200550860359139620001b981620003d760201b60201c565b50620001da620001ce620003f360201b60201c565b620003fb60201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003cf57801562000295576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200025b929190620005b6565b600060405180830381600087803b1580156200027657600080fd5b505af11580156200028b573d6000803e3d6000fd5b50505050620003ce565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200034f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000315929190620005b6565b600060405180830381600087803b1580156200033057600080fd5b505af115801562000345573d6000803e3d6000fd5b50505050620003cd565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003989190620005e3565b600060405180830381600087803b158015620003b357600080fd5b505af1158015620003c8573d6000803e3d6000fd5b505050505b5b5b505062000664565b8060029080519060200190620003ef929190620004c1565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004cf906200062f565b90600052602060002090601f016020900481019282620004f357600085556200053f565b82601f106200050e57805160ff19168380011785556200053f565b828001600101855582156200053f579182015b828111156200053e57825182559160200191906001019062000521565b5b5090506200054e919062000552565b5090565b5b808211156200056d57600081600090555060010162000553565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200059e8262000571565b9050919050565b620005b08162000591565b82525050565b6000604082019050620005cd6000830185620005a5565b620005dc6020830184620005a5565b9392505050565b6000602082019050620005fa6000830184620005a5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200064857607f821691505b6020821081036200065e576200065d62000600565b5b50919050565b614e9480620006746000396000f3fe60806040526004361061023a5760003560e01c8063729ad39e1161012e578063bd85b039116100ab578063dc33e6811161006f578063dc33e6811461085b578063e985e9c514610898578063f242432a146108d5578063f2fde38b146108fe578063fbdb8494146109275761023a565b8063bd85b03914610762578063bdf08d711461079f578063c783fb32146107ca578063d5abeb0114610807578063d897833e146108325761023a565b806398a8cffe116100f257806398a8cffe1461067d5780639e400cae146106ba578063a035b1fe146106e3578063a22cb4651461070e578063b0f6f4b5146107375761023a565b8063729ad39e146105ac5780638895283f146105d55780638da5cb5b146105fe57806391b7f5ed1461062957806393ce0033146106525761023a565b80633ccfd60b116101bc5780634fe6b690116101805780634fe6b690146104d957806353135ca0146105025780635997bbee1461052d57806368428a1b1461056a578063715018a6146105955761023a565b80633ccfd60b1461040157806341f434341461041857806344d84381146104435780634e1273f41461045f5780634f558e791461049c5761023a565b806306fdde031161020357806306fdde03146103295780630e89341c146103545780632db11544146103915780632eb2c2d6146103ad578063386bfc98146103d65761023a565b8062fdd58e1461023f57806301ffc9a71461027c578063020c878d146102b957806302fe5305146102d55780630559a4df146102fe575b600080fd5b34801561024b57600080fd5b5061026660048036038101906102619190613254565b610950565b60405161027391906132a3565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613316565b610a18565b6040516102b0919061335e565b60405180910390f35b6102d360048036038101906102ce91906133de565b610afa565b005b3480156102e157600080fd5b506102fc60048036038101906102f7919061356c565b610da9565b005b34801561030a57600080fd5b50610313610dbd565b60405161032091906132a3565b60405180910390f35b34801561033557600080fd5b5061033e610dc3565b60405161034b919061363d565b60405180910390f35b34801561036057600080fd5b5061037b6004803603810190610376919061365f565b610e51565b604051610388919061363d565b60405180910390f35b6103ab60048036038101906103a6919061365f565b610ee5565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906137f0565b611126565b005b3480156103e257600080fd5b506103eb61127c565b6040516103f891906138d8565b60405180910390f35b34801561040d57600080fd5b50610416611282565b005b34801561042457600080fd5b5061042d6113a3565b60405161043a9190613952565b60405180910390f35b61045d600480360381019061045891906133de565b6113b5565b005b34801561046b57600080fd5b5061048660048036038101906104819190613a30565b611664565b6040516104939190613b66565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be919061365f565b61177d565b6040516104d0919061335e565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb9190613bb4565b611791565b005b34801561050e57600080fd5b506105176117ab565b604051610524919061335e565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613bf4565b6117be565b604051610561919061335e565b60405180910390f35b34801561057657600080fd5b5061057f611814565b60405161058c919061335e565b60405180910390f35b3480156105a157600080fd5b506105aa611827565b005b3480156105b857600080fd5b506105d360048036038101906105ce9190613c77565b61183b565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613cf0565b6118f2565b005b34801561060a57600080fd5b50610613611917565b6040516106209190613d2c565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b919061365f565b611941565b005b34801561065e57600080fd5b50610667611953565b60405161067491906132a3565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613bf4565b611959565b6040516106b1919061335e565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190613cf0565b611979565b005b3480156106ef57600080fd5b506106f86119c8565b60405161070591906132a3565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613d47565b6119ce565b005b34801561074357600080fd5b5061074c611ad8565b60405161075991906138d8565b60405180910390f35b34801561076e57600080fd5b506107896004803603810190610784919061365f565b611ade565b60405161079691906132a3565b60405180910390f35b3480156107ab57600080fd5b506107b4611afb565b6040516107c1919061335e565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec9190613bf4565b611b0e565b6040516107fe91906132a3565b60405180910390f35b34801561081357600080fd5b5061081c611b57565b60405161082991906132a3565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613cf0565b611b5d565b005b34801561086757600080fd5b50610882600480360381019061087d9190613bf4565b611b82565b60405161088f91906132a3565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190613d87565b611b9a565b6040516108cc919061335e565b60405180910390f35b3480156108e157600080fd5b506108fc60048036038101906108f79190613dc7565b611c2e565b005b34801561090a57600080fd5b5061092560048036038101906109209190613bf4565b611d84565b005b34801561093357600080fd5b5061094e6004803603810190610949919061365f565b611e07565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b790613ed0565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af35750610af282611e19565b5b9050919050565b600033604051602001610b0d9190613f38565b604051602081830303815290604052805190602001209050600554341015610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190613f9f565b60405180910390fd5b600760019054906101000a900460ff16610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb09061400b565b60405180910390fd5b6006546001610bc9600954611ade565b610bd3919061405a565b1115610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b906140fc565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9890614168565b60405180910390fd5b610cef838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483611e83565b610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d25906141d4565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610da433600954600160405180602001604052806000815250611e9a565b505050565b610db161204a565b610dba816120c8565b50565b60095481565b600e8054610dd090614223565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfc90614223565b8015610e495780601f10610e1e57610100808354040283529160200191610e49565b820191906000526020600020905b815481529060010190602001808311610e2c57829003601f168201915b505050505081565b606060028054610e6090614223565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8c90614223565b8015610ed95780601f10610eae57610100808354040283529160200191610ed9565b820191906000526020600020905b815481529060010190602001808311610ebc57829003601f168201915b50505050509050919050565b60055481610ef39190614254565b341015610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90613f9f565b60405180910390fd5b600760029054906101000a900460ff16610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b9061400b565b60405180910390fd5b60008111610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906142fa565b60405180910390fd5b60065481610fd6600954611ade565b610fe0919061405a565b1115611021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611018906140fc565b60405180910390fd5b60085481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461106f919061405a565b11156110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a790614366565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110ff919061405a565b92505081905550611123336009548360405180602001604052806000815250611e9a565b50565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611266573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361119a5761119586868686866120e2565b611274565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111e3929190614386565b602060405180830381865afa158015611200573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122491906143c4565b61126557336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161125c9190613d2c565b60405180910390fd5b5b61127386868686866120e2565b5b505050505050565b600a5481565b61128a61204a565b600047905060006103e86103a6836112a29190614254565b6112ac9190614420565b905060006103e86042846112c09190614254565b6112ca9190614420565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611334573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561139d573d6000803e3d6000fd5b50505050565b6daaeb6d7670e522a718067333cd4e81565b6000336040516020016113c89190613f38565b604051602081830303815290604052805190602001209050600554341015611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c90613f9f565b60405180910390fd5b600760009054906101000a900460ff16611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b9061400b565b60405180910390fd5b6006546001611484600954611ade565b61148e919061405a565b11156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c6906140fc565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390614168565b60405180910390fd5b6115aa838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483611e83565b6115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e0906141d4565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061165f33600954600160405180602001604052806000815250611e9a565b505050565b606081518351146116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a1906144c3565b60405180910390fd5b6000835167ffffffffffffffff8111156116c7576116c6613441565b5b6040519080825280602002602001820160405280156116f55781602001602082028036833780820191505090505b50905060005b84518110156117725761174285828151811061171a576117196144e3565b5b6020026020010151858381518110611735576117346144e3565b5b6020026020010151610950565b828281518110611755576117546144e3565b5b6020026020010181815250508061176b90614512565b90506116fb565b508091505092915050565b60008061178983611ade565b119050919050565b61179961204a565b81600a8190555080600d819055505050565b600760009054906101000a900460ff1681565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600760029054906101000a900460ff1681565b61182f61204a565b6118396000612183565b565b61184361204a565b60008282905011611889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611880906145a6565b60405180910390fd5b60005b828290508110156118ed576118dc8383838181106118ad576118ac6144e3565b5b90506020020160208101906118c29190613bf4565b600954600160405180602001604052806000815250611e9a565b806118e690614512565b905061188c565b505050565b6118fa61204a565b80600760006101000a81548160ff02191690831515021790555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61194961204a565b8060058190555050565b60085481565b600f6020528060005260406000206000915054906101000a900460ff1681565b61198161204a565b600760009054906101000a900460ff1615600760006101000a81548160ff02191690831515021790555080600760016101000a81548160ff02191690831515021790555050565b60055481565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ac9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a46929190614386565b602060405180830381865afa158015611a63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8791906143c4565b611ac857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611abf9190613d2c565b60405180910390fd5b5b611ad38383612249565b505050565b600d5481565b600060046000838152602001908152602001600020549050919050565b600760019054906101000a900460ff1681565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60065481565b611b6561204a565b80600760026101000a81548160ff02191690831515021790555050565b60106020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d6e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ca257611c9d868686868661225f565b611d7c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611ceb929190614386565b602060405180830381865afa158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c91906143c4565b611d6d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d649190613d2c565b60405180910390fd5b5b611d7b868686868661225f565b5b505050505050565b611d8c61204a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df290614638565b60405180910390fd5b611e0481612183565b50565b611e0f61204a565b8060088190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600082611e908584612300565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f00906146ca565b60405180910390fd5b6000611f13612356565b90506000611f208561235e565b90506000611f2d8561235e565b9050611f3e836000898585896123d8565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f9d919061405a565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161201b9291906146ea565b60405180910390a4612032836000898585896123ee565b612041836000898989896123f6565b50505050505050565b612052612356565b73ffffffffffffffffffffffffffffffffffffffff16612070611917565b73ffffffffffffffffffffffffffffffffffffffff16146120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd9061475f565b60405180910390fd5b565b80600290805190602001906120de929190613109565b5050565b6120ea612356565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612130575061212f8561212a612356565b611b9a565b5b61216f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612166906147f1565b60405180910390fd5b61217c85858585856125cd565b5050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61225b612254612356565b83836128ee565b5050565b612267612356565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806122ad57506122ac856122a7612356565b611b9a565b5b6122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e3906147f1565b60405180910390fd5b6122f98585858585612a5a565b5050505050565b60008082905060005b845181101561234b5761233682868381518110612329576123286144e3565b5b6020026020010151612cf5565b9150808061234390614512565b915050612309565b508091505092915050565b600033905090565b60606000600167ffffffffffffffff81111561237d5761237c613441565b5b6040519080825280602002602001820160405280156123ab5781602001602082028036833780820191505090505b50905082816000815181106123c3576123c26144e3565b5b60200260200101818152505080915050919050565b6123e6868686868686612d20565b505050505050565b505050505050565b6124158473ffffffffffffffffffffffffffffffffffffffff16612ef0565b156125c5578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161245b959493929190614866565b6020604051808303816000875af192505050801561249757506040513d601f19601f8201168201806040525081019061249491906148d5565b60015b61253c576124a361490f565b806308c379a0036124ff57506124b7614931565b806124c25750612501565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f6919061363d565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253390614a33565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba90614ac5565b60405180910390fd5b505b505050505050565b8151835114612611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260890614b57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267790614be9565b60405180910390fd5b600061268a612356565b905061269a8187878787876123d8565b60005b845181101561284b5760008582815181106126bb576126ba6144e3565b5b6020026020010151905060008583815181106126da576126d96144e3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614c7b565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612830919061405a565b925050819055505050508061284490614512565b905061269d565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128c2929190614c9b565b60405180910390a46128d88187878787876123ee565b6128e6818787878787612f13565b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295390614d44565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a4d919061335e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac090614be9565b60405180910390fd5b6000612ad3612356565b90506000612ae08561235e565b90506000612aed8561235e565b9050612afd8389898585896123d8565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8b90614c7b565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c49919061405a565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612cc69291906146ea565b60405180910390a4612cdc848a8a86868a6123ee565b612cea848a8a8a8a8a6123f6565b505050505050505050565b6000818310612d0d57612d0882846130ea565b612d18565b612d1783836130ea565b5b905092915050565b612d2e868686868686613101565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ddf5760005b8351811015612ddd57828181518110612d8157612d806144e3565b5b602002602001015160046000868481518110612da057612d9f6144e3565b5b602002602001015181526020019081526020016000206000828254612dc5919061405a565b9250508190555080612dd690614512565b9050612d65565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ee85760005b8351811015612ee6576000848281518110612e3457612e336144e3565b5b602002602001015190506000848381518110612e5357612e526144e3565b5b6020026020010151905060006004600084815260200190815260200160002054905081811015612eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaf90614dd6565b60405180910390fd5b818103600460008581526020019081526020016000208190555050505080612edf90614512565b9050612e16565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b612f328473ffffffffffffffffffffffffffffffffffffffff16612ef0565b156130e2578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612f78959493929190614df6565b6020604051808303816000875af1925050508015612fb457506040513d601f19601f82011682018060405250810190612fb191906148d5565b60015b61305957612fc061490f565b806308c379a00361301c5750612fd4614931565b80612fdf575061301e565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613013919061363d565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305090614a33565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d790614ac5565b60405180910390fd5b505b505050505050565b600082600052816020526040600020905092915050565b505050505050565b82805461311590614223565b90600052602060002090601f016020900481019282613137576000855561317e565b82601f1061315057805160ff191683800117855561317e565b8280016001018555821561317e579182015b8281111561317d578251825591602001919060010190613162565b5b50905061318b919061318f565b5090565b5b808211156131a8576000816000905550600101613190565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131eb826131c0565b9050919050565b6131fb816131e0565b811461320657600080fd5b50565b600081359050613218816131f2565b92915050565b6000819050919050565b6132318161321e565b811461323c57600080fd5b50565b60008135905061324e81613228565b92915050565b6000806040838503121561326b5761326a6131b6565b5b600061327985828601613209565b925050602061328a8582860161323f565b9150509250929050565b61329d8161321e565b82525050565b60006020820190506132b86000830184613294565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132f3816132be565b81146132fe57600080fd5b50565b600081359050613310816132ea565b92915050565b60006020828403121561332c5761332b6131b6565b5b600061333a84828501613301565b91505092915050565b60008115159050919050565b61335881613343565b82525050565b6000602082019050613373600083018461334f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261339e5761339d613379565b5b8235905067ffffffffffffffff8111156133bb576133ba61337e565b5b6020830191508360208202830111156133d7576133d6613383565b5b9250929050565b600080602083850312156133f5576133f46131b6565b5b600083013567ffffffffffffffff811115613413576134126131bb565b5b61341f85828601613388565b92509250509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61347982613430565b810181811067ffffffffffffffff8211171561349857613497613441565b5b80604052505050565b60006134ab6131ac565b90506134b78282613470565b919050565b600067ffffffffffffffff8211156134d7576134d6613441565b5b6134e082613430565b9050602081019050919050565b82818337600083830152505050565b600061350f61350a846134bc565b6134a1565b90508281526020810184848401111561352b5761352a61342b565b5b6135368482856134ed565b509392505050565b600082601f83011261355357613552613379565b5b81356135638482602086016134fc565b91505092915050565b600060208284031215613582576135816131b6565b5b600082013567ffffffffffffffff8111156135a05761359f6131bb565b5b6135ac8482850161353e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135ef5780820151818401526020810190506135d4565b838111156135fe576000848401525b50505050565b600061360f826135b5565b61361981856135c0565b93506136298185602086016135d1565b61363281613430565b840191505092915050565b600060208201905081810360008301526136578184613604565b905092915050565b600060208284031215613675576136746131b6565b5b60006136838482850161323f565b91505092915050565b600067ffffffffffffffff8211156136a7576136a6613441565b5b602082029050602081019050919050565b60006136cb6136c68461368c565b6134a1565b905080838252602082019050602084028301858111156136ee576136ed613383565b5b835b818110156137175780613703888261323f565b8452602084019350506020810190506136f0565b5050509392505050565b600082601f83011261373657613735613379565b5b81356137468482602086016136b8565b91505092915050565b600067ffffffffffffffff82111561376a57613769613441565b5b61377382613430565b9050602081019050919050565b600061379361378e8461374f565b6134a1565b9050828152602081018484840111156137af576137ae61342b565b5b6137ba8482856134ed565b509392505050565b600082601f8301126137d7576137d6613379565b5b81356137e7848260208601613780565b91505092915050565b600080600080600060a0868803121561380c5761380b6131b6565b5b600061381a88828901613209565b955050602061382b88828901613209565b945050604086013567ffffffffffffffff81111561384c5761384b6131bb565b5b61385888828901613721565b935050606086013567ffffffffffffffff811115613879576138786131bb565b5b61388588828901613721565b925050608086013567ffffffffffffffff8111156138a6576138a56131bb565b5b6138b2888289016137c2565b9150509295509295909350565b6000819050919050565b6138d2816138bf565b82525050565b60006020820190506138ed60008301846138c9565b92915050565b6000819050919050565b600061391861391361390e846131c0565b6138f3565b6131c0565b9050919050565b600061392a826138fd565b9050919050565b600061393c8261391f565b9050919050565b61394c81613931565b82525050565b60006020820190506139676000830184613943565b92915050565b600067ffffffffffffffff82111561398857613987613441565b5b602082029050602081019050919050565b60006139ac6139a78461396d565b6134a1565b905080838252602082019050602084028301858111156139cf576139ce613383565b5b835b818110156139f857806139e48882613209565b8452602084019350506020810190506139d1565b5050509392505050565b600082601f830112613a1757613a16613379565b5b8135613a27848260208601613999565b91505092915050565b60008060408385031215613a4757613a466131b6565b5b600083013567ffffffffffffffff811115613a6557613a646131bb565b5b613a7185828601613a02565b925050602083013567ffffffffffffffff811115613a9257613a916131bb565b5b613a9e85828601613721565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613add8161321e565b82525050565b6000613aef8383613ad4565b60208301905092915050565b6000602082019050919050565b6000613b1382613aa8565b613b1d8185613ab3565b9350613b2883613ac4565b8060005b83811015613b59578151613b408882613ae3565b9750613b4b83613afb565b925050600181019050613b2c565b5085935050505092915050565b60006020820190508181036000830152613b808184613b08565b905092915050565b613b91816138bf565b8114613b9c57600080fd5b50565b600081359050613bae81613b88565b92915050565b60008060408385031215613bcb57613bca6131b6565b5b6000613bd985828601613b9f565b9250506020613bea85828601613b9f565b9150509250929050565b600060208284031215613c0a57613c096131b6565b5b6000613c1884828501613209565b91505092915050565b60008083601f840112613c3757613c36613379565b5b8235905067ffffffffffffffff811115613c5457613c5361337e565b5b602083019150836020820283011115613c7057613c6f613383565b5b9250929050565b60008060208385031215613c8e57613c8d6131b6565b5b600083013567ffffffffffffffff811115613cac57613cab6131bb565b5b613cb885828601613c21565b92509250509250929050565b613ccd81613343565b8114613cd857600080fd5b50565b600081359050613cea81613cc4565b92915050565b600060208284031215613d0657613d056131b6565b5b6000613d1484828501613cdb565b91505092915050565b613d26816131e0565b82525050565b6000602082019050613d416000830184613d1d565b92915050565b60008060408385031215613d5e57613d5d6131b6565b5b6000613d6c85828601613209565b9250506020613d7d85828601613cdb565b9150509250929050565b60008060408385031215613d9e57613d9d6131b6565b5b6000613dac85828601613209565b9250506020613dbd85828601613209565b9150509250929050565b600080600080600060a08688031215613de357613de26131b6565b5b6000613df188828901613209565b9550506020613e0288828901613209565b9450506040613e138882890161323f565b9350506060613e248882890161323f565b925050608086013567ffffffffffffffff811115613e4557613e446131bb565b5b613e51888289016137c2565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613eba602a836135c0565b9150613ec582613e5e565b604082019050919050565b60006020820190508181036000830152613ee981613ead565b9050919050565b60008160601b9050919050565b6000613f0882613ef0565b9050919050565b6000613f1a82613efd565b9050919050565b613f32613f2d826131e0565b613f0f565b82525050565b6000613f448284613f21565b60148201915081905092915050565b7f53656e6420636f727265637420616d6f756e7400000000000000000000000000600082015250565b6000613f896013836135c0565b9150613f9482613f53565b602082019050919050565b60006020820190508181036000830152613fb881613f7c565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000613ff56012836135c0565b915061400082613fbf565b602082019050919050565b6000602082019050818103600083015261402481613fe8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140658261321e565b91506140708361321e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140a5576140a461402b565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b60006140e66020836135c0565b91506140f1826140b0565b602082019050919050565b60006020820190508181036000830152614115816140d9565b9050919050565b7f57686974656c6973742068617320616c726561647920636c61696d6564000000600082015250565b6000614152601d836135c0565b915061415d8261411c565b602082019050919050565b6000602082019050818103600083015261418181614145565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b60006141be600d836135c0565b91506141c982614188565b602082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061423b57607f821691505b60208210810361424e5761424d6141f4565b5b50919050565b600061425f8261321e565b915061426a8361321e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142a3576142a261402b565b5b828202905092915050565b7f416d6f756e74206d75737420626520706f73697469766520696e746567657200600082015250565b60006142e4601f836135c0565b91506142ef826142ae565b602082019050919050565b60006020820190508181036000830152614313816142d7565b9050919050565b7f4d6178207065722077616c6c6574207265616368656400000000000000000000600082015250565b60006143506016836135c0565b915061435b8261431a565b602082019050919050565b6000602082019050818103600083015261437f81614343565b9050919050565b600060408201905061439b6000830185613d1d565b6143a86020830184613d1d565b9392505050565b6000815190506143be81613cc4565b92915050565b6000602082840312156143da576143d96131b6565b5b60006143e8848285016143af565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061442b8261321e565b91506144368361321e565b925082614446576144456143f1565b5b828204905092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006144ad6029836135c0565b91506144b882614451565b604082019050919050565b600060208201905081810360008301526144dc816144a0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061451d8261321e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361454f5761454e61402b565b5b600182019050919050565b7f4e656564206174206c65617374206f6e65206164647265737300000000000000600082015250565b60006145906019836135c0565b915061459b8261455a565b602082019050919050565b600060208201905081810360008301526145bf81614583565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146226026836135c0565b915061462d826145c6565b604082019050919050565b6000602082019050818103600083015261465181614615565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146b46021836135c0565b91506146bf82614658565b604082019050919050565b600060208201905081810360008301526146e3816146a7565b9050919050565b60006040820190506146ff6000830185613294565b61470c6020830184613294565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147496020836135c0565b915061475482614713565b602082019050919050565b600060208201905081810360008301526147788161473c565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006147db602f836135c0565b91506147e68261477f565b604082019050919050565b6000602082019050818103600083015261480a816147ce565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061483882614811565b614842818561481c565b93506148528185602086016135d1565b61485b81613430565b840191505092915050565b600060a08201905061487b6000830188613d1d565b6148886020830187613d1d565b6148956040830186613294565b6148a26060830185613294565b81810360808301526148b4818461482d565b90509695505050505050565b6000815190506148cf816132ea565b92915050565b6000602082840312156148eb576148ea6131b6565b5b60006148f9848285016148c0565b91505092915050565b60008160e01c9050919050565b600060033d111561492e5760046000803e61492b600051614902565b90505b90565b600060443d106149be576149436131ac565b60043d036004823e80513d602482011167ffffffffffffffff8211171561496b5750506149be565b808201805167ffffffffffffffff81111561498957505050506149be565b80602083010160043d0385018111156149a65750505050506149be565b6149b582602001850186613470565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614a1d6034836135c0565b9150614a28826149c1565b604082019050919050565b60006020820190508181036000830152614a4c81614a10565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614aaf6028836135c0565b9150614aba82614a53565b604082019050919050565b60006020820190508181036000830152614ade81614aa2565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614b416028836135c0565b9150614b4c82614ae5565b604082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614bd36025836135c0565b9150614bde82614b77565b604082019050919050565b60006020820190508181036000830152614c0281614bc6565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614c65602a836135c0565b9150614c7082614c09565b604082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b60006040820190508181036000830152614cb58185613b08565b90508181036020830152614cc98184613b08565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614d2e6029836135c0565b9150614d3982614cd2565b604082019050919050565b60006020820190508181036000830152614d5d81614d21565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614dc06028836135c0565b9150614dcb82614d64565b604082019050919050565b60006020820190508181036000830152614def81614db3565b9050919050565b600060a082019050614e0b6000830188613d1d565b614e186020830187613d1d565b8181036040830152614e2a8186613b08565b90508181036060830152614e3e8185613b08565b90508181036080830152614e52818461482d565b9050969550505050505056fea26469706673582212204dab074def9cf97e8d3c4db087c5b55c08312b4b456634fface4260e1e1df0a664736f6c634300080d0033697066733a2f2f516d585739706e41524c484665676257483875653631316a37505956324b754c364e61564b393635756d6d785262

Deployed Bytecode

0x60806040526004361061023a5760003560e01c8063729ad39e1161012e578063bd85b039116100ab578063dc33e6811161006f578063dc33e6811461085b578063e985e9c514610898578063f242432a146108d5578063f2fde38b146108fe578063fbdb8494146109275761023a565b8063bd85b03914610762578063bdf08d711461079f578063c783fb32146107ca578063d5abeb0114610807578063d897833e146108325761023a565b806398a8cffe116100f257806398a8cffe1461067d5780639e400cae146106ba578063a035b1fe146106e3578063a22cb4651461070e578063b0f6f4b5146107375761023a565b8063729ad39e146105ac5780638895283f146105d55780638da5cb5b146105fe57806391b7f5ed1461062957806393ce0033146106525761023a565b80633ccfd60b116101bc5780634fe6b690116101805780634fe6b690146104d957806353135ca0146105025780635997bbee1461052d57806368428a1b1461056a578063715018a6146105955761023a565b80633ccfd60b1461040157806341f434341461041857806344d84381146104435780634e1273f41461045f5780634f558e791461049c5761023a565b806306fdde031161020357806306fdde03146103295780630e89341c146103545780632db11544146103915780632eb2c2d6146103ad578063386bfc98146103d65761023a565b8062fdd58e1461023f57806301ffc9a71461027c578063020c878d146102b957806302fe5305146102d55780630559a4df146102fe575b600080fd5b34801561024b57600080fd5b5061026660048036038101906102619190613254565b610950565b60405161027391906132a3565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613316565b610a18565b6040516102b0919061335e565b60405180910390f35b6102d360048036038101906102ce91906133de565b610afa565b005b3480156102e157600080fd5b506102fc60048036038101906102f7919061356c565b610da9565b005b34801561030a57600080fd5b50610313610dbd565b60405161032091906132a3565b60405180910390f35b34801561033557600080fd5b5061033e610dc3565b60405161034b919061363d565b60405180910390f35b34801561036057600080fd5b5061037b6004803603810190610376919061365f565b610e51565b604051610388919061363d565b60405180910390f35b6103ab60048036038101906103a6919061365f565b610ee5565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906137f0565b611126565b005b3480156103e257600080fd5b506103eb61127c565b6040516103f891906138d8565b60405180910390f35b34801561040d57600080fd5b50610416611282565b005b34801561042457600080fd5b5061042d6113a3565b60405161043a9190613952565b60405180910390f35b61045d600480360381019061045891906133de565b6113b5565b005b34801561046b57600080fd5b5061048660048036038101906104819190613a30565b611664565b6040516104939190613b66565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be919061365f565b61177d565b6040516104d0919061335e565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb9190613bb4565b611791565b005b34801561050e57600080fd5b506105176117ab565b604051610524919061335e565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613bf4565b6117be565b604051610561919061335e565b60405180910390f35b34801561057657600080fd5b5061057f611814565b60405161058c919061335e565b60405180910390f35b3480156105a157600080fd5b506105aa611827565b005b3480156105b857600080fd5b506105d360048036038101906105ce9190613c77565b61183b565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613cf0565b6118f2565b005b34801561060a57600080fd5b50610613611917565b6040516106209190613d2c565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b919061365f565b611941565b005b34801561065e57600080fd5b50610667611953565b60405161067491906132a3565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613bf4565b611959565b6040516106b1919061335e565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190613cf0565b611979565b005b3480156106ef57600080fd5b506106f86119c8565b60405161070591906132a3565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613d47565b6119ce565b005b34801561074357600080fd5b5061074c611ad8565b60405161075991906138d8565b60405180910390f35b34801561076e57600080fd5b506107896004803603810190610784919061365f565b611ade565b60405161079691906132a3565b60405180910390f35b3480156107ab57600080fd5b506107b4611afb565b6040516107c1919061335e565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec9190613bf4565b611b0e565b6040516107fe91906132a3565b60405180910390f35b34801561081357600080fd5b5061081c611b57565b60405161082991906132a3565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613cf0565b611b5d565b005b34801561086757600080fd5b50610882600480360381019061087d9190613bf4565b611b82565b60405161088f91906132a3565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190613d87565b611b9a565b6040516108cc919061335e565b60405180910390f35b3480156108e157600080fd5b506108fc60048036038101906108f79190613dc7565b611c2e565b005b34801561090a57600080fd5b5061092560048036038101906109209190613bf4565b611d84565b005b34801561093357600080fd5b5061094e6004803603810190610949919061365f565b611e07565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b790613ed0565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af35750610af282611e19565b5b9050919050565b600033604051602001610b0d9190613f38565b604051602081830303815290604052805190602001209050600554341015610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190613f9f565b60405180910390fd5b600760019054906101000a900460ff16610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb09061400b565b60405180910390fd5b6006546001610bc9600954611ade565b610bd3919061405a565b1115610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b906140fc565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9890614168565b60405180910390fd5b610cef838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483611e83565b610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d25906141d4565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610da433600954600160405180602001604052806000815250611e9a565b505050565b610db161204a565b610dba816120c8565b50565b60095481565b600e8054610dd090614223565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfc90614223565b8015610e495780601f10610e1e57610100808354040283529160200191610e49565b820191906000526020600020905b815481529060010190602001808311610e2c57829003601f168201915b505050505081565b606060028054610e6090614223565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8c90614223565b8015610ed95780601f10610eae57610100808354040283529160200191610ed9565b820191906000526020600020905b815481529060010190602001808311610ebc57829003601f168201915b50505050509050919050565b60055481610ef39190614254565b341015610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90613f9f565b60405180910390fd5b600760029054906101000a900460ff16610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b9061400b565b60405180910390fd5b60008111610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906142fa565b60405180910390fd5b60065481610fd6600954611ade565b610fe0919061405a565b1115611021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611018906140fc565b60405180910390fd5b60085481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461106f919061405a565b11156110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a790614366565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110ff919061405a565b92505081905550611123336009548360405180602001604052806000815250611e9a565b50565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611266573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361119a5761119586868686866120e2565b611274565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111e3929190614386565b602060405180830381865afa158015611200573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122491906143c4565b61126557336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161125c9190613d2c565b60405180910390fd5b5b61127386868686866120e2565b5b505050505050565b600a5481565b61128a61204a565b600047905060006103e86103a6836112a29190614254565b6112ac9190614420565b905060006103e86042846112c09190614254565b6112ca9190614420565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611334573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561139d573d6000803e3d6000fd5b50505050565b6daaeb6d7670e522a718067333cd4e81565b6000336040516020016113c89190613f38565b604051602081830303815290604052805190602001209050600554341015611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c90613f9f565b60405180910390fd5b600760009054906101000a900460ff16611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b9061400b565b60405180910390fd5b6006546001611484600954611ade565b61148e919061405a565b11156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c6906140fc565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390614168565b60405180910390fd5b6115aa838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483611e83565b6115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e0906141d4565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061165f33600954600160405180602001604052806000815250611e9a565b505050565b606081518351146116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a1906144c3565b60405180910390fd5b6000835167ffffffffffffffff8111156116c7576116c6613441565b5b6040519080825280602002602001820160405280156116f55781602001602082028036833780820191505090505b50905060005b84518110156117725761174285828151811061171a576117196144e3565b5b6020026020010151858381518110611735576117346144e3565b5b6020026020010151610950565b828281518110611755576117546144e3565b5b6020026020010181815250508061176b90614512565b90506116fb565b508091505092915050565b60008061178983611ade565b119050919050565b61179961204a565b81600a8190555080600d819055505050565b600760009054906101000a900460ff1681565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600760029054906101000a900460ff1681565b61182f61204a565b6118396000612183565b565b61184361204a565b60008282905011611889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611880906145a6565b60405180910390fd5b60005b828290508110156118ed576118dc8383838181106118ad576118ac6144e3565b5b90506020020160208101906118c29190613bf4565b600954600160405180602001604052806000815250611e9a565b806118e690614512565b905061188c565b505050565b6118fa61204a565b80600760006101000a81548160ff02191690831515021790555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61194961204a565b8060058190555050565b60085481565b600f6020528060005260406000206000915054906101000a900460ff1681565b61198161204a565b600760009054906101000a900460ff1615600760006101000a81548160ff02191690831515021790555080600760016101000a81548160ff02191690831515021790555050565b60055481565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ac9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a46929190614386565b602060405180830381865afa158015611a63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8791906143c4565b611ac857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611abf9190613d2c565b60405180910390fd5b5b611ad38383612249565b505050565b600d5481565b600060046000838152602001908152602001600020549050919050565b600760019054906101000a900460ff1681565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60065481565b611b6561204a565b80600760026101000a81548160ff02191690831515021790555050565b60106020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d6e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ca257611c9d868686868661225f565b611d7c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611ceb929190614386565b602060405180830381865afa158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c91906143c4565b611d6d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d649190613d2c565b60405180910390fd5b5b611d7b868686868661225f565b5b505050505050565b611d8c61204a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df290614638565b60405180910390fd5b611e0481612183565b50565b611e0f61204a565b8060088190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600082611e908584612300565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f00906146ca565b60405180910390fd5b6000611f13612356565b90506000611f208561235e565b90506000611f2d8561235e565b9050611f3e836000898585896123d8565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f9d919061405a565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161201b9291906146ea565b60405180910390a4612032836000898585896123ee565b612041836000898989896123f6565b50505050505050565b612052612356565b73ffffffffffffffffffffffffffffffffffffffff16612070611917565b73ffffffffffffffffffffffffffffffffffffffff16146120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd9061475f565b60405180910390fd5b565b80600290805190602001906120de929190613109565b5050565b6120ea612356565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612130575061212f8561212a612356565b611b9a565b5b61216f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612166906147f1565b60405180910390fd5b61217c85858585856125cd565b5050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61225b612254612356565b83836128ee565b5050565b612267612356565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806122ad57506122ac856122a7612356565b611b9a565b5b6122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e3906147f1565b60405180910390fd5b6122f98585858585612a5a565b5050505050565b60008082905060005b845181101561234b5761233682868381518110612329576123286144e3565b5b6020026020010151612cf5565b9150808061234390614512565b915050612309565b508091505092915050565b600033905090565b60606000600167ffffffffffffffff81111561237d5761237c613441565b5b6040519080825280602002602001820160405280156123ab5781602001602082028036833780820191505090505b50905082816000815181106123c3576123c26144e3565b5b60200260200101818152505080915050919050565b6123e6868686868686612d20565b505050505050565b505050505050565b6124158473ffffffffffffffffffffffffffffffffffffffff16612ef0565b156125c5578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161245b959493929190614866565b6020604051808303816000875af192505050801561249757506040513d601f19601f8201168201806040525081019061249491906148d5565b60015b61253c576124a361490f565b806308c379a0036124ff57506124b7614931565b806124c25750612501565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f6919061363d565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253390614a33565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba90614ac5565b60405180910390fd5b505b505050505050565b8151835114612611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260890614b57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267790614be9565b60405180910390fd5b600061268a612356565b905061269a8187878787876123d8565b60005b845181101561284b5760008582815181106126bb576126ba6144e3565b5b6020026020010151905060008583815181106126da576126d96144e3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614c7b565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612830919061405a565b925050819055505050508061284490614512565b905061269d565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128c2929190614c9b565b60405180910390a46128d88187878787876123ee565b6128e6818787878787612f13565b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295390614d44565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a4d919061335e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac090614be9565b60405180910390fd5b6000612ad3612356565b90506000612ae08561235e565b90506000612aed8561235e565b9050612afd8389898585896123d8565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8b90614c7b565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c49919061405a565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612cc69291906146ea565b60405180910390a4612cdc848a8a86868a6123ee565b612cea848a8a8a8a8a6123f6565b505050505050505050565b6000818310612d0d57612d0882846130ea565b612d18565b612d1783836130ea565b5b905092915050565b612d2e868686868686613101565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ddf5760005b8351811015612ddd57828181518110612d8157612d806144e3565b5b602002602001015160046000868481518110612da057612d9f6144e3565b5b602002602001015181526020019081526020016000206000828254612dc5919061405a565b9250508190555080612dd690614512565b9050612d65565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ee85760005b8351811015612ee6576000848281518110612e3457612e336144e3565b5b602002602001015190506000848381518110612e5357612e526144e3565b5b6020026020010151905060006004600084815260200190815260200160002054905081811015612eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaf90614dd6565b60405180910390fd5b818103600460008581526020019081526020016000208190555050505080612edf90614512565b9050612e16565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b612f328473ffffffffffffffffffffffffffffffffffffffff16612ef0565b156130e2578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612f78959493929190614df6565b6020604051808303816000875af1925050508015612fb457506040513d601f19601f82011682018060405250810190612fb191906148d5565b60015b61305957612fc061490f565b806308c379a00361301c5750612fd4614931565b80612fdf575061301e565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613013919061363d565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305090614a33565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d790614ac5565b60405180910390fd5b505b505050505050565b600082600052816020526040600020905092915050565b505050505050565b82805461311590614223565b90600052602060002090601f016020900481019282613137576000855561317e565b82601f1061315057805160ff191683800117855561317e565b8280016001018555821561317e579182015b8281111561317d578251825591602001919060010190613162565b5b50905061318b919061318f565b5090565b5b808211156131a8576000816000905550600101613190565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131eb826131c0565b9050919050565b6131fb816131e0565b811461320657600080fd5b50565b600081359050613218816131f2565b92915050565b6000819050919050565b6132318161321e565b811461323c57600080fd5b50565b60008135905061324e81613228565b92915050565b6000806040838503121561326b5761326a6131b6565b5b600061327985828601613209565b925050602061328a8582860161323f565b9150509250929050565b61329d8161321e565b82525050565b60006020820190506132b86000830184613294565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132f3816132be565b81146132fe57600080fd5b50565b600081359050613310816132ea565b92915050565b60006020828403121561332c5761332b6131b6565b5b600061333a84828501613301565b91505092915050565b60008115159050919050565b61335881613343565b82525050565b6000602082019050613373600083018461334f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261339e5761339d613379565b5b8235905067ffffffffffffffff8111156133bb576133ba61337e565b5b6020830191508360208202830111156133d7576133d6613383565b5b9250929050565b600080602083850312156133f5576133f46131b6565b5b600083013567ffffffffffffffff811115613413576134126131bb565b5b61341f85828601613388565b92509250509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61347982613430565b810181811067ffffffffffffffff8211171561349857613497613441565b5b80604052505050565b60006134ab6131ac565b90506134b78282613470565b919050565b600067ffffffffffffffff8211156134d7576134d6613441565b5b6134e082613430565b9050602081019050919050565b82818337600083830152505050565b600061350f61350a846134bc565b6134a1565b90508281526020810184848401111561352b5761352a61342b565b5b6135368482856134ed565b509392505050565b600082601f83011261355357613552613379565b5b81356135638482602086016134fc565b91505092915050565b600060208284031215613582576135816131b6565b5b600082013567ffffffffffffffff8111156135a05761359f6131bb565b5b6135ac8482850161353e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135ef5780820151818401526020810190506135d4565b838111156135fe576000848401525b50505050565b600061360f826135b5565b61361981856135c0565b93506136298185602086016135d1565b61363281613430565b840191505092915050565b600060208201905081810360008301526136578184613604565b905092915050565b600060208284031215613675576136746131b6565b5b60006136838482850161323f565b91505092915050565b600067ffffffffffffffff8211156136a7576136a6613441565b5b602082029050602081019050919050565b60006136cb6136c68461368c565b6134a1565b905080838252602082019050602084028301858111156136ee576136ed613383565b5b835b818110156137175780613703888261323f565b8452602084019350506020810190506136f0565b5050509392505050565b600082601f83011261373657613735613379565b5b81356137468482602086016136b8565b91505092915050565b600067ffffffffffffffff82111561376a57613769613441565b5b61377382613430565b9050602081019050919050565b600061379361378e8461374f565b6134a1565b9050828152602081018484840111156137af576137ae61342b565b5b6137ba8482856134ed565b509392505050565b600082601f8301126137d7576137d6613379565b5b81356137e7848260208601613780565b91505092915050565b600080600080600060a0868803121561380c5761380b6131b6565b5b600061381a88828901613209565b955050602061382b88828901613209565b945050604086013567ffffffffffffffff81111561384c5761384b6131bb565b5b61385888828901613721565b935050606086013567ffffffffffffffff811115613879576138786131bb565b5b61388588828901613721565b925050608086013567ffffffffffffffff8111156138a6576138a56131bb565b5b6138b2888289016137c2565b9150509295509295909350565b6000819050919050565b6138d2816138bf565b82525050565b60006020820190506138ed60008301846138c9565b92915050565b6000819050919050565b600061391861391361390e846131c0565b6138f3565b6131c0565b9050919050565b600061392a826138fd565b9050919050565b600061393c8261391f565b9050919050565b61394c81613931565b82525050565b60006020820190506139676000830184613943565b92915050565b600067ffffffffffffffff82111561398857613987613441565b5b602082029050602081019050919050565b60006139ac6139a78461396d565b6134a1565b905080838252602082019050602084028301858111156139cf576139ce613383565b5b835b818110156139f857806139e48882613209565b8452602084019350506020810190506139d1565b5050509392505050565b600082601f830112613a1757613a16613379565b5b8135613a27848260208601613999565b91505092915050565b60008060408385031215613a4757613a466131b6565b5b600083013567ffffffffffffffff811115613a6557613a646131bb565b5b613a7185828601613a02565b925050602083013567ffffffffffffffff811115613a9257613a916131bb565b5b613a9e85828601613721565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613add8161321e565b82525050565b6000613aef8383613ad4565b60208301905092915050565b6000602082019050919050565b6000613b1382613aa8565b613b1d8185613ab3565b9350613b2883613ac4565b8060005b83811015613b59578151613b408882613ae3565b9750613b4b83613afb565b925050600181019050613b2c565b5085935050505092915050565b60006020820190508181036000830152613b808184613b08565b905092915050565b613b91816138bf565b8114613b9c57600080fd5b50565b600081359050613bae81613b88565b92915050565b60008060408385031215613bcb57613bca6131b6565b5b6000613bd985828601613b9f565b9250506020613bea85828601613b9f565b9150509250929050565b600060208284031215613c0a57613c096131b6565b5b6000613c1884828501613209565b91505092915050565b60008083601f840112613c3757613c36613379565b5b8235905067ffffffffffffffff811115613c5457613c5361337e565b5b602083019150836020820283011115613c7057613c6f613383565b5b9250929050565b60008060208385031215613c8e57613c8d6131b6565b5b600083013567ffffffffffffffff811115613cac57613cab6131bb565b5b613cb885828601613c21565b92509250509250929050565b613ccd81613343565b8114613cd857600080fd5b50565b600081359050613cea81613cc4565b92915050565b600060208284031215613d0657613d056131b6565b5b6000613d1484828501613cdb565b91505092915050565b613d26816131e0565b82525050565b6000602082019050613d416000830184613d1d565b92915050565b60008060408385031215613d5e57613d5d6131b6565b5b6000613d6c85828601613209565b9250506020613d7d85828601613cdb565b9150509250929050565b60008060408385031215613d9e57613d9d6131b6565b5b6000613dac85828601613209565b9250506020613dbd85828601613209565b9150509250929050565b600080600080600060a08688031215613de357613de26131b6565b5b6000613df188828901613209565b9550506020613e0288828901613209565b9450506040613e138882890161323f565b9350506060613e248882890161323f565b925050608086013567ffffffffffffffff811115613e4557613e446131bb565b5b613e51888289016137c2565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613eba602a836135c0565b9150613ec582613e5e565b604082019050919050565b60006020820190508181036000830152613ee981613ead565b9050919050565b60008160601b9050919050565b6000613f0882613ef0565b9050919050565b6000613f1a82613efd565b9050919050565b613f32613f2d826131e0565b613f0f565b82525050565b6000613f448284613f21565b60148201915081905092915050565b7f53656e6420636f727265637420616d6f756e7400000000000000000000000000600082015250565b6000613f896013836135c0565b9150613f9482613f53565b602082019050919050565b60006020820190508181036000830152613fb881613f7c565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000613ff56012836135c0565b915061400082613fbf565b602082019050919050565b6000602082019050818103600083015261402481613fe8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140658261321e565b91506140708361321e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140a5576140a461402b565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b60006140e66020836135c0565b91506140f1826140b0565b602082019050919050565b60006020820190508181036000830152614115816140d9565b9050919050565b7f57686974656c6973742068617320616c726561647920636c61696d6564000000600082015250565b6000614152601d836135c0565b915061415d8261411c565b602082019050919050565b6000602082019050818103600083015261418181614145565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b60006141be600d836135c0565b91506141c982614188565b602082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061423b57607f821691505b60208210810361424e5761424d6141f4565b5b50919050565b600061425f8261321e565b915061426a8361321e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142a3576142a261402b565b5b828202905092915050565b7f416d6f756e74206d75737420626520706f73697469766520696e746567657200600082015250565b60006142e4601f836135c0565b91506142ef826142ae565b602082019050919050565b60006020820190508181036000830152614313816142d7565b9050919050565b7f4d6178207065722077616c6c6574207265616368656400000000000000000000600082015250565b60006143506016836135c0565b915061435b8261431a565b602082019050919050565b6000602082019050818103600083015261437f81614343565b9050919050565b600060408201905061439b6000830185613d1d565b6143a86020830184613d1d565b9392505050565b6000815190506143be81613cc4565b92915050565b6000602082840312156143da576143d96131b6565b5b60006143e8848285016143af565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061442b8261321e565b91506144368361321e565b925082614446576144456143f1565b5b828204905092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006144ad6029836135c0565b91506144b882614451565b604082019050919050565b600060208201905081810360008301526144dc816144a0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061451d8261321e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361454f5761454e61402b565b5b600182019050919050565b7f4e656564206174206c65617374206f6e65206164647265737300000000000000600082015250565b60006145906019836135c0565b915061459b8261455a565b602082019050919050565b600060208201905081810360008301526145bf81614583565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146226026836135c0565b915061462d826145c6565b604082019050919050565b6000602082019050818103600083015261465181614615565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146b46021836135c0565b91506146bf82614658565b604082019050919050565b600060208201905081810360008301526146e3816146a7565b9050919050565b60006040820190506146ff6000830185613294565b61470c6020830184613294565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147496020836135c0565b915061475482614713565b602082019050919050565b600060208201905081810360008301526147788161473c565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006147db602f836135c0565b91506147e68261477f565b604082019050919050565b6000602082019050818103600083015261480a816147ce565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061483882614811565b614842818561481c565b93506148528185602086016135d1565b61485b81613430565b840191505092915050565b600060a08201905061487b6000830188613d1d565b6148886020830187613d1d565b6148956040830186613294565b6148a26060830185613294565b81810360808301526148b4818461482d565b90509695505050505050565b6000815190506148cf816132ea565b92915050565b6000602082840312156148eb576148ea6131b6565b5b60006148f9848285016148c0565b91505092915050565b60008160e01c9050919050565b600060033d111561492e5760046000803e61492b600051614902565b90505b90565b600060443d106149be576149436131ac565b60043d036004823e80513d602482011167ffffffffffffffff8211171561496b5750506149be565b808201805167ffffffffffffffff81111561498957505050506149be565b80602083010160043d0385018111156149a65750505050506149be565b6149b582602001850186613470565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614a1d6034836135c0565b9150614a28826149c1565b604082019050919050565b60006020820190508181036000830152614a4c81614a10565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614aaf6028836135c0565b9150614aba82614a53565b604082019050919050565b60006020820190508181036000830152614ade81614aa2565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614b416028836135c0565b9150614b4c82614ae5565b604082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614bd36025836135c0565b9150614bde82614b77565b604082019050919050565b60006020820190508181036000830152614c0281614bc6565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614c65602a836135c0565b9150614c7082614c09565b604082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b60006040820190508181036000830152614cb58185613b08565b90508181036020830152614cc98184613b08565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614d2e6029836135c0565b9150614d3982614cd2565b604082019050919050565b60006020820190508181036000830152614d5d81614d21565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614dc06028836135c0565b9150614dcb82614d64565b604082019050919050565b60006020820190508181036000830152614def81614db3565b9050919050565b600060a082019050614e0b6000830188613d1d565b614e186020830187613d1d565b8181036040830152614e2a8186613b08565b90508181036060830152614e3e8185613b08565b90508181036080830152614e52818461482d565b9050969550505050505056fea26469706673582212204dab074def9cf97e8d3c4db087c5b55c08312b4b456634fface4260e1e1df0a664736f6c634300080d0033

Deployed Bytecode Sourcemap

57938:5934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39138:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38111:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59527:705;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61981:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58291:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58566:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38882:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60261:627;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63567:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58330:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62345:300;;;;;;;;;;;;;:::i;:::-;;2854:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58814:705;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39621:561;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56679:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61780:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58129:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60896:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58210:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17580:103;;;;;;;;;;;;;:::i;:::-;;62078:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61190:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16932:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61688:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58247:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58615:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61311:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58052:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63071:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58534:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56468:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58169:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61025:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58092:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61579:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58669:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40514:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63287:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17838:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61468:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39138:317;39269:7;39335:1;39316:21;;:7;:21;;;39294:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;39425:9;:13;39435:2;39425:13;;;;;;;;;;;:22;39439:7;39425:22;;;;;;;;;;;;;;;;39418:29;;39138:317;;;;:::o;38111:360::-;38258:4;38315:26;38300:41;;;:11;:41;;;;:110;;;;38373:37;38358:52;;;:11;:52;;;;38300:110;:163;;;;38427:36;38451:11;38427:23;:36::i;:::-;38300:163;38280:183;;38111:360;;;:::o;59527:705::-;59611:12;59653:10;59636:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;59626:39;;;;;;59611:54;;59699:5;;59686:9;:18;;59678:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;59747:14;;;;;;;;;;;59739:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;59851:9;;59846:1;59817:26;59829:13;;59817:11;:26::i;:::-;:30;;;;:::i;:::-;:43;;59795:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;59940:15;:27;59956:10;59940:27;;;;;;;;;;;;;;;;;;;;;;;;;59939:28;59931:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60036:50;60055:12;;60036:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60069:10;;60081:4;60036:18;:50::i;:::-;60014:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;60170:4;60140:15;:27;60156:10;60140:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;60185:39;60191:10;60203:13;;60218:1;60185:39;;;;;;;;;;;;:5;:39::i;:::-;59600:632;59527:705;;:::o;61981:89::-;16818:13;:11;:13::i;:::-;62047:15:::1;62055:6;62047:7;:15::i;:::-;61981:89:::0;:::o;58291:32::-;;;;:::o;58566:40::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38882:105::-;38942:13;38975:4;38968:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38882:105;;;:::o;60261:627::-;60353:5;;60344:6;:14;;;;:::i;:::-;60331:9;:27;;60323:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60401:10;;;;;;;;;;;60393:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;60462:1;60453:6;:10;60445:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;60571:9;;60561:6;60532:26;60544:13;;60532:11;:26::i;:::-;:35;;;;:::i;:::-;:48;;60510:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;60710:18;;60700:6;60673:12;:24;60686:10;60673:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:55;;60651:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;60817:6;60789:12;:24;60802:10;60789:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;60836:44;60842:10;60854:13;;60869:6;60836:44;;;;;;;;;;;;:5;:44::i;:::-;60261:627;:::o;63567:302::-;63787:4;4284:1;2954:42;4236:45;;;:49;4232:632;;;4525:10;4517:18;;:4;:18;;;4513:85;;63804:57:::1;63832:4;63838:2;63842:3;63847:7;63856:4;63804:27;:57::i;:::-;4576:7:::0;;4513:85;2954:42;4635;;;4708:4;4736:10;4635:130;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4612:241;;4826:10;4807:30;;;;;;;;;;;:::i;:::-;;;;;;;;4612:241;4232:632;63804:57:::1;63832:4;63838:2;63842:3;63847:7;63856:4;63804:27;:57::i;:::-;63567:302:::0;;;;;;;:::o;58330:28::-;;;;:::o;62345:300::-;16818:13;:11;:13::i;:::-;62395:15:::1;62413:21;62395:39;;62445:16;62482:4;62475:3;62465:7;:13;;;;:::i;:::-;62464:22;;;;:::i;:::-;62445:41;;62497:16;62533:4;62527:2;62517:7;:12;;;;:::i;:::-;62516:21;;;;:::i;:::-;62497:40;;62558:13;;;;;;;;;;;62550:31;;:41;62582:8;62550:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62610:7;;;;;;;;;;;62602:25;;:35;62628:8;62602:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62384:261;;;62345:300::o:0;2854:143::-;2954:42;2854:143;:::o;58814:705::-;58896:12;58938:10;58921:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;58911:39;;;;;;58896:54;;58984:5;;58971:9;:18;;58963:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;59032:13;;;;;;;;;;;59024:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59135:9;;59130:1;59101:26;59113:13;;59101:11;:26::i;:::-;:30;;;;:::i;:::-;:43;;59079:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;59224:15;:27;59240:10;59224:27;;;;;;;;;;;;;;;;;;;;;;;;;59223:28;59215:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59320:53;59339:12;;59320:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59353:13;;59368:4;59320:18;:53::i;:::-;59298:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;59457:4;59427:15;:27;59443:10;59427:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;59472:39;59478:10;59490:13;;59505:1;59472:39;;;;;;;;;;;;:5;:39::i;:::-;58885:634;58814:705;;:::o;39621:561::-;39777:16;39852:3;:10;39833:8;:15;:29;39811:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;39944:30;39991:8;:15;39977:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39944:63;;40025:9;40020:122;40044:8;:15;40040:1;:19;40020:122;;;40100:30;40110:8;40119:1;40110:11;;;;;;;;:::i;:::-;;;;;;;;40123:3;40127:1;40123:6;;;;;;;;:::i;:::-;;;;;;;;40100:9;:30::i;:::-;40081:13;40095:1;40081:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;40061:3;;;;:::i;:::-;;;40020:122;;;;40161:13;40154:20;;;39621:561;;;;:::o;56679:122::-;56736:4;56792:1;56760:29;56786:2;56760:25;:29::i;:::-;:33;56753:40;;56679:122;;;:::o;61780:193::-;16818:13;:11;:13::i;:::-;61918:12:::1;61902:13;:28;;;;61954:11;61941:10;:24;;;;61780:193:::0;;:::o;58129:33::-;;;;;;;;;;;;;:::o;60896:121::-;60962:4;60986:15;:23;61002:6;60986:23;;;;;;;;;;;;;;;;;;;;;;;;;60979:30;;60896:121;;;:::o;58210:30::-;;;;;;;;;;;;;:::o;17580:103::-;16818:13;:11;:13::i;:::-;17645:30:::1;17672:1;17645:18;:30::i;:::-;17580:103::o:0;62078:262::-;16818:13;:11;:13::i;:::-;62180:1:::1;62161:9;;:16;;:20;62153:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62227:9;62222:111;62242:9;;:16;;62238:1;:20;62222:111;;;62280:41;62286:9;;62296:1;62286:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62300:13;;62315:1;62280:41;;;;;;;;;;;::::0;:5:::1;:41::i;:::-;62260:3;;;;:::i;:::-;;;62222:111;;;;62078:262:::0;;:::o;61190:113::-;16818:13;:11;:13::i;:::-;61281:14:::1;61265:13;;:30;;;;;;;;;;;;;;;;;;61190:113:::0;:::o;16932:87::-;16978:7;17005:6;;;;;;;;;;;16998:13;;16932:87;:::o;61688:84::-;16818:13;:11;:13::i;:::-;61758:6:::1;61750:5;:14;;;;61688:84:::0;:::o;58247:37::-;;;;:::o;58615:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;61311:149::-;16818:13;:11;:13::i;:::-;61399::::1;;;;;;;;;;;61398:14;61382:13;;:30;;;;;;;;;;;;;;;;;;61440:12;61423:14;;:29;;;;;;;;;;;;;;;;;;61311:149:::0;:::o;58052:33::-;;;;:::o;63071:208::-;63202:8;5123:1;2954:42;5075:45;;;:49;5071:318;;;2954:42;5164;;;5237:4;5265:8;5164:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5141:237;;5353:8;5334:28;;;;;;;;;;;:::i;:::-;;;;;;;;5141:237;5071:318;63228:43:::1;63252:8;63262;63228:23;:43::i;:::-;63071:208:::0;;;:::o;58534:25::-;;;;:::o;56468:113::-;56530:7;56557:12;:16;56570:2;56557:16;;;;;;;;;;;;56550:23;;56468:113;;;:::o;58169:34::-;;;;;;;;;;;;;:::o;61025:157::-;61122:7;61154:12;:20;61167:6;61154:20;;;;;;;;;;;;;;;;61147:27;;61025:157;;;:::o;58092:30::-;;;;:::o;61579:101::-;16818:13;:11;:13::i;:::-;61661:11:::1;61648:10;;:24;;;;;;;;;;;;;;;;;;61579:101:::0;:::o;58669:47::-;;;;;;;;;;;;;;;;;:::o;40514:218::-;40658:4;40687:18;:27;40706:7;40687:27;;;;;;;;;;;;;;;:37;40715:8;40687:37;;;;;;;;;;;;;;;;;;;;;;;;;40680:44;;40514:218;;;;:::o;63287:272::-;63479:4;4284:1;2954:42;4236:45;;;:49;4232:632;;;4525:10;4517:18;;:4;:18;;;4513:85;;63496:55:::1;63519:4;63525:2;63529:7;63538:6;63546:4;63496:22;:55::i;:::-;4576:7:::0;;4513:85;2954:42;4635;;;4708:4;4736:10;4635:130;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4612:241;;4826:10;4807:30;;;;;;;;;;;:::i;:::-;;;;;;;;4612:241;4232:632;63496:55:::1;63519:4;63525:2;63529:7;63538:6;63546:4;63496:22;:55::i;:::-;63287:272:::0;;;;;;;:::o;17838:238::-;16818:13;:11;:13::i;:::-;17961:1:::1;17941:22;;:8;:22;;::::0;17919:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18040:28;18059:8;18040:18;:28::i;:::-;17838:238:::0;:::o;61468:103::-;16818:13;:11;:13::i;:::-;61556:7:::1;61535:18;:28;;;;61468:103:::0;:::o;29228:207::-;29358:4;29402:25;29387:40;;;:11;:40;;;;29380:47;;29228:207;;;:::o;6973:190::-;7098:4;7151;7122:25;7135:5;7142:4;7122:12;:25::i;:::-;:33;7115:40;;6973:190;;;;;:::o;46199:818::-;46366:1;46352:16;;:2;:16;;;46344:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46419:16;46438:12;:10;:12::i;:::-;46419:31;;46461:20;46484:21;46502:2;46484:17;:21::i;:::-;46461:44;;46516:24;46543:25;46561:6;46543:17;:25::i;:::-;46516:52;;46581:66;46602:8;46620:1;46624:2;46628:3;46633:7;46642:4;46581:20;:66::i;:::-;46681:6;46660:9;:13;46670:2;46660:13;;;;;;;;;;;:17;46674:2;46660:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46740:2;46703:52;;46736:1;46703:52;;46718:8;46703:52;;;46744:2;46748:6;46703:52;;;;;;;:::i;:::-;;;;;;;;46768:65;46788:8;46806:1;46810:2;46814:3;46819:7;46828:4;46768:19;:65::i;:::-;46846:163;46891:8;46922:1;46939:2;46956;46973:6;46994:4;46846:30;:163::i;:::-;46333:684;;;46199:818;;;;:::o;17097:132::-;17172:12;:10;:12::i;:::-;17161:23;;:7;:5;:7::i;:::-;:23;;;17153:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17097:132::o;45725:88::-;45799:6;45792:4;:13;;;;;;;;;;;;:::i;:::-;;45725:88;:::o;41288:439::-;41529:12;:10;:12::i;:::-;41521:20;;:4;:20;;;:60;;;;41545:36;41562:4;41568:12;:10;:12::i;:::-;41545:16;:36::i;:::-;41521:60;41499:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;41667:52;41690:4;41696:2;41700:3;41705:7;41714:4;41667:22;:52::i;:::-;41288:439;;;;;:::o;18236:191::-;18310:16;18329:6;;;;;;;;;;;18310:25;;18355:8;18346:6;;:17;;;;;;;;;;;;;;;;;;18410:8;18379:40;;18400:8;18379:40;;;;;;;;;;;;18299:128;18236:191;:::o;40255:187::-;40382:52;40401:12;:10;:12::i;:::-;40415:8;40425;40382:18;:52::i;:::-;40255:187;;:::o;40804:407::-;41020:12;:10;:12::i;:::-;41012:20;;:4;:20;;;:60;;;;41036:36;41053:4;41059:12;:10;:12::i;:::-;41036:16;:36::i;:::-;41012:60;40990:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;41158:45;41176:4;41182:2;41186;41190:6;41198:4;41158:17;:45::i;:::-;40804:407;;;;;:::o;7840:328::-;7950:7;7975:20;7998:4;7975:27;;8018:9;8013:118;8037:5;:12;8033:1;:16;8013:118;;;8086:33;8096:12;8110:5;8116:1;8110:8;;;;;;;;:::i;:::-;;;;;;;;8086:9;:33::i;:::-;8071:48;;8051:3;;;;;:::i;:::-;;;;8013:118;;;;8148:12;8141:19;;;7840:328;;;;:::o;15462:98::-;15515:7;15542:10;15535:17;;15462:98;:::o;55495:230::-;55588:16;55622:22;55661:1;55647:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55622:41;;55685:7;55674:5;55680:1;55674:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;55712:5;55705:12;;;55495:230;;;:::o;62701:329::-;62956:66;62983:8;62993:4;62999:2;63003:3;63008:7;63017:4;62956:26;:66::i;:::-;62701:329;;;;;;:::o;53378:220::-;;;;;;;:::o;53606:898::-;53821:15;:2;:13;;;:15::i;:::-;53817:680;;;53891:2;53874:38;;;53935:8;53966:4;53993:2;54018:6;54047:4;53874:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53853:633;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;54359:6;54352:14;;;;;;;;;;;:::i;:::-;;;;;;;;53853:633;;;54408:62;;;;;;;;;;:::i;:::-;;;;;;;;53853:633;54145:43;;;54133:55;;;:8;:55;;;;54129:154;;54213:50;;;;;;;;;;:::i;:::-;;;;;;;;54129:154;54084:214;53817:680;53606:898;;;;;;:::o;43560:1321::-;43801:7;:14;43787:3;:10;:28;43765:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;43916:1;43902:16;;:2;:16;;;43894:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43973:16;43992:12;:10;:12::i;:::-;43973:31;;44017:60;44038:8;44048:4;44054:2;44058:3;44063:7;44072:4;44017:20;:60::i;:::-;44095:9;44090:470;44114:3;:10;44110:1;:14;44090:470;;;44146:10;44159:3;44163:1;44159:6;;;;;;;;:::i;:::-;;;;;;;;44146:19;;44180:14;44197:7;44205:1;44197:10;;;;;;;;:::i;:::-;;;;;;;;44180:27;;44224:19;44246:9;:13;44256:2;44246:13;;;;;;;;;;;:19;44260:4;44246:19;;;;;;;;;;;;;;;;44224:41;;44321:6;44306:11;:21;;44280:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;44485:6;44471:11;:20;44449:9;:13;44459:2;44449:13;;;;;;;;;;;:19;44463:4;44449:19;;;;;;;;;;;;;;;:42;;;;44542:6;44521:9;:13;44531:2;44521:13;;;;;;;;;;;:17;44535:2;44521:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;44131:429;;;44126:3;;;;:::i;:::-;;;44090:470;;;;44607:2;44577:47;;44601:4;44577:47;;44591:8;44577:47;;;44611:3;44616:7;44577:47;;;;;;;:::i;:::-;;;;;;;;44637:59;44657:8;44667:4;44673:2;44677:3;44682:7;44691:4;44637:19;:59::i;:::-;44709:164;44759:8;44782:4;44801:2;44818:3;44836:7;44858:4;44709:35;:164::i;:::-;43754:1127;43560:1321;;;;;:::o;50913:331::-;51068:8;51059:17;;:5;:17;;;51051:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51171:8;51133:18;:25;51152:5;51133:25;;;;;;;;;;;;;;;:35;51159:8;51133:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51217:8;51195:41;;51210:5;51195:41;;;51227:8;51195:41;;;;;;:::i;:::-;;;;;;;;50913:331;;;:::o;42191:1011::-;42393:1;42379:16;;:2;:16;;;42371:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42450:16;42469:12;:10;:12::i;:::-;42450:31;;42492:20;42515:21;42533:2;42515:17;:21::i;:::-;42492:44;;42547:24;42574:25;42592:6;42574:17;:25::i;:::-;42547:52;;42612:60;42633:8;42643:4;42649:2;42653:3;42658:7;42667:4;42612:20;:60::i;:::-;42685:19;42707:9;:13;42717:2;42707:13;;;;;;;;;;;:19;42721:4;42707:19;;;;;;;;;;;;;;;;42685:41;;42774:6;42759:11;:21;;42737:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;42922:6;42908:11;:20;42886:9;:13;42896:2;42886:13;;;;;;;;;;;:19;42900:4;42886:19;;;;;;;;;;;;;;;:42;;;;42971:6;42950:9;:13;42960:2;42950:13;;;;;;;;;;;:17;42964:2;42950:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;43026:2;42995:46;;43020:4;42995:46;;43010:8;42995:46;;;43030:2;43034:6;42995:46;;;;;;;:::i;:::-;;;;;;;;43054:59;43074:8;43084:4;43090:2;43094:3;43099:7;43108:4;43054:19;:59::i;:::-;43126:68;43157:8;43167:4;43173:2;43177;43181:6;43189:4;43126:30;:68::i;:::-;42360:842;;;;42191:1011;;;;;:::o;14321:149::-;14384:7;14415:1;14411;:5;:51;;14442:20;14457:1;14460;14442:14;:20::i;:::-;14411:51;;;14419:20;14434:1;14437;14419:14;:20::i;:::-;14411:51;14404:58;;14321:149;;;;:::o;56876:992::-;57115:66;57142:8;57152:4;57158:2;57162:3;57167:7;57176:4;57115:26;:66::i;:::-;57214:1;57198:18;;:4;:18;;;57194:160;;57238:9;57233:110;57257:3;:10;57253:1;:14;57233:110;;;57317:7;57325:1;57317:10;;;;;;;;:::i;:::-;;;;;;;;57293:12;:20;57306:3;57310:1;57306:6;;;;;;;;:::i;:::-;;;;;;;;57293:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;57269:3;;;;:::i;:::-;;;57233:110;;;;57194:160;57384:1;57370:16;;:2;:16;;;57366:495;;57408:9;57403:447;57427:3;:10;57423:1;:14;57403:447;;;57463:10;57476:3;57480:1;57476:6;;;;;;;;:::i;:::-;;;;;;;;57463:19;;57501:14;57518:7;57526:1;57518:10;;;;;;;;:::i;:::-;;;;;;;;57501:27;;57547:14;57564:12;:16;57577:2;57564:16;;;;;;;;;;;;57547:33;;57639:6;57629;:16;;57599:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;57809:6;57800;:15;57781:12;:16;57794:2;57781:16;;;;;;;;;;;:34;;;;57444:406;;;57439:3;;;;:::i;:::-;;;57403:447;;;;57366:495;56876:992;;;;;;:::o;19665:326::-;19725:4;19982:1;19960:7;:19;;;:23;19953:30;;19665:326;;;:::o;54512:975::-;54752:15;:2;:13;;;:15::i;:::-;54748:732;;;54822:2;54805:43;;;54871:8;54902:4;54929:3;54955:7;54985:4;54805:203;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54784:685;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;55342:6;55335:14;;;;;;;;;;;:::i;:::-;;;;;;;;54784:685;;;55391:62;;;;;;;;;;:::i;:::-;;;;;;;;54784:685;55105:48;;;55093:60;;;:8;:60;;;;55067:199;;55196:50;;;;;;;;;;:::i;:::-;;;;;;;;55067:199;55022:259;54748:732;54512:975;;;;;;:::o;14478:300::-;14573:13;14685:1;14679:4;14672:15;14714:1;14708:4;14701:15;14755:4;14749;14739:21;14730:30;;14478:300;;;;:::o;52202:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:117;3568:1;3565;3558:12;3599:568;3672:8;3682:6;3732:3;3725:4;3717:6;3713:17;3709:27;3699:122;;3740:79;;:::i;:::-;3699:122;3853:6;3840:20;3830:30;;3883:18;3875:6;3872:30;3869:117;;;3905:79;;:::i;:::-;3869:117;4019:4;4011:6;4007:17;3995:29;;4073:3;4065:4;4057:6;4053:17;4043:8;4039:32;4036:41;4033:128;;;4080:79;;:::i;:::-;4033:128;3599:568;;;;;:::o;4173:559::-;4259:6;4267;4316:2;4304:9;4295:7;4291:23;4287:32;4284:119;;;4322:79;;:::i;:::-;4284:119;4470:1;4459:9;4455:17;4442:31;4500:18;4492:6;4489:30;4486:117;;;4522:79;;:::i;:::-;4486:117;4635:80;4707:7;4698:6;4687:9;4683:22;4635:80;:::i;:::-;4617:98;;;;4413:312;4173:559;;;;;:::o;4738:117::-;4847:1;4844;4837:12;4861:102;4902:6;4953:2;4949:7;4944:2;4937:5;4933:14;4929:28;4919:38;;4861:102;;;:::o;4969:180::-;5017:77;5014:1;5007:88;5114:4;5111:1;5104:15;5138:4;5135:1;5128:15;5155:281;5238:27;5260:4;5238:27;:::i;:::-;5230:6;5226:40;5368:6;5356:10;5353:22;5332:18;5320:10;5317:34;5314:62;5311:88;;;5379:18;;:::i;:::-;5311:88;5419:10;5415:2;5408:22;5198:238;5155:281;;:::o;5442:129::-;5476:6;5503:20;;:::i;:::-;5493:30;;5532:33;5560:4;5552:6;5532:33;:::i;:::-;5442:129;;;:::o;5577:308::-;5639:4;5729:18;5721:6;5718:30;5715:56;;;5751:18;;:::i;:::-;5715:56;5789:29;5811:6;5789:29;:::i;:::-;5781:37;;5873:4;5867;5863:15;5855:23;;5577:308;;;:::o;5891:154::-;5975:6;5970:3;5965;5952:30;6037:1;6028:6;6023:3;6019:16;6012:27;5891:154;;;:::o;6051:412::-;6129:5;6154:66;6170:49;6212:6;6170:49;:::i;:::-;6154:66;:::i;:::-;6145:75;;6243:6;6236:5;6229:21;6281:4;6274:5;6270:16;6319:3;6310:6;6305:3;6301:16;6298:25;6295:112;;;6326:79;;:::i;:::-;6295:112;6416:41;6450:6;6445:3;6440;6416:41;:::i;:::-;6135:328;6051:412;;;;;:::o;6483:340::-;6539:5;6588:3;6581:4;6573:6;6569:17;6565:27;6555:122;;6596:79;;:::i;:::-;6555:122;6713:6;6700:20;6738:79;6813:3;6805:6;6798:4;6790:6;6786:17;6738:79;:::i;:::-;6729:88;;6545:278;6483:340;;;;:::o;6829:509::-;6898:6;6947:2;6935:9;6926:7;6922:23;6918:32;6915:119;;;6953:79;;:::i;:::-;6915:119;7101:1;7090:9;7086:17;7073:31;7131:18;7123:6;7120:30;7117:117;;;7153:79;;:::i;:::-;7117:117;7258:63;7313:7;7304:6;7293:9;7289:22;7258:63;:::i;:::-;7248:73;;7044:287;6829:509;;;;:::o;7344:99::-;7396:6;7430:5;7424:12;7414:22;;7344:99;;;:::o;7449:169::-;7533:11;7567:6;7562:3;7555:19;7607:4;7602:3;7598:14;7583:29;;7449:169;;;;:::o;7624:307::-;7692:1;7702:113;7716:6;7713:1;7710:13;7702:113;;;7801:1;7796:3;7792:11;7786:18;7782:1;7777:3;7773:11;7766:39;7738:2;7735:1;7731:10;7726:15;;7702:113;;;7833:6;7830:1;7827:13;7824:101;;;7913:1;7904:6;7899:3;7895:16;7888:27;7824:101;7673:258;7624:307;;;:::o;7937:364::-;8025:3;8053:39;8086:5;8053:39;:::i;:::-;8108:71;8172:6;8167:3;8108:71;:::i;:::-;8101:78;;8188:52;8233:6;8228:3;8221:4;8214:5;8210:16;8188:52;:::i;:::-;8265:29;8287:6;8265:29;:::i;:::-;8260:3;8256:39;8249:46;;8029:272;7937:364;;;;:::o;8307:313::-;8420:4;8458:2;8447:9;8443:18;8435:26;;8507:9;8501:4;8497:20;8493:1;8482:9;8478:17;8471:47;8535:78;8608:4;8599:6;8535:78;:::i;:::-;8527:86;;8307:313;;;;:::o;8626:329::-;8685:6;8734:2;8722:9;8713:7;8709:23;8705:32;8702:119;;;8740:79;;:::i;:::-;8702:119;8860:1;8885:53;8930:7;8921:6;8910:9;8906:22;8885:53;:::i;:::-;8875:63;;8831:117;8626:329;;;;:::o;8961:311::-;9038:4;9128:18;9120:6;9117:30;9114:56;;;9150:18;;:::i;:::-;9114:56;9200:4;9192:6;9188:17;9180:25;;9260:4;9254;9250:15;9242:23;;8961:311;;;:::o;9295:710::-;9391:5;9416:81;9432:64;9489:6;9432:64;:::i;:::-;9416:81;:::i;:::-;9407:90;;9517:5;9546:6;9539:5;9532:21;9580:4;9573:5;9569:16;9562:23;;9633:4;9625:6;9621:17;9613:6;9609:30;9662:3;9654:6;9651:15;9648:122;;;9681:79;;:::i;:::-;9648:122;9796:6;9779:220;9813:6;9808:3;9805:15;9779:220;;;9888:3;9917:37;9950:3;9938:10;9917:37;:::i;:::-;9912:3;9905:50;9984:4;9979:3;9975:14;9968:21;;9855:144;9839:4;9834:3;9830:14;9823:21;;9779:220;;;9783:21;9397:608;;9295:710;;;;;:::o;10028:370::-;10099:5;10148:3;10141:4;10133:6;10129:17;10125:27;10115:122;;10156:79;;:::i;:::-;10115:122;10273:6;10260:20;10298:94;10388:3;10380:6;10373:4;10365:6;10361:17;10298:94;:::i;:::-;10289:103;;10105:293;10028:370;;;;:::o;10404:307::-;10465:4;10555:18;10547:6;10544:30;10541:56;;;10577:18;;:::i;:::-;10541:56;10615:29;10637:6;10615:29;:::i;:::-;10607:37;;10699:4;10693;10689:15;10681:23;;10404:307;;;:::o;10717:410::-;10794:5;10819:65;10835:48;10876:6;10835:48;:::i;:::-;10819:65;:::i;:::-;10810:74;;10907:6;10900:5;10893:21;10945:4;10938:5;10934:16;10983:3;10974:6;10969:3;10965:16;10962:25;10959:112;;;10990:79;;:::i;:::-;10959:112;11080:41;11114:6;11109:3;11104;11080:41;:::i;:::-;10800:327;10717:410;;;;;:::o;11146:338::-;11201:5;11250:3;11243:4;11235:6;11231:17;11227:27;11217:122;;11258:79;;:::i;:::-;11217:122;11375:6;11362:20;11400:78;11474:3;11466:6;11459:4;11451:6;11447:17;11400:78;:::i;:::-;11391:87;;11207:277;11146:338;;;;:::o;11490:1509::-;11644:6;11652;11660;11668;11676;11725:3;11713:9;11704:7;11700:23;11696:33;11693:120;;;11732:79;;:::i;:::-;11693:120;11852:1;11877:53;11922:7;11913:6;11902:9;11898:22;11877:53;:::i;:::-;11867:63;;11823:117;11979:2;12005:53;12050:7;12041:6;12030:9;12026:22;12005:53;:::i;:::-;11995:63;;11950:118;12135:2;12124:9;12120:18;12107:32;12166:18;12158:6;12155:30;12152:117;;;12188:79;;:::i;:::-;12152:117;12293:78;12363:7;12354:6;12343:9;12339:22;12293:78;:::i;:::-;12283:88;;12078:303;12448:2;12437:9;12433:18;12420:32;12479:18;12471:6;12468:30;12465:117;;;12501:79;;:::i;:::-;12465:117;12606:78;12676:7;12667:6;12656:9;12652:22;12606:78;:::i;:::-;12596:88;;12391:303;12761:3;12750:9;12746:19;12733:33;12793:18;12785:6;12782:30;12779:117;;;12815:79;;:::i;:::-;12779:117;12920:62;12974:7;12965:6;12954:9;12950:22;12920:62;:::i;:::-;12910:72;;12704:288;11490:1509;;;;;;;;:::o;13005:77::-;13042:7;13071:5;13060:16;;13005:77;;;:::o;13088:118::-;13175:24;13193:5;13175:24;:::i;:::-;13170:3;13163:37;13088:118;;:::o;13212:222::-;13305:4;13343:2;13332:9;13328:18;13320:26;;13356:71;13424:1;13413:9;13409:17;13400:6;13356:71;:::i;:::-;13212:222;;;;:::o;13440:60::-;13468:3;13489:5;13482:12;;13440:60;;;:::o;13506:142::-;13556:9;13589:53;13607:34;13616:24;13634:5;13616:24;:::i;:::-;13607:34;:::i;:::-;13589:53;:::i;:::-;13576:66;;13506:142;;;:::o;13654:126::-;13704:9;13737:37;13768:5;13737:37;:::i;:::-;13724:50;;13654:126;;;:::o;13786:157::-;13867:9;13900:37;13931:5;13900:37;:::i;:::-;13887:50;;13786:157;;;:::o;13949:193::-;14067:68;14129:5;14067:68;:::i;:::-;14062:3;14055:81;13949:193;;:::o;14148:284::-;14272:4;14310:2;14299:9;14295:18;14287:26;;14323:102;14422:1;14411:9;14407:17;14398:6;14323:102;:::i;:::-;14148:284;;;;:::o;14438:311::-;14515:4;14605:18;14597:6;14594:30;14591:56;;;14627:18;;:::i;:::-;14591:56;14677:4;14669:6;14665:17;14657:25;;14737:4;14731;14727:15;14719:23;;14438:311;;;:::o;14772:710::-;14868:5;14893:81;14909:64;14966:6;14909:64;:::i;:::-;14893:81;:::i;:::-;14884:90;;14994:5;15023:6;15016:5;15009:21;15057:4;15050:5;15046:16;15039:23;;15110:4;15102:6;15098:17;15090:6;15086:30;15139:3;15131:6;15128:15;15125:122;;;15158:79;;:::i;:::-;15125:122;15273:6;15256:220;15290:6;15285:3;15282:15;15256:220;;;15365:3;15394:37;15427:3;15415:10;15394:37;:::i;:::-;15389:3;15382:50;15461:4;15456:3;15452:14;15445:21;;15332:144;15316:4;15311:3;15307:14;15300:21;;15256:220;;;15260:21;14874:608;;14772:710;;;;;:::o;15505:370::-;15576:5;15625:3;15618:4;15610:6;15606:17;15602:27;15592:122;;15633:79;;:::i;:::-;15592:122;15750:6;15737:20;15775:94;15865:3;15857:6;15850:4;15842:6;15838:17;15775:94;:::i;:::-;15766:103;;15582:293;15505:370;;;;:::o;15881:894::-;15999:6;16007;16056:2;16044:9;16035:7;16031:23;16027:32;16024:119;;;16062:79;;:::i;:::-;16024:119;16210:1;16199:9;16195:17;16182:31;16240:18;16232:6;16229:30;16226:117;;;16262:79;;:::i;:::-;16226:117;16367:78;16437:7;16428:6;16417:9;16413:22;16367:78;:::i;:::-;16357:88;;16153:302;16522:2;16511:9;16507:18;16494:32;16553:18;16545:6;16542:30;16539:117;;;16575:79;;:::i;:::-;16539:117;16680:78;16750:7;16741:6;16730:9;16726:22;16680:78;:::i;:::-;16670:88;;16465:303;15881:894;;;;;:::o;16781:114::-;16848:6;16882:5;16876:12;16866:22;;16781:114;;;:::o;16901:184::-;17000:11;17034:6;17029:3;17022:19;17074:4;17069:3;17065:14;17050:29;;16901:184;;;;:::o;17091:132::-;17158:4;17181:3;17173:11;;17211:4;17206:3;17202:14;17194:22;;17091:132;;;:::o;17229:108::-;17306:24;17324:5;17306:24;:::i;:::-;17301:3;17294:37;17229:108;;:::o;17343:179::-;17412:10;17433:46;17475:3;17467:6;17433:46;:::i;:::-;17511:4;17506:3;17502:14;17488:28;;17343:179;;;;:::o;17528:113::-;17598:4;17630;17625:3;17621:14;17613:22;;17528:113;;;:::o;17677:732::-;17796:3;17825:54;17873:5;17825:54;:::i;:::-;17895:86;17974:6;17969:3;17895:86;:::i;:::-;17888:93;;18005:56;18055:5;18005:56;:::i;:::-;18084:7;18115:1;18100:284;18125:6;18122:1;18119:13;18100:284;;;18201:6;18195:13;18228:63;18287:3;18272:13;18228:63;:::i;:::-;18221:70;;18314:60;18367:6;18314:60;:::i;:::-;18304:70;;18160:224;18147:1;18144;18140:9;18135:14;;18100:284;;;18104:14;18400:3;18393:10;;17801:608;;;17677:732;;;;:::o;18415:373::-;18558:4;18596:2;18585:9;18581:18;18573:26;;18645:9;18639:4;18635:20;18631:1;18620:9;18616:17;18609:47;18673:108;18776:4;18767:6;18673:108;:::i;:::-;18665:116;;18415:373;;;;:::o;18794:122::-;18867:24;18885:5;18867:24;:::i;:::-;18860:5;18857:35;18847:63;;18906:1;18903;18896:12;18847:63;18794:122;:::o;18922:139::-;18968:5;19006:6;18993:20;18984:29;;19022:33;19049:5;19022:33;:::i;:::-;18922:139;;;;:::o;19067:474::-;19135:6;19143;19192:2;19180:9;19171:7;19167:23;19163:32;19160:119;;;19198:79;;:::i;:::-;19160:119;19318:1;19343:53;19388:7;19379:6;19368:9;19364:22;19343:53;:::i;:::-;19333:63;;19289:117;19445:2;19471:53;19516:7;19507:6;19496:9;19492:22;19471:53;:::i;:::-;19461:63;;19416:118;19067:474;;;;;:::o;19547:329::-;19606:6;19655:2;19643:9;19634:7;19630:23;19626:32;19623:119;;;19661:79;;:::i;:::-;19623:119;19781:1;19806:53;19851:7;19842:6;19831:9;19827:22;19806:53;:::i;:::-;19796:63;;19752:117;19547:329;;;;:::o;19899:568::-;19972:8;19982:6;20032:3;20025:4;20017:6;20013:17;20009:27;19999:122;;20040:79;;:::i;:::-;19999:122;20153:6;20140:20;20130:30;;20183:18;20175:6;20172:30;20169:117;;;20205:79;;:::i;:::-;20169:117;20319:4;20311:6;20307:17;20295:29;;20373:3;20365:4;20357:6;20353:17;20343:8;20339:32;20336:41;20333:128;;;20380:79;;:::i;:::-;20333:128;19899:568;;;;;:::o;20473:559::-;20559:6;20567;20616:2;20604:9;20595:7;20591:23;20587:32;20584:119;;;20622:79;;:::i;:::-;20584:119;20770:1;20759:9;20755:17;20742:31;20800:18;20792:6;20789:30;20786:117;;;20822:79;;:::i;:::-;20786:117;20935:80;21007:7;20998:6;20987:9;20983:22;20935:80;:::i;:::-;20917:98;;;;20713:312;20473:559;;;;;:::o;21038:116::-;21108:21;21123:5;21108:21;:::i;:::-;21101:5;21098:32;21088:60;;21144:1;21141;21134:12;21088:60;21038:116;:::o;21160:133::-;21203:5;21241:6;21228:20;21219:29;;21257:30;21281:5;21257:30;:::i;:::-;21160:133;;;;:::o;21299:323::-;21355:6;21404:2;21392:9;21383:7;21379:23;21375:32;21372:119;;;21410:79;;:::i;:::-;21372:119;21530:1;21555:50;21597:7;21588:6;21577:9;21573:22;21555:50;:::i;:::-;21545:60;;21501:114;21299:323;;;;:::o;21628:118::-;21715:24;21733:5;21715:24;:::i;:::-;21710:3;21703:37;21628:118;;:::o;21752:222::-;21845:4;21883:2;21872:9;21868:18;21860:26;;21896:71;21964:1;21953:9;21949:17;21940:6;21896:71;:::i;:::-;21752:222;;;;:::o;21980:468::-;22045:6;22053;22102:2;22090:9;22081:7;22077:23;22073:32;22070:119;;;22108:79;;:::i;:::-;22070:119;22228:1;22253:53;22298:7;22289:6;22278:9;22274:22;22253:53;:::i;:::-;22243:63;;22199:117;22355:2;22381:50;22423:7;22414:6;22403:9;22399:22;22381:50;:::i;:::-;22371:60;;22326:115;21980:468;;;;;:::o;22454:474::-;22522:6;22530;22579:2;22567:9;22558:7;22554:23;22550:32;22547:119;;;22585:79;;:::i;:::-;22547:119;22705:1;22730:53;22775:7;22766:6;22755:9;22751:22;22730:53;:::i;:::-;22720:63;;22676:117;22832:2;22858:53;22903:7;22894:6;22883:9;22879:22;22858:53;:::i;:::-;22848:63;;22803:118;22454:474;;;;;:::o;22934:1089::-;23038:6;23046;23054;23062;23070;23119:3;23107:9;23098:7;23094:23;23090:33;23087:120;;;23126:79;;:::i;:::-;23087:120;23246:1;23271:53;23316:7;23307:6;23296:9;23292:22;23271:53;:::i;:::-;23261:63;;23217:117;23373:2;23399:53;23444:7;23435:6;23424:9;23420:22;23399:53;:::i;:::-;23389:63;;23344:118;23501:2;23527:53;23572:7;23563:6;23552:9;23548:22;23527:53;:::i;:::-;23517:63;;23472:118;23629:2;23655:53;23700:7;23691:6;23680:9;23676:22;23655:53;:::i;:::-;23645:63;;23600:118;23785:3;23774:9;23770:19;23757:33;23817:18;23809:6;23806:30;23803:117;;;23839:79;;:::i;:::-;23803:117;23944:62;23998:7;23989:6;23978:9;23974:22;23944:62;:::i;:::-;23934:72;;23728:288;22934:1089;;;;;;;;:::o;24029:229::-;24169:34;24165:1;24157:6;24153:14;24146:58;24238:12;24233:2;24225:6;24221:15;24214:37;24029:229;:::o;24264:366::-;24406:3;24427:67;24491:2;24486:3;24427:67;:::i;:::-;24420:74;;24503:93;24592:3;24503:93;:::i;:::-;24621:2;24616:3;24612:12;24605:19;;24264:366;;;:::o;24636:419::-;24802:4;24840:2;24829:9;24825:18;24817:26;;24889:9;24883:4;24879:20;24875:1;24864:9;24860:17;24853:47;24917:131;25043:4;24917:131;:::i;:::-;24909:139;;24636:419;;;:::o;25061:94::-;25094:8;25142:5;25138:2;25134:14;25113:35;;25061:94;;;:::o;25161:::-;25200:7;25229:20;25243:5;25229:20;:::i;:::-;25218:31;;25161:94;;;:::o;25261:100::-;25300:7;25329:26;25349:5;25329:26;:::i;:::-;25318:37;;25261:100;;;:::o;25367:157::-;25472:45;25492:24;25510:5;25492:24;:::i;:::-;25472:45;:::i;:::-;25467:3;25460:58;25367:157;;:::o;25530:256::-;25642:3;25657:75;25728:3;25719:6;25657:75;:::i;:::-;25757:2;25752:3;25748:12;25741:19;;25777:3;25770:10;;25530:256;;;;:::o;25792:169::-;25932:21;25928:1;25920:6;25916:14;25909:45;25792:169;:::o;25967:366::-;26109:3;26130:67;26194:2;26189:3;26130:67;:::i;:::-;26123:74;;26206:93;26295:3;26206:93;:::i;:::-;26324:2;26319:3;26315:12;26308:19;;25967:366;;;:::o;26339:419::-;26505:4;26543:2;26532:9;26528:18;26520:26;;26592:9;26586:4;26582:20;26578:1;26567:9;26563:17;26556:47;26620:131;26746:4;26620:131;:::i;:::-;26612:139;;26339:419;;;:::o;26764:168::-;26904:20;26900:1;26892:6;26888:14;26881:44;26764:168;:::o;26938:366::-;27080:3;27101:67;27165:2;27160:3;27101:67;:::i;:::-;27094:74;;27177:93;27266:3;27177:93;:::i;:::-;27295:2;27290:3;27286:12;27279:19;;26938:366;;;:::o;27310:419::-;27476:4;27514:2;27503:9;27499:18;27491:26;;27563:9;27557:4;27553:20;27549:1;27538:9;27534:17;27527:47;27591:131;27717:4;27591:131;:::i;:::-;27583:139;;27310:419;;;:::o;27735:180::-;27783:77;27780:1;27773:88;27880:4;27877:1;27870:15;27904:4;27901:1;27894:15;27921:305;27961:3;27980:20;27998:1;27980:20;:::i;:::-;27975:25;;28014:20;28032:1;28014:20;:::i;:::-;28009:25;;28168:1;28100:66;28096:74;28093:1;28090:81;28087:107;;;28174:18;;:::i;:::-;28087:107;28218:1;28215;28211:9;28204:16;;27921:305;;;;:::o;28232:182::-;28372:34;28368:1;28360:6;28356:14;28349:58;28232:182;:::o;28420:366::-;28562:3;28583:67;28647:2;28642:3;28583:67;:::i;:::-;28576:74;;28659:93;28748:3;28659:93;:::i;:::-;28777:2;28772:3;28768:12;28761:19;;28420:366;;;:::o;28792:419::-;28958:4;28996:2;28985:9;28981:18;28973:26;;29045:9;29039:4;29035:20;29031:1;29020:9;29016:17;29009:47;29073:131;29199:4;29073:131;:::i;:::-;29065:139;;28792:419;;;:::o;29217:179::-;29357:31;29353:1;29345:6;29341:14;29334:55;29217:179;:::o;29402:366::-;29544:3;29565:67;29629:2;29624:3;29565:67;:::i;:::-;29558:74;;29641:93;29730:3;29641:93;:::i;:::-;29759:2;29754:3;29750:12;29743:19;;29402:366;;;:::o;29774:419::-;29940:4;29978:2;29967:9;29963:18;29955:26;;30027:9;30021:4;30017:20;30013:1;30002:9;29998:17;29991:47;30055:131;30181:4;30055:131;:::i;:::-;30047:139;;29774:419;;;:::o;30199:163::-;30339:15;30335:1;30327:6;30323:14;30316:39;30199:163;:::o;30368:366::-;30510:3;30531:67;30595:2;30590:3;30531:67;:::i;:::-;30524:74;;30607:93;30696:3;30607:93;:::i;:::-;30725:2;30720:3;30716:12;30709:19;;30368:366;;;:::o;30740:419::-;30906:4;30944:2;30933:9;30929:18;30921:26;;30993:9;30987:4;30983:20;30979:1;30968:9;30964:17;30957:47;31021:131;31147:4;31021:131;:::i;:::-;31013:139;;30740:419;;;:::o;31165:180::-;31213:77;31210:1;31203:88;31310:4;31307:1;31300:15;31334:4;31331:1;31324:15;31351:320;31395:6;31432:1;31426:4;31422:12;31412:22;;31479:1;31473:4;31469:12;31500:18;31490:81;;31556:4;31548:6;31544:17;31534:27;;31490:81;31618:2;31610:6;31607:14;31587:18;31584:38;31581:84;;31637:18;;:::i;:::-;31581:84;31402:269;31351:320;;;:::o;31677:348::-;31717:7;31740:20;31758:1;31740:20;:::i;:::-;31735:25;;31774:20;31792:1;31774:20;:::i;:::-;31769:25;;31962:1;31894:66;31890:74;31887:1;31884:81;31879:1;31872:9;31865:17;31861:105;31858:131;;;31969:18;;:::i;:::-;31858:131;32017:1;32014;32010:9;31999:20;;31677:348;;;;:::o;32031:181::-;32171:33;32167:1;32159:6;32155:14;32148:57;32031:181;:::o;32218:366::-;32360:3;32381:67;32445:2;32440:3;32381:67;:::i;:::-;32374:74;;32457:93;32546:3;32457:93;:::i;:::-;32575:2;32570:3;32566:12;32559:19;;32218:366;;;:::o;32590:419::-;32756:4;32794:2;32783:9;32779:18;32771:26;;32843:9;32837:4;32833:20;32829:1;32818:9;32814:17;32807:47;32871:131;32997:4;32871:131;:::i;:::-;32863:139;;32590:419;;;:::o;33015:172::-;33155:24;33151:1;33143:6;33139:14;33132:48;33015:172;:::o;33193:366::-;33335:3;33356:67;33420:2;33415:3;33356:67;:::i;:::-;33349:74;;33432:93;33521:3;33432:93;:::i;:::-;33550:2;33545:3;33541:12;33534:19;;33193:366;;;:::o;33565:419::-;33731:4;33769:2;33758:9;33754:18;33746:26;;33818:9;33812:4;33808:20;33804:1;33793:9;33789:17;33782:47;33846:131;33972:4;33846:131;:::i;:::-;33838:139;;33565:419;;;:::o;33990:332::-;34111:4;34149:2;34138:9;34134:18;34126:26;;34162:71;34230:1;34219:9;34215:17;34206:6;34162:71;:::i;:::-;34243:72;34311:2;34300:9;34296:18;34287:6;34243:72;:::i;:::-;33990:332;;;;;:::o;34328:137::-;34382:5;34413:6;34407:13;34398:22;;34429:30;34453:5;34429:30;:::i;:::-;34328:137;;;;:::o;34471:345::-;34538:6;34587:2;34575:9;34566:7;34562:23;34558:32;34555:119;;;34593:79;;:::i;:::-;34555:119;34713:1;34738:61;34791:7;34782:6;34771:9;34767:22;34738:61;:::i;:::-;34728:71;;34684:125;34471:345;;;;:::o;34822:180::-;34870:77;34867:1;34860:88;34967:4;34964:1;34957:15;34991:4;34988:1;34981:15;35008:185;35048:1;35065:20;35083:1;35065:20;:::i;:::-;35060:25;;35099:20;35117:1;35099:20;:::i;:::-;35094:25;;35138:1;35128:35;;35143:18;;:::i;:::-;35128:35;35185:1;35182;35178:9;35173:14;;35008:185;;;;:::o;35199:228::-;35339:34;35335:1;35327:6;35323:14;35316:58;35408:11;35403:2;35395:6;35391:15;35384:36;35199:228;:::o;35433:366::-;35575:3;35596:67;35660:2;35655:3;35596:67;:::i;:::-;35589:74;;35672:93;35761:3;35672:93;:::i;:::-;35790:2;35785:3;35781:12;35774:19;;35433:366;;;:::o;35805:419::-;35971:4;36009:2;35998:9;35994:18;35986:26;;36058:9;36052:4;36048:20;36044:1;36033:9;36029:17;36022:47;36086:131;36212:4;36086:131;:::i;:::-;36078:139;;35805:419;;;:::o;36230:180::-;36278:77;36275:1;36268:88;36375:4;36372:1;36365:15;36399:4;36396:1;36389:15;36416:233;36455:3;36478:24;36496:5;36478:24;:::i;:::-;36469:33;;36524:66;36517:5;36514:77;36511:103;;36594:18;;:::i;:::-;36511:103;36641:1;36634:5;36630:13;36623:20;;36416:233;;;:::o;36655:175::-;36795:27;36791:1;36783:6;36779:14;36772:51;36655:175;:::o;36836:366::-;36978:3;36999:67;37063:2;37058:3;36999:67;:::i;:::-;36992:74;;37075:93;37164:3;37075:93;:::i;:::-;37193:2;37188:3;37184:12;37177:19;;36836:366;;;:::o;37208:419::-;37374:4;37412:2;37401:9;37397:18;37389:26;;37461:9;37455:4;37451:20;37447:1;37436:9;37432:17;37425:47;37489:131;37615:4;37489:131;:::i;:::-;37481:139;;37208:419;;;:::o;37633:225::-;37773:34;37769:1;37761:6;37757:14;37750:58;37842:8;37837:2;37829:6;37825:15;37818:33;37633:225;:::o;37864:366::-;38006:3;38027:67;38091:2;38086:3;38027:67;:::i;:::-;38020:74;;38103:93;38192:3;38103:93;:::i;:::-;38221:2;38216:3;38212:12;38205:19;;37864:366;;;:::o;38236:419::-;38402:4;38440:2;38429:9;38425:18;38417:26;;38489:9;38483:4;38479:20;38475:1;38464:9;38460:17;38453:47;38517:131;38643:4;38517:131;:::i;:::-;38509:139;;38236:419;;;:::o;38661:220::-;38801:34;38797:1;38789:6;38785:14;38778:58;38870:3;38865:2;38857:6;38853:15;38846:28;38661:220;:::o;38887:366::-;39029:3;39050:67;39114:2;39109:3;39050:67;:::i;:::-;39043:74;;39126:93;39215:3;39126:93;:::i;:::-;39244:2;39239:3;39235:12;39228:19;;38887:366;;;:::o;39259:419::-;39425:4;39463:2;39452:9;39448:18;39440:26;;39512:9;39506:4;39502:20;39498:1;39487:9;39483:17;39476:47;39540:131;39666:4;39540:131;:::i;:::-;39532:139;;39259:419;;;:::o;39684:332::-;39805:4;39843:2;39832:9;39828:18;39820:26;;39856:71;39924:1;39913:9;39909:17;39900:6;39856:71;:::i;:::-;39937:72;40005:2;39994:9;39990:18;39981:6;39937:72;:::i;:::-;39684:332;;;;;:::o;40022:182::-;40162:34;40158:1;40150:6;40146:14;40139:58;40022:182;:::o;40210:366::-;40352:3;40373:67;40437:2;40432:3;40373:67;:::i;:::-;40366:74;;40449:93;40538:3;40449:93;:::i;:::-;40567:2;40562:3;40558:12;40551:19;;40210:366;;;:::o;40582:419::-;40748:4;40786:2;40775:9;40771:18;40763:26;;40835:9;40829:4;40825:20;40821:1;40810:9;40806:17;40799:47;40863:131;40989:4;40863:131;:::i;:::-;40855:139;;40582:419;;;:::o;41007:234::-;41147:34;41143:1;41135:6;41131:14;41124:58;41216:17;41211:2;41203:6;41199:15;41192:42;41007:234;:::o;41247:366::-;41389:3;41410:67;41474:2;41469:3;41410:67;:::i;:::-;41403:74;;41486:93;41575:3;41486:93;:::i;:::-;41604:2;41599:3;41595:12;41588:19;;41247:366;;;:::o;41619:419::-;41785:4;41823:2;41812:9;41808:18;41800:26;;41872:9;41866:4;41862:20;41858:1;41847:9;41843:17;41836:47;41900:131;42026:4;41900:131;:::i;:::-;41892:139;;41619:419;;;:::o;42044:98::-;42095:6;42129:5;42123:12;42113:22;;42044:98;;;:::o;42148:168::-;42231:11;42265:6;42260:3;42253:19;42305:4;42300:3;42296:14;42281:29;;42148:168;;;;:::o;42322:360::-;42408:3;42436:38;42468:5;42436:38;:::i;:::-;42490:70;42553:6;42548:3;42490:70;:::i;:::-;42483:77;;42569:52;42614:6;42609:3;42602:4;42595:5;42591:16;42569:52;:::i;:::-;42646:29;42668:6;42646:29;:::i;:::-;42641:3;42637:39;42630:46;;42412:270;42322:360;;;;:::o;42688:751::-;42911:4;42949:3;42938:9;42934:19;42926:27;;42963:71;43031:1;43020:9;43016:17;43007:6;42963:71;:::i;:::-;43044:72;43112:2;43101:9;43097:18;43088:6;43044:72;:::i;:::-;43126;43194:2;43183:9;43179:18;43170:6;43126:72;:::i;:::-;43208;43276:2;43265:9;43261:18;43252:6;43208:72;:::i;:::-;43328:9;43322:4;43318:20;43312:3;43301:9;43297:19;43290:49;43356:76;43427:4;43418:6;43356:76;:::i;:::-;43348:84;;42688:751;;;;;;;;:::o;43445:141::-;43501:5;43532:6;43526:13;43517:22;;43548:32;43574:5;43548:32;:::i;:::-;43445:141;;;;:::o;43592:349::-;43661:6;43710:2;43698:9;43689:7;43685:23;43681:32;43678:119;;;43716:79;;:::i;:::-;43678:119;43836:1;43861:63;43916:7;43907:6;43896:9;43892:22;43861:63;:::i;:::-;43851:73;;43807:127;43592:349;;;;:::o;43947:106::-;43991:8;44040:5;44035:3;44031:15;44010:36;;43947:106;;;:::o;44059:183::-;44094:3;44132:1;44114:16;44111:23;44108:128;;;44170:1;44167;44164;44149:23;44192:34;44223:1;44217:8;44192:34;:::i;:::-;44185:41;;44108:128;44059:183;:::o;44248:711::-;44287:3;44325:4;44307:16;44304:26;44333:5;44301:39;44362:20;;:::i;:::-;44437:1;44419:16;44415:24;44412:1;44406:4;44391:49;44470:4;44464:11;44569:16;44562:4;44554:6;44550:17;44547:39;44514:18;44506:6;44503:30;44487:113;44484:146;;;44615:5;;;;44484:146;44661:6;44655:4;44651:17;44697:3;44691:10;44724:18;44716:6;44713:30;44710:43;;;44746:5;;;;;;44710:43;44794:6;44787:4;44782:3;44778:14;44774:27;44853:1;44835:16;44831:24;44825:4;44821:35;44816:3;44813:44;44810:57;;;44860:5;;;;;;;44810:57;44877;44925:6;44919:4;44915:17;44907:6;44903:30;44897:4;44877:57;:::i;:::-;44950:3;44943:10;;44291:668;;;;;44248:711;;:::o;44965:239::-;45105:34;45101:1;45093:6;45089:14;45082:58;45174:22;45169:2;45161:6;45157:15;45150:47;44965:239;:::o;45210:366::-;45352:3;45373:67;45437:2;45432:3;45373:67;:::i;:::-;45366:74;;45449:93;45538:3;45449:93;:::i;:::-;45567:2;45562:3;45558:12;45551:19;;45210:366;;;:::o;45582:419::-;45748:4;45786:2;45775:9;45771:18;45763:26;;45835:9;45829:4;45825:20;45821:1;45810:9;45806:17;45799:47;45863:131;45989:4;45863:131;:::i;:::-;45855:139;;45582:419;;;:::o;46007:227::-;46147:34;46143:1;46135:6;46131:14;46124:58;46216:10;46211:2;46203:6;46199:15;46192:35;46007:227;:::o;46240:366::-;46382:3;46403:67;46467:2;46462:3;46403:67;:::i;:::-;46396:74;;46479:93;46568:3;46479:93;:::i;:::-;46597:2;46592:3;46588:12;46581:19;;46240:366;;;:::o;46612:419::-;46778:4;46816:2;46805:9;46801:18;46793:26;;46865:9;46859:4;46855:20;46851:1;46840:9;46836:17;46829:47;46893:131;47019:4;46893:131;:::i;:::-;46885:139;;46612:419;;;:::o;47037:227::-;47177:34;47173:1;47165:6;47161:14;47154:58;47246:10;47241:2;47233:6;47229:15;47222:35;47037:227;:::o;47270:366::-;47412:3;47433:67;47497:2;47492:3;47433:67;:::i;:::-;47426:74;;47509:93;47598:3;47509:93;:::i;:::-;47627:2;47622:3;47618:12;47611:19;;47270:366;;;:::o;47642:419::-;47808:4;47846:2;47835:9;47831:18;47823:26;;47895:9;47889:4;47885:20;47881:1;47870:9;47866:17;47859:47;47923:131;48049:4;47923:131;:::i;:::-;47915:139;;47642:419;;;:::o;48067:224::-;48207:34;48203:1;48195:6;48191:14;48184:58;48276:7;48271:2;48263:6;48259:15;48252:32;48067:224;:::o;48297:366::-;48439:3;48460:67;48524:2;48519:3;48460:67;:::i;:::-;48453:74;;48536:93;48625:3;48536:93;:::i;:::-;48654:2;48649:3;48645:12;48638:19;;48297:366;;;:::o;48669:419::-;48835:4;48873:2;48862:9;48858:18;48850:26;;48922:9;48916:4;48912:20;48908:1;48897:9;48893:17;48886:47;48950:131;49076:4;48950:131;:::i;:::-;48942:139;;48669:419;;;:::o;49094:229::-;49234:34;49230:1;49222:6;49218:14;49211:58;49303:12;49298:2;49290:6;49286:15;49279:37;49094:229;:::o;49329:366::-;49471:3;49492:67;49556:2;49551:3;49492:67;:::i;:::-;49485:74;;49568:93;49657:3;49568:93;:::i;:::-;49686:2;49681:3;49677:12;49670:19;;49329:366;;;:::o;49701:419::-;49867:4;49905:2;49894:9;49890:18;49882:26;;49954:9;49948:4;49944:20;49940:1;49929:9;49925:17;49918:47;49982:131;50108:4;49982:131;:::i;:::-;49974:139;;49701:419;;;:::o;50126:634::-;50347:4;50385:2;50374:9;50370:18;50362:26;;50434:9;50428:4;50424:20;50420:1;50409:9;50405:17;50398:47;50462:108;50565:4;50556:6;50462:108;:::i;:::-;50454:116;;50617:9;50611:4;50607:20;50602:2;50591:9;50587:18;50580:48;50645:108;50748:4;50739:6;50645:108;:::i;:::-;50637:116;;50126:634;;;;;:::o;50766:228::-;50906:34;50902:1;50894:6;50890:14;50883:58;50975:11;50970:2;50962:6;50958:15;50951:36;50766:228;:::o;51000:366::-;51142:3;51163:67;51227:2;51222:3;51163:67;:::i;:::-;51156:74;;51239:93;51328:3;51239:93;:::i;:::-;51357:2;51352:3;51348:12;51341:19;;51000:366;;;:::o;51372:419::-;51538:4;51576:2;51565:9;51561:18;51553:26;;51625:9;51619:4;51615:20;51611:1;51600:9;51596:17;51589:47;51653:131;51779:4;51653:131;:::i;:::-;51645:139;;51372:419;;;:::o;51797:227::-;51937:34;51933:1;51925:6;51921:14;51914:58;52006:10;52001:2;51993:6;51989:15;51982:35;51797:227;:::o;52030:366::-;52172:3;52193:67;52257:2;52252:3;52193:67;:::i;:::-;52186:74;;52269:93;52358:3;52269:93;:::i;:::-;52387:2;52382:3;52378:12;52371:19;;52030:366;;;:::o;52402:419::-;52568:4;52606:2;52595:9;52591:18;52583:26;;52655:9;52649:4;52645:20;52641:1;52630:9;52626:17;52619:47;52683:131;52809:4;52683:131;:::i;:::-;52675:139;;52402:419;;;:::o;52827:1053::-;53150:4;53188:3;53177:9;53173:19;53165:27;;53202:71;53270:1;53259:9;53255:17;53246:6;53202:71;:::i;:::-;53283:72;53351:2;53340:9;53336:18;53327:6;53283:72;:::i;:::-;53402:9;53396:4;53392:20;53387:2;53376:9;53372:18;53365:48;53430:108;53533:4;53524:6;53430:108;:::i;:::-;53422:116;;53585:9;53579:4;53575:20;53570:2;53559:9;53555:18;53548:48;53613:108;53716:4;53707:6;53613:108;:::i;:::-;53605:116;;53769:9;53763:4;53759:20;53753:3;53742:9;53738:19;53731:49;53797:76;53868:4;53859:6;53797:76;:::i;:::-;53789:84;;52827:1053;;;;;;;;:::o

Swarm Source

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