ETH Price: $2,871.38 (-10.88%)
Gas: 14 Gwei

Token

MoonLanderz (MLZ)
 

Overview

Max Total Supply

7,890 MLZ

Holders

1,070

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MLZ
0xec1d5cfb0bf18925ab722eeebcb53dc636834e8a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to The MoonLanderz universe. Follow the journey of Tony Smoothie and his friends that are on a mission to go to the moon. The MoonLanderz is a community and art focused project that aims to create a strong brand through the release of their hybrid cartoon-anime co...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MoonLanderzNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-07
*/

// Sources flattened with hardhat v2.9.3 https://hardhat.org

// File @openzeppelin/contracts/utils/cryptography/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            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/[email protected]

// 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/[email protected]

// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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


// File erc721a/contracts/[email protected]

// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    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;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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/contracts/[email protected]

// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @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).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

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

    // The number of tokens burned.
    uint256 private _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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev 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 Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @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 Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 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 {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

            if (to.code.length != 0) {
                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 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) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 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 {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

            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
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev 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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));
        address approvedAddress = _tokenApprovals[tokenId];

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                approvedAddress == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        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 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
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__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 {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}


// File contracts/WithdrawFairly.sol

pragma solidity ^0.8.0;

contract WithdrawFairly {
    error Unauthorized();
    error ZeroBalance();
    error TransferFailed();

    struct Part {
        address wallet;
        uint16 salePart;
        uint16 royaltiesPart;
    }

    Part[] public parts;
    mapping(address => bool) public callers;

    constructor(){
        parts.push(Part(0xecB4278af1379c38Eab140063fFC426f05FEde28, 1000, 1000));
        callers[0xecB4278af1379c38Eab140063fFC426f05FEde28] = true;
        parts.push(Part(0xE1580cA711094CF2888716a54c5A892245653435, 1000, 2000));
        callers[0xE1580cA711094CF2888716a54c5A892245653435] = true;
        parts.push(Part(0xc6738fd2235042956ffbE94C77d0958D3927Ed89, 350, 0));
        callers[0xc6738fd2235042956ffbE94C77d0958D3927Ed89] = true;
        parts.push(Part(0x158C2406D5BA83F9019398753c1b4aF1A61819B6, 770, 0));
        callers[0x158C2406D5BA83F9019398753c1b4aF1A61819B6] = true;
        parts.push(Part(0x06DcBa9ef76B9C6a129Df78D55f99989905e5F96, 800, 2800));
        callers[0x06DcBa9ef76B9C6a129Df78D55f99989905e5F96] = true;
        parts.push(Part(0x9d246cA915ea31be43B4eF151e473d6e8Bc892eF, 2837, 2172));
        callers[0x9d246cA915ea31be43B4eF151e473d6e8Bc892eF] = true;
        parts.push(Part(0x2af89f045fB0B17Ad218423Cff3744ee25a69845, 2600, 2028));
        callers[0x2af89f045fB0B17Ad218423Cff3744ee25a69845] = true;
        parts.push(Part(0x0b7BeF50CE4D522636E955179DEC09a55f7aF845, 643, 0));
        callers[0x0b7BeF50CE4D522636E955179DEC09a55f7aF845] = true;
    }

    function shareSalesPart() external {
        if (!callers[msg.sender])
            revert Unauthorized();

        uint256 balance = address(this).balance;

        if (balance == 0)
            revert ZeroBalance();

        for (uint256 i; i < parts.length;){
            if (parts[i].salePart > 0)
                _withdraw(parts[i].wallet, balance * parts[i].salePart / 10000);

            unchecked {
                i++;
            }
        }
    }

    function shareRoyaltiesPart() external {
        if (!callers[msg.sender])
            revert Unauthorized();

        uint256 balance = address(this).balance;

        if (balance == 0)
            revert ZeroBalance();

        for (uint256 i; i < parts.length;) {
            if (parts[i].royaltiesPart > 0)
                _withdraw(parts[i].wallet, balance * parts[i].royaltiesPart / 10000);

            unchecked {
                i++;
            }
        }
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        
        if (!success)
            revert TransferFailed();
    }

    receive() external payable {}

}


// File contracts/MoonLanderzNFT.sol

pragma solidity ^0.8.7;

// @author: 0x0

contract MoonLanderzNFT is ERC721A, Ownable, WithdrawFairly {
    error AlreadyRevealed();
    error ZeroValueParam();
    error AmountParamGtThanMax();
    error CollectionSoldOut();
    error CollectionNotSoldOut();
    error NotPresale();
    error MaxPresaleMints();
    error NotWhitelisted();
    error NotSale();
    error MaxSaleTxMintsReached();
    error IncorrectETHValue();
    error NotEnoughNFTs();

    // Minting data
    uint256 public constant SALE_PRICE = 0.088 ether;

    uint64 public constant SPECIAL_SUPPLY = 5;
    uint64 public constant TEAM_SUPPLY = 145;
    // Represents total mint supply including team supply excluding special
    // = totalSupply (7890) - special
    uint64 public constant MINT_SUPPLY = 7890 - SPECIAL_SUPPLY;

    // Validating whitelisted addresses using merkle tree
    bytes32 public merkleRoot;

    // Metadata data
    string public baseURI;
    string public unrevealedURI;
    string public specialUnrevealedURI;
    string public specialURI;

    uint256 public presaleStart;
    uint256 public presaleEnd;

    uint256 private teamCount;
    uint256 private specialCount;

    event MerkleRootUpdated(bytes32 root);
    event SetUnrevealedURI(string unrevealedURI_);
    event SetSpecialUnrevealedURI(string specialUnrevealedURI_);
    event Reveal(string baseURI_);
    event RevealSpecial(string specialURI_);

    constructor(
        uint256 presaleStart_,
        uint256 presaleEnd_,
        bytes32 merkleRoot_
    )
        ERC721A("MoonLanderz", "MLZ")
    {
        presaleStart = presaleStart_;
        presaleEnd = presaleEnd_;
        merkleRoot = merkleRoot_;
    }

    function setUnrevealedURI(string calldata unrevealedURI_) 
        external
        onlyOwner
    {
        unrevealedURI = unrevealedURI_;

        emit SetUnrevealedURI(unrevealedURI_);
    }

     function setSpecialUnrevealedURI(string calldata specialUnrevealedURI_)
        external
        onlyOwner
    {
        specialUnrevealedURI = specialUnrevealedURI_;

        emit SetSpecialUnrevealedURI(specialUnrevealedURI_);
    }

    function updateMerkleRoot(bytes32 root) external onlyOwner {
        merkleRoot = root;

        emit MerkleRootUpdated(root);
    }

    function reveal(string calldata baseURI_) external onlyOwner {
        if (bytes(baseURI).length > 0)
            revert AlreadyRevealed();

        baseURI = baseURI_;

        emit Reveal(baseURI_);
    }

    function revealSpecial(string calldata specialURI_) external onlyOwner {
        if (bytes(specialURI).length > 0)
            revert AlreadyRevealed();

        specialURI = specialURI_;

        emit RevealSpecial(specialURI_);
    }

    function teamMint(uint256 amount, address to) external onlyOwner {
        teamCount += amount;

        if (teamCount > TEAM_SUPPLY)
            revert AmountParamGtThanMax();
        // If not minted before sold out, then lost in profit of public sale
        if (isSoldOut(amount))
            revert CollectionSoldOut();

        _mint(to, amount);
    }

    function specialMint(uint256 amount, address to) external onlyOwner {
        // Required cuz of ERC721A mint mechanism
        // specials will have TOTAL + TEAM + i (>1) ids
        // Splits URI metadata no stress xSensei!
        if (!isSoldOut(1))
            revert CollectionNotSoldOut();

        specialCount += amount;

        if (specialCount > SPECIAL_SUPPLY)
            revert AmountParamGtThanMax();

        _mint(to, amount);
    }

    function totalMinted() external view returns (uint256) {
        return _totalMinted();
    }

    function publicMintNumber(address _owner) external view returns (uint256) {
        return _getAux(_owner);
    }

    function privateMintNumber(address _owner) external view returns (uint256) {
        return _numberMinted(_owner) - _getAux(_owner);
    }

    function presaleMint(bytes32[] calldata _proof)
        external
        payable
    {
        if (!isPresale())
            revert NotPresale();

        if (_numberMinted(msg.sender) != 0)
            revert MaxPresaleMints();

        if (!_isWhiteListed(msg.sender, _proof))
            revert NotWhitelisted();

        if (msg.value != SALE_PRICE)
            revert IncorrectETHValue();

        _mint(msg.sender, 1);
    }

    function saleMint(uint256 amount) external payable {
        // Arbitrary limiting to 3 max / tx
        if (amount > 3) 
            revert MaxSaleTxMintsReached();

        if (!isSale())
            revert NotSale();

        if (isSoldOut(amount))
            revert NotEnoughNFTs();

        if (msg.value != SALE_PRICE * amount)
            revert IncorrectETHValue();

        _mint(msg.sender, amount);
    }

    function isPresale() public view returns (bool) {
        return block.timestamp > presaleStart &&
            block.timestamp < presaleEnd;
    }

    function isSale() public view returns (bool) {
        return block.timestamp > presaleEnd;
    }

    function isSoldOut(uint256 nftWanted) public view returns (bool) {
        return _totalMinted() + nftWanted > MINT_SUPPLY;
    }

    function tokenURI(uint256 _nftId)
        public
        view
        override
        returns (string memory)
    {
        if (!_exists(_nftId))
            revert URIQueryForNonexistentToken();

        // Checks if is special => 1/1
        if (_nftId > MINT_SUPPLY) {
            return bytes(specialURI).length != 0 ? 
                string(abi.encodePacked(specialURI, _toString(_nftId), ".json")) :
                specialUnrevealedURI;
        } else {
            return bytes(baseURI).length != 0 ?
                string(abi.encodePacked(baseURI, _toString(_nftId), ".json")) :
                unrevealedURI;
        }
    }

    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    function _isWhiteListed(address account, bytes32[] calldata proof)
        private
        view
        returns(bool)
    {
        return _verify(_leaf(account), proof);
    }

    function _leaf(address account) private pure returns(bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof)
        private
        view
        returns (bool)
    {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"presaleStart_","type":"uint256"},{"internalType":"uint256","name":"presaleEnd_","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyRevealed","type":"error"},{"inputs":[],"name":"AmountParamGtThanMax","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CollectionNotSoldOut","type":"error"},{"inputs":[],"name":"CollectionSoldOut","type":"error"},{"inputs":[],"name":"IncorrectETHValue","type":"error"},{"inputs":[],"name":"MaxPresaleMints","type":"error"},{"inputs":[],"name":"MaxSaleTxMintsReached","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotEnoughNFTs","type":"error"},{"inputs":[],"name":"NotPresale","type":"error"},{"inputs":[],"name":"NotSale","type":"error"},{"inputs":[],"name":"NotWhitelisted","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ZeroBalance","type":"error"},{"inputs":[],"name":"ZeroValueParam","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":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"MerkleRootUpdated","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":false,"internalType":"string","name":"baseURI_","type":"string"}],"name":"Reveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"specialURI_","type":"string"}],"name":"RevealSpecial","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"specialUnrevealedURI_","type":"string"}],"name":"SetSpecialUnrevealedURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"SetUnrevealedURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINT_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SPECIAL_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"callers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftWanted","type":"uint256"}],"name":"isSoldOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"parts","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint16","name":"salePart","type":"uint16"},{"internalType":"uint16","name":"royaltiesPart","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"privateMintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"publicMintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"specialURI_","type":"string"}],"name":"revealSpecial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"saleMint","outputs":[],"stateMutability":"payable","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":"specialUnrevealedURI_","type":"string"}],"name":"setSpecialUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareRoyaltiesPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareSalesPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"specialMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"specialURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"specialUnrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200517938038062005179833981810160405281019062000037919062000e75565b6040518060400160405280600b81526020017f4d6f6f6e4c616e6465727a0000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d4c5a00000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000bb92919062000d97565b508060039080519060200190620000d492919062000d97565b50620000e562000cc060201b60201c565b60008190555050506200010d6200010162000cc960201b60201c565b62000cd160201b60201c565b6009604051806060016040528073ecb4278af1379c38eab140063ffc426f05fede2873ffffffffffffffffffffffffffffffffffffffff1681526020016103e861ffff1681526020016103e861ffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548161ffff021916908361ffff16021790555050506001600a600073ecb4278af1379c38eab140063ffc426f05fede2873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506009604051806060016040528073e1580ca711094cf2888716a54c5a89224565343573ffffffffffffffffffffffffffffffffffffffff1681526020016103e861ffff1681526020016107d061ffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548161ffff021916908361ffff16021790555050506001600a600073e1580ca711094cf2888716a54c5a89224565343573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506009604051806060016040528073c6738fd2235042956ffbe94c77d0958d3927ed8973ffffffffffffffffffffffffffffffffffffffff16815260200161015e61ffff168152602001600061ffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548161ffff021916908361ffff16021790555050506001600a600073c6738fd2235042956ffbe94c77d0958d3927ed8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506009604051806060016040528073158c2406d5ba83f9019398753c1b4af1a61819b673ffffffffffffffffffffffffffffffffffffffff16815260200161030261ffff168152602001600061ffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548161ffff021916908361ffff16021790555050506001600a600073158c2406d5ba83f9019398753c1b4af1a61819b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960405180606001604052807306dcba9ef76b9c6a129df78d55f99989905e5f9673ffffffffffffffffffffffffffffffffffffffff16815260200161032061ffff168152602001610af061ffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548161ffff021916908361ffff16021790555050506001600a60007306dcba9ef76b9c6a129df78d55f99989905e5f9673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060096040518060600160405280739d246ca915ea31be43b4ef151e473d6e8bc892ef73ffffffffffffffffffffffffffffffffffffffff168152602001610b1561ffff16815260200161087c61ffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548161ffff021916908361ffff16021790555050506001600a6000739d246ca915ea31be43b4ef151e473d6e8bc892ef73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060096040518060600160405280732af89f045fb0b17ad218423cff3744ee25a6984573ffffffffffffffffffffffffffffffffffffffff168152602001610a2861ffff1681526020016107ec61ffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548161ffff021916908361ffff16021790555050506001600a6000732af89f045fb0b17ad218423cff3744ee25a6984573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060096040518060600160405280730b7bef50ce4d522636e955179dec09a55f7af84573ffffffffffffffffffffffffffffffffffffffff16815260200161028361ffff168152602001600061ffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548161ffff021916908361ffff16021790555050506001600a6000730b7bef50ce4d522636e955179dec09a55f7af84573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826010819055508160118190555080600b8190555050505062000f83565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000da59062000ee5565b90600052602060002090601f01602090048101928262000dc9576000855562000e15565b82601f1062000de457805160ff191683800117855562000e15565b8280016001018555821562000e15579182015b8281111562000e1457825182559160200191906001019062000df7565b5b50905062000e24919062000e28565b5090565b5b8082111562000e4357600081600090555060010162000e29565b5090565b60008151905062000e588162000f4f565b92915050565b60008151905062000e6f8162000f69565b92915050565b60008060006060848603121562000e915762000e9062000f4a565b5b600062000ea18682870162000e5e565b935050602062000eb48682870162000e5e565b925050604062000ec78682870162000e47565b9150509250925092565b6000819050919050565b6000819050919050565b6000600282049050600182168062000efe57607f821691505b6020821081141562000f155762000f1462000f1b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b62000f5a8162000ed1565b811462000f6657600080fd5b50565b62000f748162000edb565b811462000f8057600080fd5b50565b6141e68062000f936000396000f3fe60806040526004361061028c5760003560e01c80637f205a741161015a578063c87b56dd116100c1578063f0ba9cb81161007a578063f0ba9cb8146109c3578063f0bb1de614610a00578063f2fde38b14610a29578063f8c1c18614610a52578063fb918da214610a7d578063fe2c7fee14610aa857610293565b8063c87b56dd1461089a578063c9eb4662146108d7578063de8801e514610916578063e2cceb6214610941578063e985e9c51461096a578063edc0c72c146109a757610293565b80639dfbcde8116101135780639dfbcde81461079e578063a22cb465146107c9578063a2309ff8146107f2578063b88d4fde1461081d578063b9c3a81814610846578063bfa457bc1461087157610293565b80637f205a74146106ad5780638045179f146106d85780638ca887ca146107015780638da5cb5b1461071d57806395364a841461074857806395d89b411461077357610293565b806342842e0e116101fe5780636b69fd20116101b75780636b69fd201461059b5780636c0360eb146105c65780637035bf18146105f157806370a082311461061c578063715018a6146106595780637bbf4a3f1461067057610293565b806342842e0e1461048f57806346002b06146104b85780634783f0ef146104cf5780634c261247146104f857806359aa4ab3146105215780636352211e1461055e57610293565b80631afac3ba116102505780631afac3ba1461039157806320160e29146103ce578063229f3e29146103f957806323b872dd146104245780632eb4a7ab1461044d57806340f9bbe21461047857610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d57806318160ddd1461036657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba919061366f565b610ad1565b6040516102cc9190613acc565b60405180910390f35b3480156102e157600080fd5b506102ea610b63565b6040516102f79190613b26565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190613716565b610bf5565b6040516103349190613a2e565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f91906135b5565b610c71565b005b34801561037257600080fd5b5061037b610e18565b6040516103889190613b88565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613432565b610e2f565b6040516103c59190613b88565b60405180910390f35b3480156103da57600080fd5b506103e3610e4b565b6040516103f09190613b26565b60405180910390f35b34801561040557600080fd5b5061040e610ed9565b60405161041b9190613b88565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061349f565b610edf565b005b34801561045957600080fd5b50610462610eef565b60405161046f9190613ae7565b60405180910390f35b34801561048457600080fd5b5061048d610ef5565b005b34801561049b57600080fd5b506104b660048036038101906104b1919061349f565b6110ac565b005b3480156104c457600080fd5b506104cd6110cc565b005b3480156104db57600080fd5b506104f660048036038101906104f19190613642565b611283565b005b34801561050457600080fd5b5061051f600480360381019061051a91906136c9565b611340565b005b34801561052d57600080fd5b5061054860048036038101906105439190613432565b611454565b6040516105559190613b88565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190613716565b611483565b6040516105929190613a2e565b60405180910390f35b3480156105a757600080fd5b506105b0611495565b6040516105bd9190613ba3565b60405180910390f35b3480156105d257600080fd5b506105db61149a565b6040516105e89190613b26565b60405180910390f35b3480156105fd57600080fd5b50610606611528565b6040516106139190613b26565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190613432565b6115b6565b6040516106509190613b88565b60405180910390f35b34801561066557600080fd5b5061066e61164b565b005b34801561067c57600080fd5b5061069760048036038101906106929190613432565b6116d3565b6040516106a49190613acc565b60405180910390f35b3480156106b957600080fd5b506106c26116f3565b6040516106cf9190613b88565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa91906136c9565b6116ff565b005b61071b60048036038101906107169190613716565b6117ca565b005b34801561072957600080fd5b506107326118dc565b60405161073f9190613a2e565b60405180910390f35b34801561075457600080fd5b5061075d611906565b60405161076a9190613acc565b60405180910390f35b34801561077f57600080fd5b5061078861191f565b6040516107959190613b26565b60405180910390f35b3480156107aa57600080fd5b506107b36119b1565b6040516107c09190613ba3565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190613575565b6119c3565b005b3480156107fe57600080fd5b50610807611b3b565b6040516108149190613b88565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f91906134f2565b611b4a565b005b34801561085257600080fd5b5061085b611bbd565b6040516108689190613ba3565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613743565b611bc2565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613716565b611cec565b6040516108ce9190613b26565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190613716565b611f02565b60405161090d93929190613a95565b60405180910390f35b34801561092257600080fd5b5061092b611f74565b6040516109389190613b88565b60405180910390f35b34801561094d57600080fd5b5061096860048036038101906109639190613743565b611f7a565b005b34801561097657600080fd5b50610991600480360381019061098c919061345f565b6120a4565b60405161099e9190613acc565b60405180910390f35b6109c160048036038101906109bc91906135f5565b612138565b005b3480156109cf57600080fd5b506109ea60048036038101906109e59190613716565b612249565b6040516109f79190613acc565b60405180910390f35b348015610a0c57600080fd5b50610a276004803603810190610a2291906136c9565b61227f565b005b348015610a3557600080fd5b50610a506004803603810190610a4b9190613432565b612393565b005b348015610a5e57600080fd5b50610a6761248b565b604051610a749190613acc565b60405180910390f35b348015610a8957600080fd5b50610a92612497565b604051610a9f9190613b26565b60405180910390f35b348015610ab457600080fd5b50610acf6004803603810190610aca91906136c9565b612525565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b7290613ea2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9e90613ea2565b8015610beb5780601f10610bc057610100808354040283529160200191610beb565b820191906000526020600020905b815481529060010190602001808311610bce57829003601f168201915b5050505050905090565b6000610c00826125f0565b610c36576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7c8261264f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d0361271d565b73ffffffffffffffffffffffffffffffffffffffff1614610d6657610d2f81610d2a61271d565b6120a4565b610d65576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e22612725565b6001546000540303905090565b6000610e3a8261272e565b67ffffffffffffffff169050919050565b600e8054610e5890613ea2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8490613ea2565b8015610ed15780601f10610ea657610100808354040283529160200191610ed1565b820191906000526020600020905b815481529060010190602001808311610eb457829003601f168201915b505050505081565b60115481565b610eea83838361277b565b505050565b600b5481565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f78576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60004790506000811415610fb8576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b6009805490508110156110a857600060098281548110610fde57610fdd613fff565b5b9060005260206000200160000160149054906101000a900461ffff1661ffff16111561109b5761109a6009828154811061101b5761101a613fff565b5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600984815481106110605761105f613fff565b5b9060005260206000200160000160149054906101000a900461ffff1661ffff168561108b9190613cfe565b6110959190613ccd565b612b43565b5b8080600101915050610fbb565b5050565b6110c783838360405180602001604052806000815250611b4a565b505050565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661114f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000479050600081141561118f576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60098054905081101561127f576000600982815481106111b5576111b4613fff565b5b9060005260206000200160000160169054906101000a900461ffff1661ffff16111561127257611271600982815481106111f2576111f1613fff565b5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106009848154811061123757611236613fff565b5b9060005260206000200160000160169054906101000a900461ffff1661ffff16856112629190613cfe565b61126c9190613ccd565b612b43565b5b8080600101915050611192565b5050565b61128b612beb565b73ffffffffffffffffffffffffffffffffffffffff166112a96118dc565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613b68565b60405180910390fd5b80600b819055507f90004c04698bc3322499a575ed3752dd4abf33e0a7294c06a787a0fe01bea941816040516113359190613ae7565b60405180910390a150565b611348612beb565b73ffffffffffffffffffffffffffffffffffffffff166113666118dc565b73ffffffffffffffffffffffffffffffffffffffff16146113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b390613b68565b60405180910390fd5b6000600c80546113cb90613ea2565b90501115611405576040517fa89ac15100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181600c91906114169291906131f5565b507ff040279f20c4475afca9a566d33b14e09c92fcb6460fb4121fadf563ab9ecc1f8282604051611448929190613b02565b60405180910390a15050565b600061145f8261272e565b67ffffffffffffffff1661147283612bf3565b61147c9190613d58565b9050919050565b600061148e8261264f565b9050919050565b600581565b600c80546114a790613ea2565b80601f01602080910402602001604051908101604052809291908181526020018280546114d390613ea2565b80156115205780601f106114f557610100808354040283529160200191611520565b820191906000526020600020905b81548152906001019060200180831161150357829003601f168201915b505050505081565b600d805461153590613ea2565b80601f016020809104026020016040519081016040528092919081815260200182805461156190613ea2565b80156115ae5780601f10611583576101008083540402835291602001916115ae565b820191906000526020600020905b81548152906001019060200180831161159157829003601f168201915b505050505081565b6000806115c283612c4a565b14156115fa576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611653612beb565b73ffffffffffffffffffffffffffffffffffffffff166116716118dc565b73ffffffffffffffffffffffffffffffffffffffff16146116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be90613b68565b60405180910390fd5b6116d16000612c54565b565b600a6020528060005260406000206000915054906101000a900460ff1681565b670138a388a43c000081565b611707612beb565b73ffffffffffffffffffffffffffffffffffffffff166117256118dc565b73ffffffffffffffffffffffffffffffffffffffff161461177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177290613b68565b60405180910390fd5b8181600e919061178c9291906131f5565b507fa8e1aed230fb114b31f7ab0bce3ccf2342bd7805343bf73cf45d91af5d40cc7382826040516117be929190613b02565b60405180910390a15050565b6003811115611805576040517f9b4d7d3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180d61248b565b611843576040517fa7283fb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61184c81612249565b15611883576040517fe1ace8ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80670138a388a43c00006118979190613cfe565b34146118cf576040517fde94e21300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d93382612d1a565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006010544211801561191a575060115442105b905090565b60606003805461192e90613ea2565b80601f016020809104026020016040519081016040528092919081815260200182805461195a90613ea2565b80156119a75780601f1061197c576101008083540402835291602001916119a7565b820191906000526020600020905b81548152906001019060200180831161198a57829003601f168201915b5050505050905090565b6005611ed26119c09190613d8c565b81565b6119cb61271d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a30576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a3d61271d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aea61271d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b2f9190613acc565b60405180910390a35050565b6000611b45612eca565b905090565b611b5584848461277b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bb757611b8084848484612edd565b611bb6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b609181565b611bca612beb565b73ffffffffffffffffffffffffffffffffffffffff16611be86118dc565b73ffffffffffffffffffffffffffffffffffffffff1614611c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3590613b68565b60405180910390fd5b8160126000828254611c509190613c77565b92505081905550609167ffffffffffffffff166012541115611c9e576040517f8390347900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ca782612249565b15611cde576040517f5fd48f9100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ce88183612d1a565b5050565b6060611cf7826125f0565b611d2d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005611ed2611d3c9190613d8c565b67ffffffffffffffff16821115611e27576000600f8054611d5c90613ea2565b90501415611df457600e8054611d7190613ea2565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9d90613ea2565b8015611dea5780601f10611dbf57610100808354040283529160200191611dea565b820191906000526020600020905b815481529060010190602001808311611dcd57829003601f168201915b5050505050611e20565b600f611dff8361303d565b604051602001611e109291906139ea565b6040516020818303038152906040525b9050611efd565b6000600c8054611e3690613ea2565b90501415611ece57600d8054611e4b90613ea2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7790613ea2565b8015611ec45780601f10611e9957610100808354040283529160200191611ec4565b820191906000526020600020905b815481529060010190602001808311611ea757829003601f168201915b5050505050611efa565b600c611ed98361303d565b604051602001611eea9291906139ea565b6040516020818303038152906040525b90505b919050565b60098181548110611f1257600080fd5b906000526020600020016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900461ffff16908060000160169054906101000a900461ffff16905083565b60105481565b611f82612beb565b73ffffffffffffffffffffffffffffffffffffffff16611fa06118dc565b73ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90613b68565b60405180910390fd5b6120006001612249565b612036576040517fc680351e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81601360008282546120489190613c77565b92505081905550600567ffffffffffffffff166013541115612096576040517f8390347900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120a08183612d1a565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612140611906565b612176576040517f310a594a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061218133612bf3565b146121b8576040517fa85607a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121c3338383613097565b6121f9576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670138a388a43c0000341461223a576040517fde94e21300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612245336001612d1a565b5050565b60006005611ed261225a9190613d8c565b67ffffffffffffffff168261226d612eca565b6122779190613c77565b119050919050565b612287612beb565b73ffffffffffffffffffffffffffffffffffffffff166122a56118dc565b73ffffffffffffffffffffffffffffffffffffffff16146122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290613b68565b60405180910390fd5b6000600f805461230a90613ea2565b90501115612344576040517fa89ac15100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181600f91906123559291906131f5565b507fb763322da9170230a476b46e84e1eb8cdd681927127f3a947a5a5fdbf82772e98282604051612387929190613b02565b60405180910390a15050565b61239b612beb565b73ffffffffffffffffffffffffffffffffffffffff166123b96118dc565b73ffffffffffffffffffffffffffffffffffffffff161461240f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240690613b68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247690613b48565b60405180910390fd5b61248881612c54565b50565b60006011544211905090565b600f80546124a490613ea2565b80601f01602080910402602001604051908101604052809291908181526020018280546124d090613ea2565b801561251d5780601f106124f25761010080835404028352916020019161251d565b820191906000526020600020905b81548152906001019060200180831161250057829003601f168201915b505050505081565b61252d612beb565b73ffffffffffffffffffffffffffffffffffffffff1661254b6118dc565b73ffffffffffffffffffffffffffffffffffffffff16146125a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259890613b68565b60405180910390fd5b8181600d91906125b29291906131f5565b507facdfdd5724262f924ad56bda437d11c6cfe8ca3d58440f1052b335217431ba7e82826040516125e4929190613b02565b60405180910390a15050565b6000816125fb612725565b1115801561260a575060005482105b8015612648575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061265e612725565b116126e6576000548110156126e55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156126e3575b60008114156126d95760046000836001900393508381526020019081526020016000205490506126ae565b8092505050612718565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600060c0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c9050919050565b60006127868261264f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127ed576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff1661284661271d565b73ffffffffffffffffffffffffffffffffffffffff16148061287557506128748661286f61271d565b6120a4565b5b806128b2575061288361271d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806128eb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128f686612c4a565b141561292e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61293b86868660016130f5565b600061294683612c4a565b14612982576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612a4987612c4a565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415612ad3576000600185019050600060046000838152602001908152602001600020541415612ad1576000548114612ad0578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b3b86868660016130fb565b505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b6990613a19565b60006040518083038185875af1925050503d8060008114612ba6576040519150601f19603f3d011682016040523d82523d6000602084013e612bab565b606091505b5050905080612be6576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000805490506000612d2b84612c4a565b1415612d63576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612d9e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dab60008483856130f5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612e1060018414613101565b901b60a042901b612e2085612c4a565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612e4657816000819055505050612ec560008483856130fb565b505050565b6000612ed4612725565b60005403905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f0361271d565b8786866040518563ffffffff1660e01b8152600401612f259493929190613a49565b602060405180830381600087803b158015612f3f57600080fd5b505af1925050508015612f7057506040513d601f19601f82011682018060405250810190612f6d919061369c565b60015b612fea573d8060008114612fa0576040519150601f19603f3d011682016040523d82523d6000602084013e612fa5565b606091505b50600081511415612fe2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561308357600183039250600a81066030018353600a81049050613063565b508181036020830392508083525050919050565b60006130ec6130a58561310b565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061313b565b90509392505050565b50505050565b50505050565b6000819050919050565b60008160405160200161311e91906139cf565b604051602081830303815290604052805190602001209050919050565b600061314a82600b5485613152565b905092915050565b60008261315f8584613169565b1490509392505050565b60008082905060005b84518110156131d35760008582815181106131905761318f613fff565b5b602002602001015190508083116131b2576131ab83826131de565b92506131bf565b6131bc81846131de565b92505b5080806131cb90613f05565b915050613172565b508091505092915050565b600082600052816020526040600020905092915050565b82805461320190613ea2565b90600052602060002090601f016020900481019282613223576000855561326a565b82601f1061323c57803560ff191683800117855561326a565b8280016001018555821561326a579182015b8281111561326957823582559160200191906001019061324e565b5b509050613277919061327b565b5090565b5b8082111561329457600081600090555060010161327c565b5090565b60006132ab6132a684613be3565b613bbe565b9050828152602081018484840111156132c7576132c661406c565b5b6132d2848285613e60565b509392505050565b6000813590506132e98161413d565b92915050565b60008083601f84011261330557613304614062565b5b8235905067ffffffffffffffff8111156133225761332161405d565b5b60208301915083602082028301111561333e5761333d614067565b5b9250929050565b60008135905061335481614154565b92915050565b6000813590506133698161416b565b92915050565b60008135905061337e81614182565b92915050565b60008151905061339381614182565b92915050565b600082601f8301126133ae576133ad614062565b5b81356133be848260208601613298565b91505092915050565b60008083601f8401126133dd576133dc614062565b5b8235905067ffffffffffffffff8111156133fa576133f961405d565b5b60208301915083600182028301111561341657613415614067565b5b9250929050565b60008135905061342c81614199565b92915050565b60006020828403121561344857613447614076565b5b6000613456848285016132da565b91505092915050565b6000806040838503121561347657613475614076565b5b6000613484858286016132da565b9250506020613495858286016132da565b9150509250929050565b6000806000606084860312156134b8576134b7614076565b5b60006134c6868287016132da565b93505060206134d7868287016132da565b92505060406134e88682870161341d565b9150509250925092565b6000806000806080858703121561350c5761350b614076565b5b600061351a878288016132da565b945050602061352b878288016132da565b935050604061353c8782880161341d565b925050606085013567ffffffffffffffff81111561355d5761355c614071565b5b61356987828801613399565b91505092959194509250565b6000806040838503121561358c5761358b614076565b5b600061359a858286016132da565b92505060206135ab85828601613345565b9150509250929050565b600080604083850312156135cc576135cb614076565b5b60006135da858286016132da565b92505060206135eb8582860161341d565b9150509250929050565b6000806020838503121561360c5761360b614076565b5b600083013567ffffffffffffffff81111561362a57613629614071565b5b613636858286016132ef565b92509250509250929050565b60006020828403121561365857613657614076565b5b60006136668482850161335a565b91505092915050565b60006020828403121561368557613684614076565b5b60006136938482850161336f565b91505092915050565b6000602082840312156136b2576136b1614076565b5b60006136c084828501613384565b91505092915050565b600080602083850312156136e0576136df614076565b5b600083013567ffffffffffffffff8111156136fe576136fd614071565b5b61370a858286016133c7565b92509250509250929050565b60006020828403121561372c5761372b614076565b5b600061373a8482850161341d565b91505092915050565b6000806040838503121561375a57613759614076565b5b60006137688582860161341d565b9250506020613779858286016132da565b9150509250929050565b61378c81613dc0565b82525050565b6137a361379e82613dc0565b613f4e565b82525050565b6137b281613dd2565b82525050565b6137c181613dde565b82525050565b60006137d282613c29565b6137dc8185613c3f565b93506137ec818560208601613e6f565b6137f58161407b565b840191505092915050565b600061380c8385613c5b565b9350613819838584613e60565b6138228361407b565b840190509392505050565b600061383882613c34565b6138428185613c5b565b9350613852818560208601613e6f565b61385b8161407b565b840191505092915050565b600061387182613c34565b61387b8185613c6c565b935061388b818560208601613e6f565b80840191505092915050565b600081546138a481613ea2565b6138ae8186613c6c565b945060018216600081146138c957600181146138da5761390d565b60ff1983168652818601935061390d565b6138e385613c14565b60005b83811015613905578154818901526001820191506020810190506138e6565b838801955050505b50505092915050565b6000613923602683613c5b565b915061392e82614099565b604082019050919050565b6000613946600583613c6c565b9150613951826140e8565b600582019050919050565b6000613969602083613c5b565b915061397482614111565b602082019050919050565b600061398c600083613c50565b91506139978261413a565b600082019050919050565b6139ab81613e14565b82525050565b6139ba81613e42565b82525050565b6139c981613e4c565b82525050565b60006139db8284613792565b60148201915081905092915050565b60006139f68285613897565b9150613a028284613866565b9150613a0d82613939565b91508190509392505050565b6000613a248261397f565b9150819050919050565b6000602082019050613a436000830184613783565b92915050565b6000608082019050613a5e6000830187613783565b613a6b6020830186613783565b613a7860408301856139b1565b8181036060830152613a8a81846137c7565b905095945050505050565b6000606082019050613aaa6000830186613783565b613ab760208301856139a2565b613ac460408301846139a2565b949350505050565b6000602082019050613ae160008301846137a9565b92915050565b6000602082019050613afc60008301846137b8565b92915050565b60006020820190508181036000830152613b1d818486613800565b90509392505050565b60006020820190508181036000830152613b40818461382d565b905092915050565b60006020820190508181036000830152613b6181613916565b9050919050565b60006020820190508181036000830152613b818161395c565b9050919050565b6000602082019050613b9d60008301846139b1565b92915050565b6000602082019050613bb860008301846139c0565b92915050565b6000613bc8613bd9565b9050613bd48282613ed4565b919050565b6000604051905090565b600067ffffffffffffffff821115613bfe57613bfd61402e565b5b613c078261407b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c8282613e42565b9150613c8d83613e42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cc257613cc1613f72565b5b828201905092915050565b6000613cd882613e42565b9150613ce383613e42565b925082613cf357613cf2613fa1565b5b828204905092915050565b6000613d0982613e42565b9150613d1483613e42565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d4d57613d4c613f72565b5b828202905092915050565b6000613d6382613e42565b9150613d6e83613e42565b925082821015613d8157613d80613f72565b5b828203905092915050565b6000613d9782613e4c565b9150613da283613e4c565b925082821015613db557613db4613f72565b5b828203905092915050565b6000613dcb82613e22565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613e8d578082015181840152602081019050613e72565b83811115613e9c576000848401525b50505050565b60006002820490506001821680613eba57607f821691505b60208210811415613ece57613ecd613fd0565b5b50919050565b613edd8261407b565b810181811067ffffffffffffffff82111715613efc57613efb61402e565b5b80604052505050565b6000613f1082613e42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f4357613f42613f72565b5b600182019050919050565b6000613f5982613f60565b9050919050565b6000613f6b8261408c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61414681613dc0565b811461415157600080fd5b50565b61415d81613dd2565b811461416857600080fd5b50565b61417481613dde565b811461417f57600080fd5b50565b61418b81613de8565b811461419657600080fd5b50565b6141a281613e42565b81146141ad57600080fd5b5056fea26469706673582212207e3aceea6a49f2da92f219102ac6cffe9727408a93b27e1eb3d3d97d7ddbefb664736f6c6343000807003300000000000000000000000000000000000000000000000000000000629f59e000000000000000000000000000000000000000000000000000000000629fca60cfcaef6fc6be98960944b9165ac155eaf4321c5a3b8fde2a8887760f046ff581

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80637f205a741161015a578063c87b56dd116100c1578063f0ba9cb81161007a578063f0ba9cb8146109c3578063f0bb1de614610a00578063f2fde38b14610a29578063f8c1c18614610a52578063fb918da214610a7d578063fe2c7fee14610aa857610293565b8063c87b56dd1461089a578063c9eb4662146108d7578063de8801e514610916578063e2cceb6214610941578063e985e9c51461096a578063edc0c72c146109a757610293565b80639dfbcde8116101135780639dfbcde81461079e578063a22cb465146107c9578063a2309ff8146107f2578063b88d4fde1461081d578063b9c3a81814610846578063bfa457bc1461087157610293565b80637f205a74146106ad5780638045179f146106d85780638ca887ca146107015780638da5cb5b1461071d57806395364a841461074857806395d89b411461077357610293565b806342842e0e116101fe5780636b69fd20116101b75780636b69fd201461059b5780636c0360eb146105c65780637035bf18146105f157806370a082311461061c578063715018a6146106595780637bbf4a3f1461067057610293565b806342842e0e1461048f57806346002b06146104b85780634783f0ef146104cf5780634c261247146104f857806359aa4ab3146105215780636352211e1461055e57610293565b80631afac3ba116102505780631afac3ba1461039157806320160e29146103ce578063229f3e29146103f957806323b872dd146104245780632eb4a7ab1461044d57806340f9bbe21461047857610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d57806318160ddd1461036657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba919061366f565b610ad1565b6040516102cc9190613acc565b60405180910390f35b3480156102e157600080fd5b506102ea610b63565b6040516102f79190613b26565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190613716565b610bf5565b6040516103349190613a2e565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f91906135b5565b610c71565b005b34801561037257600080fd5b5061037b610e18565b6040516103889190613b88565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613432565b610e2f565b6040516103c59190613b88565b60405180910390f35b3480156103da57600080fd5b506103e3610e4b565b6040516103f09190613b26565b60405180910390f35b34801561040557600080fd5b5061040e610ed9565b60405161041b9190613b88565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061349f565b610edf565b005b34801561045957600080fd5b50610462610eef565b60405161046f9190613ae7565b60405180910390f35b34801561048457600080fd5b5061048d610ef5565b005b34801561049b57600080fd5b506104b660048036038101906104b1919061349f565b6110ac565b005b3480156104c457600080fd5b506104cd6110cc565b005b3480156104db57600080fd5b506104f660048036038101906104f19190613642565b611283565b005b34801561050457600080fd5b5061051f600480360381019061051a91906136c9565b611340565b005b34801561052d57600080fd5b5061054860048036038101906105439190613432565b611454565b6040516105559190613b88565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190613716565b611483565b6040516105929190613a2e565b60405180910390f35b3480156105a757600080fd5b506105b0611495565b6040516105bd9190613ba3565b60405180910390f35b3480156105d257600080fd5b506105db61149a565b6040516105e89190613b26565b60405180910390f35b3480156105fd57600080fd5b50610606611528565b6040516106139190613b26565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190613432565b6115b6565b6040516106509190613b88565b60405180910390f35b34801561066557600080fd5b5061066e61164b565b005b34801561067c57600080fd5b5061069760048036038101906106929190613432565b6116d3565b6040516106a49190613acc565b60405180910390f35b3480156106b957600080fd5b506106c26116f3565b6040516106cf9190613b88565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa91906136c9565b6116ff565b005b61071b60048036038101906107169190613716565b6117ca565b005b34801561072957600080fd5b506107326118dc565b60405161073f9190613a2e565b60405180910390f35b34801561075457600080fd5b5061075d611906565b60405161076a9190613acc565b60405180910390f35b34801561077f57600080fd5b5061078861191f565b6040516107959190613b26565b60405180910390f35b3480156107aa57600080fd5b506107b36119b1565b6040516107c09190613ba3565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190613575565b6119c3565b005b3480156107fe57600080fd5b50610807611b3b565b6040516108149190613b88565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f91906134f2565b611b4a565b005b34801561085257600080fd5b5061085b611bbd565b6040516108689190613ba3565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613743565b611bc2565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613716565b611cec565b6040516108ce9190613b26565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190613716565b611f02565b60405161090d93929190613a95565b60405180910390f35b34801561092257600080fd5b5061092b611f74565b6040516109389190613b88565b60405180910390f35b34801561094d57600080fd5b5061096860048036038101906109639190613743565b611f7a565b005b34801561097657600080fd5b50610991600480360381019061098c919061345f565b6120a4565b60405161099e9190613acc565b60405180910390f35b6109c160048036038101906109bc91906135f5565b612138565b005b3480156109cf57600080fd5b506109ea60048036038101906109e59190613716565b612249565b6040516109f79190613acc565b60405180910390f35b348015610a0c57600080fd5b50610a276004803603810190610a2291906136c9565b61227f565b005b348015610a3557600080fd5b50610a506004803603810190610a4b9190613432565b612393565b005b348015610a5e57600080fd5b50610a6761248b565b604051610a749190613acc565b60405180910390f35b348015610a8957600080fd5b50610a92612497565b604051610a9f9190613b26565b60405180910390f35b348015610ab457600080fd5b50610acf6004803603810190610aca91906136c9565b612525565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b7290613ea2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9e90613ea2565b8015610beb5780601f10610bc057610100808354040283529160200191610beb565b820191906000526020600020905b815481529060010190602001808311610bce57829003601f168201915b5050505050905090565b6000610c00826125f0565b610c36576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7c8261264f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d0361271d565b73ffffffffffffffffffffffffffffffffffffffff1614610d6657610d2f81610d2a61271d565b6120a4565b610d65576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e22612725565b6001546000540303905090565b6000610e3a8261272e565b67ffffffffffffffff169050919050565b600e8054610e5890613ea2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8490613ea2565b8015610ed15780601f10610ea657610100808354040283529160200191610ed1565b820191906000526020600020905b815481529060010190602001808311610eb457829003601f168201915b505050505081565b60115481565b610eea83838361277b565b505050565b600b5481565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f78576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60004790506000811415610fb8576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b6009805490508110156110a857600060098281548110610fde57610fdd613fff565b5b9060005260206000200160000160149054906101000a900461ffff1661ffff16111561109b5761109a6009828154811061101b5761101a613fff565b5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600984815481106110605761105f613fff565b5b9060005260206000200160000160149054906101000a900461ffff1661ffff168561108b9190613cfe565b6110959190613ccd565b612b43565b5b8080600101915050610fbb565b5050565b6110c783838360405180602001604052806000815250611b4a565b505050565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661114f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000479050600081141561118f576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60098054905081101561127f576000600982815481106111b5576111b4613fff565b5b9060005260206000200160000160169054906101000a900461ffff1661ffff16111561127257611271600982815481106111f2576111f1613fff565b5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106009848154811061123757611236613fff565b5b9060005260206000200160000160169054906101000a900461ffff1661ffff16856112629190613cfe565b61126c9190613ccd565b612b43565b5b8080600101915050611192565b5050565b61128b612beb565b73ffffffffffffffffffffffffffffffffffffffff166112a96118dc565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613b68565b60405180910390fd5b80600b819055507f90004c04698bc3322499a575ed3752dd4abf33e0a7294c06a787a0fe01bea941816040516113359190613ae7565b60405180910390a150565b611348612beb565b73ffffffffffffffffffffffffffffffffffffffff166113666118dc565b73ffffffffffffffffffffffffffffffffffffffff16146113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b390613b68565b60405180910390fd5b6000600c80546113cb90613ea2565b90501115611405576040517fa89ac15100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181600c91906114169291906131f5565b507ff040279f20c4475afca9a566d33b14e09c92fcb6460fb4121fadf563ab9ecc1f8282604051611448929190613b02565b60405180910390a15050565b600061145f8261272e565b67ffffffffffffffff1661147283612bf3565b61147c9190613d58565b9050919050565b600061148e8261264f565b9050919050565b600581565b600c80546114a790613ea2565b80601f01602080910402602001604051908101604052809291908181526020018280546114d390613ea2565b80156115205780601f106114f557610100808354040283529160200191611520565b820191906000526020600020905b81548152906001019060200180831161150357829003601f168201915b505050505081565b600d805461153590613ea2565b80601f016020809104026020016040519081016040528092919081815260200182805461156190613ea2565b80156115ae5780601f10611583576101008083540402835291602001916115ae565b820191906000526020600020905b81548152906001019060200180831161159157829003601f168201915b505050505081565b6000806115c283612c4a565b14156115fa576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611653612beb565b73ffffffffffffffffffffffffffffffffffffffff166116716118dc565b73ffffffffffffffffffffffffffffffffffffffff16146116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be90613b68565b60405180910390fd5b6116d16000612c54565b565b600a6020528060005260406000206000915054906101000a900460ff1681565b670138a388a43c000081565b611707612beb565b73ffffffffffffffffffffffffffffffffffffffff166117256118dc565b73ffffffffffffffffffffffffffffffffffffffff161461177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177290613b68565b60405180910390fd5b8181600e919061178c9291906131f5565b507fa8e1aed230fb114b31f7ab0bce3ccf2342bd7805343bf73cf45d91af5d40cc7382826040516117be929190613b02565b60405180910390a15050565b6003811115611805576040517f9b4d7d3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180d61248b565b611843576040517fa7283fb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61184c81612249565b15611883576040517fe1ace8ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80670138a388a43c00006118979190613cfe565b34146118cf576040517fde94e21300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d93382612d1a565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006010544211801561191a575060115442105b905090565b60606003805461192e90613ea2565b80601f016020809104026020016040519081016040528092919081815260200182805461195a90613ea2565b80156119a75780601f1061197c576101008083540402835291602001916119a7565b820191906000526020600020905b81548152906001019060200180831161198a57829003601f168201915b5050505050905090565b6005611ed26119c09190613d8c565b81565b6119cb61271d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a30576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a3d61271d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aea61271d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b2f9190613acc565b60405180910390a35050565b6000611b45612eca565b905090565b611b5584848461277b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bb757611b8084848484612edd565b611bb6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b609181565b611bca612beb565b73ffffffffffffffffffffffffffffffffffffffff16611be86118dc565b73ffffffffffffffffffffffffffffffffffffffff1614611c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3590613b68565b60405180910390fd5b8160126000828254611c509190613c77565b92505081905550609167ffffffffffffffff166012541115611c9e576040517f8390347900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ca782612249565b15611cde576040517f5fd48f9100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ce88183612d1a565b5050565b6060611cf7826125f0565b611d2d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005611ed2611d3c9190613d8c565b67ffffffffffffffff16821115611e27576000600f8054611d5c90613ea2565b90501415611df457600e8054611d7190613ea2565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9d90613ea2565b8015611dea5780601f10611dbf57610100808354040283529160200191611dea565b820191906000526020600020905b815481529060010190602001808311611dcd57829003601f168201915b5050505050611e20565b600f611dff8361303d565b604051602001611e109291906139ea565b6040516020818303038152906040525b9050611efd565b6000600c8054611e3690613ea2565b90501415611ece57600d8054611e4b90613ea2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7790613ea2565b8015611ec45780601f10611e9957610100808354040283529160200191611ec4565b820191906000526020600020905b815481529060010190602001808311611ea757829003601f168201915b5050505050611efa565b600c611ed98361303d565b604051602001611eea9291906139ea565b6040516020818303038152906040525b90505b919050565b60098181548110611f1257600080fd5b906000526020600020016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900461ffff16908060000160169054906101000a900461ffff16905083565b60105481565b611f82612beb565b73ffffffffffffffffffffffffffffffffffffffff16611fa06118dc565b73ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90613b68565b60405180910390fd5b6120006001612249565b612036576040517fc680351e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81601360008282546120489190613c77565b92505081905550600567ffffffffffffffff166013541115612096576040517f8390347900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120a08183612d1a565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612140611906565b612176576040517f310a594a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061218133612bf3565b146121b8576040517fa85607a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121c3338383613097565b6121f9576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670138a388a43c0000341461223a576040517fde94e21300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612245336001612d1a565b5050565b60006005611ed261225a9190613d8c565b67ffffffffffffffff168261226d612eca565b6122779190613c77565b119050919050565b612287612beb565b73ffffffffffffffffffffffffffffffffffffffff166122a56118dc565b73ffffffffffffffffffffffffffffffffffffffff16146122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290613b68565b60405180910390fd5b6000600f805461230a90613ea2565b90501115612344576040517fa89ac15100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181600f91906123559291906131f5565b507fb763322da9170230a476b46e84e1eb8cdd681927127f3a947a5a5fdbf82772e98282604051612387929190613b02565b60405180910390a15050565b61239b612beb565b73ffffffffffffffffffffffffffffffffffffffff166123b96118dc565b73ffffffffffffffffffffffffffffffffffffffff161461240f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240690613b68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247690613b48565b60405180910390fd5b61248881612c54565b50565b60006011544211905090565b600f80546124a490613ea2565b80601f01602080910402602001604051908101604052809291908181526020018280546124d090613ea2565b801561251d5780601f106124f25761010080835404028352916020019161251d565b820191906000526020600020905b81548152906001019060200180831161250057829003601f168201915b505050505081565b61252d612beb565b73ffffffffffffffffffffffffffffffffffffffff1661254b6118dc565b73ffffffffffffffffffffffffffffffffffffffff16146125a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259890613b68565b60405180910390fd5b8181600d91906125b29291906131f5565b507facdfdd5724262f924ad56bda437d11c6cfe8ca3d58440f1052b335217431ba7e82826040516125e4929190613b02565b60405180910390a15050565b6000816125fb612725565b1115801561260a575060005482105b8015612648575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061265e612725565b116126e6576000548110156126e55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156126e3575b60008114156126d95760046000836001900393508381526020019081526020016000205490506126ae565b8092505050612718565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600060c0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c9050919050565b60006127868261264f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127ed576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff1661284661271d565b73ffffffffffffffffffffffffffffffffffffffff16148061287557506128748661286f61271d565b6120a4565b5b806128b2575061288361271d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806128eb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128f686612c4a565b141561292e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61293b86868660016130f5565b600061294683612c4a565b14612982576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612a4987612c4a565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415612ad3576000600185019050600060046000838152602001908152602001600020541415612ad1576000548114612ad0578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b3b86868660016130fb565b505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b6990613a19565b60006040518083038185875af1925050503d8060008114612ba6576040519150601f19603f3d011682016040523d82523d6000602084013e612bab565b606091505b5050905080612be6576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000805490506000612d2b84612c4a565b1415612d63576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612d9e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dab60008483856130f5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612e1060018414613101565b901b60a042901b612e2085612c4a565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612e4657816000819055505050612ec560008483856130fb565b505050565b6000612ed4612725565b60005403905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f0361271d565b8786866040518563ffffffff1660e01b8152600401612f259493929190613a49565b602060405180830381600087803b158015612f3f57600080fd5b505af1925050508015612f7057506040513d601f19601f82011682018060405250810190612f6d919061369c565b60015b612fea573d8060008114612fa0576040519150601f19603f3d011682016040523d82523d6000602084013e612fa5565b606091505b50600081511415612fe2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561308357600183039250600a81066030018353600a81049050613063565b508181036020830392508083525050919050565b60006130ec6130a58561310b565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061313b565b90509392505050565b50505050565b50505050565b6000819050919050565b60008160405160200161311e91906139cf565b604051602081830303815290604052805190602001209050919050565b600061314a82600b5485613152565b905092915050565b60008261315f8584613169565b1490509392505050565b60008082905060005b84518110156131d35760008582815181106131905761318f613fff565b5b602002602001015190508083116131b2576131ab83826131de565b92506131bf565b6131bc81846131de565b92505b5080806131cb90613f05565b915050613172565b508091505092915050565b600082600052816020526040600020905092915050565b82805461320190613ea2565b90600052602060002090601f016020900481019282613223576000855561326a565b82601f1061323c57803560ff191683800117855561326a565b8280016001018555821561326a579182015b8281111561326957823582559160200191906001019061324e565b5b509050613277919061327b565b5090565b5b8082111561329457600081600090555060010161327c565b5090565b60006132ab6132a684613be3565b613bbe565b9050828152602081018484840111156132c7576132c661406c565b5b6132d2848285613e60565b509392505050565b6000813590506132e98161413d565b92915050565b60008083601f84011261330557613304614062565b5b8235905067ffffffffffffffff8111156133225761332161405d565b5b60208301915083602082028301111561333e5761333d614067565b5b9250929050565b60008135905061335481614154565b92915050565b6000813590506133698161416b565b92915050565b60008135905061337e81614182565b92915050565b60008151905061339381614182565b92915050565b600082601f8301126133ae576133ad614062565b5b81356133be848260208601613298565b91505092915050565b60008083601f8401126133dd576133dc614062565b5b8235905067ffffffffffffffff8111156133fa576133f961405d565b5b60208301915083600182028301111561341657613415614067565b5b9250929050565b60008135905061342c81614199565b92915050565b60006020828403121561344857613447614076565b5b6000613456848285016132da565b91505092915050565b6000806040838503121561347657613475614076565b5b6000613484858286016132da565b9250506020613495858286016132da565b9150509250929050565b6000806000606084860312156134b8576134b7614076565b5b60006134c6868287016132da565b93505060206134d7868287016132da565b92505060406134e88682870161341d565b9150509250925092565b6000806000806080858703121561350c5761350b614076565b5b600061351a878288016132da565b945050602061352b878288016132da565b935050604061353c8782880161341d565b925050606085013567ffffffffffffffff81111561355d5761355c614071565b5b61356987828801613399565b91505092959194509250565b6000806040838503121561358c5761358b614076565b5b600061359a858286016132da565b92505060206135ab85828601613345565b9150509250929050565b600080604083850312156135cc576135cb614076565b5b60006135da858286016132da565b92505060206135eb8582860161341d565b9150509250929050565b6000806020838503121561360c5761360b614076565b5b600083013567ffffffffffffffff81111561362a57613629614071565b5b613636858286016132ef565b92509250509250929050565b60006020828403121561365857613657614076565b5b60006136668482850161335a565b91505092915050565b60006020828403121561368557613684614076565b5b60006136938482850161336f565b91505092915050565b6000602082840312156136b2576136b1614076565b5b60006136c084828501613384565b91505092915050565b600080602083850312156136e0576136df614076565b5b600083013567ffffffffffffffff8111156136fe576136fd614071565b5b61370a858286016133c7565b92509250509250929050565b60006020828403121561372c5761372b614076565b5b600061373a8482850161341d565b91505092915050565b6000806040838503121561375a57613759614076565b5b60006137688582860161341d565b9250506020613779858286016132da565b9150509250929050565b61378c81613dc0565b82525050565b6137a361379e82613dc0565b613f4e565b82525050565b6137b281613dd2565b82525050565b6137c181613dde565b82525050565b60006137d282613c29565b6137dc8185613c3f565b93506137ec818560208601613e6f565b6137f58161407b565b840191505092915050565b600061380c8385613c5b565b9350613819838584613e60565b6138228361407b565b840190509392505050565b600061383882613c34565b6138428185613c5b565b9350613852818560208601613e6f565b61385b8161407b565b840191505092915050565b600061387182613c34565b61387b8185613c6c565b935061388b818560208601613e6f565b80840191505092915050565b600081546138a481613ea2565b6138ae8186613c6c565b945060018216600081146138c957600181146138da5761390d565b60ff1983168652818601935061390d565b6138e385613c14565b60005b83811015613905578154818901526001820191506020810190506138e6565b838801955050505b50505092915050565b6000613923602683613c5b565b915061392e82614099565b604082019050919050565b6000613946600583613c6c565b9150613951826140e8565b600582019050919050565b6000613969602083613c5b565b915061397482614111565b602082019050919050565b600061398c600083613c50565b91506139978261413a565b600082019050919050565b6139ab81613e14565b82525050565b6139ba81613e42565b82525050565b6139c981613e4c565b82525050565b60006139db8284613792565b60148201915081905092915050565b60006139f68285613897565b9150613a028284613866565b9150613a0d82613939565b91508190509392505050565b6000613a248261397f565b9150819050919050565b6000602082019050613a436000830184613783565b92915050565b6000608082019050613a5e6000830187613783565b613a6b6020830186613783565b613a7860408301856139b1565b8181036060830152613a8a81846137c7565b905095945050505050565b6000606082019050613aaa6000830186613783565b613ab760208301856139a2565b613ac460408301846139a2565b949350505050565b6000602082019050613ae160008301846137a9565b92915050565b6000602082019050613afc60008301846137b8565b92915050565b60006020820190508181036000830152613b1d818486613800565b90509392505050565b60006020820190508181036000830152613b40818461382d565b905092915050565b60006020820190508181036000830152613b6181613916565b9050919050565b60006020820190508181036000830152613b818161395c565b9050919050565b6000602082019050613b9d60008301846139b1565b92915050565b6000602082019050613bb860008301846139c0565b92915050565b6000613bc8613bd9565b9050613bd48282613ed4565b919050565b6000604051905090565b600067ffffffffffffffff821115613bfe57613bfd61402e565b5b613c078261407b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c8282613e42565b9150613c8d83613e42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cc257613cc1613f72565b5b828201905092915050565b6000613cd882613e42565b9150613ce383613e42565b925082613cf357613cf2613fa1565b5b828204905092915050565b6000613d0982613e42565b9150613d1483613e42565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d4d57613d4c613f72565b5b828202905092915050565b6000613d6382613e42565b9150613d6e83613e42565b925082821015613d8157613d80613f72565b5b828203905092915050565b6000613d9782613e4c565b9150613da283613e4c565b925082821015613db557613db4613f72565b5b828203905092915050565b6000613dcb82613e22565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613e8d578082015181840152602081019050613e72565b83811115613e9c576000848401525b50505050565b60006002820490506001821680613eba57607f821691505b60208210811415613ece57613ecd613fd0565b5b50919050565b613edd8261407b565b810181811067ffffffffffffffff82111715613efc57613efb61402e565b5b80604052505050565b6000613f1082613e42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f4357613f42613f72565b5b600182019050919050565b6000613f5982613f60565b9050919050565b6000613f6b8261408c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61414681613dc0565b811461415157600080fd5b50565b61415d81613dd2565b811461416857600080fd5b50565b61417481613dde565b811461417f57600080fd5b50565b61418b81613de8565b811461419657600080fd5b50565b6141a281613e42565b81146141ad57600080fd5b5056fea26469706673582212207e3aceea6a49f2da92f219102ac6cffe9727408a93b27e1eb3d3d97d7ddbefb664736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000629f59e000000000000000000000000000000000000000000000000000000000629fca60cfcaef6fc6be98960944b9165ac155eaf4321c5a3b8fde2a8887760f046ff581

-----Decoded View---------------
Arg [0] : presaleStart_ (uint256): 1654610400
Arg [1] : presaleEnd_ (uint256): 1654639200
Arg [2] : merkleRoot_ (bytes32): 0xcfcaef6fc6be98960944b9165ac155eaf4321c5a3b8fde2a8887760f046ff581

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000629f59e0
Arg [1] : 00000000000000000000000000000000000000000000000000000000629fca60
Arg [2] : cfcaef6fc6be98960944b9165ac155eaf4321c5a3b8fde2a8887760f046ff581


Deployed Bytecode Sourcemap

47789:6566:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19302:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24325:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26393:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25853:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18356:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51513:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48754:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48862:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27279:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48636:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46472:474;;;;;;;;;;;;;:::i;:::-;;27520:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46954:489;;;;;;;;;;;;;:::i;:::-;;49949:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50093:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51636:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24114:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48299:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48692:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48720:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19981:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5402:103;;;;;;;;;;;;;:::i;:::-;;45192:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48242:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49700:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52239:431;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4751:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52678:149;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24494:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48510:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26669:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51410:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27776:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48347:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50564:368;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53081:656;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45166:19;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48828:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50940:462;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27048:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51784:447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52942:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50314:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5660:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52835:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48795:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49491:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19302:615;19387:4;19702:10;19687:25;;:11;:25;;;;:102;;;;19779:10;19764:25;;:11;:25;;;;19687:102;:179;;;;19856:10;19841:25;;:11;:25;;;;19687:179;19667:199;;19302:615;;;:::o;24325:100::-;24379:13;24412:5;24405:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24325:100;:::o;26393:204::-;26461:7;26486:16;26494:7;26486;:16::i;:::-;26481:64;;26511:34;;;;;;;;;;;;;;26481:64;26565:15;:24;26581:7;26565:24;;;;;;;;;;;;;;;;;;;;;26558:31;;26393:204;;;:::o;25853:474::-;25926:13;25958:27;25977:7;25958:18;:27::i;:::-;25926:61;;26008:5;26002:11;;:2;:11;;;25998:48;;;26022:24;;;;;;;;;;;;;;25998:48;26086:5;26063:28;;:19;:17;:19::i;:::-;:28;;;26059:175;;26111:44;26128:5;26135:19;:17;:19::i;:::-;26111:16;:44::i;:::-;26106:128;;26183:35;;;;;;;;;;;;;;26106:128;26059:175;26273:2;26246:15;:24;26262:7;26246:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;26311:7;26307:2;26291:28;;26300:5;26291:28;;;;;;;;;;;;25915:412;25853:474;;:::o;18356:315::-;18409:7;18637:15;:13;:15::i;:::-;18622:12;;18606:13;;:28;:46;18599:53;;18356:315;:::o;51513:115::-;51578:7;51605:15;51613:6;51605:7;:15::i;:::-;51598:22;;;;51513:115;;;:::o;48754:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48862:25::-;;;;:::o;27279:170::-;27413:28;27423:4;27429:2;27433:7;27413:9;:28::i;:::-;27279:170;;;:::o;48636:25::-;;;;:::o;46472:474::-;46523:7;:19;46531:10;46523:19;;;;;;;;;;;;;;;;;;;;;;;;;46518:60;;46564:14;;;;;;;;;;;;;;46518:60;46591:15;46609:21;46591:39;;46658:1;46647:7;:12;46643:51;;;46681:13;;;;;;;;;;;;;;46643:51;46712:9;46707:232;46727:5;:12;;;;46723:1;:16;46707:232;;;46780:1;46760:5;46766:1;46760:8;;;;;;;;:::i;:::-;;;;;;;;;:17;;;;;;;;;;;;:21;;;46756:107;;;46800:63;46810:5;46816:1;46810:8;;;;;;;;:::i;:::-;;;;;;;;;:15;;;;;;;;;;;;46857:5;46837;46843:1;46837:8;;;;;;;;:::i;:::-;;;;;;;;;:17;;;;;;;;;;;;46827:27;;:7;:27;;;;:::i;:::-;:35;;;;:::i;:::-;46800:9;:63::i;:::-;46756:107;46909:3;;;;;;;46707:232;;;;46507:439;46472:474::o;27520:185::-;27658:39;27675:4;27681:2;27685:7;27658:39;;;;;;;;;;;;:16;:39::i;:::-;27520:185;;;:::o;46954:489::-;47009:7;:19;47017:10;47009:19;;;;;;;;;;;;;;;;;;;;;;;;;47004:60;;47050:14;;;;;;;;;;;;;;47004:60;47077:15;47095:21;47077:39;;47144:1;47133:7;:12;47129:51;;;47167:13;;;;;;;;;;;;;;47129:51;47198:9;47193:243;47213:5;:12;;;;47209:1;:16;47193:243;;;47272:1;47247:5;47253:1;47247:8;;;;;;;;:::i;:::-;;;;;;;;;:22;;;;;;;;;;;;:26;;;47243:117;;;47292:68;47302:5;47308:1;47302:8;;;;;;;;:::i;:::-;;;;;;;;;:15;;;;;;;;;;;;47354:5;47329;47335:1;47329:8;;;;;;;;:::i;:::-;;;;;;;;;:22;;;;;;;;;;;;47319:32;;:7;:32;;;;:::i;:::-;:40;;;;:::i;:::-;47292:9;:68::i;:::-;47243:117;47406:3;;;;;;;47193:243;;;;46993:450;46954:489::o;49949:136::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50032:4:::1;50019:10;:17;;;;50054:23;50072:4;50054:23;;;;;;:::i;:::-;;;;;;;;49949:136:::0;:::o;50093:213::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50193:1:::1;50175:7;50169:21;;;;;:::i;:::-;;;:25;50165:68;;;50216:17;;;;;;;;;;;;;;50165:68;50256:8;;50246:7;:18;;;;;;;:::i;:::-;;50282:16;50289:8;;50282:16;;;;;;;:::i;:::-;;;;;;;;50093:213:::0;;:::o;51636:140::-;51702:7;51753:15;51761:6;51753:7;:15::i;:::-;51729:39;;:21;51743:6;51729:13;:21::i;:::-;:39;;;;:::i;:::-;51722:46;;51636:140;;;:::o;24114:144::-;24178:7;24221:27;24240:7;24221:18;:27::i;:::-;24198:52;;24114:144;;;:::o;48299:41::-;48339:1;48299:41;:::o;48692:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48720:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19981:234::-;20045:7;20097:1;20069:24;20087:5;20069:17;:24::i;:::-;:29;20065:70;;;20107:28;;;;;;;;;;;;;;20065:70;15320:13;20153:18;:25;20172:5;20153:25;;;;;;;;;;;;;;;;:54;20146:61;;19981:234;;;:::o;5402:103::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5467:30:::1;5494:1;5467:18;:30::i;:::-;5402:103::o:0;45192:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;48242:48::-;48279:11;48242:48;:::o;49700:241::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49848:21:::1;;49825:20;:44;;;;;;;:::i;:::-;;49887:46;49911:21;;49887:46;;;;;;;:::i;:::-;;;;;;;;49700:241:::0;;:::o;52239:431::-;52359:1;52350:6;:10;52346:60;;;52383:23;;;;;;;;;;;;;;52346:60;52424:8;:6;:8::i;:::-;52419:44;;52454:9;;;;;;;;;;;;;;52419:44;52480:17;52490:6;52480:9;:17::i;:::-;52476:58;;;52519:15;;;;;;;;;;;;;;52476:58;52577:6;48279:11;52564:19;;;;:::i;:::-;52551:9;:32;52547:77;;52605:19;;;;;;;;;;;;;;52547:77;52637:25;52643:10;52655:6;52637:5;:25::i;:::-;52239:431;:::o;4751:87::-;4797:7;4824:6;;;;;;;;;;;4817:13;;4751:87;:::o;52678:149::-;52720:4;52762:12;;52744:15;:30;:75;;;;;52809:10;;52791:15;:28;52744:75;52737:82;;52678:149;:::o;24494:104::-;24550:13;24583:7;24576:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24494:104;:::o;48510:58::-;48339:1;48547:4;:21;;;;:::i;:::-;48510:58;:::o;26669:308::-;26780:19;:17;:19::i;:::-;26768:31;;:8;:31;;;26764:61;;;26808:17;;;;;;;;;;;;;;26764:61;26890:8;26838:18;:39;26857:19;:17;:19::i;:::-;26838:39;;;;;;;;;;;;;;;:49;26878:8;26838:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26950:8;26914:55;;26929:19;:17;:19::i;:::-;26914:55;;;26960:8;26914:55;;;;;;:::i;:::-;;;;;;;;26669:308;;:::o;51410:95::-;51456:7;51483:14;:12;:14::i;:::-;51476:21;;51410:95;:::o;27776:396::-;27943:28;27953:4;27959:2;27963:7;27943:9;:28::i;:::-;28004:1;27986:2;:14;;;:19;27982:183;;28025:56;28056:4;28062:2;28066:7;28075:5;28025:30;:56::i;:::-;28020:145;;28109:40;;;;;;;;;;;;;;28020:145;27982:183;27776:396;;;;:::o;48347:40::-;48384:3;48347:40;:::o;50564:368::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50653:6:::1;50640:9;;:19;;;;;;;:::i;:::-;;;;;;;;48384:3;50676:23;;:9;;:23;50672:71;;;50721:22;;;;;;;;;;;;;;50672:71;50836:17;50846:6;50836:9;:17::i;:::-;50832:62;;;50875:19;;;;;;;;;;;;;;50832:62;50907:17;50913:2;50917:6;50907:5;:17::i;:::-;50564:368:::0;;:::o;53081:656::-;53181:13;53217:15;53225:6;53217:7;:15::i;:::-;53212:71;;53254:29;;;;;;;;;;;;;;53212:71;48339:1;48547:4;:21;;;;:::i;:::-;53340:20;;:6;:20;53336:394;;;53412:1;53390:10;53384:24;;;;;:::i;:::-;;;:29;;:154;;53518:20;53384:154;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53458:10;53470:17;53480:6;53470:9;:17::i;:::-;53441:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53384:154;53377:161;;;;53336:394;53603:1;53584:7;53578:21;;;;;:::i;:::-;;;:26;;:140;;53705:13;53578:140;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53648:7;53657:17;53667:6;53657:9;:17::i;:::-;53631:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53578:140;53571:147;;53081:656;;;;:::o;45166:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48828:27::-;;;;:::o;50940:462::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51183:12:::1;51193:1;51183:9;:12::i;:::-;51178:61;;51217:22;;;;;;;;;;;;;;51178:61;51268:6;51252:12;;:22;;;;;;;:::i;:::-;;;;;;;;48339:1;51291:29;;:12;;:29;51287:77;;;51342:22;;;;;;;;;;;;;;51287:77;51377:17;51383:2;51387:6;51377:5;:17::i;:::-;50940:462:::0;;:::o;27048:164::-;27145:4;27169:18;:25;27188:5;27169:25;;;;;;;;;;;;;;;:35;27195:8;27169:35;;;;;;;;;;;;;;;;;;;;;;;;;27162:42;;27048:164;;;;:::o;51784:447::-;51888:11;:9;:11::i;:::-;51883:50;;51921:12;;;;;;;;;;;;;;51883:50;51979:1;51950:25;51964:10;51950:13;:25::i;:::-;:30;51946:73;;52002:17;;;;;;;;;;;;;;51946:73;52037:34;52052:10;52064:6;;52037:14;:34::i;:::-;52032:77;;52093:16;;;;;;;;;;;;;;52032:77;48279:11;52126:9;:23;52122:68;;52171:19;;;;;;;;;;;;;;52122:68;52203:20;52209:10;52221:1;52203:5;:20::i;:::-;51784:447;;:::o;52942:131::-;53001:4;48339:1;48547:4;:21;;;;:::i;:::-;53025:40;;53042:9;53025:14;:12;:14::i;:::-;:26;;;;:::i;:::-;:40;53018:47;;52942:131;;;:::o;50314:242::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50427:1:::1;50406:10;50400:24;;;;;:::i;:::-;;;:28;50396:71;;;50450:17;;;;;;;;;;;;;;50396:71;50493:11;;50480:10;:24;;;;;;;:::i;:::-;;50522:26;50536:11;;50522:26;;;;;;;:::i;:::-;;;;;;;;50314:242:::0;;:::o;5660:201::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5769:1:::1;5749:22;;:8;:22;;;;5741:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5825:28;5844:8;5825:18;:28::i;:::-;5660:201:::0;:::o;52835:99::-;52874:4;52916:10;;52898:15;:28;52891:35;;52835:99;:::o;48795:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49491:200::-;4982:12;:10;:12::i;:::-;4971:23;;:7;:5;:7::i;:::-;:23;;;4963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49619:14:::1;;49603:13;:30;;;;;;;:::i;:::-;;49651:32;49668:14;;49651:32;;;;;;;:::i;:::-;;;;;;;;49491:200:::0;;:::o;28427:273::-;28484:4;28540:7;28521:15;:13;:15::i;:::-;:26;;:66;;;;;28574:13;;28564:7;:23;28521:66;:152;;;;;28672:1;16090:8;28625:17;:26;28643:7;28625:26;;;;;;;;;;;;:43;:48;28521:152;28501:172;;28427:273;;;:::o;21629:1129::-;21696:7;21716:12;21731:7;21716:22;;21799:4;21780:15;:13;:15::i;:::-;:23;21776:915;;21833:13;;21826:4;:20;21822:869;;;21871:14;21888:17;:23;21906:4;21888:23;;;;;;;;;;;;21871:40;;22004:1;16090:8;21977:6;:23;:28;21973:699;;;22496:113;22513:1;22503:6;:11;22496:113;;;22556:17;:25;22574:6;;;;;;;22556:25;;;;;;;;;;;;22547:34;;22496:113;;;22642:6;22635:13;;;;;;21973:699;21848:843;21822:869;21776:915;22719:31;;;;;;;;;;;;;;21629:1129;;;;:::o;42695:105::-;42755:7;42782:10;42775:17;;42695:105;:::o;53745:93::-;53802:7;53829:1;53822:8;;53745:93;:::o;20865:136::-;20920:6;15691:3;20953:18;:25;20972:5;20953:25;;;;;;;;;;;;;;;;:39;;20939:54;;20865:136;;;:::o;33686:2654::-;33801:27;33831;33850:7;33831:18;:27::i;:::-;33801:57;;33916:4;33875:45;;33891:19;33875:45;;;33871:86;;33929:28;;;;;;;;;;;;;;33871:86;33970:23;33996:15;:24;34012:7;33996:24;;;;;;;;;;;;;;;;;;;;;33970:50;;34033:22;34082:4;34059:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;34103:43;34120:4;34126:19;:17;:19::i;:::-;34103:16;:43::i;:::-;34059:87;:142;;;;34182:19;:17;:19::i;:::-;34163:38;;:15;:38;;;34059:142;34033:169;;34220:17;34215:66;;34246:35;;;;;;;;;;;;;;34215:66;34321:1;34296:21;34314:2;34296:17;:21::i;:::-;:26;34292:62;;;34331:23;;;;;;;;;;;;;;34292:62;34367:43;34389:4;34395:2;34399:7;34408:1;34367:21;:43::i;:::-;34518:1;34480:34;34498:15;34480:17;:34::i;:::-;:39;34476:103;;34543:15;:24;34559:7;34543:24;;;;;;;;;;;;34536:31;;;;;;;;;;;34476:103;34946:18;:24;34965:4;34946:24;;;;;;;;;;;;;;;;34944:26;;;;;;;;;;;;35015:18;:22;35034:2;35015:22;;;;;;;;;;;;;;;;35013:24;;;;;;;;;;;16372:8;15974:3;35396:15;:41;;35354:21;35372:2;35354:17;:21::i;:::-;:84;:128;35308:17;:26;35326:7;35308:26;;;;;;;;;;;:174;;;;35652:1;16372:8;35602:19;:46;:51;35598:626;;;35674:19;35706:1;35696:7;:11;35674:33;;35863:1;35829:17;:30;35847:11;35829:30;;;;;;;;;;;;:35;35825:384;;;35967:13;;35952:11;:28;35948:242;;36147:19;36114:17;:30;36132:11;36114:30;;;;;;;;;;;:52;;;;35948:242;35825:384;35655:569;35598:626;36271:7;36267:2;36252:27;;36261:4;36252:27;;;;;;;;;;;;36290:42;36311:4;36317:2;36321:7;36330:1;36290:20;:42::i;:::-;33790:2550;;;33686:2654;;;:::o;47451:204::-;47525:12;47543:8;:13;;47564:7;47543:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47524:52;;;47602:7;47597:50;;47631:16;;;;;;;;;;;;;;47597:50;47513:142;47451:204;;:::o;3471:98::-;3524:7;3551:10;3544:17;;3471:98;:::o;20297:176::-;20358:7;15320:13;15457:2;20386:18;:25;20405:5;20386:25;;;;;;;;;;;;;;;;:49;;20385:80;20378:87;;20297:176;;;:::o;25414:148::-;25478:14;25539:5;25529:15;;25414:148;;;:::o;6021:191::-;6095:16;6114:6;;;;;;;;;;;6095:25;;6140:8;6131:6;;:17;;;;;;;;;;;;;;;;;;6195:8;6164:40;;6185:8;6164:40;;;;;;;;;;;;6084:128;6021:191;:::o;31766:1666::-;31831:20;31854:13;;31831:36;;31907:1;31882:21;31900:2;31882:17;:21::i;:::-;:26;31878:58;;;31917:19;;;;;;;;;;;;;;31878:58;31963:1;31951:8;:13;31947:44;;;31973:18;;;;;;;;;;;;;;31947:44;32004:61;32034:1;32038:2;32042:12;32056:8;32004:21;:61::i;:::-;32608:1;15457:2;32579:1;:25;;32578:31;32566:8;:44;32540:18;:22;32559:2;32540:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;16237:3;33009:29;33036:1;33024:8;:13;33009:14;:29::i;:::-;:56;;15974:3;32946:15;:41;;32904:21;32922:2;32904:17;:21::i;:::-;:84;:162;32853:17;:31;32871:12;32853:31;;;;;;;;;;;:213;;;;33083:20;33106:12;33083:35;;33133:11;33162:8;33147:12;:23;33133:37;;33187:111;33239:14;;;;;;33235:2;33214:40;;33231:1;33214:40;;;;;;;;;;;;33293:3;33278:12;:18;33187:111;;33330:12;33314:13;:28;;;;32317:1037;;33364:60;33393:1;33397:2;33401:12;33415:8;33364:20;:60::i;:::-;31820:1612;31766:1666;;:::o;18769:285::-;18816:7;19020:15;:13;:15::i;:::-;19004:13;;:31;18997:38;;18769:285;:::o;40164:716::-;40327:4;40373:2;40348:45;;;40394:19;:17;:19::i;:::-;40415:4;40421:7;40430:5;40348:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40344:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40648:1;40631:6;:13;:18;40627:235;;;40677:40;;;;;;;;;;;;;;40627:235;40820:6;40814:13;40805:6;40801:2;40797:15;40790:38;40344:529;40517:54;;;40507:64;;;:6;:64;;;;40500:71;;;40164:716;;;;;;:::o;42906:1959::-;42963:17;43384:3;43377:4;43371:11;43367:21;43360:28;;43475:3;43469:4;43462:17;43581:3;44038:5;44168:1;44163:3;44159:11;44152:18;;44305:2;44299:4;44295:13;44291:2;44287:22;44282:3;44274:36;44346:2;44340:4;44336:13;44328:21;;43929:682;44365:4;43929:682;;;44540:1;44535:3;44531:11;44524:18;;44591:2;44585:4;44581:13;44577:2;44573:22;44568:3;44560:36;44461:2;44455:4;44451:13;44443:21;;43929:682;;;43933:431;44662:3;44657;44653:13;44777:2;44772:3;44768:12;44761:19;;44840:6;44835:3;44828:19;43002:1856;;42906:1959;;;:::o;53846:182::-;53961:4;53990:30;53998:14;54004:7;53998:5;:14::i;:::-;54014:5;;53990:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:30::i;:::-;53983:37;;53846:182;;;;;:::o;41528:159::-;;;;;:::o;42346:158::-;;;;;:::o;25649:142::-;25707:14;25768:5;25758:15;;25649:142;;;:::o;54036:124::-;54089:7;54143;54126:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;54116:36;;;;;;54109:43;;54036:124;;;:::o;54168:184::-;54272:4;54301:43;54320:5;54327:10;;54339:4;54301:18;:43::i;:::-;54294:50;;54168:184;;;;:::o;1321:190::-;1446:4;1499;1470:25;1483:5;1490:4;1470:12;:25::i;:::-;:33;1463:40;;1321:190;;;;;:::o;1872:675::-;1955:7;1975:20;1998:4;1975:27;;2018:9;2013:497;2037:5;:12;2033:1;:16;2013:497;;;2071:20;2094:5;2100:1;2094:8;;;;;;;;:::i;:::-;;;;;;;;2071:31;;2137:12;2121;:28;2117:382;;2264:42;2279:12;2293;2264:14;:42::i;:::-;2249:57;;2117:382;;;2441:42;2456:12;2470;2441:14;:42::i;:::-;2426:57;;2117:382;2056:454;2051:3;;;;;:::i;:::-;;;;2013:497;;;;2527:12;2520:19;;;1872:675;;;;:::o;2555:224::-;2623:13;2686:1;2680:4;2673:15;2715:1;2709:4;2702:15;2756:4;2750;2740:21;2731:30;;2555:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:139::-;1344:5;1382:6;1369:20;1360:29;;1398:33;1425:5;1398:33;:::i;:::-;1298:139;;;;:::o;1443:137::-;1488:5;1526:6;1513:20;1504:29;;1542:32;1568:5;1542:32;:::i;:::-;1443:137;;;;:::o;1586:141::-;1642:5;1673:6;1667:13;1658:22;;1689:32;1715:5;1689:32;:::i;:::-;1586:141;;;;:::o;1746:338::-;1801:5;1850:3;1843:4;1835:6;1831:17;1827:27;1817:122;;1858:79;;:::i;:::-;1817:122;1975:6;1962:20;2000:78;2074:3;2066:6;2059:4;2051:6;2047:17;2000:78;:::i;:::-;1991:87;;1807:277;1746:338;;;;:::o;2104:553::-;2162:8;2172:6;2222:3;2215:4;2207:6;2203:17;2199:27;2189:122;;2230:79;;:::i;:::-;2189:122;2343:6;2330:20;2320:30;;2373:18;2365:6;2362:30;2359:117;;;2395:79;;:::i;:::-;2359:117;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:128;;;2570:79;;:::i;:::-;2523:128;2104:553;;;;;:::o;2663:139::-;2709:5;2747:6;2734:20;2725:29;;2763:33;2790:5;2763:33;:::i;:::-;2663:139;;;;:::o;2808:329::-;2867:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:119;;;2922:79;;:::i;:::-;2884:119;3042:1;3067:53;3112:7;3103:6;3092:9;3088:22;3067:53;:::i;:::-;3057:63;;3013:117;2808:329;;;;:::o;3143:474::-;3211:6;3219;3268:2;3256:9;3247:7;3243:23;3239:32;3236:119;;;3274:79;;:::i;:::-;3236:119;3394:1;3419:53;3464:7;3455:6;3444:9;3440:22;3419:53;:::i;:::-;3409:63;;3365:117;3521:2;3547:53;3592:7;3583:6;3572:9;3568:22;3547:53;:::i;:::-;3537:63;;3492:118;3143:474;;;;;:::o;3623:619::-;3700:6;3708;3716;3765:2;3753:9;3744:7;3740:23;3736:32;3733:119;;;3771:79;;:::i;:::-;3733:119;3891:1;3916:53;3961:7;3952:6;3941:9;3937:22;3916:53;:::i;:::-;3906:63;;3862:117;4018:2;4044:53;4089:7;4080:6;4069:9;4065:22;4044:53;:::i;:::-;4034:63;;3989:118;4146:2;4172:53;4217:7;4208:6;4197:9;4193:22;4172:53;:::i;:::-;4162:63;;4117:118;3623:619;;;;;:::o;4248:943::-;4343:6;4351;4359;4367;4416:3;4404:9;4395:7;4391:23;4387:33;4384:120;;;4423:79;;:::i;:::-;4384:120;4543:1;4568:53;4613:7;4604:6;4593:9;4589:22;4568:53;:::i;:::-;4558:63;;4514:117;4670:2;4696:53;4741:7;4732:6;4721:9;4717:22;4696:53;:::i;:::-;4686:63;;4641:118;4798:2;4824:53;4869:7;4860:6;4849:9;4845:22;4824:53;:::i;:::-;4814:63;;4769:118;4954:2;4943:9;4939:18;4926:32;4985:18;4977:6;4974:30;4971:117;;;5007:79;;:::i;:::-;4971:117;5112:62;5166:7;5157:6;5146:9;5142:22;5112:62;:::i;:::-;5102:72;;4897:287;4248:943;;;;;;;:::o;5197:468::-;5262:6;5270;5319:2;5307:9;5298:7;5294:23;5290:32;5287:119;;;5325:79;;:::i;:::-;5287:119;5445:1;5470:53;5515:7;5506:6;5495:9;5491:22;5470:53;:::i;:::-;5460:63;;5416:117;5572:2;5598:50;5640:7;5631:6;5620:9;5616:22;5598:50;:::i;:::-;5588:60;;5543:115;5197:468;;;;;:::o;5671:474::-;5739:6;5747;5796:2;5784:9;5775:7;5771:23;5767:32;5764:119;;;5802:79;;:::i;:::-;5764:119;5922:1;5947:53;5992:7;5983:6;5972:9;5968:22;5947:53;:::i;:::-;5937:63;;5893:117;6049:2;6075:53;6120:7;6111:6;6100:9;6096:22;6075:53;:::i;:::-;6065:63;;6020:118;5671:474;;;;;:::o;6151:559::-;6237:6;6245;6294:2;6282:9;6273:7;6269:23;6265:32;6262:119;;;6300:79;;:::i;:::-;6262:119;6448:1;6437:9;6433:17;6420:31;6478:18;6470:6;6467:30;6464:117;;;6500:79;;:::i;:::-;6464:117;6613:80;6685:7;6676:6;6665:9;6661:22;6613:80;:::i;:::-;6595:98;;;;6391:312;6151:559;;;;;:::o;6716:329::-;6775:6;6824:2;6812:9;6803:7;6799:23;6795:32;6792:119;;;6830:79;;:::i;:::-;6792:119;6950:1;6975:53;7020:7;7011:6;7000:9;6996:22;6975:53;:::i;:::-;6965:63;;6921:117;6716:329;;;;:::o;7051:327::-;7109:6;7158:2;7146:9;7137:7;7133:23;7129:32;7126:119;;;7164:79;;:::i;:::-;7126:119;7284:1;7309:52;7353:7;7344:6;7333:9;7329:22;7309:52;:::i;:::-;7299:62;;7255:116;7051:327;;;;:::o;7384:349::-;7453:6;7502:2;7490:9;7481:7;7477:23;7473:32;7470:119;;;7508:79;;:::i;:::-;7470:119;7628:1;7653:63;7708:7;7699:6;7688:9;7684:22;7653:63;:::i;:::-;7643:73;;7599:127;7384:349;;;;:::o;7739:529::-;7810:6;7818;7867:2;7855:9;7846:7;7842:23;7838:32;7835:119;;;7873:79;;:::i;:::-;7835:119;8021:1;8010:9;8006:17;7993:31;8051:18;8043:6;8040:30;8037:117;;;8073:79;;:::i;:::-;8037:117;8186:65;8243:7;8234:6;8223:9;8219:22;8186:65;:::i;:::-;8168:83;;;;7964:297;7739:529;;;;;:::o;8274:329::-;8333:6;8382:2;8370:9;8361:7;8357:23;8353:32;8350:119;;;8388:79;;:::i;:::-;8350:119;8508:1;8533:53;8578:7;8569:6;8558:9;8554:22;8533:53;:::i;:::-;8523:63;;8479:117;8274:329;;;;:::o;8609:474::-;8677:6;8685;8734:2;8722:9;8713:7;8709:23;8705:32;8702:119;;;8740:79;;:::i;:::-;8702:119;8860:1;8885:53;8930:7;8921:6;8910:9;8906:22;8885:53;:::i;:::-;8875:63;;8831:117;8987:2;9013:53;9058:7;9049:6;9038:9;9034:22;9013:53;:::i;:::-;9003:63;;8958:118;8609:474;;;;;:::o;9089:118::-;9176:24;9194:5;9176:24;:::i;:::-;9171:3;9164:37;9089:118;;:::o;9213:157::-;9318:45;9338:24;9356:5;9338:24;:::i;:::-;9318:45;:::i;:::-;9313:3;9306:58;9213:157;;:::o;9376:109::-;9457:21;9472:5;9457:21;:::i;:::-;9452:3;9445:34;9376:109;;:::o;9491:118::-;9578:24;9596:5;9578:24;:::i;:::-;9573:3;9566:37;9491:118;;:::o;9615:360::-;9701:3;9729:38;9761:5;9729:38;:::i;:::-;9783:70;9846:6;9841:3;9783:70;:::i;:::-;9776:77;;9862:52;9907:6;9902:3;9895:4;9888:5;9884:16;9862:52;:::i;:::-;9939:29;9961:6;9939:29;:::i;:::-;9934:3;9930:39;9923:46;;9705:270;9615:360;;;;:::o;10005:304::-;10103:3;10124:71;10188:6;10183:3;10124:71;:::i;:::-;10117:78;;10205:43;10241:6;10236:3;10229:5;10205:43;:::i;:::-;10273:29;10295:6;10273:29;:::i;:::-;10268:3;10264:39;10257:46;;10005:304;;;;;:::o;10315:364::-;10403:3;10431:39;10464:5;10431:39;:::i;:::-;10486:71;10550:6;10545:3;10486:71;:::i;:::-;10479:78;;10566:52;10611:6;10606:3;10599:4;10592:5;10588:16;10566:52;:::i;:::-;10643:29;10665:6;10643:29;:::i;:::-;10638:3;10634:39;10627:46;;10407:272;10315:364;;;;:::o;10685:377::-;10791:3;10819:39;10852:5;10819:39;:::i;:::-;10874:89;10956:6;10951:3;10874:89;:::i;:::-;10867:96;;10972:52;11017:6;11012:3;11005:4;10998:5;10994:16;10972:52;:::i;:::-;11049:6;11044:3;11040:16;11033:23;;10795:267;10685:377;;;;:::o;11092:845::-;11195:3;11232:5;11226:12;11261:36;11287:9;11261:36;:::i;:::-;11313:89;11395:6;11390:3;11313:89;:::i;:::-;11306:96;;11433:1;11422:9;11418:17;11449:1;11444:137;;;;11595:1;11590:341;;;;11411:520;;11444:137;11528:4;11524:9;11513;11509:25;11504:3;11497:38;11564:6;11559:3;11555:16;11548:23;;11444:137;;11590:341;11657:38;11689:5;11657:38;:::i;:::-;11717:1;11731:154;11745:6;11742:1;11739:13;11731:154;;;11819:7;11813:14;11809:1;11804:3;11800:11;11793:35;11869:1;11860:7;11856:15;11845:26;;11767:4;11764:1;11760:12;11755:17;;11731:154;;;11914:6;11909:3;11905:16;11898:23;;11597:334;;11411:520;;11199:738;;11092:845;;;;:::o;11943:366::-;12085:3;12106:67;12170:2;12165:3;12106:67;:::i;:::-;12099:74;;12182:93;12271:3;12182:93;:::i;:::-;12300:2;12295:3;12291:12;12284:19;;11943:366;;;:::o;12315:400::-;12475:3;12496:84;12578:1;12573:3;12496:84;:::i;:::-;12489:91;;12589:93;12678:3;12589:93;:::i;:::-;12707:1;12702:3;12698:11;12691:18;;12315:400;;;:::o;12721:366::-;12863:3;12884:67;12948:2;12943:3;12884:67;:::i;:::-;12877:74;;12960:93;13049:3;12960:93;:::i;:::-;13078:2;13073:3;13069:12;13062:19;;12721:366;;;:::o;13093:398::-;13252:3;13273:83;13354:1;13349:3;13273:83;:::i;:::-;13266:90;;13365:93;13454:3;13365:93;:::i;:::-;13483:1;13478:3;13474:11;13467:18;;13093:398;;;:::o;13497:115::-;13582:23;13599:5;13582:23;:::i;:::-;13577:3;13570:36;13497:115;;:::o;13618:118::-;13705:24;13723:5;13705:24;:::i;:::-;13700:3;13693:37;13618:118;;:::o;13742:115::-;13827:23;13844:5;13827:23;:::i;:::-;13822:3;13815:36;13742:115;;:::o;13863:256::-;13975:3;13990:75;14061:3;14052:6;13990:75;:::i;:::-;14090:2;14085:3;14081:12;14074:19;;14110:3;14103:10;;13863:256;;;;:::o;14125:695::-;14403:3;14425:92;14513:3;14504:6;14425:92;:::i;:::-;14418:99;;14534:95;14625:3;14616:6;14534:95;:::i;:::-;14527:102;;14646:148;14790:3;14646:148;:::i;:::-;14639:155;;14811:3;14804:10;;14125:695;;;;;:::o;14826:379::-;15010:3;15032:147;15175:3;15032:147;:::i;:::-;15025:154;;15196:3;15189:10;;14826:379;;;:::o;15211:222::-;15304:4;15342:2;15331:9;15327:18;15319:26;;15355:71;15423:1;15412:9;15408:17;15399:6;15355:71;:::i;:::-;15211:222;;;;:::o;15439:640::-;15634:4;15672:3;15661:9;15657:19;15649:27;;15686:71;15754:1;15743:9;15739:17;15730:6;15686:71;:::i;:::-;15767:72;15835:2;15824:9;15820:18;15811:6;15767:72;:::i;:::-;15849;15917:2;15906:9;15902:18;15893:6;15849:72;:::i;:::-;15968:9;15962:4;15958:20;15953:2;15942:9;15938:18;15931:48;15996:76;16067:4;16058:6;15996:76;:::i;:::-;15988:84;;15439:640;;;;;;;:::o;16085:434::-;16230:4;16268:2;16257:9;16253:18;16245:26;;16281:71;16349:1;16338:9;16334:17;16325:6;16281:71;:::i;:::-;16362:70;16428:2;16417:9;16413:18;16404:6;16362:70;:::i;:::-;16442;16508:2;16497:9;16493:18;16484:6;16442:70;:::i;:::-;16085:434;;;;;;:::o;16525:210::-;16612:4;16650:2;16639:9;16635:18;16627:26;;16663:65;16725:1;16714:9;16710:17;16701:6;16663:65;:::i;:::-;16525:210;;;;:::o;16741:222::-;16834:4;16872:2;16861:9;16857:18;16849:26;;16885:71;16953:1;16942:9;16938:17;16929:6;16885:71;:::i;:::-;16741:222;;;;:::o;16969:333::-;17092:4;17130:2;17119:9;17115:18;17107:26;;17179:9;17173:4;17169:20;17165:1;17154:9;17150:17;17143:47;17207:88;17290:4;17281:6;17273;17207:88;:::i;:::-;17199:96;;16969:333;;;;;:::o;17308:313::-;17421:4;17459:2;17448:9;17444:18;17436:26;;17508:9;17502:4;17498:20;17494:1;17483:9;17479:17;17472:47;17536:78;17609:4;17600:6;17536:78;:::i;:::-;17528:86;;17308:313;;;;:::o;17627:419::-;17793:4;17831:2;17820:9;17816:18;17808:26;;17880:9;17874:4;17870:20;17866:1;17855:9;17851:17;17844:47;17908:131;18034:4;17908:131;:::i;:::-;17900:139;;17627:419;;;:::o;18052:::-;18218:4;18256:2;18245:9;18241:18;18233:26;;18305:9;18299:4;18295:20;18291:1;18280:9;18276:17;18269:47;18333:131;18459:4;18333:131;:::i;:::-;18325:139;;18052:419;;;:::o;18477:222::-;18570:4;18608:2;18597:9;18593:18;18585:26;;18621:71;18689:1;18678:9;18674:17;18665:6;18621:71;:::i;:::-;18477:222;;;;:::o;18705:218::-;18796:4;18834:2;18823:9;18819:18;18811:26;;18847:69;18913:1;18902:9;18898:17;18889:6;18847:69;:::i;:::-;18705:218;;;;:::o;18929:129::-;18963:6;18990:20;;:::i;:::-;18980:30;;19019:33;19047:4;19039:6;19019:33;:::i;:::-;18929:129;;;:::o;19064:75::-;19097:6;19130:2;19124:9;19114:19;;19064:75;:::o;19145:307::-;19206:4;19296:18;19288:6;19285:30;19282:56;;;19318:18;;:::i;:::-;19282:56;19356:29;19378:6;19356:29;:::i;:::-;19348:37;;19440:4;19434;19430:15;19422:23;;19145:307;;;:::o;19458:141::-;19507:4;19530:3;19522:11;;19553:3;19550:1;19543:14;19587:4;19584:1;19574:18;19566:26;;19458:141;;;:::o;19605:98::-;19656:6;19690:5;19684:12;19674:22;;19605:98;;;:::o;19709:99::-;19761:6;19795:5;19789:12;19779:22;;19709:99;;;:::o;19814:168::-;19897:11;19931:6;19926:3;19919:19;19971:4;19966:3;19962:14;19947:29;;19814:168;;;;:::o;19988:147::-;20089:11;20126:3;20111:18;;19988:147;;;;:::o;20141:169::-;20225:11;20259:6;20254:3;20247:19;20299:4;20294:3;20290:14;20275:29;;20141:169;;;;:::o;20316:148::-;20418:11;20455:3;20440:18;;20316:148;;;;:::o;20470:305::-;20510:3;20529:20;20547:1;20529:20;:::i;:::-;20524:25;;20563:20;20581:1;20563:20;:::i;:::-;20558:25;;20717:1;20649:66;20645:74;20642:1;20639:81;20636:107;;;20723:18;;:::i;:::-;20636:107;20767:1;20764;20760:9;20753:16;;20470:305;;;;:::o;20781:185::-;20821:1;20838:20;20856:1;20838:20;:::i;:::-;20833:25;;20872:20;20890:1;20872:20;:::i;:::-;20867:25;;20911:1;20901:35;;20916:18;;:::i;:::-;20901:35;20958:1;20955;20951:9;20946:14;;20781:185;;;;:::o;20972:348::-;21012:7;21035:20;21053:1;21035:20;:::i;:::-;21030:25;;21069:20;21087:1;21069:20;:::i;:::-;21064:25;;21257:1;21189:66;21185:74;21182:1;21179:81;21174:1;21167:9;21160:17;21156:105;21153:131;;;21264:18;;:::i;:::-;21153:131;21312:1;21309;21305:9;21294:20;;20972:348;;;;:::o;21326:191::-;21366:4;21386:20;21404:1;21386:20;:::i;:::-;21381:25;;21420:20;21438:1;21420:20;:::i;:::-;21415:25;;21459:1;21456;21453:8;21450:34;;;21464:18;;:::i;:::-;21450:34;21509:1;21506;21502:9;21494:17;;21326:191;;;;:::o;21523:188::-;21562:4;21582:19;21599:1;21582:19;:::i;:::-;21577:24;;21615:19;21632:1;21615:19;:::i;:::-;21610:24;;21653:1;21650;21647:8;21644:34;;;21658:18;;:::i;:::-;21644:34;21703:1;21700;21696:9;21688:17;;21523:188;;;;:::o;21717:96::-;21754:7;21783:24;21801:5;21783:24;:::i;:::-;21772:35;;21717:96;;;:::o;21819:90::-;21853:7;21896:5;21889:13;21882:21;21871:32;;21819:90;;;:::o;21915:77::-;21952:7;21981:5;21970:16;;21915:77;;;:::o;21998:149::-;22034:7;22074:66;22067:5;22063:78;22052:89;;21998:149;;;:::o;22153:89::-;22189:7;22229:6;22222:5;22218:18;22207:29;;22153:89;;;:::o;22248:126::-;22285:7;22325:42;22318:5;22314:54;22303:65;;22248:126;;;:::o;22380:77::-;22417:7;22446:5;22435:16;;22380:77;;;:::o;22463:101::-;22499:7;22539:18;22532:5;22528:30;22517:41;;22463:101;;;:::o;22570:154::-;22654:6;22649:3;22644;22631:30;22716:1;22707:6;22702:3;22698:16;22691:27;22570:154;;;:::o;22730:307::-;22798:1;22808:113;22822:6;22819:1;22816:13;22808:113;;;22907:1;22902:3;22898:11;22892:18;22888:1;22883:3;22879:11;22872:39;22844:2;22841:1;22837:10;22832:15;;22808:113;;;22939:6;22936:1;22933:13;22930:101;;;23019:1;23010:6;23005:3;23001:16;22994:27;22930:101;22779:258;22730:307;;;:::o;23043:320::-;23087:6;23124:1;23118:4;23114:12;23104:22;;23171:1;23165:4;23161:12;23192:18;23182:81;;23248:4;23240:6;23236:17;23226:27;;23182:81;23310:2;23302:6;23299:14;23279:18;23276:38;23273:84;;;23329:18;;:::i;:::-;23273:84;23094:269;23043:320;;;:::o;23369:281::-;23452:27;23474:4;23452:27;:::i;:::-;23444:6;23440:40;23582:6;23570:10;23567:22;23546:18;23534:10;23531:34;23528:62;23525:88;;;23593:18;;:::i;:::-;23525:88;23633:10;23629:2;23622:22;23412:238;23369:281;;:::o;23656:233::-;23695:3;23718:24;23736:5;23718:24;:::i;:::-;23709:33;;23764:66;23757:5;23754:77;23751:103;;;23834:18;;:::i;:::-;23751:103;23881:1;23874:5;23870:13;23863:20;;23656:233;;;:::o;23895:100::-;23934:7;23963:26;23983:5;23963:26;:::i;:::-;23952:37;;23895:100;;;:::o;24001:94::-;24040:7;24069:20;24083:5;24069:20;:::i;:::-;24058:31;;24001:94;;;:::o;24101:180::-;24149:77;24146:1;24139:88;24246:4;24243:1;24236:15;24270:4;24267:1;24260:15;24287:180;24335:77;24332:1;24325:88;24432:4;24429:1;24422:15;24456:4;24453:1;24446:15;24473:180;24521:77;24518:1;24511:88;24618:4;24615:1;24608:15;24642:4;24639:1;24632:15;24659:180;24707:77;24704:1;24697:88;24804:4;24801:1;24794:15;24828:4;24825:1;24818:15;24845:180;24893:77;24890:1;24883:88;24990:4;24987:1;24980:15;25014:4;25011:1;25004:15;25031:117;25140:1;25137;25130:12;25154:117;25263:1;25260;25253:12;25277:117;25386:1;25383;25376:12;25400:117;25509:1;25506;25499:12;25523:117;25632:1;25629;25622:12;25646:117;25755:1;25752;25745:12;25769:102;25810:6;25861:2;25857:7;25852:2;25845:5;25841:14;25837:28;25827:38;;25769:102;;;:::o;25877:94::-;25910:8;25958:5;25954:2;25950:14;25929:35;;25877:94;;;:::o;25977:225::-;26117:34;26113:1;26105:6;26101:14;26094:58;26186:8;26181:2;26173:6;26169:15;26162:33;25977:225;:::o;26208:155::-;26348:7;26344:1;26336:6;26332:14;26325:31;26208:155;:::o;26369:182::-;26509:34;26505:1;26497:6;26493:14;26486:58;26369:182;:::o;26557:114::-;;:::o;26677:122::-;26750:24;26768:5;26750:24;:::i;:::-;26743:5;26740:35;26730:63;;26789:1;26786;26779:12;26730:63;26677:122;:::o;26805:116::-;26875:21;26890:5;26875:21;:::i;:::-;26868:5;26865:32;26855:60;;26911:1;26908;26901:12;26855:60;26805:116;:::o;26927:122::-;27000:24;27018:5;27000:24;:::i;:::-;26993:5;26990:35;26980:63;;27039:1;27036;27029:12;26980:63;26927:122;:::o;27055:120::-;27127:23;27144:5;27127:23;:::i;:::-;27120:5;27117:34;27107:62;;27165:1;27162;27155:12;27107:62;27055:120;:::o;27181:122::-;27254:24;27272:5;27254:24;:::i;:::-;27247:5;27244:35;27234:63;;27293:1;27290;27283:12;27234:63;27181:122;:::o

Swarm Source

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