ETH Price: $2,732.43 (+12.80%)
 

Overview

Max Total Supply

500 INIMIGO

Holders

191

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 INIMIGO
0x492a04094c67fd6fcc6ae101050692ee0d9c1ac3
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:
OInimigo

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/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: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/OperatorFilterer.sol


pragma solidity ^0.8.13;


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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // 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) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view 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: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


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

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

// File: @openzeppelin/[email protected]/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId, string memory baseExtension) public view virtual returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        string memory baseURI = _baseURI();
        if (_exists(tokenId)) return string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension)) : '';
    }

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

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

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

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

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

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

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

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

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

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

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;


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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

// File: OInimigo.sol



pragma solidity >=0.7.0 <0.9.0;
pragma abicoder v2;









contract OInimigo is DefaultOperatorFilterer, ERC721A, Ownable {
    using Address for address;
    using Strings for uint256;

    bytes32 public root;
    bytes32 public rootBadList;
    bytes32[] public merkleProof;

    mapping(address => bool) public whitelistClaimed;

    string private baseURI; //Deve ser a URL do json do pinata:
    string private baseExtension = ".json";
    string private notRevealedUri = "";
    uint256 private maxSupply = 500;
    uint256 private maxMintAmount = 500;
    uint256 private FreeMintPerAddressLimit = 1;
    bool private paused = false;
    bool private onlyWhitelisted = true;
    address[] public whitelistedAddresses;
    mapping(address => uint256) private addressMintedBalance;
    mapping(uint256 => uint) private _availableTokens;
    uint256 private _numAvailableTokens;

    string private _contractUri;

    address _contractOwner;

    mapping (address => bool) private _affiliates;
    bool private _allowAffiliateProgram = true;
    uint private _affiliateProgramPercentage = 15;

    bool private _allowRecommendation = true;
    uint256 private _recommendationPercentage = 10;
    uint256 private _royalties = 7;
    uint256 private nftWhitelistDiscount = 14;

    mapping(address => uint256) private _addressLastMintedTokenId;

    bool private _isFreeMint = false;

    uint256 private _nftEtherValue = 44000000000000000;
    uint256 private nftEtherValueConselheiros = 33000000000000000;
    uint256 private nftEtherValueBad = 41000000000000000;

    uint256 private initSaleConselheiros;
    uint256 private initSaleBadList;
    uint256 private initSalePublic;
    uint256 private endSalePublic;

    uint256 private supplyTotalHolders = 300;
    
    uint256 private supplyTotalBadList = 100;
    uint256 private contSupplyTotalBadList = 0;

    address private wMobiup = 0x4aB50B33A3475B46814b2EE066fAFD0c8Bcb393e;

    uint256 private statusPhase = 0;

    event _transferSend(address _from, address _to, uint _amount);

    constructor(
    string memory _initBaseURI,
    string memory _contractURI,
    bytes32 _root,
    bytes32 _rootBadList,
    uint256 _nftEtherValueConselheiros,
    uint256 _nftEtherValueBad,
    uint256 _initSaleConselheiros,
    uint256 _initSaleBadList,
    uint256 _initSalePublic,
    uint256 _endSalePublic
    ) ERC721A("Brazuera - O INIMIGO", "INIMIGO") {
        setBaseURI(_initBaseURI);
        root = _root;
        rootBadList = _rootBadList;
        nftEtherValueConselheiros = _nftEtherValueConselheiros;
        nftEtherValueBad = _nftEtherValueBad;
        initSaleConselheiros = _initSaleConselheiros;
        initSaleBadList = _initSaleBadList;
        initSalePublic = _initSalePublic;
        endSalePublic = _endSalePublic;
        _contractUri = _contractURI;
        _contractOwner = msg.sender;
    }

    function setTimesSales(uint256 _initSaleConselheiros, uint256 _initSaleBadList, uint256 _initSalePublic, uint256 _endSalePublic) public onlyOwner {
        require(_initSaleConselheiros < _initSaleBadList, "Data Inicial de venda deve ser menor que da data de venda da BadList");
        require(_initSaleBadList < _initSalePublic, "Data Inicial de venda para badlist deve ser menor que da data de venda do public mint");
        require(_initSalePublic < _endSalePublic, "Data Inicial de venda publica deve ser menor que da data final venda");
        initSaleConselheiros = _initSaleConselheiros;
        initSaleBadList = _initSaleBadList;
        initSalePublic = _initSalePublic;
        endSalePublic = _endSalePublic;
    }

    function phase() public view returns (uint256) {
        uint256 phaseTemp = 0;
        if (block.timestamp >= initSaleConselheiros && block.timestamp <= initSaleBadList) {
            phaseTemp = 1;
            if (supplyTotalHolders == totalSupply()) {
                phaseTemp = 2;
            }
            return phaseTemp;
        }

        if (block.timestamp >= initSaleBadList && block.timestamp <= initSalePublic) {
            phaseTemp = 2;
            if (supplyTotalBadList == contSupplyTotalBadList) {
                phaseTemp = 3;
            }
        }

        if (block.timestamp >= initSalePublic && block.timestamp <= endSalePublic) {
            phaseTemp = 3;
            if (totalSupply() == maxSupply) {
                phaseTemp = 3;
            }
        }
        
        return phaseTemp;
    }

    function conditionPrice() public view returns (uint256) {
        uint256 phaseTemp = phase();

        if (phaseTemp == 0) {
            return _nftEtherValue;
        }

        if (phaseTemp == 1) {
            return nftEtherValueConselheiros;
        }

        if (phaseTemp == 2) {
            return nftEtherValueBad;
        }

        if (phaseTemp == 3) {
            return _nftEtherValue;
        }

        return _nftEtherValue;
    }

    function conditionRoot() public view returns (bytes32) {
        uint256 phaseTemp = phase();

        if (phaseTemp == 0) {
            return 0x0000000000000000000000000000000000000000000000000000000000000000;
        }

        if (phaseTemp == 1) {
            return root;
        }

        if (phaseTemp == 2) {
            return rootBadList;
        }

        if (phaseTemp == 3) {
            return 0x0000000000000000000000000000000000000000000000000000000000000000;
        }

        return 0x0000000000000000000000000000000000000000000000000000000000000000;
    } 

    function isValid(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }

    function isValidBadList(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        return MerkleProof.verify(proof, rootBadList, leaf);
    }

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

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setFreeMintPerAddressLimit(uint256 _limit) public onlyOwner {
        FreeMintPerAddressLimit = _limit;
    }

    function setRootKey(bytes32 _newRootKey) public onlyOwner {
        root = _newRootKey;
    }

    function setRootKeyBadList(bytes32 _newRootKeyBadList) public onlyOwner {
        rootBadList = _newRootKeyBadList;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    function isOnlyWhitelist() public view returns (bool) {
        return onlyWhitelisted;
    }

    function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner {
        maxMintAmount = _maxMintAmount;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setAllowAffiliateProgram(bool _state) public onlyOwner {
        _allowAffiliateProgram = _state;
    }

    function setAffiliateProgramPercentage(uint256 percentage) public onlyOwner {
        _affiliateProgramPercentage = percentage;
    }

    function withdraw() public payable onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function setNftEtherValue(uint256 nftEtherValue) public onlyOwner {
        _nftEtherValue = nftEtherValue;
    }

    function setNftEtherValueConselheiros(uint256 _nftEtherValueConselheiros) public onlyOwner {
        nftEtherValueConselheiros = _nftEtherValueConselheiros;
    }

    function setNftEtherValueBadList(uint256 _nftEtherValueBadList) public onlyOwner {
        nftEtherValueBad = _nftEtherValueBadList;
    }

    function setAffiliate(address manager, bool state) public onlyOwner {
        _affiliates[manager] = state;
    }

    function setIsFreeMint(bool state) public onlyOwner {
        _isFreeMint = state;
    }

    function getQtdAvailableTokens() public view returns (uint256) {
        if(_numAvailableTokens > 0) {
            return _numAvailableTokens;
        }
        return maxSupply;
    }

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

    function getNftEtherValue() public view returns (uint256) {
        return conditionPrice();
    }

    function getAddressLastMintedTokenId(address wallet) public view returns (uint256) {
        return _addressLastMintedTokenId[wallet];
    }

    function getMaxMintAmount() public view returns (uint256) {
        return maxMintAmount;
    }

    function getBalance() public view returns (uint) {
        return msg.sender.balance;
    }

    function getBaseURI() public view returns (string memory) {
        return baseURI;
    }

    function getNFTURI(uint256 tokenId) public view returns(string memory) {
        return string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
    }

    function isAffliliated(address wallet) public view returns (bool) {
        return _affiliates[wallet];
    }

    function contractIsFreeMint() public view returns (bool) {
        return _isFreeMint;
    }

    function isPaused() public view returns (bool) {
        return paused;
    }

    function isWhitelisted(address _user, bytes32[] memory proof) public view returns (bool) {
        if ( isValid( proof, keccak256( abi.encodePacked(_user) ) ) ) {
            if (whitelistClaimed[_user]) {
                return false;
            }
            return true;
        } else {
            return false;
        }
    }

    function isWhitelistedBadList(address _user, bytes32[] memory proof) public view returns (bool) {
        if ( isValidBadList( proof, keccak256( abi.encodePacked(_user) ) ) ) {
            if (whitelistClaimed[_user]) {
                return false;
            }
            return true;
        } else {
            return false;
        }
    }

    function mintPublic(
        uint256 _mintAmount,
        address payable endUser,
        bytes32[] memory proof
    ) public payable {
        require(phase() == 3, "Venda Public mint desativada");
        require(!paused, "O contrato pausado");
        uint256 supply = totalSupply();
        require(_mintAmount > 0, "Precisa mintar pelo menos 1 NFT");
        require(_mintAmount + balanceOf(endUser) <= maxMintAmount, "Quantidade limite de mint por carteira excedida");
        require(supply + _mintAmount <= maxSupply, "Quantidade limite de NFT excedida");

        if (!_isFreeMint ) {
            split(_mintAmount);
        }

        uint256 updatedNumAvailableTokens = maxSupply - totalSupply();

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[endUser]++;
            _safeMint(endUser, 1);
            uint256 newIdToken = supply + 1;
            tokenURI(newIdToken);
            --updatedNumAvailableTokens;
            _addressLastMintedTokenId[endUser] = i;
        }
        _numAvailableTokens = updatedNumAvailableTokens;
    }

    function mintHolder(
        uint256 _mintAmount,
        address payable endUser,
        bytes32[] memory proof
    ) public payable {
        require(phase() == 1, "Venda Holder mint desativada");
        require(!paused, "O contrato pausado");
        uint256 supply = totalSupply();
        require(_mintAmount > 0, "Precisa mintar pelo menos 1 NFT");
        require(_mintAmount + balanceOf(endUser) <= maxMintAmount, "Quantidade limite de mint por carteira excedida");
        require(supply + _mintAmount <= maxSupply, "Quantidade limite de NFT excedida");
        require(supply + _mintAmount <= supplyTotalHolders, "Quantidade limite de NFT para Holders excedida");

        if (onlyWhitelisted) {
            require(isValid(proof, keccak256(abi.encodePacked(endUser))), "Voce nao e Holder");
        }

        if (!_isFreeMint ) {
            split(_mintAmount);
        }

        uint256 updatedNumAvailableTokens = maxSupply - totalSupply();

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[endUser]++;
            _safeMint(endUser, 1);
            uint256 newIdToken = supply + 1;
            tokenURI(newIdToken);
            --updatedNumAvailableTokens;
            _addressLastMintedTokenId[endUser] = i;
        }

        if (onlyWhitelisted) {
            whitelistClaimed[endUser] = true;
        }
        _numAvailableTokens = updatedNumAvailableTokens;
    }

    function mintBadlist(
        uint256 _mintAmount,
        address payable endUser,
        bytes32[] memory proof
    ) public payable {
        require(phase() == 2, "Venda BadList mint desativada");
        require(!paused, "O contrato pausado");
        uint256 supply = contSupplyTotalBadList;
        require(_mintAmount > 0, "Precisa mintar pelo menos 1 NFT");
        require(_mintAmount + balanceOf(endUser) <= maxMintAmount, "Quantidade limite de mint por carteira excedida");
        require(supply + _mintAmount <= supplyTotalBadList, "Quantidade limite de NFT para BADLIST excedida");

        if (onlyWhitelisted) {
            require(isValidBadList(proof, keccak256(abi.encodePacked(endUser))), "Voce nao esta na Badlist");
        }

        if (!_isFreeMint ) {
            split(_mintAmount);
        }

        uint256 updatedNumAvailableTokens = maxSupply - totalSupply();

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[endUser]++;
            _safeMint(endUser, 1);
            uint256 newIdToken = supply + 1;
            contSupplyTotalBadList++;
            tokenURI(newIdToken);
            --updatedNumAvailableTokens;
            _addressLastMintedTokenId[endUser] = i;
        }

        if (onlyWhitelisted) {
            whitelistClaimed[endUser] = true;
        }
        _numAvailableTokens = updatedNumAvailableTokens;
    }

    function contractURI() external view returns (string memory) {
        return _contractUri;
    }

    function setContractURI(string memory contractURI_) external onlyOwner {
        _contractUri = contractURI_;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        returns (string memory)
    {
        require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );

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

    function walletOfOwner(address _owner)
        public
        view
        returns (uint)
    {
        return addressMintedBalance[_owner];
    }

    function split(uint256 _mintAmount) public payable {
        uint256 _nftEtherValueTemp = conditionPrice();

        require(msg.value >= (_nftEtherValueTemp * _mintAmount), "Valor da mintagem diferente do valor definido no contrato");

        uint ownerAmount = msg.value;

        uint256 _splitPercentageM = _royalties;
        uint256 amountM = msg.value * _splitPercentageM / 100;
        
        payable(wMobiup).transfer(amountM);
        
        ownerAmount = msg.value - amountM;
        payable(_contractOwner).transfer(ownerAmount);
    }

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

    function approve(address operator, uint256 tokenId) public override view virtual onlyAllowedOperatorApproval(operator) {
        approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public view virtual onlyAllowedOperator(from) {
        transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public view virtual onlyAllowedOperator(from) {
        safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public view virtual
        onlyAllowedOperator(from)
    {
        safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bytes32","name":"_rootBadList","type":"bytes32"},{"internalType":"uint256","name":"_nftEtherValueConselheiros","type":"uint256"},{"internalType":"uint256","name":"_nftEtherValueBad","type":"uint256"},{"internalType":"uint256","name":"_initSaleConselheiros","type":"uint256"},{"internalType":"uint256","name":"_initSaleBadList","type":"uint256"},{"internalType":"uint256","name":"_initSalePublic","type":"uint256"},{"internalType":"uint256","name":"_endSalePublic","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_transferSend","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"_checkContractOnERC721Received","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"conditionPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"conditionRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractIsFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getAddressLastMintedTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNFTURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNftEtherValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQtdAvailableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isAffliliated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOnlyWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValidBadList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelistedBadList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleProof","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address payable","name":"endUser","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintBadlist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address payable","name":"endUser","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintHolder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address payable","name":"endUser","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootBadList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setAffiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setAffiliateProgramPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setAllowAffiliateProgram","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeMintPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftEtherValue","type":"uint256"}],"name":"setNftEtherValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftEtherValueBadList","type":"uint256"}],"name":"setNftEtherValueBadList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftEtherValueConselheiros","type":"uint256"}],"name":"setNftEtherValueConselheiros","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRootKey","type":"bytes32"}],"name":"setRootKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRootKeyBadList","type":"bytes32"}],"name":"setRootKeyBadList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initSaleConselheiros","type":"uint256"},{"internalType":"uint256","name":"_initSaleBadList","type":"uint256"},{"internalType":"uint256","name":"_initSalePublic","type":"uint256"},{"internalType":"uint256","name":"_endSalePublic","type":"uint256"}],"name":"setTimesSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"split","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"baseExtension","type":"string"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90816200004a919062000989565b5060405180602001604052806000815250600f90816200006b919062000989565b506101f46010556101f460115560016012556000601360006101000a81548160ff0219169083151502179055506001601360016101000a81548160ff0219169083151502179055506001601b60006101000a81548160ff021916908315150217905550600f601c556001601d60006101000a81548160ff021916908315150217905550600a601e556007601f55600e6020556000602260006101000a81548160ff021916908315150217905550669c51c4521e000060235566753d533d9680006024556691a94863ca800060255561012c602a556064602b556000602c55734ab50b33a3475b46814b2ee066fafd0c8bcb393e602d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000602e55348015620001b057600080fd5b5060405162006dd538038062006dd58339818101604052810190620001d6919062000c40565b6040518060400160405280601481526020017f4272617a75657261202d204f20494e494d49474f0000000000000000000000008152506040518060400160405280600781526020017f494e494d49474f00000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200044e57801562000314576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002da92919062000db9565b600060405180830381600087803b158015620002f557600080fd5b505af11580156200030a573d6000803e3d6000fd5b505050506200044d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620003ce576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200039492919062000db9565b600060405180830381600087803b158015620003af57600080fd5b505af1158015620003c4573d6000803e3d6000fd5b505050506200044c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000417919062000de6565b600060405180830381600087803b1580156200043257600080fd5b505af115801562000447573d6000803e3d6000fd5b505050505b5b5b5050816002908162000461919062000989565b50806003908162000473919062000989565b50620004846200055860201b60201c565b6000819055505050620004ac620004a06200056160201b60201c565b6200056960201b60201c565b620004bd8a6200062f60201b60201c565b8760098190555086600a81905550856024819055508460258190555083602681905550826027819055508160288190555080602981905550886018908162000506919062000989565b5033601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050505062000e86565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200063f6200065460201b60201c565b80600d908162000650919062000989565b5050565b620006646200056160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200068a620006e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620006e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006da9062000e64565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200079157607f821691505b602082108103620007a757620007a662000749565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007d2565b6200081d8683620007d2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200086a620008646200085e8462000835565b6200083f565b62000835565b9050919050565b6000819050919050565b620008868362000849565b6200089e620008958262000871565b848454620007df565b825550505050565b600090565b620008b5620008a6565b620008c28184846200087b565b505050565b5b81811015620008ea57620008de600082620008ab565b600181019050620008c8565b5050565b601f82111562000939576200090381620007ad565b6200090e84620007c2565b810160208510156200091e578190505b620009366200092d85620007c2565b830182620008c7565b50505b505050565b600082821c905092915050565b60006200095e600019846008026200093e565b1980831691505092915050565b60006200097983836200094b565b9150826002028217905092915050565b62000994826200070f565b67ffffffffffffffff811115620009b057620009af6200071a565b5b620009bc825462000778565b620009c9828285620008ee565b600060209050601f83116001811462000a015760008415620009ec578287015190505b620009f885826200096b565b86555062000a68565b601f19841662000a1186620007ad565b60005b8281101562000a3b5784890151825560018201915060208501945060208101905062000a14565b8683101562000a5b578489015162000a57601f8916826200094b565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000aaa8262000a8e565b810181811067ffffffffffffffff8211171562000acc5762000acb6200071a565b5b80604052505050565b600062000ae162000a70565b905062000aef828262000a9f565b919050565b600067ffffffffffffffff82111562000b125762000b116200071a565b5b62000b1d8262000a8e565b9050602081019050919050565b60005b8381101562000b4a57808201518184015260208101905062000b2d565b60008484015250505050565b600062000b6d62000b678462000af4565b62000ad5565b90508281526020810184848401111562000b8c5762000b8b62000a89565b5b62000b9984828562000b2a565b509392505050565b600082601f83011262000bb95762000bb862000a84565b5b815162000bcb84826020860162000b56565b91505092915050565b6000819050919050565b62000be98162000bd4565b811462000bf557600080fd5b50565b60008151905062000c098162000bde565b92915050565b62000c1a8162000835565b811462000c2657600080fd5b50565b60008151905062000c3a8162000c0f565b92915050565b6000806000806000806000806000806101408b8d03121562000c675762000c6662000a7a565b5b60008b015167ffffffffffffffff81111562000c885762000c8762000a7f565b5b62000c968d828e0162000ba1565b9a505060208b015167ffffffffffffffff81111562000cba5762000cb962000a7f565b5b62000cc88d828e0162000ba1565b995050604062000cdb8d828e0162000bf8565b985050606062000cee8d828e0162000bf8565b975050608062000d018d828e0162000c29565b96505060a062000d148d828e0162000c29565b95505060c062000d278d828e0162000c29565b94505060e062000d3a8d828e0162000c29565b93505061010062000d4e8d828e0162000c29565b92505061012062000d628d828e0162000c29565b9150509295989b9194979a5092959850565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000da18262000d74565b9050919050565b62000db38162000d94565b82525050565b600060408201905062000dd0600083018562000da8565b62000ddf602083018462000da8565b9392505050565b600060208201905062000dfd600083018462000da8565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000e4c60208362000e03565b915062000e598262000e14565b602082019050919050565b6000602082019050818103600083015262000e7f8162000e3d565b9050919050565b615f3f8062000e966000396000f3fe6080604052600436106103f95760003560e01c8063715018a611610213578063b4ed16b311610123578063db4bec44116100ab578063ebf0c7171161007a578063ebf0c71714610f67578063ef5d87d714610f92578063f1763ebf14610fbb578063f2fde38b14610fe4578063fa9a309d1461100d576103f9565b8063db4bec4414610ea6578063dbceb00514610ee3578063e8a3d48514610eff578063e985e9c514610f2a576103f9565b8063c87b56dd116100f2578063c87b56dd14610dab578063d03be3ec14610de8578063d550700714610e13578063d6e7b8e414610e3e578063d88343e214610e69576103f9565b8063b4ed16b314610cdd578063b88d4fde14610d08578063b8a20ed014610d31578063ba4e5c4914610d6e576103f9565b80639536584f116101a65780639bbf31d1116101755780639bbf31d114610c19578063a22cb46514610c35578063a916cf6014610c5e578063b187bd2614610c87578063b1c9fe6e14610cb2576103f9565b80639536584f14610b5d57806395d89b4114610b865780639663d8cc14610bb15780639b0e665d14610bdc576103f9565b80638da5cb5b116101e25780638da5cb5b14610ab75780638e51548d14610ae2578063938e3d7b14610b0b57806394cf4b6a14610b34576103f9565b8063715018a614610a305780637de39e4214610a47578063833fbe4614610a635780638863ebbb14610a8e576103f9565b806341dcf4541161030e5780635a23dd99116102a15780636e17f797116102705780636e17f7971461094b5780636f50c93c146109745780636f8b44b01461099f57806370a08231146109c8578063714c539814610a05576103f9565b80635a23dd99146108575780636352211e146108945780636708231b146108d15780636c21fb001461090e576103f9565b8063474c68ec116102dd578063474c68ec146107af5780634c0f38c2146107d85780634fc9f84a1461080357806355f804b31461082e576103f9565b806341dcf454146106e157806341f434341461071e57806342842e0e14610749578063438b630014610772576103f9565b8063095ea7b31161039157806323b872dd1161036057806323b872dd1461063357806328ecc8a71461065c57806330e0789e146106855780633c952764146106ae5780633ccfd60b146106d7576103f9565b8063095ea7b31461059857806312065fe0146105c157806314e661a2146105ec57806318160ddd14610608576103f9565b806306fdde03116103cd57806306fdde03146104de578063081812fc146105095780630818181614610546578063088a4ed01461056f576103f9565b8062621fda146103fe57806301ffc9a71461043b57806302329a2914610478578063059d096f146104a1575b600080fd5b34801561040a57600080fd5b506104256004803603810190610420919061429a565b61104a565b6040516104329190614357565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d91906143d1565b611081565b60405161046f9190614419565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190614460565b611163565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190614669565b611188565b6040516104d59190614419565b60405180910390f35b3480156104ea57600080fd5b506104f361122e565b6040516105009190614357565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b919061429a565b6112c0565b60405161053d91906146d4565b60405180910390f35b34801561055257600080fd5b5061056d6004803603810190610568919061429a565b61133c565b005b34801561057b57600080fd5b506105966004803603810190610591919061429a565b61134e565b005b3480156105a457600080fd5b506105bf60048036038101906105ba91906146ef565b611360565b005b3480156105cd57600080fd5b506105d6611379565b6040516105e3919061473e565b60405180910390f35b61060660048036038101906106019190614797565b611398565b005b34801561061457600080fd5b5061061d611762565b60405161062a919061473e565b60405180910390f35b34801561063f57600080fd5b5061065a60048036038101906106559190614806565b611779565b005b34801561066857600080fd5b50610683600480360381019061067e9190614859565b6117c8565b005b34801561069157600080fd5b506106ac60048036038101906106a79190614806565b6118b8565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190614460565b611d6c565b005b6106df611d91565b005b3480156106ed57600080fd5b5061070860048036038101906107039190614975565b611e19565b6040516107159190614357565b60405180910390f35b34801561072a57600080fd5b50610733611efd565b6040516107409190614a30565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b9190614806565b611f0f565b005b34801561077e57600080fd5b5061079960048036038101906107949190614a4b565b611f5e565b6040516107a6919061473e565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d1919061429a565b611fa7565b005b3480156107e457600080fd5b506107ed611fb9565b6040516107fa919061473e565b60405180910390f35b34801561080f57600080fd5b50610818611fc3565b6040516108259190614419565b60405180910390f35b34801561083a57600080fd5b5061085560048036038101906108509190614a78565b611fda565b005b34801561086357600080fd5b5061087e60048036038101906108799190614669565b611ff5565b60405161088b9190614419565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b6919061429a565b61209b565b6040516108c891906146d4565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190614ac1565b6120b1565b6040516109059190614419565b60405180910390f35b34801561091a57600080fd5b5061093560048036038101906109309190614a4b565b6120c8565b604051610942919061473e565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d919061429a565b612111565b005b34801561098057600080fd5b50610989612123565b6040516109969190614419565b60405180910390f35b3480156109ab57600080fd5b506109c660048036038101906109c1919061429a565b61213a565b005b3480156109d457600080fd5b506109ef60048036038101906109ea9190614a4b565b61214c565b6040516109fc919061473e565b60405180910390f35b348015610a1157600080fd5b50610a1a61221b565b604051610a279190614357565b60405180910390f35b348015610a3c57600080fd5b50610a456122ad565b005b610a616004803603810190610a5c9190614797565b6122c1565b005b348015610a6f57600080fd5b50610a786126c8565b604051610a859190614b2c565b60405180910390f35b348015610a9a57600080fd5b50610ab56004803603810190610ab09190614b47565b61272e565b005b348015610ac357600080fd5b50610acc612791565b604051610ad991906146d4565b60405180910390f35b348015610aee57600080fd5b50610b096004803603810190610b049190614b87565b6127bb565b005b348015610b1757600080fd5b50610b326004803603810190610b2d9190614a78565b6127cd565b005b348015610b4057600080fd5b50610b5b6004803603810190610b569190614460565b6127e8565b005b348015610b6957600080fd5b50610b846004803603810190610b7f919061429a565b61280d565b005b348015610b9257600080fd5b50610b9b61281f565b604051610ba89190614357565b60405180910390f35b348015610bbd57600080fd5b50610bc66128b1565b604051610bd39190614b2c565b60405180910390f35b348015610be857600080fd5b50610c036004803603810190610bfe9190614a4b565b6128b7565b604051610c109190614419565b60405180910390f35b610c336004803603810190610c2e9190614797565b61290d565b005b348015610c4157600080fd5b50610c5c6004803603810190610c579190614b47565b612bd1565b005b348015610c6a57600080fd5b50610c856004803603810190610c80919061429a565b612bea565b005b348015610c9357600080fd5b50610c9c612bfc565b604051610ca99190614419565b60405180910390f35b348015610cbe57600080fd5b50610cc7612c13565b604051610cd4919061473e565b60405180910390f35b348015610ce957600080fd5b50610cf2612cbe565b604051610cff919061473e565b60405180910390f35b348015610d1457600080fd5b50610d2f6004803603810190610d2a9190614c55565b612cdd565b005b348015610d3d57600080fd5b50610d586004803603810190610d539190614ac1565b612d2e565b604051610d659190614419565b60405180910390f35b348015610d7a57600080fd5b50610d956004803603810190610d90919061429a565b612d45565b604051610da291906146d4565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd919061429a565b612d84565b604051610ddf9190614357565b60405180910390f35b348015610df457600080fd5b50610dfd612e2e565b604051610e0a919061473e565b60405180910390f35b348015610e1f57600080fd5b50610e28612e3d565b604051610e35919061473e565b60405180910390f35b348015610e4a57600080fd5b50610e53612ea0565b604051610e60919061473e565b60405180910390f35b348015610e7557600080fd5b50610e906004803603810190610e8b9190614c55565b612eaa565b604051610e9d9190614419565b60405180910390f35b348015610eb257600080fd5b50610ecd6004803603810190610ec89190614a4b565b612ffa565b604051610eda9190614419565b60405180910390f35b610efd6004803603810190610ef8919061429a565b61301a565b005b348015610f0b57600080fd5b50610f14613183565b604051610f219190614357565b60405180910390f35b348015610f3657600080fd5b50610f516004803603810190610f4c9190614cd8565b613215565b604051610f5e9190614419565b60405180910390f35b348015610f7357600080fd5b50610f7c6132a9565b604051610f899190614b2c565b60405180910390f35b348015610f9e57600080fd5b50610fb96004803603810190610fb49190614460565b6132af565b005b348015610fc757600080fd5b50610fe26004803603810190610fdd9190614b87565b6132d4565b005b348015610ff057600080fd5b5061100b60048036038101906110069190614a4b565b6132e6565b005b34801561101957600080fd5b50611034600480360381019061102f919061429a565b613369565b6040516110419190614b2c565b60405180910390f35b6060600d6110578361338d565b600e60405160200161106b93929190614e4c565b6040516020818303038152906040529050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061114c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061115c575061115b826134ed565b5b9050919050565b61116b613557565b80601360006101000a81548160ff02191690831515021790555050565b60006111ba828460405160200161119f9190614ec5565b604051602081830303815290604052805190602001206120b1565b1561122357600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561121a5760009050611228565b60019050611228565b600090505b92915050565b60606002805461123d90614d47565b80601f016020809104026020016040519081016040528092919081815260200182805461126990614d47565b80156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b5050505050905090565b60006112cb826135d5565b611301576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611344613557565b8060128190555050565b611356613557565b8060118190555050565b8161136a81613623565b6113748383611360565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff1631905090565b60026113a2612c13565b146113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d990614f2c565b60405180910390fd5b601360009054906101000a900460ff1615611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990614f98565b60405180910390fd5b6000602c5490506000841161147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147390615004565b60405180910390fd5b6011546114888461214c565b856114939190615053565b11156114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb906150f9565b60405180910390fd5b602b5484826114e39190615053565b1115611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b9061518b565b60405180910390fd5b601360019054906101000a900460ff16156115a957611569828460405160200161154e91906151d4565b604051602081830303815290604052805190602001206120b1565b6115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f9061523b565b60405180910390fd5b5b602260009054906101000a900460ff166115c7576115c68461301a565b5b60006115d1611762565b6010546115de919061525b565b90506000600190505b8581116116e557601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061163e9061528f565b919050555061164e856001613720565b600060018461165d9190615053565b9050602c60008154809291906116729061528f565b919050555061168081612d84565b508261168b906152d7565b925081602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806116dd9061528f565b9150506115e7565b50601360019054906101000a900460ff1615611754576001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806017819055505050505050565b600061176c61373e565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117b7576117b633613623565b5b6117c2848484611779565b50505050565b6117d0613557565b828410611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990615398565b60405180910390fd5b818310611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90615450565b60405180910390fd5b808210611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90615508565b60405180910390fd5b8360268190555082602781905550816028819055508060298190555050505050565b60006118c382613747565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461192e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661194f6139d6565b73ffffffffffffffffffffffffffffffffffffffff16148061197e575061197d856119786139d6565b613215565b5b806119c3575061198c6139d6565b73ffffffffffffffffffffffffffffffffffffffff166119ab846112c0565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806119fc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a62576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a6f85858560016139de565b611a7b600084876139e4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cfa576000548214611cf957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d658585856001613a96565b5050505050565b611d74613557565b80601360016101000a81548160ff02191690831515021790555050565b611d99613557565b6000611da3612791565b73ffffffffffffffffffffffffffffffffffffffff1647604051611dc690615559565b60006040518083038185875af1925050503d8060008114611e03576040519150601f19603f3d011682016040523d82523d6000602084013e611e08565b606091505b5050905080611e1657600080fd5b50565b6060611e24836135d5565b611e5a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e64613a9c565b9050611e6f846135d5565b15611ea85780611e7e8561338d565b84604051602001611e919392919061556e565b604051602081830303815290604052915050611ef7565b6000815103611ec65760405180602001604052806000815250611ef3565b80611ed08561338d565b84604051602001611ee39392919061556e565b6040516020818303038152906040525b9150505b92915050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f4d57611f4c33613623565b5b611f58848484611f0f565b50505050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611faf613557565b80601c8190555050565b6000601054905090565b6000602260009054906101000a900460ff16905090565b611fe2613557565b80600d9081611ff1919061572c565b5050565b6000612027828460405160200161200c9190614ec5565b60405160208183030381529060405280519060200120612d2e565b1561209057600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120875760009050612095565b60019050612095565b600090505b92915050565b60006120a682613747565b600001519050919050565b60006120c083600a5484613b2e565b905092915050565b6000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612119613557565b8060238190555050565b6000601360019054906101000a900460ff16905090565b612142613557565b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121b3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060600d805461222a90614d47565b80601f016020809104026020016040519081016040528092919081815260200182805461225690614d47565b80156122a35780601f10612278576101008083540402835291602001916122a3565b820191906000526020600020905b81548152906001019060200180831161228657829003601f168201915b5050505050905090565b6122b5613557565b6122bf6000613b45565b565b60016122cb612c13565b1461230b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123029061584a565b60405180910390fd5b601360009054906101000a900460ff161561235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290614f98565b60405180910390fd5b6000612365611762565b9050600084116123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190615004565b60405180910390fd5b6011546123b68461214c565b856123c19190615053565b1115612402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f9906150f9565b60405180910390fd5b60105484826124119190615053565b1115612452576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612449906158dc565b60405180910390fd5b602a5484826124619190615053565b11156124a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124999061596e565b60405180910390fd5b601360019054906101000a900460ff1615612527576124e782846040516020016124cc91906151d4565b60405160208183030381529060405280519060200120612d2e565b612526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251d906159da565b60405180910390fd5b5b602260009054906101000a900460ff16612545576125448461301a565b5b600061254f611762565b60105461255c919061525b565b90506000600190505b85811161264b57601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906125bc9061528f565b91905055506125cc856001613720565b60006001846125db9190615053565b90506125e681612d84565b50826125f1906152d7565b925081602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806126439061528f565b915050612565565b50601360019054906101000a900460ff16156126ba576001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806017819055505050505050565b6000806126d3612c13565b9050600081036126e9576000801b91505061272b565b600181036126fc5760095491505061272b565b6002810361270f57600a5491505061272b565b60038103612723576000801b91505061272b565b6000801b9150505b90565b612736613557565b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6127c3613557565b80600a8190555050565b6127d5613557565b80601890816127e4919061572c565b5050565b6127f0613557565b80601b60006101000a81548160ff02191690831515021790555050565b612815613557565b8060258190555050565b60606003805461282e90614d47565b80601f016020809104026020016040519081016040528092919081815260200182805461285a90614d47565b80156128a75780601f1061287c576101008083540402835291602001916128a7565b820191906000526020600020905b81548152906001019060200180831161288a57829003601f168201915b5050505050905090565b600a5481565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6003612917612c13565b14612957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294e90615a46565b60405180910390fd5b601360009054906101000a900460ff16156129a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299e90614f98565b60405180910390fd5b60006129b1611762565b9050600084116129f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ed90615004565b60405180910390fd5b601154612a028461214c565b85612a0d9190615053565b1115612a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a45906150f9565b60405180910390fd5b6010548482612a5d9190615053565b1115612a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a95906158dc565b60405180910390fd5b602260009054906101000a900460ff16612abc57612abb8461301a565b5b6000612ac6611762565b601054612ad3919061525b565b90506000600190505b858111612bc257601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612b339061528f565b9190505550612b43856001613720565b6000600184612b529190615053565b9050612b5d81612d84565b5082612b68906152d7565b925081602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080612bba9061528f565b915050612adc565b50806017819055505050505050565b81612bdb81613623565b612be58383613c0b565b505050565b612bf2613557565b8060248190555050565b6000601360009054906101000a900460ff16905090565b600080600090506026544210158015612c2e57506027544211155b15612c555760019050612c3f611762565b602a5403612c4c57600290505b80915050612cbb565b6027544210158015612c6957506028544211155b15612c835760029050602c54602b5403612c8257600390505b5b6028544210158015612c9757506029544211155b15612cb65760039050601054612cab611762565b03612cb557600390505b5b809150505b90565b6000806017541115612cd4576017549050612cda565b60105490505b90565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d1b57612d1a33613623565b5b612d2785858585612cdd565b5050505050565b6000612d3d8360095484613b2e565b905092915050565b60148181548110612d5557600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060612d8f826135d5565b612dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc590615ad8565b60405180910390fd5b6000612dd8613a9c565b90506000815111612df85760405180602001604052806000815250612e26565b80612e028461338d565b600e604051602001612e1693929190615af8565b6040516020818303038152906040525b915050919050565b6000612e38612e3d565b905090565b600080612e48612c13565b905060008103612e5d57602354915050612e9d565b60018103612e7057602454915050612e9d565b60028103612e8357602554915050612e9d565b60038103612e9657602354915050612e9d565b6023549150505b90565b6000601154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ed06139d6565b8786866040518563ffffffff1660e01b8152600401612ef29493929190615b7e565b6020604051808303816000875af1925050508015612f2e57506040513d601f19601f82011682018060405250810190612f2b9190615bdf565b60015b612fa7573d8060008114612f5e576040519150601f19603f3d011682016040523d82523d6000602084013e612f63565b606091505b506000815103612f9f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000613024612e3d565b905081816130329190615c0c565b341015613074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306b90615cc0565b60405180910390fd5b60003490506000601f5490506000606482346130909190615c0c565b61309a9190615d0f565b9050602d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613104573d6000803e3d6000fd5b508034613111919061525b565b9250601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561317b573d6000803e3d6000fd5b505050505050565b60606018805461319290614d47565b80601f01602080910402602001604051908101604052809291908181526020018280546131be90614d47565b801561320b5780601f106131e05761010080835404028352916020019161320b565b820191906000526020600020905b8154815290600101906020018083116131ee57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b6132b7613557565b80602260006101000a81548160ff02191690831515021790555050565b6132dc613557565b8060098190555050565b6132ee613557565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361335d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335490615db2565b60405180910390fd5b61336681613b45565b50565b600b818154811061337957600080fd5b906000526020600020016000915090505481565b6060600082036133d4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134e8565b600082905060005b600082146134065780806133ef9061528f565b915050600a826133ff9190615d0f565b91506133dc565b60008167ffffffffffffffff811115613422576134216144f0565b5b6040519080825280601f01601f1916602001820160405280156134545781602001600182028036833780820191505090505b5090505b600085146134e15760018261346d919061525b565b9150600a8561347c9190615dd2565b60306134889190615053565b60f81b81838151811061349e5761349d615e03565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134da9190615d0f565b9450613458565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61355f6139d6565b73ffffffffffffffffffffffffffffffffffffffff1661357d612791565b73ffffffffffffffffffffffffffffffffffffffff16146135d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ca90615e7e565b60405180910390fd5b565b6000816135e061373e565b111580156135ef575060005482105b801561361c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561371d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161369a929190615e9e565b602060405180830381865afa1580156136b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136db9190615edc565b61371c57806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161371391906146d4565b60405180910390fd5b5b50565b61373a828260405180602001604052806000815250613d82565b5050565b60006001905090565b61374f61420d565b60008290508061375d61373e565b1115801561376c575060005481105b1561399f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161399d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146138815780925050506139d1565b5b60011561399c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146139975780925050506139d1565b613882565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b50505050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b50505050565b6060600d8054613aab90614d47565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad790614d47565b8015613b245780601f10613af957610100808354040283529160200191613b24565b820191906000526020600020905b815481529060010190602001808311613b0757829003601f168201915b5050505050905090565b600082613b3b8584613d94565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613c136139d6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613c77576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000613c846139d6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613d316139d6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613d769190614419565b60405180910390a35050565b613d8f8383836001613e09565b505050565b60008082905060005b8451811015613dfe576000858281518110613dbb57613dba615e03565b5b60200260200101519050808311613ddd57613dd683826141d3565b9250613dea565b613de781846141d3565b92505b508080613df69061528f565b915050613d9d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613e75576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613eaf576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ebc60008683876139de565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561408657506140858773ffffffffffffffffffffffffffffffffffffffff166141ea565b5b1561414b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46140fb6000888480600101955088612eaa565b614131576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361408c57826000541461414657600080fd5b6141b6565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361414c575b8160008190555050506141cc6000868387613a96565b5050505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61427781614264565b811461428257600080fd5b50565b6000813590506142948161426e565b92915050565b6000602082840312156142b0576142af61425a565b5b60006142be84828501614285565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156143015780820151818401526020810190506142e6565b60008484015250505050565b6000601f19601f8301169050919050565b6000614329826142c7565b61433381856142d2565b93506143438185602086016142e3565b61434c8161430d565b840191505092915050565b60006020820190508181036000830152614371818461431e565b905092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6143ae81614379565b81146143b957600080fd5b50565b6000813590506143cb816143a5565b92915050565b6000602082840312156143e7576143e661425a565b5b60006143f5848285016143bc565b91505092915050565b60008115159050919050565b614413816143fe565b82525050565b600060208201905061442e600083018461440a565b92915050565b61443d816143fe565b811461444857600080fd5b50565b60008135905061445a81614434565b92915050565b6000602082840312156144765761447561425a565b5b60006144848482850161444b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144b88261448d565b9050919050565b6144c8816144ad565b81146144d357600080fd5b50565b6000813590506144e5816144bf565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145288261430d565b810181811067ffffffffffffffff82111715614547576145466144f0565b5b80604052505050565b600061455a614250565b9050614566828261451f565b919050565b600067ffffffffffffffff821115614586576145856144f0565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6145af8161459c565b81146145ba57600080fd5b50565b6000813590506145cc816145a6565b92915050565b60006145e56145e08461456b565b614550565b9050808382526020820190506020840283018581111561460857614607614597565b5b835b81811015614631578061461d88826145bd565b84526020840193505060208101905061460a565b5050509392505050565b600082601f8301126146505761464f6144eb565b5b81356146608482602086016145d2565b91505092915050565b600080604083850312156146805761467f61425a565b5b600061468e858286016144d6565b925050602083013567ffffffffffffffff8111156146af576146ae61425f565b5b6146bb8582860161463b565b9150509250929050565b6146ce816144ad565b82525050565b60006020820190506146e960008301846146c5565b92915050565b600080604083850312156147065761470561425a565b5b6000614714858286016144d6565b925050602061472585828601614285565b9150509250929050565b61473881614264565b82525050565b6000602082019050614753600083018461472f565b92915050565b60006147648261448d565b9050919050565b61477481614759565b811461477f57600080fd5b50565b6000813590506147918161476b565b92915050565b6000806000606084860312156147b0576147af61425a565b5b60006147be86828701614285565b93505060206147cf86828701614782565b925050604084013567ffffffffffffffff8111156147f0576147ef61425f565b5b6147fc8682870161463b565b9150509250925092565b60008060006060848603121561481f5761481e61425a565b5b600061482d868287016144d6565b935050602061483e868287016144d6565b925050604061484f86828701614285565b9150509250925092565b600080600080608085870312156148735761487261425a565b5b600061488187828801614285565b945050602061489287828801614285565b93505060406148a387828801614285565b92505060606148b487828801614285565b91505092959194509250565b600080fd5b600067ffffffffffffffff8211156148e0576148df6144f0565b5b6148e98261430d565b9050602081019050919050565b82818337600083830152505050565b6000614918614913846148c5565b614550565b905082815260208101848484011115614934576149336148c0565b5b61493f8482856148f6565b509392505050565b600082601f83011261495c5761495b6144eb565b5b813561496c848260208601614905565b91505092915050565b6000806040838503121561498c5761498b61425a565b5b600061499a85828601614285565b925050602083013567ffffffffffffffff8111156149bb576149ba61425f565b5b6149c785828601614947565b9150509250929050565b6000819050919050565b60006149f66149f16149ec8461448d565b6149d1565b61448d565b9050919050565b6000614a08826149db565b9050919050565b6000614a1a826149fd565b9050919050565b614a2a81614a0f565b82525050565b6000602082019050614a456000830184614a21565b92915050565b600060208284031215614a6157614a6061425a565b5b6000614a6f848285016144d6565b91505092915050565b600060208284031215614a8e57614a8d61425a565b5b600082013567ffffffffffffffff811115614aac57614aab61425f565b5b614ab884828501614947565b91505092915050565b60008060408385031215614ad857614ad761425a565b5b600083013567ffffffffffffffff811115614af657614af561425f565b5b614b028582860161463b565b9250506020614b13858286016145bd565b9150509250929050565b614b268161459c565b82525050565b6000602082019050614b416000830184614b1d565b92915050565b60008060408385031215614b5e57614b5d61425a565b5b6000614b6c858286016144d6565b9250506020614b7d8582860161444b565b9150509250929050565b600060208284031215614b9d57614b9c61425a565b5b6000614bab848285016145bd565b91505092915050565b600067ffffffffffffffff821115614bcf57614bce6144f0565b5b614bd88261430d565b9050602081019050919050565b6000614bf8614bf384614bb4565b614550565b905082815260208101848484011115614c1457614c136148c0565b5b614c1f8482856148f6565b509392505050565b600082601f830112614c3c57614c3b6144eb565b5b8135614c4c848260208601614be5565b91505092915050565b60008060008060808587031215614c6f57614c6e61425a565b5b6000614c7d878288016144d6565b9450506020614c8e878288016144d6565b9350506040614c9f87828801614285565b925050606085013567ffffffffffffffff811115614cc057614cbf61425f565b5b614ccc87828801614c27565b91505092959194509250565b60008060408385031215614cef57614cee61425a565b5b6000614cfd858286016144d6565b9250506020614d0e858286016144d6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d5f57607f821691505b602082108103614d7257614d71614d18565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614da581614d47565b614daf8186614d78565b94506001821660008114614dca5760018114614ddf57614e12565b60ff1983168652811515820286019350614e12565b614de885614d83565b60005b83811015614e0a57815481890152600182019150602081019050614deb565b838801955050505b50505092915050565b6000614e26826142c7565b614e308185614d78565b9350614e408185602086016142e3565b80840191505092915050565b6000614e588286614d98565b9150614e648285614e1b565b9150614e708284614d98565b9150819050949350505050565b60008160601b9050919050565b6000614e9582614e7d565b9050919050565b6000614ea782614e8a565b9050919050565b614ebf614eba826144ad565b614e9c565b82525050565b6000614ed18284614eae565b60148201915081905092915050565b7f56656e6461204261644c697374206d696e742064657361746976616461000000600082015250565b6000614f16601d836142d2565b9150614f2182614ee0565b602082019050919050565b60006020820190508181036000830152614f4581614f09565b9050919050565b7f4f20636f6e747261746f207061757361646f0000000000000000000000000000600082015250565b6000614f826012836142d2565b9150614f8d82614f4c565b602082019050919050565b60006020820190508181036000830152614fb181614f75565b9050919050565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e465400600082015250565b6000614fee601f836142d2565b9150614ff982614fb8565b602082019050919050565b6000602082019050818103600083015261501d81614fe1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061505e82614264565b915061506983614264565b925082820190508082111561508157615080615024565b5b92915050565b7f5175616e746964616465206c696d697465206465206d696e7420706f7220636160008201527f7274656972612065786365646964610000000000000000000000000000000000602082015250565b60006150e3602f836142d2565b91506150ee82615087565b604082019050919050565b60006020820190508181036000830152615112816150d6565b9050919050565b7f5175616e746964616465206c696d697465206465204e4654207061726120424160008201527f444c495354206578636564696461000000000000000000000000000000000000602082015250565b6000615175602e836142d2565b915061518082615119565b604082019050919050565b600060208201905081810360008301526151a481615168565b9050919050565b60006151b682614e8a565b9050919050565b6151ce6151c982614759565b6151ab565b82525050565b60006151e082846151bd565b60148201915081905092915050565b7f566f6365206e616f2065737461206e61204261646c6973740000000000000000600082015250565b60006152256018836142d2565b9150615230826151ef565b602082019050919050565b6000602082019050818103600083015261525481615218565b9050919050565b600061526682614264565b915061527183614264565b925082820390508181111561528957615288615024565b5b92915050565b600061529a82614264565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036152cc576152cb615024565b5b600182019050919050565b60006152e282614264565b9150600082036152f5576152f4615024565b5b600182039050919050565b7f4461746120496e696369616c2064652076656e6461206465766520736572206d60008201527f656e6f722071756520646120646174612064652076656e64612064612042616460208201527f4c69737400000000000000000000000000000000000000000000000000000000604082015250565b60006153826044836142d2565b915061538d82615300565b606082019050919050565b600060208201905081810360008301526153b181615375565b9050919050565b7f4461746120496e696369616c2064652076656e64612070617261206261646c6960008201527f7374206465766520736572206d656e6f7220717565206461206461746120646560208201527f2076656e646120646f207075626c6963206d696e740000000000000000000000604082015250565b600061543a6055836142d2565b9150615445826153b8565b606082019050919050565b600060208201905081810360008301526154698161542d565b9050919050565b7f4461746120496e696369616c2064652076656e6461207075626c69636120646560008201527f766520736572206d656e6f722071756520646120646174612066696e616c207660208201527f656e646100000000000000000000000000000000000000000000000000000000604082015250565b60006154f26044836142d2565b91506154fd82615470565b606082019050919050565b60006020820190508181036000830152615521816154e5565b9050919050565b600081905092915050565b50565b6000615543600083615528565b915061554e82615533565b600082019050919050565b600061556482615536565b9150819050919050565b600061557a8286614e1b565b91506155868285614e1b565b91506155928284614e1b565b9150819050949350505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026155ec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826155af565b6155f686836155af565b95508019841693508086168417925050509392505050565b600061562961562461561f84614264565b6149d1565b614264565b9050919050565b6000819050919050565b6156438361560e565b61565761564f82615630565b8484546155bc565b825550505050565b600090565b61566c61565f565b61567781848461563a565b505050565b5b8181101561569b57615690600082615664565b60018101905061567d565b5050565b601f8211156156e0576156b181614d83565b6156ba8461559f565b810160208510156156c9578190505b6156dd6156d58561559f565b83018261567c565b50505b505050565b600082821c905092915050565b6000615703600019846008026156e5565b1980831691505092915050565b600061571c83836156f2565b9150826002028217905092915050565b615735826142c7565b67ffffffffffffffff81111561574e5761574d6144f0565b5b6157588254614d47565b61576382828561569f565b600060209050601f8311600181146157965760008415615784578287015190505b61578e8582615710565b8655506157f6565b601f1984166157a486614d83565b60005b828110156157cc578489015182556001820191506020850194506020810190506157a7565b868310156157e957848901516157e5601f8916826156f2565b8355505b6001600288020188555050505b505050505050565b7f56656e646120486f6c646572206d696e74206465736174697661646100000000600082015250565b6000615834601c836142d2565b915061583f826157fe565b602082019050919050565b6000602082019050818103600083015261586381615827565b9050919050565b7f5175616e746964616465206c696d697465206465204e4654206578636564696460008201527f6100000000000000000000000000000000000000000000000000000000000000602082015250565b60006158c66021836142d2565b91506158d18261586a565b604082019050919050565b600060208201905081810360008301526158f5816158b9565b9050919050565b7f5175616e746964616465206c696d697465206465204e4654207061726120486f60008201527f6c64657273206578636564696461000000000000000000000000000000000000602082015250565b6000615958602e836142d2565b9150615963826158fc565b604082019050919050565b600060208201905081810360008301526159878161594b565b9050919050565b7f566f6365206e616f206520486f6c646572000000000000000000000000000000600082015250565b60006159c46011836142d2565b91506159cf8261598e565b602082019050919050565b600060208201905081810360008301526159f3816159b7565b9050919050565b7f56656e6461205075626c6963206d696e74206465736174697661646100000000600082015250565b6000615a30601c836142d2565b9150615a3b826159fa565b602082019050919050565b60006020820190508181036000830152615a5f81615a23565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615ac2602f836142d2565b9150615acd82615a66565b604082019050919050565b60006020820190508181036000830152615af181615ab5565b9050919050565b6000615b048286614e1b565b9150615b108285614e1b565b9150615b1c8284614d98565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b6000615b5082615b29565b615b5a8185615b34565b9350615b6a8185602086016142e3565b615b738161430d565b840191505092915050565b6000608082019050615b9360008301876146c5565b615ba060208301866146c5565b615bad604083018561472f565b8181036060830152615bbf8184615b45565b905095945050505050565b600081519050615bd9816143a5565b92915050565b600060208284031215615bf557615bf461425a565b5b6000615c0384828501615bca565b91505092915050565b6000615c1782614264565b9150615c2283614264565b9250828202615c3081614264565b91508282048414831517615c4757615c46615024565b5b5092915050565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f00000000000000602082015250565b6000615caa6039836142d2565b9150615cb582615c4e565b604082019050919050565b60006020820190508181036000830152615cd981615c9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615d1a82614264565b9150615d2583614264565b925082615d3557615d34615ce0565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615d9c6026836142d2565b9150615da782615d40565b604082019050919050565b60006020820190508181036000830152615dcb81615d8f565b9050919050565b6000615ddd82614264565b9150615de883614264565b925082615df857615df7615ce0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615e686020836142d2565b9150615e7382615e32565b602082019050919050565b60006020820190508181036000830152615e9781615e5b565b9050919050565b6000604082019050615eb360008301856146c5565b615ec060208301846146c5565b9392505050565b600081519050615ed681614434565b92915050565b600060208284031215615ef257615ef161425a565b5b6000615f0084828501615ec7565b9150509291505056fea2646970667358221220220b37886c267363021169a9418dbe3cda42b24ed131bd9c9f2016fb28d0a58f64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c00fa7fe020da33f4627f3fba1e10749840760e94134eb667f509a132fcd601a7458cd5b0aaffbbe0b0359bc9ae09a28dc698bdd2338d571399b23e90dc0dbabdd00000000000000000000000000000000000000000000000000753d533d9680000000000000000000000000000000000000000000000000000091a94863ca800000000000000000000000000000000000000000000000000000000000639d22a000000000000000000000000000000000000000000000000000000000639dbd5000000000000000000000000000000000000000000000000000000000639df59000000000000000000000000000000000000000000000000000000000657f2910000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d506372367a4b3859374465344a4c48546143394a70385274597268753666615236365a7969677334723169452f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d4e5178776a6e31786e69633853587369524563637a506d785039766b795638776a45797a7647727a6e725a4a0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103f95760003560e01c8063715018a611610213578063b4ed16b311610123578063db4bec44116100ab578063ebf0c7171161007a578063ebf0c71714610f67578063ef5d87d714610f92578063f1763ebf14610fbb578063f2fde38b14610fe4578063fa9a309d1461100d576103f9565b8063db4bec4414610ea6578063dbceb00514610ee3578063e8a3d48514610eff578063e985e9c514610f2a576103f9565b8063c87b56dd116100f2578063c87b56dd14610dab578063d03be3ec14610de8578063d550700714610e13578063d6e7b8e414610e3e578063d88343e214610e69576103f9565b8063b4ed16b314610cdd578063b88d4fde14610d08578063b8a20ed014610d31578063ba4e5c4914610d6e576103f9565b80639536584f116101a65780639bbf31d1116101755780639bbf31d114610c19578063a22cb46514610c35578063a916cf6014610c5e578063b187bd2614610c87578063b1c9fe6e14610cb2576103f9565b80639536584f14610b5d57806395d89b4114610b865780639663d8cc14610bb15780639b0e665d14610bdc576103f9565b80638da5cb5b116101e25780638da5cb5b14610ab75780638e51548d14610ae2578063938e3d7b14610b0b57806394cf4b6a14610b34576103f9565b8063715018a614610a305780637de39e4214610a47578063833fbe4614610a635780638863ebbb14610a8e576103f9565b806341dcf4541161030e5780635a23dd99116102a15780636e17f797116102705780636e17f7971461094b5780636f50c93c146109745780636f8b44b01461099f57806370a08231146109c8578063714c539814610a05576103f9565b80635a23dd99146108575780636352211e146108945780636708231b146108d15780636c21fb001461090e576103f9565b8063474c68ec116102dd578063474c68ec146107af5780634c0f38c2146107d85780634fc9f84a1461080357806355f804b31461082e576103f9565b806341dcf454146106e157806341f434341461071e57806342842e0e14610749578063438b630014610772576103f9565b8063095ea7b31161039157806323b872dd1161036057806323b872dd1461063357806328ecc8a71461065c57806330e0789e146106855780633c952764146106ae5780633ccfd60b146106d7576103f9565b8063095ea7b31461059857806312065fe0146105c157806314e661a2146105ec57806318160ddd14610608576103f9565b806306fdde03116103cd57806306fdde03146104de578063081812fc146105095780630818181614610546578063088a4ed01461056f576103f9565b8062621fda146103fe57806301ffc9a71461043b57806302329a2914610478578063059d096f146104a1575b600080fd5b34801561040a57600080fd5b506104256004803603810190610420919061429a565b61104a565b6040516104329190614357565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d91906143d1565b611081565b60405161046f9190614419565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190614460565b611163565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190614669565b611188565b6040516104d59190614419565b60405180910390f35b3480156104ea57600080fd5b506104f361122e565b6040516105009190614357565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b919061429a565b6112c0565b60405161053d91906146d4565b60405180910390f35b34801561055257600080fd5b5061056d6004803603810190610568919061429a565b61133c565b005b34801561057b57600080fd5b506105966004803603810190610591919061429a565b61134e565b005b3480156105a457600080fd5b506105bf60048036038101906105ba91906146ef565b611360565b005b3480156105cd57600080fd5b506105d6611379565b6040516105e3919061473e565b60405180910390f35b61060660048036038101906106019190614797565b611398565b005b34801561061457600080fd5b5061061d611762565b60405161062a919061473e565b60405180910390f35b34801561063f57600080fd5b5061065a60048036038101906106559190614806565b611779565b005b34801561066857600080fd5b50610683600480360381019061067e9190614859565b6117c8565b005b34801561069157600080fd5b506106ac60048036038101906106a79190614806565b6118b8565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190614460565b611d6c565b005b6106df611d91565b005b3480156106ed57600080fd5b5061070860048036038101906107039190614975565b611e19565b6040516107159190614357565b60405180910390f35b34801561072a57600080fd5b50610733611efd565b6040516107409190614a30565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b9190614806565b611f0f565b005b34801561077e57600080fd5b5061079960048036038101906107949190614a4b565b611f5e565b6040516107a6919061473e565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d1919061429a565b611fa7565b005b3480156107e457600080fd5b506107ed611fb9565b6040516107fa919061473e565b60405180910390f35b34801561080f57600080fd5b50610818611fc3565b6040516108259190614419565b60405180910390f35b34801561083a57600080fd5b5061085560048036038101906108509190614a78565b611fda565b005b34801561086357600080fd5b5061087e60048036038101906108799190614669565b611ff5565b60405161088b9190614419565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b6919061429a565b61209b565b6040516108c891906146d4565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190614ac1565b6120b1565b6040516109059190614419565b60405180910390f35b34801561091a57600080fd5b5061093560048036038101906109309190614a4b565b6120c8565b604051610942919061473e565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d919061429a565b612111565b005b34801561098057600080fd5b50610989612123565b6040516109969190614419565b60405180910390f35b3480156109ab57600080fd5b506109c660048036038101906109c1919061429a565b61213a565b005b3480156109d457600080fd5b506109ef60048036038101906109ea9190614a4b565b61214c565b6040516109fc919061473e565b60405180910390f35b348015610a1157600080fd5b50610a1a61221b565b604051610a279190614357565b60405180910390f35b348015610a3c57600080fd5b50610a456122ad565b005b610a616004803603810190610a5c9190614797565b6122c1565b005b348015610a6f57600080fd5b50610a786126c8565b604051610a859190614b2c565b60405180910390f35b348015610a9a57600080fd5b50610ab56004803603810190610ab09190614b47565b61272e565b005b348015610ac357600080fd5b50610acc612791565b604051610ad991906146d4565b60405180910390f35b348015610aee57600080fd5b50610b096004803603810190610b049190614b87565b6127bb565b005b348015610b1757600080fd5b50610b326004803603810190610b2d9190614a78565b6127cd565b005b348015610b4057600080fd5b50610b5b6004803603810190610b569190614460565b6127e8565b005b348015610b6957600080fd5b50610b846004803603810190610b7f919061429a565b61280d565b005b348015610b9257600080fd5b50610b9b61281f565b604051610ba89190614357565b60405180910390f35b348015610bbd57600080fd5b50610bc66128b1565b604051610bd39190614b2c565b60405180910390f35b348015610be857600080fd5b50610c036004803603810190610bfe9190614a4b565b6128b7565b604051610c109190614419565b60405180910390f35b610c336004803603810190610c2e9190614797565b61290d565b005b348015610c4157600080fd5b50610c5c6004803603810190610c579190614b47565b612bd1565b005b348015610c6a57600080fd5b50610c856004803603810190610c80919061429a565b612bea565b005b348015610c9357600080fd5b50610c9c612bfc565b604051610ca99190614419565b60405180910390f35b348015610cbe57600080fd5b50610cc7612c13565b604051610cd4919061473e565b60405180910390f35b348015610ce957600080fd5b50610cf2612cbe565b604051610cff919061473e565b60405180910390f35b348015610d1457600080fd5b50610d2f6004803603810190610d2a9190614c55565b612cdd565b005b348015610d3d57600080fd5b50610d586004803603810190610d539190614ac1565b612d2e565b604051610d659190614419565b60405180910390f35b348015610d7a57600080fd5b50610d956004803603810190610d90919061429a565b612d45565b604051610da291906146d4565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd919061429a565b612d84565b604051610ddf9190614357565b60405180910390f35b348015610df457600080fd5b50610dfd612e2e565b604051610e0a919061473e565b60405180910390f35b348015610e1f57600080fd5b50610e28612e3d565b604051610e35919061473e565b60405180910390f35b348015610e4a57600080fd5b50610e53612ea0565b604051610e60919061473e565b60405180910390f35b348015610e7557600080fd5b50610e906004803603810190610e8b9190614c55565b612eaa565b604051610e9d9190614419565b60405180910390f35b348015610eb257600080fd5b50610ecd6004803603810190610ec89190614a4b565b612ffa565b604051610eda9190614419565b60405180910390f35b610efd6004803603810190610ef8919061429a565b61301a565b005b348015610f0b57600080fd5b50610f14613183565b604051610f219190614357565b60405180910390f35b348015610f3657600080fd5b50610f516004803603810190610f4c9190614cd8565b613215565b604051610f5e9190614419565b60405180910390f35b348015610f7357600080fd5b50610f7c6132a9565b604051610f899190614b2c565b60405180910390f35b348015610f9e57600080fd5b50610fb96004803603810190610fb49190614460565b6132af565b005b348015610fc757600080fd5b50610fe26004803603810190610fdd9190614b87565b6132d4565b005b348015610ff057600080fd5b5061100b60048036038101906110069190614a4b565b6132e6565b005b34801561101957600080fd5b50611034600480360381019061102f919061429a565b613369565b6040516110419190614b2c565b60405180910390f35b6060600d6110578361338d565b600e60405160200161106b93929190614e4c565b6040516020818303038152906040529050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061114c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061115c575061115b826134ed565b5b9050919050565b61116b613557565b80601360006101000a81548160ff02191690831515021790555050565b60006111ba828460405160200161119f9190614ec5565b604051602081830303815290604052805190602001206120b1565b1561122357600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561121a5760009050611228565b60019050611228565b600090505b92915050565b60606002805461123d90614d47565b80601f016020809104026020016040519081016040528092919081815260200182805461126990614d47565b80156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b5050505050905090565b60006112cb826135d5565b611301576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611344613557565b8060128190555050565b611356613557565b8060118190555050565b8161136a81613623565b6113748383611360565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff1631905090565b60026113a2612c13565b146113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d990614f2c565b60405180910390fd5b601360009054906101000a900460ff1615611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990614f98565b60405180910390fd5b6000602c5490506000841161147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147390615004565b60405180910390fd5b6011546114888461214c565b856114939190615053565b11156114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb906150f9565b60405180910390fd5b602b5484826114e39190615053565b1115611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b9061518b565b60405180910390fd5b601360019054906101000a900460ff16156115a957611569828460405160200161154e91906151d4565b604051602081830303815290604052805190602001206120b1565b6115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f9061523b565b60405180910390fd5b5b602260009054906101000a900460ff166115c7576115c68461301a565b5b60006115d1611762565b6010546115de919061525b565b90506000600190505b8581116116e557601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061163e9061528f565b919050555061164e856001613720565b600060018461165d9190615053565b9050602c60008154809291906116729061528f565b919050555061168081612d84565b508261168b906152d7565b925081602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806116dd9061528f565b9150506115e7565b50601360019054906101000a900460ff1615611754576001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806017819055505050505050565b600061176c61373e565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117b7576117b633613623565b5b6117c2848484611779565b50505050565b6117d0613557565b828410611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990615398565b60405180910390fd5b818310611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90615450565b60405180910390fd5b808210611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90615508565b60405180910390fd5b8360268190555082602781905550816028819055508060298190555050505050565b60006118c382613747565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461192e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661194f6139d6565b73ffffffffffffffffffffffffffffffffffffffff16148061197e575061197d856119786139d6565b613215565b5b806119c3575061198c6139d6565b73ffffffffffffffffffffffffffffffffffffffff166119ab846112c0565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806119fc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a62576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a6f85858560016139de565b611a7b600084876139e4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cfa576000548214611cf957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d658585856001613a96565b5050505050565b611d74613557565b80601360016101000a81548160ff02191690831515021790555050565b611d99613557565b6000611da3612791565b73ffffffffffffffffffffffffffffffffffffffff1647604051611dc690615559565b60006040518083038185875af1925050503d8060008114611e03576040519150601f19603f3d011682016040523d82523d6000602084013e611e08565b606091505b5050905080611e1657600080fd5b50565b6060611e24836135d5565b611e5a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e64613a9c565b9050611e6f846135d5565b15611ea85780611e7e8561338d565b84604051602001611e919392919061556e565b604051602081830303815290604052915050611ef7565b6000815103611ec65760405180602001604052806000815250611ef3565b80611ed08561338d565b84604051602001611ee39392919061556e565b6040516020818303038152906040525b9150505b92915050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f4d57611f4c33613623565b5b611f58848484611f0f565b50505050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611faf613557565b80601c8190555050565b6000601054905090565b6000602260009054906101000a900460ff16905090565b611fe2613557565b80600d9081611ff1919061572c565b5050565b6000612027828460405160200161200c9190614ec5565b60405160208183030381529060405280519060200120612d2e565b1561209057600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120875760009050612095565b60019050612095565b600090505b92915050565b60006120a682613747565b600001519050919050565b60006120c083600a5484613b2e565b905092915050565b6000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612119613557565b8060238190555050565b6000601360019054906101000a900460ff16905090565b612142613557565b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121b3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060600d805461222a90614d47565b80601f016020809104026020016040519081016040528092919081815260200182805461225690614d47565b80156122a35780601f10612278576101008083540402835291602001916122a3565b820191906000526020600020905b81548152906001019060200180831161228657829003601f168201915b5050505050905090565b6122b5613557565b6122bf6000613b45565b565b60016122cb612c13565b1461230b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123029061584a565b60405180910390fd5b601360009054906101000a900460ff161561235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290614f98565b60405180910390fd5b6000612365611762565b9050600084116123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190615004565b60405180910390fd5b6011546123b68461214c565b856123c19190615053565b1115612402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f9906150f9565b60405180910390fd5b60105484826124119190615053565b1115612452576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612449906158dc565b60405180910390fd5b602a5484826124619190615053565b11156124a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124999061596e565b60405180910390fd5b601360019054906101000a900460ff1615612527576124e782846040516020016124cc91906151d4565b60405160208183030381529060405280519060200120612d2e565b612526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251d906159da565b60405180910390fd5b5b602260009054906101000a900460ff16612545576125448461301a565b5b600061254f611762565b60105461255c919061525b565b90506000600190505b85811161264b57601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906125bc9061528f565b91905055506125cc856001613720565b60006001846125db9190615053565b90506125e681612d84565b50826125f1906152d7565b925081602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806126439061528f565b915050612565565b50601360019054906101000a900460ff16156126ba576001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806017819055505050505050565b6000806126d3612c13565b9050600081036126e9576000801b91505061272b565b600181036126fc5760095491505061272b565b6002810361270f57600a5491505061272b565b60038103612723576000801b91505061272b565b6000801b9150505b90565b612736613557565b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6127c3613557565b80600a8190555050565b6127d5613557565b80601890816127e4919061572c565b5050565b6127f0613557565b80601b60006101000a81548160ff02191690831515021790555050565b612815613557565b8060258190555050565b60606003805461282e90614d47565b80601f016020809104026020016040519081016040528092919081815260200182805461285a90614d47565b80156128a75780601f1061287c576101008083540402835291602001916128a7565b820191906000526020600020905b81548152906001019060200180831161288a57829003601f168201915b5050505050905090565b600a5481565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6003612917612c13565b14612957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294e90615a46565b60405180910390fd5b601360009054906101000a900460ff16156129a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299e90614f98565b60405180910390fd5b60006129b1611762565b9050600084116129f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ed90615004565b60405180910390fd5b601154612a028461214c565b85612a0d9190615053565b1115612a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a45906150f9565b60405180910390fd5b6010548482612a5d9190615053565b1115612a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a95906158dc565b60405180910390fd5b602260009054906101000a900460ff16612abc57612abb8461301a565b5b6000612ac6611762565b601054612ad3919061525b565b90506000600190505b858111612bc257601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612b339061528f565b9190505550612b43856001613720565b6000600184612b529190615053565b9050612b5d81612d84565b5082612b68906152d7565b925081602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080612bba9061528f565b915050612adc565b50806017819055505050505050565b81612bdb81613623565b612be58383613c0b565b505050565b612bf2613557565b8060248190555050565b6000601360009054906101000a900460ff16905090565b600080600090506026544210158015612c2e57506027544211155b15612c555760019050612c3f611762565b602a5403612c4c57600290505b80915050612cbb565b6027544210158015612c6957506028544211155b15612c835760029050602c54602b5403612c8257600390505b5b6028544210158015612c9757506029544211155b15612cb65760039050601054612cab611762565b03612cb557600390505b5b809150505b90565b6000806017541115612cd4576017549050612cda565b60105490505b90565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d1b57612d1a33613623565b5b612d2785858585612cdd565b5050505050565b6000612d3d8360095484613b2e565b905092915050565b60148181548110612d5557600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060612d8f826135d5565b612dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc590615ad8565b60405180910390fd5b6000612dd8613a9c565b90506000815111612df85760405180602001604052806000815250612e26565b80612e028461338d565b600e604051602001612e1693929190615af8565b6040516020818303038152906040525b915050919050565b6000612e38612e3d565b905090565b600080612e48612c13565b905060008103612e5d57602354915050612e9d565b60018103612e7057602454915050612e9d565b60028103612e8357602554915050612e9d565b60038103612e9657602354915050612e9d565b6023549150505b90565b6000601154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ed06139d6565b8786866040518563ffffffff1660e01b8152600401612ef29493929190615b7e565b6020604051808303816000875af1925050508015612f2e57506040513d601f19601f82011682018060405250810190612f2b9190615bdf565b60015b612fa7573d8060008114612f5e576040519150601f19603f3d011682016040523d82523d6000602084013e612f63565b606091505b506000815103612f9f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000613024612e3d565b905081816130329190615c0c565b341015613074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306b90615cc0565b60405180910390fd5b60003490506000601f5490506000606482346130909190615c0c565b61309a9190615d0f565b9050602d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613104573d6000803e3d6000fd5b508034613111919061525b565b9250601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561317b573d6000803e3d6000fd5b505050505050565b60606018805461319290614d47565b80601f01602080910402602001604051908101604052809291908181526020018280546131be90614d47565b801561320b5780601f106131e05761010080835404028352916020019161320b565b820191906000526020600020905b8154815290600101906020018083116131ee57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b6132b7613557565b80602260006101000a81548160ff02191690831515021790555050565b6132dc613557565b8060098190555050565b6132ee613557565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361335d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335490615db2565b60405180910390fd5b61336681613b45565b50565b600b818154811061337957600080fd5b906000526020600020016000915090505481565b6060600082036133d4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134e8565b600082905060005b600082146134065780806133ef9061528f565b915050600a826133ff9190615d0f565b91506133dc565b60008167ffffffffffffffff811115613422576134216144f0565b5b6040519080825280601f01601f1916602001820160405280156134545781602001600182028036833780820191505090505b5090505b600085146134e15760018261346d919061525b565b9150600a8561347c9190615dd2565b60306134889190615053565b60f81b81838151811061349e5761349d615e03565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134da9190615d0f565b9450613458565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61355f6139d6565b73ffffffffffffffffffffffffffffffffffffffff1661357d612791565b73ffffffffffffffffffffffffffffffffffffffff16146135d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ca90615e7e565b60405180910390fd5b565b6000816135e061373e565b111580156135ef575060005482105b801561361c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561371d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161369a929190615e9e565b602060405180830381865afa1580156136b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136db9190615edc565b61371c57806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161371391906146d4565b60405180910390fd5b5b50565b61373a828260405180602001604052806000815250613d82565b5050565b60006001905090565b61374f61420d565b60008290508061375d61373e565b1115801561376c575060005481105b1561399f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161399d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146138815780925050506139d1565b5b60011561399c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146139975780925050506139d1565b613882565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b50505050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b50505050565b6060600d8054613aab90614d47565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad790614d47565b8015613b245780601f10613af957610100808354040283529160200191613b24565b820191906000526020600020905b815481529060010190602001808311613b0757829003601f168201915b5050505050905090565b600082613b3b8584613d94565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613c136139d6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613c77576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000613c846139d6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613d316139d6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613d769190614419565b60405180910390a35050565b613d8f8383836001613e09565b505050565b60008082905060005b8451811015613dfe576000858281518110613dbb57613dba615e03565b5b60200260200101519050808311613ddd57613dd683826141d3565b9250613dea565b613de781846141d3565b92505b508080613df69061528f565b915050613d9d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613e75576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613eaf576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ebc60008683876139de565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561408657506140858773ffffffffffffffffffffffffffffffffffffffff166141ea565b5b1561414b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46140fb6000888480600101955088612eaa565b614131576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361408c57826000541461414657600080fd5b6141b6565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361414c575b8160008190555050506141cc6000868387613a96565b5050505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61427781614264565b811461428257600080fd5b50565b6000813590506142948161426e565b92915050565b6000602082840312156142b0576142af61425a565b5b60006142be84828501614285565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156143015780820151818401526020810190506142e6565b60008484015250505050565b6000601f19601f8301169050919050565b6000614329826142c7565b61433381856142d2565b93506143438185602086016142e3565b61434c8161430d565b840191505092915050565b60006020820190508181036000830152614371818461431e565b905092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6143ae81614379565b81146143b957600080fd5b50565b6000813590506143cb816143a5565b92915050565b6000602082840312156143e7576143e661425a565b5b60006143f5848285016143bc565b91505092915050565b60008115159050919050565b614413816143fe565b82525050565b600060208201905061442e600083018461440a565b92915050565b61443d816143fe565b811461444857600080fd5b50565b60008135905061445a81614434565b92915050565b6000602082840312156144765761447561425a565b5b60006144848482850161444b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144b88261448d565b9050919050565b6144c8816144ad565b81146144d357600080fd5b50565b6000813590506144e5816144bf565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145288261430d565b810181811067ffffffffffffffff82111715614547576145466144f0565b5b80604052505050565b600061455a614250565b9050614566828261451f565b919050565b600067ffffffffffffffff821115614586576145856144f0565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6145af8161459c565b81146145ba57600080fd5b50565b6000813590506145cc816145a6565b92915050565b60006145e56145e08461456b565b614550565b9050808382526020820190506020840283018581111561460857614607614597565b5b835b81811015614631578061461d88826145bd565b84526020840193505060208101905061460a565b5050509392505050565b600082601f8301126146505761464f6144eb565b5b81356146608482602086016145d2565b91505092915050565b600080604083850312156146805761467f61425a565b5b600061468e858286016144d6565b925050602083013567ffffffffffffffff8111156146af576146ae61425f565b5b6146bb8582860161463b565b9150509250929050565b6146ce816144ad565b82525050565b60006020820190506146e960008301846146c5565b92915050565b600080604083850312156147065761470561425a565b5b6000614714858286016144d6565b925050602061472585828601614285565b9150509250929050565b61473881614264565b82525050565b6000602082019050614753600083018461472f565b92915050565b60006147648261448d565b9050919050565b61477481614759565b811461477f57600080fd5b50565b6000813590506147918161476b565b92915050565b6000806000606084860312156147b0576147af61425a565b5b60006147be86828701614285565b93505060206147cf86828701614782565b925050604084013567ffffffffffffffff8111156147f0576147ef61425f565b5b6147fc8682870161463b565b9150509250925092565b60008060006060848603121561481f5761481e61425a565b5b600061482d868287016144d6565b935050602061483e868287016144d6565b925050604061484f86828701614285565b9150509250925092565b600080600080608085870312156148735761487261425a565b5b600061488187828801614285565b945050602061489287828801614285565b93505060406148a387828801614285565b92505060606148b487828801614285565b91505092959194509250565b600080fd5b600067ffffffffffffffff8211156148e0576148df6144f0565b5b6148e98261430d565b9050602081019050919050565b82818337600083830152505050565b6000614918614913846148c5565b614550565b905082815260208101848484011115614934576149336148c0565b5b61493f8482856148f6565b509392505050565b600082601f83011261495c5761495b6144eb565b5b813561496c848260208601614905565b91505092915050565b6000806040838503121561498c5761498b61425a565b5b600061499a85828601614285565b925050602083013567ffffffffffffffff8111156149bb576149ba61425f565b5b6149c785828601614947565b9150509250929050565b6000819050919050565b60006149f66149f16149ec8461448d565b6149d1565b61448d565b9050919050565b6000614a08826149db565b9050919050565b6000614a1a826149fd565b9050919050565b614a2a81614a0f565b82525050565b6000602082019050614a456000830184614a21565b92915050565b600060208284031215614a6157614a6061425a565b5b6000614a6f848285016144d6565b91505092915050565b600060208284031215614a8e57614a8d61425a565b5b600082013567ffffffffffffffff811115614aac57614aab61425f565b5b614ab884828501614947565b91505092915050565b60008060408385031215614ad857614ad761425a565b5b600083013567ffffffffffffffff811115614af657614af561425f565b5b614b028582860161463b565b9250506020614b13858286016145bd565b9150509250929050565b614b268161459c565b82525050565b6000602082019050614b416000830184614b1d565b92915050565b60008060408385031215614b5e57614b5d61425a565b5b6000614b6c858286016144d6565b9250506020614b7d8582860161444b565b9150509250929050565b600060208284031215614b9d57614b9c61425a565b5b6000614bab848285016145bd565b91505092915050565b600067ffffffffffffffff821115614bcf57614bce6144f0565b5b614bd88261430d565b9050602081019050919050565b6000614bf8614bf384614bb4565b614550565b905082815260208101848484011115614c1457614c136148c0565b5b614c1f8482856148f6565b509392505050565b600082601f830112614c3c57614c3b6144eb565b5b8135614c4c848260208601614be5565b91505092915050565b60008060008060808587031215614c6f57614c6e61425a565b5b6000614c7d878288016144d6565b9450506020614c8e878288016144d6565b9350506040614c9f87828801614285565b925050606085013567ffffffffffffffff811115614cc057614cbf61425f565b5b614ccc87828801614c27565b91505092959194509250565b60008060408385031215614cef57614cee61425a565b5b6000614cfd858286016144d6565b9250506020614d0e858286016144d6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d5f57607f821691505b602082108103614d7257614d71614d18565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614da581614d47565b614daf8186614d78565b94506001821660008114614dca5760018114614ddf57614e12565b60ff1983168652811515820286019350614e12565b614de885614d83565b60005b83811015614e0a57815481890152600182019150602081019050614deb565b838801955050505b50505092915050565b6000614e26826142c7565b614e308185614d78565b9350614e408185602086016142e3565b80840191505092915050565b6000614e588286614d98565b9150614e648285614e1b565b9150614e708284614d98565b9150819050949350505050565b60008160601b9050919050565b6000614e9582614e7d565b9050919050565b6000614ea782614e8a565b9050919050565b614ebf614eba826144ad565b614e9c565b82525050565b6000614ed18284614eae565b60148201915081905092915050565b7f56656e6461204261644c697374206d696e742064657361746976616461000000600082015250565b6000614f16601d836142d2565b9150614f2182614ee0565b602082019050919050565b60006020820190508181036000830152614f4581614f09565b9050919050565b7f4f20636f6e747261746f207061757361646f0000000000000000000000000000600082015250565b6000614f826012836142d2565b9150614f8d82614f4c565b602082019050919050565b60006020820190508181036000830152614fb181614f75565b9050919050565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e465400600082015250565b6000614fee601f836142d2565b9150614ff982614fb8565b602082019050919050565b6000602082019050818103600083015261501d81614fe1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061505e82614264565b915061506983614264565b925082820190508082111561508157615080615024565b5b92915050565b7f5175616e746964616465206c696d697465206465206d696e7420706f7220636160008201527f7274656972612065786365646964610000000000000000000000000000000000602082015250565b60006150e3602f836142d2565b91506150ee82615087565b604082019050919050565b60006020820190508181036000830152615112816150d6565b9050919050565b7f5175616e746964616465206c696d697465206465204e4654207061726120424160008201527f444c495354206578636564696461000000000000000000000000000000000000602082015250565b6000615175602e836142d2565b915061518082615119565b604082019050919050565b600060208201905081810360008301526151a481615168565b9050919050565b60006151b682614e8a565b9050919050565b6151ce6151c982614759565b6151ab565b82525050565b60006151e082846151bd565b60148201915081905092915050565b7f566f6365206e616f2065737461206e61204261646c6973740000000000000000600082015250565b60006152256018836142d2565b9150615230826151ef565b602082019050919050565b6000602082019050818103600083015261525481615218565b9050919050565b600061526682614264565b915061527183614264565b925082820390508181111561528957615288615024565b5b92915050565b600061529a82614264565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036152cc576152cb615024565b5b600182019050919050565b60006152e282614264565b9150600082036152f5576152f4615024565b5b600182039050919050565b7f4461746120496e696369616c2064652076656e6461206465766520736572206d60008201527f656e6f722071756520646120646174612064652076656e64612064612042616460208201527f4c69737400000000000000000000000000000000000000000000000000000000604082015250565b60006153826044836142d2565b915061538d82615300565b606082019050919050565b600060208201905081810360008301526153b181615375565b9050919050565b7f4461746120496e696369616c2064652076656e64612070617261206261646c6960008201527f7374206465766520736572206d656e6f7220717565206461206461746120646560208201527f2076656e646120646f207075626c6963206d696e740000000000000000000000604082015250565b600061543a6055836142d2565b9150615445826153b8565b606082019050919050565b600060208201905081810360008301526154698161542d565b9050919050565b7f4461746120496e696369616c2064652076656e6461207075626c69636120646560008201527f766520736572206d656e6f722071756520646120646174612066696e616c207660208201527f656e646100000000000000000000000000000000000000000000000000000000604082015250565b60006154f26044836142d2565b91506154fd82615470565b606082019050919050565b60006020820190508181036000830152615521816154e5565b9050919050565b600081905092915050565b50565b6000615543600083615528565b915061554e82615533565b600082019050919050565b600061556482615536565b9150819050919050565b600061557a8286614e1b565b91506155868285614e1b565b91506155928284614e1b565b9150819050949350505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026155ec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826155af565b6155f686836155af565b95508019841693508086168417925050509392505050565b600061562961562461561f84614264565b6149d1565b614264565b9050919050565b6000819050919050565b6156438361560e565b61565761564f82615630565b8484546155bc565b825550505050565b600090565b61566c61565f565b61567781848461563a565b505050565b5b8181101561569b57615690600082615664565b60018101905061567d565b5050565b601f8211156156e0576156b181614d83565b6156ba8461559f565b810160208510156156c9578190505b6156dd6156d58561559f565b83018261567c565b50505b505050565b600082821c905092915050565b6000615703600019846008026156e5565b1980831691505092915050565b600061571c83836156f2565b9150826002028217905092915050565b615735826142c7565b67ffffffffffffffff81111561574e5761574d6144f0565b5b6157588254614d47565b61576382828561569f565b600060209050601f8311600181146157965760008415615784578287015190505b61578e8582615710565b8655506157f6565b601f1984166157a486614d83565b60005b828110156157cc578489015182556001820191506020850194506020810190506157a7565b868310156157e957848901516157e5601f8916826156f2565b8355505b6001600288020188555050505b505050505050565b7f56656e646120486f6c646572206d696e74206465736174697661646100000000600082015250565b6000615834601c836142d2565b915061583f826157fe565b602082019050919050565b6000602082019050818103600083015261586381615827565b9050919050565b7f5175616e746964616465206c696d697465206465204e4654206578636564696460008201527f6100000000000000000000000000000000000000000000000000000000000000602082015250565b60006158c66021836142d2565b91506158d18261586a565b604082019050919050565b600060208201905081810360008301526158f5816158b9565b9050919050565b7f5175616e746964616465206c696d697465206465204e4654207061726120486f60008201527f6c64657273206578636564696461000000000000000000000000000000000000602082015250565b6000615958602e836142d2565b9150615963826158fc565b604082019050919050565b600060208201905081810360008301526159878161594b565b9050919050565b7f566f6365206e616f206520486f6c646572000000000000000000000000000000600082015250565b60006159c46011836142d2565b91506159cf8261598e565b602082019050919050565b600060208201905081810360008301526159f3816159b7565b9050919050565b7f56656e6461205075626c6963206d696e74206465736174697661646100000000600082015250565b6000615a30601c836142d2565b9150615a3b826159fa565b602082019050919050565b60006020820190508181036000830152615a5f81615a23565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615ac2602f836142d2565b9150615acd82615a66565b604082019050919050565b60006020820190508181036000830152615af181615ab5565b9050919050565b6000615b048286614e1b565b9150615b108285614e1b565b9150615b1c8284614d98565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b6000615b5082615b29565b615b5a8185615b34565b9350615b6a8185602086016142e3565b615b738161430d565b840191505092915050565b6000608082019050615b9360008301876146c5565b615ba060208301866146c5565b615bad604083018561472f565b8181036060830152615bbf8184615b45565b905095945050505050565b600081519050615bd9816143a5565b92915050565b600060208284031215615bf557615bf461425a565b5b6000615c0384828501615bca565b91505092915050565b6000615c1782614264565b9150615c2283614264565b9250828202615c3081614264565b91508282048414831517615c4757615c46615024565b5b5092915050565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f00000000000000602082015250565b6000615caa6039836142d2565b9150615cb582615c4e565b604082019050919050565b60006020820190508181036000830152615cd981615c9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615d1a82614264565b9150615d2583614264565b925082615d3557615d34615ce0565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615d9c6026836142d2565b9150615da782615d40565b604082019050919050565b60006020820190508181036000830152615dcb81615d8f565b9050919050565b6000615ddd82614264565b9150615de883614264565b925082615df857615df7615ce0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615e686020836142d2565b9150615e7382615e32565b602082019050919050565b60006020820190508181036000830152615e9781615e5b565b9050919050565b6000604082019050615eb360008301856146c5565b615ec060208301846146c5565b9392505050565b600081519050615ed681614434565b92915050565b600060208284031215615ef257615ef161425a565b5b6000615f0084828501615ec7565b9150509291505056fea2646970667358221220220b37886c267363021169a9418dbe3cda42b24ed131bd9c9f2016fb28d0a58f64736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c00fa7fe020da33f4627f3fba1e10749840760e94134eb667f509a132fcd601a7458cd5b0aaffbbe0b0359bc9ae09a28dc698bdd2338d571399b23e90dc0dbabdd00000000000000000000000000000000000000000000000000753d533d9680000000000000000000000000000000000000000000000000000091a94863ca800000000000000000000000000000000000000000000000000000000000639d22a000000000000000000000000000000000000000000000000000000000639dbd5000000000000000000000000000000000000000000000000000000000639df59000000000000000000000000000000000000000000000000000000000657f2910000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d506372367a4b3859374465344a4c48546143394a70385274597268753666615236365a7969677334723169452f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d4e5178776a6e31786e69633853587369524563637a506d785039766b795638776a45797a7647727a6e725a4a0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://ipfs.io/ipfs/QmPcr6zK8Y7De4JLHTaC9Jp8RtYrhu6faR66Zyigs4r1iE/
Arg [1] : _contractURI (string): https://ipfs.io/ipfs/QmNQxwjn1xnic8SXsiREcczPmxP9vkyV8wjEyzvGrznrZJ
Arg [2] : _root (bytes32): 0x0fa7fe020da33f4627f3fba1e10749840760e94134eb667f509a132fcd601a74
Arg [3] : _rootBadList (bytes32): 0x58cd5b0aaffbbe0b0359bc9ae09a28dc698bdd2338d571399b23e90dc0dbabdd
Arg [4] : _nftEtherValueConselheiros (uint256): 33000000000000000
Arg [5] : _nftEtherValueBad (uint256): 41000000000000000
Arg [6] : _initSaleConselheiros (uint256): 1671242400
Arg [7] : _initSaleBadList (uint256): 1671282000
Arg [8] : _initSalePublic (uint256): 1671296400
Arg [9] : _endSalePublic (uint256): 1702832400

-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [2] : 0fa7fe020da33f4627f3fba1e10749840760e94134eb667f509a132fcd601a74
Arg [3] : 58cd5b0aaffbbe0b0359bc9ae09a28dc698bdd2338d571399b23e90dc0dbabdd
Arg [4] : 00000000000000000000000000000000000000000000000000753d533d968000
Arg [5] : 0000000000000000000000000000000000000000000000000091a94863ca8000
Arg [6] : 00000000000000000000000000000000000000000000000000000000639d22a0
Arg [7] : 00000000000000000000000000000000000000000000000000000000639dbd50
Arg [8] : 00000000000000000000000000000000000000000000000000000000639df590
Arg [9] : 00000000000000000000000000000000000000000000000000000000657f2910
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [11] : 68747470733a2f2f697066732e696f2f697066732f516d506372367a4b385937
Arg [12] : 4465344a4c48546143394a70385274597268753666615236365a796967733472
Arg [13] : 3169452f00000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [15] : 68747470733a2f2f697066732e696f2f697066732f516d4e5178776a6e31786e
Arg [16] : 69633853587369524563637a506d785039766b795638776a45797a7647727a6e
Arg [17] : 725a4a0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

71679:16574:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80666:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38073:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78525:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81504:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41186:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42834:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77827:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78401:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87515:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80466:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84458:1434;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37322:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87687:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74589:737;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46987:2129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78189:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78877:155;;;:::i;:::-;;41512:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3015:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87856:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86597:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78734:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80009:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80965:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77715:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81154:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40994:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77432:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80211:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79148:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78298:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79040:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38442:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80567:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15744:103;;;;;;;;;;;;;:::i;:::-;;82990:1460;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76672:598;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79591:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15096:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78058:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86007:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78612:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79443:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41346:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71841:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80846:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81868:1114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87331:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79271:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81067:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75334:853;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79812:189;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88033:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77279:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72325:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86132:457;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80103:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76195:469;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80361:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52731:666;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71911:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86757:566;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85900:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43468:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71815:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79714:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77955:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16002:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71874:28;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80666:172;80722:13;80779:7;80788:25;80805:7;80788:16;:25::i;:::-;80815:13;80762:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80748:82;;80666:172;;;:::o;38073:305::-;38175:4;38227:25;38212:40;;;:11;:40;;;;:105;;;;38284:33;38269:48;;;:11;:48;;;;38212:105;:158;;;;38334:36;38358:11;38334:23;:36::i;:::-;38212:158;38192:178;;38073:305;;;:::o;78525:79::-;14982:13;:11;:13::i;:::-;78590:6:::1;78581;;:15;;;;;;;;;;;;;;;;;;78525:79:::0;:::o;81504:356::-;81594:4;81616:61;81632:5;81667;81650:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;81639:36;;;;;;81616:14;:61::i;:::-;81611:242;;;81699:16;:23;81716:5;81699:23;;;;;;;;;;;;;;;;;;;;;;;;;81695:76;;;81750:5;81743:12;;;;81695:76;81792:4;81785:11;;;;81611:242;81836:5;81829:12;;81504:356;;;;;:::o;41186:91::-;41231:13;41264:5;41257:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41186:91;:::o;42834:204::-;42902:7;42927:16;42935:7;42927;:16::i;:::-;42922:64;;42952:34;;;;;;;;;;;;;;42922:64;43006:15;:24;43022:7;43006:24;;;;;;;;;;;;;;;;;;;;;42999:31;;42834:204;;;:::o;77827:120::-;14982:13;:11;:13::i;:::-;77933:6:::1;77907:23;:32;;;;77827:120:::0;:::o;78401:116::-;14982:13;:11;:13::i;:::-;78495:14:::1;78479:13;:30;;;;78401:116:::0;:::o;87515:164::-;87624:8;4536:30;4557:8;4536:20;:30::i;:::-;87645:26:::1;87653:8;87663:7;87645;:26::i;:::-;87515:164:::0;;;:::o;80466:93::-;80509:4;80533:10;:18;;;80526:25;;80466:93;:::o;84458:1434::-;84628:1;84617:7;:5;:7::i;:::-;:12;84609:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;84683:6;;;;;;;;;;;84682:7;84674:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;84723:14;84740:22;;84723:39;;84795:1;84781:11;:15;84773:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;84887:13;;84865:18;84875:7;84865:9;:18::i;:::-;84851:11;:32;;;;:::i;:::-;:49;;84843:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;84995:18;;84980:11;84971:6;:20;;;;:::i;:::-;:42;;84963:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;85081:15;;;;;;;;;;;85077:144;;;85121:59;85136:5;85170:7;85153:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;85143:36;;;;;;85121:14;:59::i;:::-;85113:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;85077:144;85238:11;;;;;;;;;;;85233:64;;85267:18;85273:11;85267:5;:18::i;:::-;85233:64;85309:33;85357:13;:11;:13::i;:::-;85345:9;;:25;;;;:::i;:::-;85309:61;;85388:9;85400:1;85388:13;;85383:352;85408:11;85403:1;:16;85383:352;;85441:20;:29;85462:7;85441:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;85487:21;85497:7;85506:1;85487:9;:21::i;:::-;85523:18;85553:1;85544:6;:10;;;;:::i;:::-;85523:31;;85569:22;;:24;;;;;;;;;:::i;:::-;;;;;;85608:20;85617:10;85608:8;:20::i;:::-;;85643:27;;;;:::i;:::-;;;85722:1;85685:25;:34;85711:7;85685:34;;;;;;;;;;;;;;;:38;;;;85426:309;85421:3;;;;;:::i;:::-;;;;85383:352;;;;85751:15;;;;;;;;;;;85747:80;;;85811:4;85783:16;:25;85800:7;85783:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;85747:80;85859:25;85837:19;:47;;;;84598:1294;;84458:1434;;;:::o;37322:303::-;37366:7;37591:15;:13;:15::i;:::-;37576:12;;37560:13;;:28;:46;37553:53;;37322:303;:::o;87687:161::-;87792:4;4364:10;4356:18;;:4;:18;;;4352:83;;4391:32;4412:10;4391:20;:32::i;:::-;4352:83;87809:31:::1;87822:4;87828:2;87832:7;87809:12;:31::i;:::-;87687:161:::0;;;;:::o;74589:737::-;14982:13;:11;:13::i;:::-;74778:16:::1;74754:21;:40;74746:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;74905:15;74886:16;:34;74878:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;75047:14;75029:15;:32;75021:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;75168:21;75145:20;:44;;;;75218:16;75200:15;:34;;;;75262:15;75245:14;:32;;;;75304:14;75288:13;:30;;;;74589:737:::0;;;;:::o;46987:2129::-;47101:35;47139:21;47152:7;47139:12;:21::i;:::-;47101:59;;47199:4;47177:26;;:13;:18;;;:26;;;47173:67;;47212:28;;;;;;;;;;;;;;47173:67;47253:22;47295:4;47279:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;47316:36;47333:4;47339:12;:10;:12::i;:::-;47316:16;:36::i;:::-;47279:73;:126;;;;47393:12;:10;:12::i;:::-;47369:36;;:20;47381:7;47369:11;:20::i;:::-;:36;;;47279:126;47253:153;;47424:17;47419:66;;47450:35;;;;;;;;;;;;;;47419:66;47514:1;47500:16;;:2;:16;;;47496:52;;47525:23;;;;;;;;;;;;;;47496:52;47561:43;47583:4;47589:2;47593:7;47602:1;47561:21;:43::i;:::-;47669:35;47686:1;47690:7;47699:4;47669:8;:35::i;:::-;48030:1;48000:12;:18;48013:4;48000:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48074:1;48046:12;:16;48059:2;48046:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48092:31;48126:11;:20;48138:7;48126:20;;;;;;;;;;;48092:54;;48177:2;48161:8;:13;;;:18;;;;;;;;;;;;;;;;;;48227:15;48194:8;:23;;;:49;;;;;;;;;;;;;;;;;;48495:19;48527:1;48517:7;:11;48495:33;;48543:31;48577:11;:24;48589:11;48577:24;;;;;;;;;;;48543:58;;48645:1;48620:27;;:8;:13;;;;;;;;;;;;:27;;;48616:384;;48830:13;;48815:11;:28;48811:174;;48884:4;48868:8;:13;;;:20;;;;;;;;;;;;;;;;;;48937:13;:28;;;48911:8;:23;;;:54;;;;;;;;;;;;;;;;;;48811:174;48616:384;47975:1036;;;49047:7;49043:2;49028:27;;49037:4;49028:27;;;;;;;;;;;;49066:42;49087:4;49093:2;49097:7;49106:1;49066:20;:42::i;:::-;47090:2026;;46987:2129;;;:::o;78189:101::-;14982:13;:11;:13::i;:::-;78276:6:::1;78258:15;;:24;;;;;;;;;;;;;;;;;;78189:101:::0;:::o;78877:155::-;14982:13;:11;:13::i;:::-;78934:7:::1;78955;:5;:7::i;:::-;78947:21;;78976;78947:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78933:69;;;79021:2;79013:11;;;::::0;::::1;;78922:110;78877:155::o:0;41512:473::-;41605:13;41636:16;41644:7;41636;:16::i;:::-;41631:59;;41661:29;;;;;;;;;;;;;;41631:59;41701:21;41725:10;:8;:10::i;:::-;41701:34;;41750:16;41758:7;41750;:16::i;:::-;41746:104;;;41799:7;41808:25;41825:7;41808:16;:25::i;:::-;41835:13;41782:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41768:82;;;;;41746:104;41893:1;41874:7;41868:21;:26;:109;;;;;;;;;;;;;;;;;41921:7;41930:25;41947:7;41930:16;:25::i;:::-;41957:13;41904:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41868:109;41861:116;;;41512:473;;;;;:::o;3015:143::-;3115:42;3015:143;:::o;87856:169::-;87965:4;4364:10;4356:18;;:4;:18;;;4352:83;;4391:32;4412:10;4391:20;:32::i;:::-;4352:83;87982:35:::1;87999:4;88005:2;88009:7;87982:16;:35::i;:::-;87856:169:::0;;;;:::o;86597:152::-;86684:4;86713:20;:28;86734:6;86713:28;;;;;;;;;;;;;;;;86706:35;;86597:152;;;:::o;78734:135::-;14982:13;:11;:13::i;:::-;78851:10:::1;78821:27;:40;;;;78734:135:::0;:::o;80009:86::-;80054:4;80078:9;;80071:16;;80009:86;:::o;80965:94::-;81016:4;81040:11;;;;;;;;;;;81033:18;;80965:94;:::o;77715:104::-;14982:13;:11;:13::i;:::-;77800:11:::1;77790:7;:21;;;;;;:::i;:::-;;77715:104:::0;:::o;81154:342::-;81237:4;81259:54;81268:5;81303;81286:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;81275:36;;;;;;81259:7;:54::i;:::-;81254:235;;;81335:16;:23;81352:5;81335:23;;;;;;;;;;;;;;;;;;;;;;;;;81331:76;;;81386:5;81379:12;;;;81331:76;81428:4;81421:11;;;;81254:235;81472:5;81465:12;;81154:342;;;;;:::o;40994:125::-;41058:7;41085:21;41098:7;41085:12;:21::i;:::-;:26;;;41078:33;;40994:125;;;:::o;77432:159::-;77515:4;77539:44;77558:5;77565:11;;77578:4;77539:18;:44::i;:::-;77532:51;;77432:159;;;;:::o;80211:142::-;80285:7;80312:25;:33;80338:6;80312:33;;;;;;;;;;;;;;;;80305:40;;80211:142;;;:::o;79148:115::-;14982:13;:11;:13::i;:::-;79242::::1;79225:14;:30;;;;79148:115:::0;:::o;78298:95::-;78346:4;78370:15;;;;;;;;;;;78363:22;;78298:95;:::o;79040:100::-;14982:13;:11;:13::i;:::-;79122:10:::1;79110:9;:22;;;;79040:100:::0;:::o;38442:206::-;38506:7;38547:1;38530:19;;:5;:19;;;38526:60;;38558:28;;;;;;;;;;;;;;38526:60;38612:12;:19;38625:5;38612:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38604:36;;38597:43;;38442:206;;;:::o;80567:91::-;80610:13;80643:7;80636:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80567:91;:::o;15744:103::-;14982:13;:11;:13::i;:::-;15809:30:::1;15836:1;15809:18;:30::i;:::-;15744:103::o:0;82990:1460::-;83159:1;83148:7;:5;:7::i;:::-;:12;83140:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;83213:6;;;;;;;;;;;83212:7;83204:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;83253:14;83270:13;:11;:13::i;:::-;83253:30;;83316:1;83302:11;:15;83294:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;83408:13;;83386:18;83396:7;83386:9;:18::i;:::-;83372:11;:32;;;;:::i;:::-;:49;;83364:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;83516:9;;83501:11;83492:6;:20;;;;:::i;:::-;:33;;83484:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;83606:18;;83591:11;83582:6;:20;;;;:::i;:::-;:42;;83574:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;83692:15;;;;;;;;;;;83688:130;;;83732:52;83740:5;83774:7;83757:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;83747:36;;;;;;83732:7;:52::i;:::-;83724:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;83688:130;83835:11;;;;;;;;;;;83830:64;;83864:18;83870:11;83864:5;:18::i;:::-;83830:64;83906:33;83954:13;:11;:13::i;:::-;83942:9;;:25;;;;:::i;:::-;83906:61;;83985:9;83997:1;83985:13;;83980:313;84005:11;84000:1;:16;83980:313;;84038:20;:29;84059:7;84038:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;84084:21;84094:7;84103:1;84084:9;:21::i;:::-;84120:18;84150:1;84141:6;:10;;;;:::i;:::-;84120:31;;84166:20;84175:10;84166:8;:20::i;:::-;;84201:27;;;;:::i;:::-;;;84280:1;84243:25;:34;84269:7;84243:34;;;;;;;;;;;;;;;:38;;;;84023:270;84018:3;;;;;:::i;:::-;;;;83980:313;;;;84309:15;;;;;;;;;;;84305:80;;;84369:4;84341:16;:25;84358:7;84341:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;84305:80;84417:25;84395:19;:47;;;;83129:1321;;82990:1460;;;:::o;76672:598::-;76718:7;76738:17;76758:7;:5;:7::i;:::-;76738:27;;76795:1;76782:9;:14;76778:120;;76820:66;76813:73;;;;;;;76778:120;76927:1;76914:9;:14;76910:58;;76952:4;;76945:11;;;;;76910:58;76997:1;76984:9;:14;76980:65;;77022:11;;77015:18;;;;;76980:65;77074:1;77061:9;:14;77057:120;;77099:66;77092:73;;;;;;;77057:120;77196:66;77189:73;;;;;76672:598;;:::o;79591:115::-;14982:13;:11;:13::i;:::-;79693:5:::1;79670:11;:20;79682:7;79670:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;79591:115:::0;;:::o;15096:87::-;15142:7;15169:6;;;;;;;;;;;15162:13;;15096:87;:::o;78058:123::-;14982:13;:11;:13::i;:::-;78155:18:::1;78141:11;:32;;;;78058:123:::0;:::o;86007:117::-;14982:13;:11;:13::i;:::-;86104:12:::1;86089;:27;;;;;;:::i;:::-;;86007:117:::0;:::o;78612:114::-;14982:13;:11;:13::i;:::-;78712:6:::1;78687:22;;:31;;;;;;;;;;;;;;;;;;78612:114:::0;:::o;79443:140::-;14982:13;:11;:13::i;:::-;79554:21:::1;79535:16;:40;;;;79443:140:::0;:::o;41346:95::-;41393:13;41426:7;41419:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41346:95;:::o;71841:26::-;;;;:::o;80846:111::-;80906:4;80930:11;:19;80942:6;80930:19;;;;;;;;;;;;;;;;;;;;;;;;;80923:26;;80846:111;;;:::o;81868:1114::-;82037:1;82026:7;:5;:7::i;:::-;:12;82018:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;82091:6;;;;;;;;;;;82090:7;82082:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;82131:14;82148:13;:11;:13::i;:::-;82131:30;;82194:1;82180:11;:15;82172:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;82286:13;;82264:18;82274:7;82264:9;:18::i;:::-;82250:11;:32;;;;:::i;:::-;:49;;82242:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;82394:9;;82379:11;82370:6;:20;;;;:::i;:::-;:33;;82362:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;82459:11;;;;;;;;;;;82454:64;;82488:18;82494:11;82488:5;:18::i;:::-;82454:64;82530:33;82578:13;:11;:13::i;:::-;82566:9;;:25;;;;:::i;:::-;82530:61;;82609:9;82621:1;82609:13;;82604:313;82629:11;82624:1;:16;82604:313;;82662:20;:29;82683:7;82662:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;82708:21;82718:7;82727:1;82708:9;:21::i;:::-;82744:18;82774:1;82765:6;:10;;;;:::i;:::-;82744:31;;82790:20;82799:10;82790:8;:20::i;:::-;;82825:27;;;;:::i;:::-;;;82904:1;82867:25;:34;82893:7;82867:34;;;;;;;;;;;;;;;:38;;;;82647:270;82642:3;;;;;:::i;:::-;;;;82604:313;;;;82949:25;82927:19;:47;;;;82007:975;;81868:1114;;;:::o;87331:176::-;87435:8;4536:30;4557:8;4536:20;:30::i;:::-;87456:43:::1;87480:8;87490;87456:23;:43::i;:::-;87331:176:::0;;;:::o;79271:164::-;14982:13;:11;:13::i;:::-;79401:26:::1;79373:25;:54;;;;79271:164:::0;:::o;81067:79::-;81108:4;81132:6;;;;;;;;;;;81125:13;;81067:79;:::o;75334:853::-;75372:7;75392:17;75412:1;75392:21;;75447:20;;75428:15;:39;;:77;;;;;75490:15;;75471;:34;;75428:77;75424:257;;;75534:1;75522:13;;75576;:11;:13::i;:::-;75554:18;;:35;75550:89;;75622:1;75610:13;;75550:89;75660:9;75653:16;;;;;75424:257;75716:15;;75697;:34;;:71;;;;;75754:14;;75735:15;:33;;75697:71;75693:229;;;75797:1;75785:13;;75839:22;;75817:18;;:44;75813:98;;75894:1;75882:13;;75813:98;75693:229;75957:14;;75938:15;:33;;:69;;;;;75994:13;;75975:15;:32;;75938:69;75934:209;;;76036:1;76024:13;;76073:9;;76056:13;:11;:13::i;:::-;:26;76052:80;;76115:1;76103:13;;76052:80;75934:209;76170:9;76163:16;;;75334:853;;:::o;79812:189::-;79866:7;79911:1;79889:19;;:23;79886:81;;;79936:19;;79929:26;;;;79886:81;79984:9;;79977:16;;79812:189;;:::o;88033:217::-;88179:4;4364:10;4356:18;;:4;:18;;;4352:83;;4391:32;4412:10;4391:20;:32::i;:::-;4352:83;88201:41:::1;88218:4;88224:2;88228:7;88237:4;88201:16;:41::i;:::-;88033:217:::0;;;;;:::o;77279:145::-;77355:4;77379:37;77398:5;77405:4;;77411;77379:18;:37::i;:::-;77372:44;;77279:145;;;;:::o;72325:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;86132:457::-;86232:13;86281:16;86289:7;86281;:16::i;:::-;86263:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;86381:28;86412:10;:8;:10::i;:::-;86381:41;;86471:1;86446:14;86440:28;:32;:141;;;;;;;;;;;;;;;;;86512:14;86528:18;:7;:16;:18::i;:::-;86548:13;86495:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;86440:141;86433:148;;;86132:457;;;:::o;80103:100::-;80152:7;80179:16;:14;:16::i;:::-;80172:23;;80103:100;:::o;76195:469::-;76242:7;76262:17;76282:7;:5;:7::i;:::-;76262:27;;76319:1;76306:9;:14;76302:68;;76344:14;;76337:21;;;;;76302:68;76399:1;76386:9;:14;76382:79;;76424:25;;76417:32;;;;;76382:79;76490:1;76477:9;:14;76473:70;;76515:16;;76508:23;;;;;76473:70;76572:1;76559:9;:14;76555:68;;76597:14;;76590:21;;;;;76555:68;76642:14;;76635:21;;;76195:469;;:::o;80361:97::-;80410:7;80437:13;;80430:20;;80361:97;:::o;52731:666::-;52893:4;52930:2;52914:36;;;52951:12;:10;:12::i;:::-;52965:4;52971:7;52980:5;52914:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52910:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53165:1;53148:6;:13;:18;53144:235;;53194:40;;;;;;;;;;;;;;53144:235;53337:6;53331:13;53322:6;53318:2;53314:15;53307:38;52910:480;53043:45;;;53033:55;;;:6;:55;;;;53026:62;;;52731:666;;;;;;:::o;71911:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;86757:566::-;86819:26;86848:16;:14;:16::i;:::-;86819:45;;86920:11;86899:18;:32;;;;:::i;:::-;86885:9;:47;;86877:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;87007:16;87026:9;87007:28;;87048:25;87076:10;;87048:38;;87097:15;87147:3;87127:17;87115:9;:29;;;;:::i;:::-;:35;;;;:::i;:::-;87097:53;;87179:7;;;;;;;;;;;87171:25;;:34;87197:7;87171:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87252:7;87240:9;:19;;;;:::i;:::-;87226:33;;87278:14;;;;;;;;;;;87270:32;;:45;87303:11;87270:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86808:515;;;;86757:566;:::o;85900:99::-;85946:13;85979:12;85972:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85900:99;:::o;43468:164::-;43565:4;43589:18;:25;43608:5;43589:25;;;;;;;;;;;;;;;:35;43615:8;43589:35;;;;;;;;;;;;;;;;;;;;;;;;;43582:42;;43468:164;;;;:::o;71815:19::-;;;;:::o;79714:90::-;14982:13;:11;:13::i;:::-;79791:5:::1;79777:11;;:19;;;;;;;;;;;;;;;;;;79714:90:::0;:::o;77955:95::-;14982:13;:11;:13::i;:::-;78031:11:::1;78024:4;:18;;;;77955:95:::0;:::o;16002:201::-;14982:13;:11;:13::i;:::-;16111:1:::1;16091:22;;:8;:22;;::::0;16083:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16167:28;16186:8;16167:18;:28::i;:::-;16002:201:::0;:::o;71874:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9847:723::-;9903:13;10133:1;10124:5;:10;10120:53;;10151:10;;;;;;;;;;;;;;;;;;;;;10120:53;10183:12;10198:5;10183:20;;10214:14;10239:78;10254:1;10246:4;:9;10239:78;;10272:8;;;;;:::i;:::-;;;;10303:2;10295:10;;;;;:::i;:::-;;;10239:78;;;10327:19;10359:6;10349:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10327:39;;10377:154;10393:1;10384:5;:10;10377:154;;10421:1;10411:11;;;;;:::i;:::-;;;10488:2;10480:5;:10;;;;:::i;:::-;10467:2;:24;;;;:::i;:::-;10454:39;;10437:6;10444;10437:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;10517:2;10508:11;;;;;:::i;:::-;;;10377:154;;;10555:6;10541:21;;;;;9847:723;;;;:::o;26896:157::-;26981:4;27020:25;27005:40;;;:11;:40;;;;26998:47;;26896:157;;;:::o;15261:132::-;15336:12;:10;:12::i;:::-;15325:23;;:7;:5;:7::i;:::-;:23;;;15317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15261:132::o;43887:174::-;43944:4;43987:7;43968:15;:13;:15::i;:::-;:26;;:53;;;;;44008:13;;43998:7;:23;43968:53;:85;;;;;44026:11;:20;44038:7;44026:20;;;;;;;;;;;:27;;;;;;;;;;;;44025:28;43968:85;43961:92;;43887:174;;;:::o;4594:419::-;4833:1;3115:42;4785:45;;;:49;4781:225;;;3115:42;4856;;;4907:4;4914:8;4856:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4851:144;;4970:8;4951:28;;;;;;;;;;;:::i;:::-;;;;;;;;4851:144;4781:225;4594:419;:::o;44069:104::-;44138:27;44148:2;44152:8;44138:27;;;;;;;;;;;;:9;:27::i;:::-;44069:104;;:::o;37096:92::-;37152:7;37179:1;37172:8;;37096:92;:::o;39823:1109::-;39885:21;;:::i;:::-;39919:12;39934:7;39919:22;;40002:4;39983:15;:13;:15::i;:::-;:23;;:47;;;;;40017:13;;40010:4;:20;39983:47;39979:886;;;40051:31;40085:11;:17;40097:4;40085:17;;;;;;;;;;;40051:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40126:9;:16;;;40121:729;;40197:1;40171:28;;:9;:14;;;:28;;;40167:101;;40235:9;40228:16;;;;;;40167:101;40570:261;40577:4;40570:261;;;40610:6;;;;;;;;40655:11;:17;40667:4;40655:17;;;;;;;;;;;40643:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40729:1;40703:28;;:9;:14;;;:28;;;40699:109;;40771:9;40764:16;;;;;;40699:109;40570:261;;;40121:729;40032:833;39979:886;40893:31;;;;;;;;;;;;;;39823:1109;;;;:::o;13647:98::-;13700:7;13727:10;13720:17;;13647:98;:::o;54045:159::-;;;;;:::o;52043:196::-;52185:2;52158:15;:24;52174:7;52158:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52223:7;52219:2;52203:28;;52212:5;52203:28;;;;;;;;;;;;52043:196;;;:::o;54863:158::-;;;;;:::o;77599:108::-;77659:13;77692:7;77685:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77599:108;:::o;6486:190::-;6611:4;6664;6635:25;6648:5;6655:4;6635:12;:25::i;:::-;:33;6628:40;;6486:190;;;;;:::o;16363:191::-;16437:16;16456:6;;;;;;;;;;;16437:25;;16482:8;16473:6;;:17;;;;;;;;;;;;;;;;;;16537:8;16506:40;;16527:8;16506:40;;;;;;;;;;;;16426:128;16363:191;:::o;43110:287::-;43221:12;:10;:12::i;:::-;43209:24;;:8;:24;;;43205:54;;43242:17;;;;;;;;;;;;;;43205:54;43317:8;43272:18;:32;43291:12;:10;:12::i;:::-;43272:32;;;;;;;;;;;;;;;:42;43305:8;43272:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;43370:8;43341:48;;43356:12;:10;:12::i;:::-;43341:48;;;43380:8;43341:48;;;;;;:::i;:::-;;;;;;;;43110:287;;:::o;44536:163::-;44659:32;44665:2;44669:8;44679:5;44686:4;44659:5;:32::i;:::-;44536:163;;;:::o;7038:675::-;7121:7;7141:20;7164:4;7141:27;;7184:9;7179:497;7203:5;:12;7199:1;:16;7179:497;;;7237:20;7260:5;7266:1;7260:8;;;;;;;;:::i;:::-;;;;;;;;7237:31;;7303:12;7287;:28;7283:382;;7430:42;7445:12;7459;7430:14;:42::i;:::-;7415:57;;7283:382;;;7607:42;7622:12;7636;7607:14;:42::i;:::-;7592:57;;7283:382;7222:454;7217:3;;;;;:::i;:::-;;;;7179:497;;;;7693:12;7686:19;;;7038:675;;;;:::o;44958:1775::-;45097:20;45120:13;;45097:36;;45162:1;45148:16;;:2;:16;;;45144:48;;45173:19;;;;;;;;;;;;;;45144:48;45219:1;45207:8;:13;45203:44;;45229:18;;;;;;;;;;;;;;45203:44;45260:61;45290:1;45294:2;45298:12;45312:8;45260:21;:61::i;:::-;45633:8;45598:12;:16;45611:2;45598:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45697:8;45657:12;:16;45670:2;45657:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45756:2;45723:11;:25;45735:12;45723:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45823:15;45773:11;:25;45785:12;45773:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;45856:20;45879:12;45856:35;;45906:11;45935:8;45920:12;:23;45906:37;;45964:4;:23;;;;;45972:15;:2;:13;;;:15::i;:::-;45964:23;45960:641;;;46008:314;46064:12;46060:2;46039:38;;46056:1;46039:38;;;;;;;;;;;;46105:69;46144:1;46148:2;46152:14;;;;;;46168:5;46105:30;:69::i;:::-;46100:174;;46210:40;;;;;;;;;;;;;;46100:174;46317:3;46301:12;:19;46008:314;;46403:12;46386:13;;:29;46382:43;;46417:8;;;46382:43;45960:641;;;46466:120;46522:14;;;;;;46518:2;46497:40;;46514:1;46497:40;;;;;;;;;;;;46581:3;46565:12;:19;46466:120;;45960:641;46631:12;46615:13;:28;;;;45573:1082;;46665:60;46694:1;46698:2;46702:12;46716:8;46665:20;:60::i;:::-;45086:1647;44958:1775;;;;:::o;7721:224::-;7789:13;7852:1;7846:4;7839:15;7881:1;7875:4;7868:15;7922:4;7916;7906:21;7897:30;;7721:224;;;;:::o;17794:326::-;17854:4;18111:1;18089:7;:19;;;:23;18082:30;;17794:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:99::-;1077:6;1111:5;1105:12;1095:22;;1025:99;;;:::o;1130:169::-;1214:11;1248:6;1243:3;1236:19;1288:4;1283:3;1279:14;1264:29;;1130:169;;;;:::o;1305:246::-;1386:1;1396:113;1410:6;1407:1;1404:13;1396:113;;;1495:1;1490:3;1486:11;1480:18;1476:1;1471:3;1467:11;1460:39;1432:2;1429:1;1425:10;1420:15;;1396:113;;;1543:1;1534:6;1529:3;1525:16;1518:27;1367:184;1305:246;;;:::o;1557:102::-;1598:6;1649:2;1645:7;1640:2;1633:5;1629:14;1625:28;1615:38;;1557:102;;;:::o;1665:377::-;1753:3;1781:39;1814:5;1781:39;:::i;:::-;1836:71;1900:6;1895:3;1836:71;:::i;:::-;1829:78;;1916:65;1974:6;1969:3;1962:4;1955:5;1951:16;1916:65;:::i;:::-;2006:29;2028:6;2006:29;:::i;:::-;2001:3;1997:39;1990:46;;1757:285;1665:377;;;;:::o;2048:313::-;2161:4;2199:2;2188:9;2184:18;2176:26;;2248:9;2242:4;2238:20;2234:1;2223:9;2219:17;2212:47;2276:78;2349:4;2340:6;2276:78;:::i;:::-;2268:86;;2048:313;;;;:::o;2367:149::-;2403:7;2443:66;2436:5;2432:78;2421:89;;2367:149;;;:::o;2522:120::-;2594:23;2611:5;2594:23;:::i;:::-;2587:5;2584:34;2574:62;;2632:1;2629;2622:12;2574:62;2522:120;:::o;2648:137::-;2693:5;2731:6;2718:20;2709:29;;2747:32;2773:5;2747:32;:::i;:::-;2648:137;;;;:::o;2791:327::-;2849:6;2898:2;2886:9;2877:7;2873:23;2869:32;2866:119;;;2904:79;;:::i;:::-;2866:119;3024:1;3049:52;3093:7;3084:6;3073:9;3069:22;3049:52;:::i;:::-;3039:62;;2995:116;2791:327;;;;:::o;3124:90::-;3158:7;3201:5;3194:13;3187:21;3176:32;;3124:90;;;:::o;3220:109::-;3301:21;3316:5;3301:21;:::i;:::-;3296:3;3289:34;3220:109;;:::o;3335:210::-;3422:4;3460:2;3449:9;3445:18;3437:26;;3473:65;3535:1;3524:9;3520:17;3511:6;3473:65;:::i;:::-;3335:210;;;;:::o;3551:116::-;3621:21;3636:5;3621:21;:::i;:::-;3614:5;3611:32;3601:60;;3657:1;3654;3647:12;3601:60;3551:116;:::o;3673:133::-;3716:5;3754:6;3741:20;3732:29;;3770:30;3794:5;3770:30;:::i;:::-;3673:133;;;;:::o;3812:323::-;3868:6;3917:2;3905:9;3896:7;3892:23;3888:32;3885:119;;;3923:79;;:::i;:::-;3885:119;4043:1;4068:50;4110:7;4101:6;4090:9;4086:22;4068:50;:::i;:::-;4058:60;;4014:114;3812:323;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:122::-;4448:24;4466:5;4448:24;:::i;:::-;4441:5;4438:35;4428:63;;4487:1;4484;4477:12;4428:63;4375:122;:::o;4503:139::-;4549:5;4587:6;4574:20;4565:29;;4603:33;4630:5;4603:33;:::i;:::-;4503:139;;;;:::o;4648:117::-;4757:1;4754;4747:12;4771:180;4819:77;4816:1;4809:88;4916:4;4913:1;4906:15;4940:4;4937:1;4930:15;4957:281;5040:27;5062:4;5040:27;:::i;:::-;5032:6;5028:40;5170:6;5158:10;5155:22;5134:18;5122:10;5119:34;5116:62;5113:88;;;5181:18;;:::i;:::-;5113:88;5221:10;5217:2;5210:22;5000:238;4957:281;;:::o;5244:129::-;5278:6;5305:20;;:::i;:::-;5295:30;;5334:33;5362:4;5354:6;5334:33;:::i;:::-;5244:129;;;:::o;5379:311::-;5456:4;5546:18;5538:6;5535:30;5532:56;;;5568:18;;:::i;:::-;5532:56;5618:4;5610:6;5606:17;5598:25;;5678:4;5672;5668:15;5660:23;;5379:311;;;:::o;5696:117::-;5805:1;5802;5795:12;5819:77;5856:7;5885:5;5874:16;;5819:77;;;:::o;5902:122::-;5975:24;5993:5;5975:24;:::i;:::-;5968:5;5965:35;5955:63;;6014:1;6011;6004:12;5955:63;5902:122;:::o;6030:139::-;6076:5;6114:6;6101:20;6092:29;;6130:33;6157:5;6130:33;:::i;:::-;6030:139;;;;:::o;6192:710::-;6288:5;6313:81;6329:64;6386:6;6329:64;:::i;:::-;6313:81;:::i;:::-;6304:90;;6414:5;6443:6;6436:5;6429:21;6477:4;6470:5;6466:16;6459:23;;6530:4;6522:6;6518:17;6510:6;6506:30;6559:3;6551:6;6548:15;6545:122;;;6578:79;;:::i;:::-;6545:122;6693:6;6676:220;6710:6;6705:3;6702:15;6676:220;;;6785:3;6814:37;6847:3;6835:10;6814:37;:::i;:::-;6809:3;6802:50;6881:4;6876:3;6872:14;6865:21;;6752:144;6736:4;6731:3;6727:14;6720:21;;6676:220;;;6680:21;6294:608;;6192:710;;;;;:::o;6925:370::-;6996:5;7045:3;7038:4;7030:6;7026:17;7022:27;7012:122;;7053:79;;:::i;:::-;7012:122;7170:6;7157:20;7195:94;7285:3;7277:6;7270:4;7262:6;7258:17;7195:94;:::i;:::-;7186:103;;7002:293;6925:370;;;;:::o;7301:684::-;7394:6;7402;7451:2;7439:9;7430:7;7426:23;7422:32;7419:119;;;7457:79;;:::i;:::-;7419:119;7577:1;7602:53;7647:7;7638:6;7627:9;7623:22;7602:53;:::i;:::-;7592:63;;7548:117;7732:2;7721:9;7717:18;7704:32;7763:18;7755:6;7752:30;7749:117;;;7785:79;;:::i;:::-;7749:117;7890:78;7960:7;7951:6;7940:9;7936:22;7890:78;:::i;:::-;7880:88;;7675:303;7301:684;;;;;:::o;7991:118::-;8078:24;8096:5;8078:24;:::i;:::-;8073:3;8066:37;7991:118;;:::o;8115:222::-;8208:4;8246:2;8235:9;8231:18;8223:26;;8259:71;8327:1;8316:9;8312:17;8303:6;8259:71;:::i;:::-;8115:222;;;;:::o;8343:474::-;8411:6;8419;8468:2;8456:9;8447:7;8443:23;8439:32;8436:119;;;8474:79;;:::i;:::-;8436:119;8594:1;8619:53;8664:7;8655:6;8644:9;8640:22;8619:53;:::i;:::-;8609:63;;8565:117;8721:2;8747:53;8792:7;8783:6;8772:9;8768:22;8747:53;:::i;:::-;8737:63;;8692:118;8343:474;;;;;:::o;8823:118::-;8910:24;8928:5;8910:24;:::i;:::-;8905:3;8898:37;8823:118;;:::o;8947:222::-;9040:4;9078:2;9067:9;9063:18;9055:26;;9091:71;9159:1;9148:9;9144:17;9135:6;9091:71;:::i;:::-;8947:222;;;;:::o;9175:104::-;9220:7;9249:24;9267:5;9249:24;:::i;:::-;9238:35;;9175:104;;;:::o;9285:138::-;9366:32;9392:5;9366:32;:::i;:::-;9359:5;9356:43;9346:71;;9413:1;9410;9403:12;9346:71;9285:138;:::o;9429:155::-;9483:5;9521:6;9508:20;9499:29;;9537:41;9572:5;9537:41;:::i;:::-;9429:155;;;;:::o;9590:845::-;9700:6;9708;9716;9765:2;9753:9;9744:7;9740:23;9736:32;9733:119;;;9771:79;;:::i;:::-;9733:119;9891:1;9916:53;9961:7;9952:6;9941:9;9937:22;9916:53;:::i;:::-;9906:63;;9862:117;10018:2;10044:61;10097:7;10088:6;10077:9;10073:22;10044:61;:::i;:::-;10034:71;;9989:126;10182:2;10171:9;10167:18;10154:32;10213:18;10205:6;10202:30;10199:117;;;10235:79;;:::i;:::-;10199:117;10340:78;10410:7;10401:6;10390:9;10386:22;10340:78;:::i;:::-;10330:88;;10125:303;9590:845;;;;;:::o;10441:619::-;10518:6;10526;10534;10583:2;10571:9;10562:7;10558:23;10554:32;10551:119;;;10589:79;;:::i;:::-;10551:119;10709:1;10734:53;10779:7;10770:6;10759:9;10755:22;10734:53;:::i;:::-;10724:63;;10680:117;10836:2;10862:53;10907:7;10898:6;10887:9;10883:22;10862:53;:::i;:::-;10852:63;;10807:118;10964:2;10990:53;11035:7;11026:6;11015:9;11011:22;10990:53;:::i;:::-;10980:63;;10935:118;10441:619;;;;;:::o;11066:765::-;11152:6;11160;11168;11176;11225:3;11213:9;11204:7;11200:23;11196:33;11193:120;;;11232:79;;:::i;:::-;11193:120;11352:1;11377:53;11422:7;11413:6;11402:9;11398:22;11377:53;:::i;:::-;11367:63;;11323:117;11479:2;11505:53;11550:7;11541:6;11530:9;11526:22;11505:53;:::i;:::-;11495:63;;11450:118;11607:2;11633:53;11678:7;11669:6;11658:9;11654:22;11633:53;:::i;:::-;11623:63;;11578:118;11735:2;11761:53;11806:7;11797:6;11786:9;11782:22;11761:53;:::i;:::-;11751:63;;11706:118;11066:765;;;;;;;:::o;11837:117::-;11946:1;11943;11936:12;11960:308;12022:4;12112:18;12104:6;12101:30;12098:56;;;12134:18;;:::i;:::-;12098:56;12172:29;12194:6;12172:29;:::i;:::-;12164:37;;12256:4;12250;12246:15;12238:23;;11960:308;;;:::o;12274:146::-;12371:6;12366:3;12361;12348:30;12412:1;12403:6;12398:3;12394:16;12387:27;12274:146;;;:::o;12426:425::-;12504:5;12529:66;12545:49;12587:6;12545:49;:::i;:::-;12529:66;:::i;:::-;12520:75;;12618:6;12611:5;12604:21;12656:4;12649:5;12645:16;12694:3;12685:6;12680:3;12676:16;12673:25;12670:112;;;12701:79;;:::i;:::-;12670:112;12791:54;12838:6;12833:3;12828;12791:54;:::i;:::-;12510:341;12426:425;;;;;:::o;12871:340::-;12927:5;12976:3;12969:4;12961:6;12957:17;12953:27;12943:122;;12984:79;;:::i;:::-;12943:122;13101:6;13088:20;13126:79;13201:3;13193:6;13186:4;13178:6;13174:17;13126:79;:::i;:::-;13117:88;;12933:278;12871:340;;;;:::o;13217:654::-;13295:6;13303;13352:2;13340:9;13331:7;13327:23;13323:32;13320:119;;;13358:79;;:::i;:::-;13320:119;13478:1;13503:53;13548:7;13539:6;13528:9;13524:22;13503:53;:::i;:::-;13493:63;;13449:117;13633:2;13622:9;13618:18;13605:32;13664:18;13656:6;13653:30;13650:117;;;13686:79;;:::i;:::-;13650:117;13791:63;13846:7;13837:6;13826:9;13822:22;13791:63;:::i;:::-;13781:73;;13576:288;13217:654;;;;;:::o;13877:60::-;13905:3;13926:5;13919:12;;13877:60;;;:::o;13943:142::-;13993:9;14026:53;14044:34;14053:24;14071:5;14053:24;:::i;:::-;14044:34;:::i;:::-;14026:53;:::i;:::-;14013:66;;13943:142;;;:::o;14091:126::-;14141:9;14174:37;14205:5;14174:37;:::i;:::-;14161:50;;14091:126;;;:::o;14223:157::-;14304:9;14337:37;14368:5;14337:37;:::i;:::-;14324:50;;14223:157;;;:::o;14386:193::-;14504:68;14566:5;14504:68;:::i;:::-;14499:3;14492:81;14386:193;;:::o;14585:284::-;14709:4;14747:2;14736:9;14732:18;14724:26;;14760:102;14859:1;14848:9;14844:17;14835:6;14760:102;:::i;:::-;14585:284;;;;:::o;14875:329::-;14934:6;14983:2;14971:9;14962:7;14958:23;14954:32;14951:119;;;14989:79;;:::i;:::-;14951:119;15109:1;15134:53;15179:7;15170:6;15159:9;15155:22;15134:53;:::i;:::-;15124:63;;15080:117;14875:329;;;;:::o;15210:509::-;15279:6;15328:2;15316:9;15307:7;15303:23;15299:32;15296:119;;;15334:79;;:::i;:::-;15296:119;15482:1;15471:9;15467:17;15454:31;15512:18;15504:6;15501:30;15498:117;;;15534:79;;:::i;:::-;15498:117;15639:63;15694:7;15685:6;15674:9;15670:22;15639:63;:::i;:::-;15629:73;;15425:287;15210:509;;;;:::o;15725:684::-;15818:6;15826;15875:2;15863:9;15854:7;15850:23;15846:32;15843:119;;;15881:79;;:::i;:::-;15843:119;16029:1;16018:9;16014:17;16001:31;16059:18;16051:6;16048:30;16045:117;;;16081:79;;:::i;:::-;16045:117;16186:78;16256:7;16247:6;16236:9;16232:22;16186:78;:::i;:::-;16176:88;;15972:302;16313:2;16339:53;16384:7;16375:6;16364:9;16360:22;16339:53;:::i;:::-;16329:63;;16284:118;15725:684;;;;;:::o;16415:118::-;16502:24;16520:5;16502:24;:::i;:::-;16497:3;16490:37;16415:118;;:::o;16539:222::-;16632:4;16670:2;16659:9;16655:18;16647:26;;16683:71;16751:1;16740:9;16736:17;16727:6;16683:71;:::i;:::-;16539:222;;;;:::o;16767:468::-;16832:6;16840;16889:2;16877:9;16868:7;16864:23;16860:32;16857:119;;;16895:79;;:::i;:::-;16857:119;17015:1;17040:53;17085:7;17076:6;17065:9;17061:22;17040:53;:::i;:::-;17030:63;;16986:117;17142:2;17168:50;17210:7;17201:6;17190:9;17186:22;17168:50;:::i;:::-;17158:60;;17113:115;16767:468;;;;;:::o;17241:329::-;17300:6;17349:2;17337:9;17328:7;17324:23;17320:32;17317:119;;;17355:79;;:::i;:::-;17317:119;17475:1;17500:53;17545:7;17536:6;17525:9;17521:22;17500:53;:::i;:::-;17490:63;;17446:117;17241:329;;;;:::o;17576:307::-;17637:4;17727:18;17719:6;17716:30;17713:56;;;17749:18;;:::i;:::-;17713:56;17787:29;17809:6;17787:29;:::i;:::-;17779:37;;17871:4;17865;17861:15;17853:23;;17576:307;;;:::o;17889:423::-;17966:5;17991:65;18007:48;18048:6;18007:48;:::i;:::-;17991:65;:::i;:::-;17982:74;;18079:6;18072:5;18065:21;18117:4;18110:5;18106:16;18155:3;18146:6;18141:3;18137:16;18134:25;18131:112;;;18162:79;;:::i;:::-;18131:112;18252:54;18299:6;18294:3;18289;18252:54;:::i;:::-;17972:340;17889:423;;;;;:::o;18331:338::-;18386:5;18435:3;18428:4;18420:6;18416:17;18412:27;18402:122;;18443:79;;:::i;:::-;18402:122;18560:6;18547:20;18585:78;18659:3;18651:6;18644:4;18636:6;18632:17;18585:78;:::i;:::-;18576:87;;18392:277;18331:338;;;;:::o;18675:943::-;18770:6;18778;18786;18794;18843:3;18831:9;18822:7;18818:23;18814:33;18811:120;;;18850:79;;:::i;:::-;18811:120;18970:1;18995:53;19040:7;19031:6;19020:9;19016:22;18995:53;:::i;:::-;18985:63;;18941:117;19097:2;19123:53;19168:7;19159:6;19148:9;19144:22;19123:53;:::i;:::-;19113:63;;19068:118;19225:2;19251:53;19296:7;19287:6;19276:9;19272:22;19251:53;:::i;:::-;19241:63;;19196:118;19381:2;19370:9;19366:18;19353:32;19412:18;19404:6;19401:30;19398:117;;;19434:79;;:::i;:::-;19398:117;19539:62;19593:7;19584:6;19573:9;19569:22;19539:62;:::i;:::-;19529:72;;19324:287;18675:943;;;;;;;:::o;19624:474::-;19692:6;19700;19749:2;19737:9;19728:7;19724:23;19720:32;19717:119;;;19755:79;;:::i;:::-;19717:119;19875:1;19900:53;19945:7;19936:6;19925:9;19921:22;19900:53;:::i;:::-;19890:63;;19846:117;20002:2;20028:53;20073:7;20064:6;20053:9;20049:22;20028:53;:::i;:::-;20018:63;;19973:118;19624:474;;;;;:::o;20104:180::-;20152:77;20149:1;20142:88;20249:4;20246:1;20239:15;20273:4;20270:1;20263:15;20290:320;20334:6;20371:1;20365:4;20361:12;20351:22;;20418:1;20412:4;20408:12;20439:18;20429:81;;20495:4;20487:6;20483:17;20473:27;;20429:81;20557:2;20549:6;20546:14;20526:18;20523:38;20520:84;;20576:18;;:::i;:::-;20520:84;20341:269;20290:320;;;:::o;20616:148::-;20718:11;20755:3;20740:18;;20616:148;;;;:::o;20770:141::-;20819:4;20842:3;20834:11;;20865:3;20862:1;20855:14;20899:4;20896:1;20886:18;20878:26;;20770:141;;;:::o;20941:874::-;21044:3;21081:5;21075:12;21110:36;21136:9;21110:36;:::i;:::-;21162:89;21244:6;21239:3;21162:89;:::i;:::-;21155:96;;21282:1;21271:9;21267:17;21298:1;21293:166;;;;21473:1;21468:341;;;;21260:549;;21293:166;21377:4;21373:9;21362;21358:25;21353:3;21346:38;21439:6;21432:14;21425:22;21417:6;21413:35;21408:3;21404:45;21397:52;;21293:166;;21468:341;21535:38;21567:5;21535:38;:::i;:::-;21595:1;21609:154;21623:6;21620:1;21617:13;21609:154;;;21697:7;21691:14;21687:1;21682:3;21678:11;21671:35;21747:1;21738:7;21734:15;21723:26;;21645:4;21642:1;21638:12;21633:17;;21609:154;;;21792:6;21787:3;21783:16;21776:23;;21475:334;;21260:549;;21048:767;;20941:874;;;;:::o;21821:390::-;21927:3;21955:39;21988:5;21955:39;:::i;:::-;22010:89;22092:6;22087:3;22010:89;:::i;:::-;22003:96;;22108:65;22166:6;22161:3;22154:4;22147:5;22143:16;22108:65;:::i;:::-;22198:6;22193:3;22189:16;22182:23;;21931:280;21821:390;;;;:::o;22217:583::-;22439:3;22461:92;22549:3;22540:6;22461:92;:::i;:::-;22454:99;;22570:95;22661:3;22652:6;22570:95;:::i;:::-;22563:102;;22682:92;22770:3;22761:6;22682:92;:::i;:::-;22675:99;;22791:3;22784:10;;22217:583;;;;;;:::o;22806:94::-;22839:8;22887:5;22883:2;22879:14;22858:35;;22806:94;;;:::o;22906:::-;22945:7;22974:20;22988:5;22974:20;:::i;:::-;22963:31;;22906:94;;;:::o;23006:100::-;23045:7;23074:26;23094:5;23074:26;:::i;:::-;23063:37;;23006:100;;;:::o;23112:157::-;23217:45;23237:24;23255:5;23237:24;:::i;:::-;23217:45;:::i;:::-;23212:3;23205:58;23112:157;;:::o;23275:256::-;23387:3;23402:75;23473:3;23464:6;23402:75;:::i;:::-;23502:2;23497:3;23493:12;23486:19;;23522:3;23515:10;;23275:256;;;;:::o;23537:179::-;23677:31;23673:1;23665:6;23661:14;23654:55;23537:179;:::o;23722:366::-;23864:3;23885:67;23949:2;23944:3;23885:67;:::i;:::-;23878:74;;23961:93;24050:3;23961:93;:::i;:::-;24079:2;24074:3;24070:12;24063:19;;23722:366;;;:::o;24094:419::-;24260:4;24298:2;24287:9;24283:18;24275:26;;24347:9;24341:4;24337:20;24333:1;24322:9;24318:17;24311:47;24375:131;24501:4;24375:131;:::i;:::-;24367:139;;24094:419;;;:::o;24519:168::-;24659:20;24655:1;24647:6;24643:14;24636:44;24519:168;:::o;24693:366::-;24835:3;24856:67;24920:2;24915:3;24856:67;:::i;:::-;24849:74;;24932:93;25021:3;24932:93;:::i;:::-;25050:2;25045:3;25041:12;25034:19;;24693:366;;;:::o;25065:419::-;25231:4;25269:2;25258:9;25254:18;25246:26;;25318:9;25312:4;25308:20;25304:1;25293:9;25289:17;25282:47;25346:131;25472:4;25346:131;:::i;:::-;25338:139;;25065:419;;;:::o;25490:181::-;25630:33;25626:1;25618:6;25614:14;25607:57;25490:181;:::o;25677:366::-;25819:3;25840:67;25904:2;25899:3;25840:67;:::i;:::-;25833:74;;25916:93;26005:3;25916:93;:::i;:::-;26034:2;26029:3;26025:12;26018:19;;25677:366;;;:::o;26049:419::-;26215:4;26253:2;26242:9;26238:18;26230:26;;26302:9;26296:4;26292:20;26288:1;26277:9;26273:17;26266:47;26330:131;26456:4;26330:131;:::i;:::-;26322:139;;26049:419;;;:::o;26474:180::-;26522:77;26519:1;26512:88;26619:4;26616:1;26609:15;26643:4;26640:1;26633:15;26660:191;26700:3;26719:20;26737:1;26719:20;:::i;:::-;26714:25;;26753:20;26771:1;26753:20;:::i;:::-;26748:25;;26796:1;26793;26789:9;26782:16;;26817:3;26814:1;26811:10;26808:36;;;26824:18;;:::i;:::-;26808:36;26660:191;;;;:::o;26857:234::-;26997:34;26993:1;26985:6;26981:14;26974:58;27066:17;27061:2;27053:6;27049:15;27042:42;26857:234;:::o;27097:366::-;27239:3;27260:67;27324:2;27319:3;27260:67;:::i;:::-;27253:74;;27336:93;27425:3;27336:93;:::i;:::-;27454:2;27449:3;27445:12;27438:19;;27097:366;;;:::o;27469:419::-;27635:4;27673:2;27662:9;27658:18;27650:26;;27722:9;27716:4;27712:20;27708:1;27697:9;27693:17;27686:47;27750:131;27876:4;27750:131;:::i;:::-;27742:139;;27469:419;;;:::o;27894:233::-;28034:34;28030:1;28022:6;28018:14;28011:58;28103:16;28098:2;28090:6;28086:15;28079:41;27894:233;:::o;28133:366::-;28275:3;28296:67;28360:2;28355:3;28296:67;:::i;:::-;28289:74;;28372:93;28461:3;28372:93;:::i;:::-;28490:2;28485:3;28481:12;28474:19;;28133:366;;;:::o;28505:419::-;28671:4;28709:2;28698:9;28694:18;28686:26;;28758:9;28752:4;28748:20;28744:1;28733:9;28729:17;28722:47;28786:131;28912:4;28786:131;:::i;:::-;28778:139;;28505:419;;;:::o;28930:108::-;28977:7;29006:26;29026:5;29006:26;:::i;:::-;28995:37;;28930:108;;;:::o;29044:189::-;29165:61;29193:32;29219:5;29193:32;:::i;:::-;29165:61;:::i;:::-;29160:3;29153:74;29044:189;;:::o;29239:288::-;29367:3;29382:91;29469:3;29460:6;29382:91;:::i;:::-;29498:2;29493:3;29489:12;29482:19;;29518:3;29511:10;;29239:288;;;;:::o;29533:174::-;29673:26;29669:1;29661:6;29657:14;29650:50;29533:174;:::o;29713:366::-;29855:3;29876:67;29940:2;29935:3;29876:67;:::i;:::-;29869:74;;29952:93;30041:3;29952:93;:::i;:::-;30070:2;30065:3;30061:12;30054:19;;29713:366;;;:::o;30085:419::-;30251:4;30289:2;30278:9;30274:18;30266:26;;30338:9;30332:4;30328:20;30324:1;30313:9;30309:17;30302:47;30366:131;30492:4;30366:131;:::i;:::-;30358:139;;30085:419;;;:::o;30510:194::-;30550:4;30570:20;30588:1;30570:20;:::i;:::-;30565:25;;30604:20;30622:1;30604:20;:::i;:::-;30599:25;;30648:1;30645;30641:9;30633:17;;30672:1;30666:4;30663:11;30660:37;;;30677:18;;:::i;:::-;30660:37;30510:194;;;;:::o;30710:233::-;30749:3;30772:24;30790:5;30772:24;:::i;:::-;30763:33;;30818:66;30811:5;30808:77;30805:103;;30888:18;;:::i;:::-;30805:103;30935:1;30928:5;30924:13;30917:20;;30710:233;;;:::o;30949:171::-;30988:3;31011:24;31029:5;31011:24;:::i;:::-;31002:33;;31057:4;31050:5;31047:15;31044:41;;31065:18;;:::i;:::-;31044:41;31112:1;31105:5;31101:13;31094:20;;30949:171;;;:::o;31126:292::-;31266:34;31262:1;31254:6;31250:14;31243:58;31335:34;31330:2;31322:6;31318:15;31311:59;31404:6;31399:2;31391:6;31387:15;31380:31;31126:292;:::o;31424:366::-;31566:3;31587:67;31651:2;31646:3;31587:67;:::i;:::-;31580:74;;31663:93;31752:3;31663:93;:::i;:::-;31781:2;31776:3;31772:12;31765:19;;31424:366;;;:::o;31796:419::-;31962:4;32000:2;31989:9;31985:18;31977:26;;32049:9;32043:4;32039:20;32035:1;32024:9;32020:17;32013:47;32077:131;32203:4;32077:131;:::i;:::-;32069:139;;31796:419;;;:::o;32221:309::-;32361:34;32357:1;32349:6;32345:14;32338:58;32430:34;32425:2;32417:6;32413:15;32406:59;32499:23;32494:2;32486:6;32482:15;32475:48;32221:309;:::o;32536:366::-;32678:3;32699:67;32763:2;32758:3;32699:67;:::i;:::-;32692:74;;32775:93;32864:3;32775:93;:::i;:::-;32893:2;32888:3;32884:12;32877:19;;32536:366;;;:::o;32908:419::-;33074:4;33112:2;33101:9;33097:18;33089:26;;33161:9;33155:4;33151:20;33147:1;33136:9;33132:17;33125:47;33189:131;33315:4;33189:131;:::i;:::-;33181:139;;32908:419;;;:::o;33333:292::-;33473:34;33469:1;33461:6;33457:14;33450:58;33542:34;33537:2;33529:6;33525:15;33518:59;33611:6;33606:2;33598:6;33594:15;33587:31;33333:292;:::o;33631:366::-;33773:3;33794:67;33858:2;33853:3;33794:67;:::i;:::-;33787:74;;33870:93;33959:3;33870:93;:::i;:::-;33988:2;33983:3;33979:12;33972:19;;33631:366;;;:::o;34003:419::-;34169:4;34207:2;34196:9;34192:18;34184:26;;34256:9;34250:4;34246:20;34242:1;34231:9;34227:17;34220:47;34284:131;34410:4;34284:131;:::i;:::-;34276:139;;34003:419;;;:::o;34428:147::-;34529:11;34566:3;34551:18;;34428:147;;;;:::o;34581:114::-;;:::o;34701:398::-;34860:3;34881:83;34962:1;34957:3;34881:83;:::i;:::-;34874:90;;34973:93;35062:3;34973:93;:::i;:::-;35091:1;35086:3;35082:11;35075:18;;34701:398;;;:::o;35105:379::-;35289:3;35311:147;35454:3;35311:147;:::i;:::-;35304:154;;35475:3;35468:10;;35105:379;;;:::o;35490:595::-;35718:3;35740:95;35831:3;35822:6;35740:95;:::i;:::-;35733:102;;35852:95;35943:3;35934:6;35852:95;:::i;:::-;35845:102;;35964:95;36055:3;36046:6;35964:95;:::i;:::-;35957:102;;36076:3;36069:10;;35490:595;;;;;;:::o;36091:93::-;36128:6;36175:2;36170;36163:5;36159:14;36155:23;36145:33;;36091:93;;;:::o;36190:107::-;36234:8;36284:5;36278:4;36274:16;36253:37;;36190:107;;;;:::o;36303:393::-;36372:6;36422:1;36410:10;36406:18;36445:97;36475:66;36464:9;36445:97;:::i;:::-;36563:39;36593:8;36582:9;36563:39;:::i;:::-;36551:51;;36635:4;36631:9;36624:5;36620:21;36611:30;;36684:4;36674:8;36670:19;36663:5;36660:30;36650:40;;36379:317;;36303:393;;;;;:::o;36702:142::-;36752:9;36785:53;36803:34;36812:24;36830:5;36812:24;:::i;:::-;36803:34;:::i;:::-;36785:53;:::i;:::-;36772:66;;36702:142;;;:::o;36850:75::-;36893:3;36914:5;36907:12;;36850:75;;;:::o;36931:269::-;37041:39;37072:7;37041:39;:::i;:::-;37102:91;37151:41;37175:16;37151:41;:::i;:::-;37143:6;37136:4;37130:11;37102:91;:::i;:::-;37096:4;37089:105;37007:193;36931:269;;;:::o;37206:73::-;37251:3;37206:73;:::o;37285:189::-;37362:32;;:::i;:::-;37403:65;37461:6;37453;37447:4;37403:65;:::i;:::-;37338:136;37285:189;;:::o;37480:186::-;37540:120;37557:3;37550:5;37547:14;37540:120;;;37611:39;37648:1;37641:5;37611:39;:::i;:::-;37584:1;37577:5;37573:13;37564:22;;37540:120;;;37480:186;;:::o;37672:543::-;37773:2;37768:3;37765:11;37762:446;;;37807:38;37839:5;37807:38;:::i;:::-;37891:29;37909:10;37891:29;:::i;:::-;37881:8;37877:44;38074:2;38062:10;38059:18;38056:49;;;38095:8;38080:23;;38056:49;38118:80;38174:22;38192:3;38174:22;:::i;:::-;38164:8;38160:37;38147:11;38118:80;:::i;:::-;37777:431;;37762:446;37672:543;;;:::o;38221:117::-;38275:8;38325:5;38319:4;38315:16;38294:37;;38221:117;;;;:::o;38344:169::-;38388:6;38421:51;38469:1;38465:6;38457:5;38454:1;38450:13;38421:51;:::i;:::-;38417:56;38502:4;38496;38492:15;38482:25;;38395:118;38344:169;;;;:::o;38518:295::-;38594:4;38740:29;38765:3;38759:4;38740:29;:::i;:::-;38732:37;;38802:3;38799:1;38795:11;38789:4;38786:21;38778:29;;38518:295;;;;:::o;38818:1395::-;38935:37;38968:3;38935:37;:::i;:::-;39037:18;39029:6;39026:30;39023:56;;;39059:18;;:::i;:::-;39023:56;39103:38;39135:4;39129:11;39103:38;:::i;:::-;39188:67;39248:6;39240;39234:4;39188:67;:::i;:::-;39282:1;39306:4;39293:17;;39338:2;39330:6;39327:14;39355:1;39350:618;;;;40012:1;40029:6;40026:77;;;40078:9;40073:3;40069:19;40063:26;40054:35;;40026:77;40129:67;40189:6;40182:5;40129:67;:::i;:::-;40123:4;40116:81;39985:222;39320:887;;39350:618;39402:4;39398:9;39390:6;39386:22;39436:37;39468:4;39436:37;:::i;:::-;39495:1;39509:208;39523:7;39520:1;39517:14;39509:208;;;39602:9;39597:3;39593:19;39587:26;39579:6;39572:42;39653:1;39645:6;39641:14;39631:24;;39700:2;39689:9;39685:18;39672:31;;39546:4;39543:1;39539:12;39534:17;;39509:208;;;39745:6;39736:7;39733:19;39730:179;;;39803:9;39798:3;39794:19;39788:26;39846:48;39888:4;39880:6;39876:17;39865:9;39846:48;:::i;:::-;39838:6;39831:64;39753:156;39730:179;39955:1;39951;39943:6;39939:14;39935:22;39929:4;39922:36;39357:611;;;39320:887;;38910:1303;;;38818:1395;;:::o;40219:178::-;40359:30;40355:1;40347:6;40343:14;40336:54;40219:178;:::o;40403:366::-;40545:3;40566:67;40630:2;40625:3;40566:67;:::i;:::-;40559:74;;40642:93;40731:3;40642:93;:::i;:::-;40760:2;40755:3;40751:12;40744:19;;40403:366;;;:::o;40775:419::-;40941:4;40979:2;40968:9;40964:18;40956:26;;41028:9;41022:4;41018:20;41014:1;41003:9;40999:17;40992:47;41056:131;41182:4;41056:131;:::i;:::-;41048:139;;40775:419;;;:::o;41200:220::-;41340:34;41336:1;41328:6;41324:14;41317:58;41409:3;41404:2;41396:6;41392:15;41385:28;41200:220;:::o;41426:366::-;41568:3;41589:67;41653:2;41648:3;41589:67;:::i;:::-;41582:74;;41665:93;41754:3;41665:93;:::i;:::-;41783:2;41778:3;41774:12;41767:19;;41426:366;;;:::o;41798:419::-;41964:4;42002:2;41991:9;41987:18;41979:26;;42051:9;42045:4;42041:20;42037:1;42026:9;42022:17;42015:47;42079:131;42205:4;42079:131;:::i;:::-;42071:139;;41798:419;;;:::o;42223:233::-;42363:34;42359:1;42351:6;42347:14;42340:58;42432:16;42427:2;42419:6;42415:15;42408:41;42223:233;:::o;42462:366::-;42604:3;42625:67;42689:2;42684:3;42625:67;:::i;:::-;42618:74;;42701:93;42790:3;42701:93;:::i;:::-;42819:2;42814:3;42810:12;42803:19;;42462:366;;;:::o;42834:419::-;43000:4;43038:2;43027:9;43023:18;43015:26;;43087:9;43081:4;43077:20;43073:1;43062:9;43058:17;43051:47;43115:131;43241:4;43115:131;:::i;:::-;43107:139;;42834:419;;;:::o;43259:167::-;43399:19;43395:1;43387:6;43383:14;43376:43;43259:167;:::o;43432:366::-;43574:3;43595:67;43659:2;43654:3;43595:67;:::i;:::-;43588:74;;43671:93;43760:3;43671:93;:::i;:::-;43789:2;43784:3;43780:12;43773:19;;43432:366;;;:::o;43804:419::-;43970:4;44008:2;43997:9;43993:18;43985:26;;44057:9;44051:4;44047:20;44043:1;44032:9;44028:17;44021:47;44085:131;44211:4;44085:131;:::i;:::-;44077:139;;43804:419;;;:::o;44229:178::-;44369:30;44365:1;44357:6;44353:14;44346:54;44229:178;:::o;44413:366::-;44555:3;44576:67;44640:2;44635:3;44576:67;:::i;:::-;44569:74;;44652:93;44741:3;44652:93;:::i;:::-;44770:2;44765:3;44761:12;44754:19;;44413:366;;;:::o;44785:419::-;44951:4;44989:2;44978:9;44974:18;44966:26;;45038:9;45032:4;45028:20;45024:1;45013:9;45009:17;45002:47;45066:131;45192:4;45066:131;:::i;:::-;45058:139;;44785:419;;;:::o;45210:234::-;45350:34;45346:1;45338:6;45334:14;45327:58;45419:17;45414:2;45406:6;45402:15;45395:42;45210:234;:::o;45450:366::-;45592:3;45613:67;45677:2;45672:3;45613:67;:::i;:::-;45606:74;;45689:93;45778:3;45689:93;:::i;:::-;45807:2;45802:3;45798:12;45791:19;;45450:366;;;:::o;45822:419::-;45988:4;46026:2;46015:9;46011:18;46003:26;;46075:9;46069:4;46065:20;46061:1;46050:9;46046:17;46039:47;46103:131;46229:4;46103:131;:::i;:::-;46095:139;;45822:419;;;:::o;46247:589::-;46472:3;46494:95;46585:3;46576:6;46494:95;:::i;:::-;46487:102;;46606:95;46697:3;46688:6;46606:95;:::i;:::-;46599:102;;46718:92;46806:3;46797:6;46718:92;:::i;:::-;46711:99;;46827:3;46820:10;;46247:589;;;;;;:::o;46842:98::-;46893:6;46927:5;46921:12;46911:22;;46842:98;;;:::o;46946:168::-;47029:11;47063:6;47058:3;47051:19;47103:4;47098:3;47094:14;47079:29;;46946:168;;;;:::o;47120:373::-;47206:3;47234:38;47266:5;47234:38;:::i;:::-;47288:70;47351:6;47346:3;47288:70;:::i;:::-;47281:77;;47367:65;47425:6;47420:3;47413:4;47406:5;47402:16;47367:65;:::i;:::-;47457:29;47479:6;47457:29;:::i;:::-;47452:3;47448:39;47441:46;;47210:283;47120:373;;;;:::o;47499:640::-;47694:4;47732:3;47721:9;47717:19;47709:27;;47746:71;47814:1;47803:9;47799:17;47790:6;47746:71;:::i;:::-;47827:72;47895:2;47884:9;47880:18;47871:6;47827:72;:::i;:::-;47909;47977:2;47966:9;47962:18;47953:6;47909:72;:::i;:::-;48028:9;48022:4;48018:20;48013:2;48002:9;47998:18;47991:48;48056:76;48127:4;48118:6;48056:76;:::i;:::-;48048:84;;47499:640;;;;;;;:::o;48145:141::-;48201:5;48232:6;48226:13;48217:22;;48248:32;48274:5;48248:32;:::i;:::-;48145:141;;;;:::o;48292:349::-;48361:6;48410:2;48398:9;48389:7;48385:23;48381:32;48378:119;;;48416:79;;:::i;:::-;48378:119;48536:1;48561:63;48616:7;48607:6;48596:9;48592:22;48561:63;:::i;:::-;48551:73;;48507:127;48292:349;;;;:::o;48647:410::-;48687:7;48710:20;48728:1;48710:20;:::i;:::-;48705:25;;48744:20;48762:1;48744:20;:::i;:::-;48739:25;;48799:1;48796;48792:9;48821:30;48839:11;48821:30;:::i;:::-;48810:41;;49000:1;48991:7;48987:15;48984:1;48981:22;48961:1;48954:9;48934:83;48911:139;;49030:18;;:::i;:::-;48911:139;48695:362;48647:410;;;;:::o;49063:244::-;49203:34;49199:1;49191:6;49187:14;49180:58;49272:27;49267:2;49259:6;49255:15;49248:52;49063:244;:::o;49313:366::-;49455:3;49476:67;49540:2;49535:3;49476:67;:::i;:::-;49469:74;;49552:93;49641:3;49552:93;:::i;:::-;49670:2;49665:3;49661:12;49654:19;;49313:366;;;:::o;49685:419::-;49851:4;49889:2;49878:9;49874:18;49866:26;;49938:9;49932:4;49928:20;49924:1;49913:9;49909:17;49902:47;49966:131;50092:4;49966:131;:::i;:::-;49958:139;;49685:419;;;:::o;50110:180::-;50158:77;50155:1;50148:88;50255:4;50252:1;50245:15;50279:4;50276:1;50269:15;50296:185;50336:1;50353:20;50371:1;50353:20;:::i;:::-;50348:25;;50387:20;50405:1;50387:20;:::i;:::-;50382:25;;50426:1;50416:35;;50431:18;;:::i;:::-;50416:35;50473:1;50470;50466:9;50461:14;;50296:185;;;;:::o;50487:225::-;50627:34;50623:1;50615:6;50611:14;50604:58;50696:8;50691:2;50683:6;50679:15;50672:33;50487:225;:::o;50718:366::-;50860:3;50881:67;50945:2;50940:3;50881:67;:::i;:::-;50874:74;;50957:93;51046:3;50957:93;:::i;:::-;51075:2;51070:3;51066:12;51059:19;;50718:366;;;:::o;51090:419::-;51256:4;51294:2;51283:9;51279:18;51271:26;;51343:9;51337:4;51333:20;51329:1;51318:9;51314:17;51307:47;51371:131;51497:4;51371:131;:::i;:::-;51363:139;;51090:419;;;:::o;51515:176::-;51547:1;51564:20;51582:1;51564:20;:::i;:::-;51559:25;;51598:20;51616:1;51598:20;:::i;:::-;51593:25;;51637:1;51627:35;;51642:18;;:::i;:::-;51627:35;51683:1;51680;51676:9;51671:14;;51515:176;;;;:::o;51697:180::-;51745:77;51742:1;51735:88;51842:4;51839:1;51832:15;51866:4;51863:1;51856:15;51883:182;52023:34;52019:1;52011:6;52007:14;52000:58;51883:182;:::o;52071:366::-;52213:3;52234:67;52298:2;52293:3;52234:67;:::i;:::-;52227:74;;52310:93;52399:3;52310:93;:::i;:::-;52428:2;52423:3;52419:12;52412:19;;52071:366;;;:::o;52443:419::-;52609:4;52647:2;52636:9;52632:18;52624:26;;52696:9;52690:4;52686:20;52682:1;52671:9;52667:17;52660:47;52724:131;52850:4;52724:131;:::i;:::-;52716:139;;52443:419;;;:::o;52868:332::-;52989:4;53027:2;53016:9;53012:18;53004:26;;53040:71;53108:1;53097:9;53093:17;53084:6;53040:71;:::i;:::-;53121:72;53189:2;53178:9;53174:18;53165:6;53121:72;:::i;:::-;52868:332;;;;;:::o;53206:137::-;53260:5;53291:6;53285:13;53276:22;;53307:30;53331:5;53307:30;:::i;:::-;53206:137;;;;:::o;53349:345::-;53416:6;53465:2;53453:9;53444:7;53440:23;53436:32;53433:119;;;53471:79;;:::i;:::-;53433:119;53591:1;53616:61;53669:7;53660:6;53649:9;53645:22;53616:61;:::i;:::-;53606:71;;53562:125;53349:345;;;;:::o

Swarm Source

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