ETH Price: $2,644.25 (+1.65%)

Token

Meta$heroes Genesis (Meta$heroesGenesis)
 

Overview

Max Total Supply

104 Meta$heroesGenesis

Holders

36

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 Meta$heroesGenesis
0x67d58b48cdc46af423bcfe1ac4b40ee73975ffdf
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Meta$heroesGenesis

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-10-29
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.7; 
library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
   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) {
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                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)
        }
    }
}
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
 
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
 
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    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;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);


}

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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 bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // 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`
    // - [232..255] `extraData`
    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 (owner == address(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 auxiliary 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 auxiliary 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;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    using SafeMath for uint256;
    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) {
                            curr=curr.sub(1);
                            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;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * 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 Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

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

        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-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 {
        transferFrom(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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // 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 Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

contract Meta$heroesGenesis is ERC721A, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;

    uint256 public collectionSize = 3333;

    string public uri = "https://bafkreihzjcji4jfelbxd2ew2nidx666mhx2en4khmxdss54674huldkysq.ipfs.nftstorage.link/";
    bool public reveal = false;

    uint256 public price = 0.095 ether;
    uint256 public price_WL = 0.085 ether;

    bool public status = false;
    bool public status_WL = false;

    uint256 public mint_perTxn = 10;

    uint256 public mint_perAdd = 30;
    uint256 public mint_perAdd_WL = 10;

    bytes32 public merkleRoot = 0x69a961d0acd6efadcb5d05033eca8d6ef9523f395bfe03b751cd78af1dab5539;
    function setMerkleRoot(bytes32 m) public onlyOwner{
        merkleRoot = m;
    }

    constructor() ERC721A("Meta$heroes Genesis", "Meta$heroesGenesis")  {
        _safeMint(0xc344657A67eE162990D2800549468b488C0FD8DE, 31);
    }

    function giveaway(address recipient, uint256 quantity) public onlyOwner {
        require(totalSupply().add(quantity) <= collectionSize, "Giveaway exceeds current batch!!!");
        _safeMint(recipient, quantity);
    }

    function mint_WL(uint256 quantity, bytes32[] calldata merkleproof) public payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify( merkleproof, merkleRoot, leaf),"Not whitelisted");
        
        require(status_WL, "Whitelist Minting not active!!");
        require(quantity <= mint_perTxn && quantity > 0, "Invalid mint quantity!!");
        require(numberMinted(msg.sender).add(quantity) <= mint_perAdd_WL && quantity > 0, "Invalid mint quantity!!");
        require(msg.value >= quantity.mul(price_WL), "Insufficient eth sent for mint!!");
        require(totalSupply().add(quantity) <= collectionSize, "Mint exceeds Collection size!!");
        
        _safeMint(msg.sender, quantity);
    }

    function mint(uint256 quantity) public payable {
        require(status, "Public Minting not active!!");
        require(quantity <= mint_perTxn && quantity > 0, "Invalid mint quantity!!");
        require(numberMinted(msg.sender).add(quantity) <= mint_perAdd && quantity > 0, "Invalid mint quantity!!");
        require(msg.value >= quantity.mul(price), "Insufficient eth sent for mint!!");
        require(totalSupply().add(quantity) <= collectionSize, "Mint exceeds Collection size!!");
        
        _safeMint(msg.sender, quantity);
    }

    function switchWL() public onlyOwner {
        status_WL = !status_WL;
    }
    function switchPublic() public onlyOwner {
        status = !status;
    }

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

    function setReveal(string memory uri_) public onlyOwner() {
        reveal = true;
        uri = uri_;
    }

    function setPrice(uint256 number) public onlyOwner() {
        price = number;
    }
    function setPrice_WL(uint256 number) public onlyOwner() {
        price_WL = number;
    }

    function setMaxPerTx(uint256 number) public onlyOwner {
        mint_perTxn = number;
    }

    function setMaxPerAdd(uint256 number) public onlyOwner {
        mint_perAdd = number;
    }
    function setMaxPerAdd_WL(uint256 number) public onlyOwner {
        mint_perAdd_WL = number;
    }
 
    function withdraw() public onlyOwner {
        (bool response, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(response, "Reward distribution failed");
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if(reveal)
            return string(abi.encodePacked(uri, (tokenId).toString(), ".json"));
        return uri;
    }
    function _startTokenId() pure internal override returns (uint256) {
        return 1;
    }
    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"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":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleproof","type":"bytes32[]"}],"name":"mint_WL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint_perAdd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_perAdd_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_perTxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMaxPerAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMaxPerAdd_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setPrice_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status_WL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"switchPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610d0560095560405180608001604052806059815260200162004aff60599139600a90805190602001906200003b92919062000793565b506000600b60006101000a81548160ff02191690831515021790555067015181ff25a98000600c5567012dfb0cb5e88000600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff021916908315150217905550600a600f55601e601055600a6011557f69a961d0acd6efadcb5d05033eca8d6ef9523f395bfe03b751cd78af1dab553960001b601255348015620000e857600080fd5b506040518060400160405280601381526020017f4d657461246865726f65732047656e65736973000000000000000000000000008152506040518060400160405280601281526020017f4d657461246865726f657347656e65736973000000000000000000000000000081525081600290805190602001906200016d92919062000793565b5080600390805190602001906200018692919062000793565b5062000197620001ec60201b60201c565b6000819055505050620001bf620001b3620001f560201b60201c565b620001fd60201b60201c565b620001e673c344657a67ee162990d2800549468b488c0fd8de601f620002c360201b60201c565b62000a94565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e5828260405180602001604052806000815250620002e960201b60201c565b5050565b620002fb83836200039a60201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146200039557600080549050600083820390505b6200034460008683806001019450866200059960201b60201c565b6200037b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110620003295781600054146200039257600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000408576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141562000444576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200045960008483856200070b60201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620004e883620004ca60008660006200071160201b60201c565b620004db856200074160201b60201c565b176200075160201b60201c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200050c578060008190555050506200059460008483856200077c60201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005c76200078260201b60201c565b8786866040518563ffffffff1660e01b8152600401620005eb9493929190620008ef565b602060405180830381600087803b1580156200060657600080fd5b505af19250505080156200063a57506040513d601f19601f820116820180604052508101906200063791906200085a565b60015b620006b8573d80600081146200066d576040519150601f19603f3d011682016040523d82523d6000602084013e62000672565b606091505b50600081511415620006b0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8620007308686846200078a60201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054620007a190620009ff565b90600052602060002090601f016020900481019282620007c5576000855562000811565b82601f10620007e057805160ff191683800117855562000811565b8280016001018555821562000811579182015b8281111562000810578251825591602001919060010190620007f3565b5b50905062000820919062000824565b5090565b5b808211156200083f57600081600090555060010162000825565b5090565b600081519050620008548162000a7a565b92915050565b60006020828403121562000873576200087262000a64565b5b6000620008838482850162000843565b91505092915050565b62000897816200095f565b82525050565b6000620008aa8262000943565b620008b681856200094e565b9350620008c8818560208601620009c9565b620008d38162000a69565b840191505092915050565b620008e981620009bf565b82525050565b60006080820190506200090660008301876200088c565b6200091560208301866200088c565b620009246040830185620008de565b81810360608301526200093881846200089d565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b60006200096c826200099f565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620009e9578082015181840152602081019050620009cc565b83811115620009f9576000848401525b50505050565b6000600282049050600182168062000a1857607f821691505b6020821081141562000a2f5762000a2e62000a35565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000a858162000973565b811462000a9157600080fd5b50565b61405b8062000aa46000396000f3fe60806040526004361061025c5760003560e01c806371b3056c11610144578063b8315db3116100b6578063dc33e6811161007a578063dc33e68114610868578063e985e9c5146108a5578063eac989f8146108e2578063f1224b541461090d578063f2fde38b14610938578063f63f0a2b146109615761025c565b8063b8315db314610783578063b88d4fde146107ae578063c6f6f216146107d7578063c87b56dd14610800578063d32e1ca61461083d5761025c565b80639be70091116101085780639be70091146106a3578063a035b1fe146106bf578063a0712d68146106ea578063a22cb46514610706578063a475b5dd1461072f578063b7e7bb791461075a5761025c565b806371b3056c146105d05780637cb64759146105fb5780638da5cb5b1461062457806391b7f5ed1461064f57806395d89b41146106785761025c565b806323b872dd116101dd57806355f804b3116101a157806355f804b3146104d657806358c76daf146104ff5780636352211e1461052857806368eec7b31461056557806370a082311461057c578063715018a6146105b95761025c565b806323b872dd146104175780632eb4a7ab146104405780633ccfd60b1461046b57806342842e0e1461048257806345c0f533146104ab5761025c565b8063081812fc11610224578063081812fc14610332578063095ea7b31461036f57806318160ddd146103985780631eb5ef5d146103c3578063200d2ed2146103ec5761025c565b806301ffc9a71461026157806302470e4e1461029e578063037bbbb9146102b5578063050225ea146102de57806306fdde0314610307575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613165565b61098c565b6040516102959190613697565b60405180910390f35b3480156102aa57600080fd5b506102b3610a1e565b005b3480156102c157600080fd5b506102dc60048036038101906102d79190613208565b610ac6565b005b3480156102ea57600080fd5b50610305600480360381019061030091906130f8565b610b4c565b005b34801561031357600080fd5b5061031c610c34565b60405161032991906136cd565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613208565b610cc6565b6040516103669190613630565b60405180910390f35b34801561037b57600080fd5b50610396600480360381019061039191906130f8565b610d42565b005b3480156103a457600080fd5b506103ad610e83565b6040516103ba919061384f565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e591906131bf565b610e9a565b005b3480156103f857600080fd5b50610401610f4b565b60405161040e9190613697565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190612fe2565b610f5e565b005b34801561044c57600080fd5b50610455611283565b60405161046291906136b2565b60405180910390f35b34801561047757600080fd5b50610480611289565b005b34801561048e57600080fd5b506104a960048036038101906104a49190612fe2565b6113b4565b005b3480156104b757600080fd5b506104c06113d4565b6040516104cd919061384f565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906131bf565b6113da565b005b34801561050b57600080fd5b5061052660048036038101906105219190613208565b611470565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613208565b6114f6565b60405161055c9190613630565b60405180910390f35b34801561057157600080fd5b5061057a611508565b005b34801561058857600080fd5b506105a3600480360381019061059e9190612f75565b6115b0565b6040516105b0919061384f565b60405180910390f35b3480156105c557600080fd5b506105ce611669565b005b3480156105dc57600080fd5b506105e56116f1565b6040516105f2919061384f565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613138565b6116f7565b005b34801561063057600080fd5b5061063961177d565b6040516106469190613630565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613208565b6117a7565b005b34801561068457600080fd5b5061068d61182d565b60405161069a91906136cd565b60405180910390f35b6106bd60048036038101906106b89190613235565b6118bf565b005b3480156106cb57600080fd5b506106d4611b47565b6040516106e1919061384f565b60405180910390f35b61070460048036038101906106ff9190613208565b611b4d565b005b34801561071257600080fd5b5061072d600480360381019061072891906130b8565b611d1a565b005b34801561073b57600080fd5b50610744611e92565b6040516107519190613697565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190613208565b611ea5565b005b34801561078f57600080fd5b50610798611f2b565b6040516107a5919061384f565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613035565b611f31565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190613208565b611fa4565b005b34801561080c57600080fd5b5061082760048036038101906108229190613208565b61202a565b60405161083491906136cd565b60405180910390f35b34801561084957600080fd5b5061085261214e565b60405161085f919061384f565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190612f75565b612154565b60405161089c919061384f565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190612fa2565b612166565b6040516108d99190613697565b60405180910390f35b3480156108ee57600080fd5b506108f76121fa565b60405161090491906136cd565b60405180910390f35b34801561091957600080fd5b50610922612288565b60405161092f919061384f565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190612f75565b61228e565b005b34801561096d57600080fd5b50610976612386565b6040516109839190613697565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a175750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610a26612399565b73ffffffffffffffffffffffffffffffffffffffff16610a4461177d565b73ffffffffffffffffffffffffffffffffffffffff1614610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a91906137ef565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b610ace612399565b73ffffffffffffffffffffffffffffffffffffffff16610aec61177d565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906137ef565b60405180910390fd5b80600d8190555050565b610b54612399565b73ffffffffffffffffffffffffffffffffffffffff16610b7261177d565b73ffffffffffffffffffffffffffffffffffffffff1614610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906137ef565b60405180910390fd5b600954610be582610bd7610e83565b6123a190919063ffffffff16565b1115610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d9061370f565b60405180910390fd5b610c3082826123b7565b5050565b606060028054610c4390613b29565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90613b29565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050905090565b6000610cd1826123d5565b610d07576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d4d826114f6565b90508073ffffffffffffffffffffffffffffffffffffffff16610d6e612434565b73ffffffffffffffffffffffffffffffffffffffff1614610dd157610d9a81610d95612434565b612166565b610dd0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e8d61243c565b6001546000540303905090565b610ea2612399565b73ffffffffffffffffffffffffffffffffffffffff16610ec061177d565b73ffffffffffffffffffffffffffffffffffffffff1614610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d906137ef565b60405180910390fd5b6001600b60006101000a81548160ff02191690831515021790555080600a9080519060200190610f47929190612d1e565b5050565b600e60009054906101000a900460ff1681565b6000610f6982612445565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fdc84612522565b91509150610ff28187610fed612434565b612544565b61103e5761100786611002612434565b612166565b61103d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156110a5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110b28686866001612588565b80156110bd57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061118b8561116788888761258e565b7c0200000000000000000000000000000000000000000000000000000000176125b6565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611213576000600185019050600060046000838152602001908152602001600020541415611211576000548114611210578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461127b86868660016125e1565b505050505050565b60125481565b611291612399565b73ffffffffffffffffffffffffffffffffffffffff166112af61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc906137ef565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161132b9061361b565b60006040518083038185875af1925050503d8060008114611368576040519150601f19603f3d011682016040523d82523d6000602084013e61136d565b606091505b50509050806113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a8906137cf565b60405180910390fd5b50565b6113cf83838360405180602001604052806000815250611f31565b505050565b60095481565b6113e2612399565b73ffffffffffffffffffffffffffffffffffffffff1661140061177d565b73ffffffffffffffffffffffffffffffffffffffff1614611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d906137ef565b60405180910390fd5b80600a908051906020019061146c929190612d1e565b5050565b611478612399565b73ffffffffffffffffffffffffffffffffffffffff1661149661177d565b73ffffffffffffffffffffffffffffffffffffffff16146114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e3906137ef565b60405180910390fd5b8060108190555050565b600061150182612445565b9050919050565b611510612399565b73ffffffffffffffffffffffffffffffffffffffff1661152e61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906137ef565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611618576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611671612399565b73ffffffffffffffffffffffffffffffffffffffff1661168f61177d565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc906137ef565b60405180910390fd5b6116ef60006125e7565b565b60105481565b6116ff612399565b73ffffffffffffffffffffffffffffffffffffffff1661171d61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a906137ef565b60405180910390fd5b8060128190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117af612399565b73ffffffffffffffffffffffffffffffffffffffff166117cd61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a906137ef565b60405180910390fd5b80600c8190555050565b60606003805461183c90613b29565b80601f016020809104026020016040519081016040528092919081815260200182805461186890613b29565b80156118b55780601f1061188a576101008083540402835291602001916118b5565b820191906000526020600020905b81548152906001019060200180831161189857829003601f168201915b5050505050905090565b6000336040516020016118d291906135d1565b604051602081830303815290604052805190602001209050611938838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601254836126ad565b611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e906137af565b60405180910390fd5b600e60019054906101000a900460ff166119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061376f565b60405180910390fd5b600f5484111580156119d85750600084115b611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e9061372f565b60405180910390fd5b601154611a3585611a2733612154565b6123a190919063ffffffff16565b11158015611a435750600084115b611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a799061372f565b60405180910390fd5b611a97600d54856126c490919063ffffffff16565b341015611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad09061374f565b60405180910390fd5b600954611af685611ae8610e83565b6123a190919063ffffffff16565b1115611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e9061378f565b60405180910390fd5b611b4133856123b7565b50505050565b600c5481565b600e60009054906101000a900460ff16611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b939061382f565b60405180910390fd5b600f548111158015611bae5750600081115b611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be49061372f565b60405180910390fd5b601054611c0b82611bfd33612154565b6123a190919063ffffffff16565b11158015611c195750600081115b611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f9061372f565b60405180910390fd5b611c6d600c54826126c490919063ffffffff16565b341015611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca69061374f565b60405180910390fd5b600954611ccc82611cbe610e83565b6123a190919063ffffffff16565b1115611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d049061378f565b60405180910390fd5b611d1733826123b7565b50565b611d22612434565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d87576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d94612434565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e41612434565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e869190613697565b60405180910390a35050565b600b60009054906101000a900460ff1681565b611ead612399565b73ffffffffffffffffffffffffffffffffffffffff16611ecb61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f18906137ef565b60405180910390fd5b8060118190555050565b60115481565b611f3c848484610f5e565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f9e57611f67848484846126da565b611f9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611fac612399565b73ffffffffffffffffffffffffffffffffffffffff16611fca61177d565b73ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612017906137ef565b60405180910390fd5b80600f8190555050565b6060612035826123d5565b612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b9061380f565b60405180910390fd5b600b60009054906101000a900460ff16156120bb57600a6120948361283a565b6040516020016120a59291906135ec565b6040516020818303038152906040529050612149565b600a80546120c890613b29565b80601f01602080910402602001604051908101604052809291908181526020018280546120f490613b29565b80156121415780601f1061211657610100808354040283529160200191612141565b820191906000526020600020905b81548152906001019060200180831161212457829003601f168201915b505050505090505b919050565b600f5481565b600061215f8261299b565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a805461220790613b29565b80601f016020809104026020016040519081016040528092919081815260200182805461223390613b29565b80156122805780601f1061225557610100808354040283529160200191612280565b820191906000526020600020905b81548152906001019060200180831161226357829003601f168201915b505050505081565b600d5481565b612296612399565b73ffffffffffffffffffffffffffffffffffffffff166122b461177d565b73ffffffffffffffffffffffffffffffffffffffff161461230a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612301906137ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561237a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612371906136ef565b60405180910390fd5b612383816125e7565b50565b600e60019054906101000a900460ff1681565b600033905090565b600081836123af9190613954565b905092915050565b6123d18282604051806020016040528060008152506129f2565b5050565b6000816123e061243c565b111580156123ef575060005482105b801561242d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061245461243c565b116124eb576000548110156124ea5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156124e8575b60008114156124de576124c1600183612a8f90919063ffffffff16565b9150600460008381526020019081526020016000205490506124a4565b809250505061251d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125a5868684612aa5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826126ba8584612aae565b1490509392505050565b600081836126d291906139db565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612700612434565b8786866040518563ffffffff1660e01b8152600401612722949392919061364b565b602060405180830381600087803b15801561273c57600080fd5b505af192505050801561276d57506040513d601f19601f8201168201806040525081019061276a9190613192565b60015b6127e7573d806000811461279d576040519150601f19603f3d011682016040523d82523d6000602084013e6127a2565b606091505b506000815114156127df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612882576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612996565b600082905060005b600082146128b457808061289d90613b8c565b915050600a826128ad91906139aa565b915061288a565b60008167ffffffffffffffff8111156128d0576128cf613ce6565b5b6040519080825280601f01601f1916602001820160405280156129025781602001600182028036833780820191505090505b5090505b6000851461298f5760018261291b9190613a35565b9150600a8561292a9190613bf9565b60306129369190613954565b60f81b81838151811061294c5761294b613cb7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561298891906139aa565b9450612906565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6129fc8383612b23565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a8a57600080549050600083820390505b612a3c60008683806001019450866126da565b612a72576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a29578160005414612a8757600080fd5b50505b505050565b60008183612a9d9190613a35565b905092915050565b60009392505050565b60008082905060005b8451811015612b18576000858281518110612ad557612ad4613cb7565b5b60200260200101519050808311612af757612af08382612cf7565b9250612b04565b612b018184612cf7565b92505b508080612b1090613b8c565b915050612ab7565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b90576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612bcb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd86000848385612588565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c4f83612c40600086600061258e565b612c4985612d0e565b176125b6565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c7357806000819055505050612cf260008483856125e1565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612d2a90613b29565b90600052602060002090601f016020900481019282612d4c5760008555612d93565b82601f10612d6557805160ff1916838001178555612d93565b82800160010185558215612d93579182015b82811115612d92578251825591602001919060010190612d77565b5b509050612da09190612da4565b5090565b5b80821115612dbd576000816000905550600101612da5565b5090565b6000612dd4612dcf8461388f565b61386a565b905082815260208101848484011115612df057612def613d24565b5b612dfb848285613ae7565b509392505050565b6000612e16612e11846138c0565b61386a565b905082815260208101848484011115612e3257612e31613d24565b5b612e3d848285613ae7565b509392505050565b600081359050612e5481613fb2565b92915050565b60008083601f840112612e7057612e6f613d1a565b5b8235905067ffffffffffffffff811115612e8d57612e8c613d15565b5b602083019150836020820283011115612ea957612ea8613d1f565b5b9250929050565b600081359050612ebf81613fc9565b92915050565b600081359050612ed481613fe0565b92915050565b600081359050612ee981613ff7565b92915050565b600081519050612efe81613ff7565b92915050565b600082601f830112612f1957612f18613d1a565b5b8135612f29848260208601612dc1565b91505092915050565b600082601f830112612f4757612f46613d1a565b5b8135612f57848260208601612e03565b91505092915050565b600081359050612f6f8161400e565b92915050565b600060208284031215612f8b57612f8a613d2e565b5b6000612f9984828501612e45565b91505092915050565b60008060408385031215612fb957612fb8613d2e565b5b6000612fc785828601612e45565b9250506020612fd885828601612e45565b9150509250929050565b600080600060608486031215612ffb57612ffa613d2e565b5b600061300986828701612e45565b935050602061301a86828701612e45565b925050604061302b86828701612f60565b9150509250925092565b6000806000806080858703121561304f5761304e613d2e565b5b600061305d87828801612e45565b945050602061306e87828801612e45565b935050604061307f87828801612f60565b925050606085013567ffffffffffffffff8111156130a05761309f613d29565b5b6130ac87828801612f04565b91505092959194509250565b600080604083850312156130cf576130ce613d2e565b5b60006130dd85828601612e45565b92505060206130ee85828601612eb0565b9150509250929050565b6000806040838503121561310f5761310e613d2e565b5b600061311d85828601612e45565b925050602061312e85828601612f60565b9150509250929050565b60006020828403121561314e5761314d613d2e565b5b600061315c84828501612ec5565b91505092915050565b60006020828403121561317b5761317a613d2e565b5b600061318984828501612eda565b91505092915050565b6000602082840312156131a8576131a7613d2e565b5b60006131b684828501612eef565b91505092915050565b6000602082840312156131d5576131d4613d2e565b5b600082013567ffffffffffffffff8111156131f3576131f2613d29565b5b6131ff84828501612f32565b91505092915050565b60006020828403121561321e5761321d613d2e565b5b600061322c84828501612f60565b91505092915050565b60008060006040848603121561324e5761324d613d2e565b5b600061325c86828701612f60565b935050602084013567ffffffffffffffff81111561327d5761327c613d29565b5b61328986828701612e5a565b92509250509250925092565b61329e81613a69565b82525050565b6132b56132b082613a69565b613bd5565b82525050565b6132c481613a7b565b82525050565b6132d381613a87565b82525050565b60006132e482613906565b6132ee818561391c565b93506132fe818560208601613af6565b61330781613d33565b840191505092915050565b600061331d82613911565b6133278185613938565b9350613337818560208601613af6565b61334081613d33565b840191505092915050565b600061335682613911565b6133608185613949565b9350613370818560208601613af6565b80840191505092915050565b6000815461338981613b29565b6133938186613949565b945060018216600081146133ae57600181146133bf576133f2565b60ff198316865281860193506133f2565b6133c8856138f1565b60005b838110156133ea578154818901526001820191506020810190506133cb565b838801955050505b50505092915050565b6000613408602683613938565b915061341382613d51565b604082019050919050565b600061342b602183613938565b915061343682613da0565b604082019050919050565b600061344e601783613938565b915061345982613def565b602082019050919050565b6000613471602083613938565b915061347c82613e18565b602082019050919050565b6000613494601e83613938565b915061349f82613e41565b602082019050919050565b60006134b7601e83613938565b91506134c282613e6a565b602082019050919050565b60006134da600f83613938565b91506134e582613e93565b602082019050919050565b60006134fd601a83613938565b915061350882613ebc565b602082019050919050565b6000613520600583613949565b915061352b82613ee5565b600582019050919050565b6000613543602083613938565b915061354e82613f0e565b602082019050919050565b6000613566602f83613938565b915061357182613f37565b604082019050919050565b6000613589601b83613938565b915061359482613f86565b602082019050919050565b60006135ac60008361392d565b91506135b782613faf565b600082019050919050565b6135cb81613add565b82525050565b60006135dd82846132a4565b60148201915081905092915050565b60006135f8828561337c565b9150613604828461334b565b915061360f82613513565b91508190509392505050565b60006136268261359f565b9150819050919050565b60006020820190506136456000830184613295565b92915050565b60006080820190506136606000830187613295565b61366d6020830186613295565b61367a60408301856135c2565b818103606083015261368c81846132d9565b905095945050505050565b60006020820190506136ac60008301846132bb565b92915050565b60006020820190506136c760008301846132ca565b92915050565b600060208201905081810360008301526136e78184613312565b905092915050565b60006020820190508181036000830152613708816133fb565b9050919050565b600060208201905081810360008301526137288161341e565b9050919050565b6000602082019050818103600083015261374881613441565b9050919050565b6000602082019050818103600083015261376881613464565b9050919050565b6000602082019050818103600083015261378881613487565b9050919050565b600060208201905081810360008301526137a8816134aa565b9050919050565b600060208201905081810360008301526137c8816134cd565b9050919050565b600060208201905081810360008301526137e8816134f0565b9050919050565b6000602082019050818103600083015261380881613536565b9050919050565b6000602082019050818103600083015261382881613559565b9050919050565b600060208201905081810360008301526138488161357c565b9050919050565b600060208201905061386460008301846135c2565b92915050565b6000613874613885565b90506138808282613b5b565b919050565b6000604051905090565b600067ffffffffffffffff8211156138aa576138a9613ce6565b5b6138b382613d33565b9050602081019050919050565b600067ffffffffffffffff8211156138db576138da613ce6565b5b6138e482613d33565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061395f82613add565b915061396a83613add565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399f5761399e613c2a565b5b828201905092915050565b60006139b582613add565b91506139c083613add565b9250826139d0576139cf613c59565b5b828204905092915050565b60006139e682613add565b91506139f183613add565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2a57613a29613c2a565b5b828202905092915050565b6000613a4082613add565b9150613a4b83613add565b925082821015613a5e57613a5d613c2a565b5b828203905092915050565b6000613a7482613abd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b14578082015181840152602081019050613af9565b83811115613b23576000848401525b50505050565b60006002820490506001821680613b4157607f821691505b60208210811415613b5557613b54613c88565b5b50919050565b613b6482613d33565b810181811067ffffffffffffffff82111715613b8357613b82613ce6565b5b80604052505050565b6000613b9782613add565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bca57613bc9613c2a565b5b600182019050919050565b6000613be082613be7565b9050919050565b6000613bf282613d44565b9050919050565b6000613c0482613add565b9150613c0f83613add565b925082613c1f57613c1e613c59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f476976656177617920657863656564732063757272656e74206261746368212160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e74207175616e746974792121000000000000000000600082015250565b7f496e73756666696369656e74206574682073656e7420666f72206d696e742121600082015250565b7f57686974656c697374204d696e74696e67206e6f742061637469766521210000600082015250565b7f4d696e74206578636565647320436f6c6c656374696f6e2073697a6521210000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f52657761726420646973747269627574696f6e206661696c6564000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c6963204d696e74696e67206e6f742061637469766521210000000000600082015250565b50565b613fbb81613a69565b8114613fc657600080fd5b50565b613fd281613a7b565b8114613fdd57600080fd5b50565b613fe981613a87565b8114613ff457600080fd5b50565b61400081613a91565b811461400b57600080fd5b50565b61401781613add565b811461402257600080fd5b5056fea2646970667358221220f42efafa83de5fe45f4c0e6f68bdc85e842189e472989486581c7bf60b37087564736f6c6343000807003368747470733a2f2f6261666b726569687a6a636a69346a66656c627864326577326e6964783636366d687832656e346b686d78647373353436373468756c646b7973712e697066732e6e667473746f726167652e6c696e6b2f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806371b3056c11610144578063b8315db3116100b6578063dc33e6811161007a578063dc33e68114610868578063e985e9c5146108a5578063eac989f8146108e2578063f1224b541461090d578063f2fde38b14610938578063f63f0a2b146109615761025c565b8063b8315db314610783578063b88d4fde146107ae578063c6f6f216146107d7578063c87b56dd14610800578063d32e1ca61461083d5761025c565b80639be70091116101085780639be70091146106a3578063a035b1fe146106bf578063a0712d68146106ea578063a22cb46514610706578063a475b5dd1461072f578063b7e7bb791461075a5761025c565b806371b3056c146105d05780637cb64759146105fb5780638da5cb5b1461062457806391b7f5ed1461064f57806395d89b41146106785761025c565b806323b872dd116101dd57806355f804b3116101a157806355f804b3146104d657806358c76daf146104ff5780636352211e1461052857806368eec7b31461056557806370a082311461057c578063715018a6146105b95761025c565b806323b872dd146104175780632eb4a7ab146104405780633ccfd60b1461046b57806342842e0e1461048257806345c0f533146104ab5761025c565b8063081812fc11610224578063081812fc14610332578063095ea7b31461036f57806318160ddd146103985780631eb5ef5d146103c3578063200d2ed2146103ec5761025c565b806301ffc9a71461026157806302470e4e1461029e578063037bbbb9146102b5578063050225ea146102de57806306fdde0314610307575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613165565b61098c565b6040516102959190613697565b60405180910390f35b3480156102aa57600080fd5b506102b3610a1e565b005b3480156102c157600080fd5b506102dc60048036038101906102d79190613208565b610ac6565b005b3480156102ea57600080fd5b50610305600480360381019061030091906130f8565b610b4c565b005b34801561031357600080fd5b5061031c610c34565b60405161032991906136cd565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613208565b610cc6565b6040516103669190613630565b60405180910390f35b34801561037b57600080fd5b50610396600480360381019061039191906130f8565b610d42565b005b3480156103a457600080fd5b506103ad610e83565b6040516103ba919061384f565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e591906131bf565b610e9a565b005b3480156103f857600080fd5b50610401610f4b565b60405161040e9190613697565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190612fe2565b610f5e565b005b34801561044c57600080fd5b50610455611283565b60405161046291906136b2565b60405180910390f35b34801561047757600080fd5b50610480611289565b005b34801561048e57600080fd5b506104a960048036038101906104a49190612fe2565b6113b4565b005b3480156104b757600080fd5b506104c06113d4565b6040516104cd919061384f565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906131bf565b6113da565b005b34801561050b57600080fd5b5061052660048036038101906105219190613208565b611470565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613208565b6114f6565b60405161055c9190613630565b60405180910390f35b34801561057157600080fd5b5061057a611508565b005b34801561058857600080fd5b506105a3600480360381019061059e9190612f75565b6115b0565b6040516105b0919061384f565b60405180910390f35b3480156105c557600080fd5b506105ce611669565b005b3480156105dc57600080fd5b506105e56116f1565b6040516105f2919061384f565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613138565b6116f7565b005b34801561063057600080fd5b5061063961177d565b6040516106469190613630565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613208565b6117a7565b005b34801561068457600080fd5b5061068d61182d565b60405161069a91906136cd565b60405180910390f35b6106bd60048036038101906106b89190613235565b6118bf565b005b3480156106cb57600080fd5b506106d4611b47565b6040516106e1919061384f565b60405180910390f35b61070460048036038101906106ff9190613208565b611b4d565b005b34801561071257600080fd5b5061072d600480360381019061072891906130b8565b611d1a565b005b34801561073b57600080fd5b50610744611e92565b6040516107519190613697565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190613208565b611ea5565b005b34801561078f57600080fd5b50610798611f2b565b6040516107a5919061384f565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613035565b611f31565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190613208565b611fa4565b005b34801561080c57600080fd5b5061082760048036038101906108229190613208565b61202a565b60405161083491906136cd565b60405180910390f35b34801561084957600080fd5b5061085261214e565b60405161085f919061384f565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190612f75565b612154565b60405161089c919061384f565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190612fa2565b612166565b6040516108d99190613697565b60405180910390f35b3480156108ee57600080fd5b506108f76121fa565b60405161090491906136cd565b60405180910390f35b34801561091957600080fd5b50610922612288565b60405161092f919061384f565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190612f75565b61228e565b005b34801561096d57600080fd5b50610976612386565b6040516109839190613697565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a175750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610a26612399565b73ffffffffffffffffffffffffffffffffffffffff16610a4461177d565b73ffffffffffffffffffffffffffffffffffffffff1614610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a91906137ef565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b610ace612399565b73ffffffffffffffffffffffffffffffffffffffff16610aec61177d565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906137ef565b60405180910390fd5b80600d8190555050565b610b54612399565b73ffffffffffffffffffffffffffffffffffffffff16610b7261177d565b73ffffffffffffffffffffffffffffffffffffffff1614610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906137ef565b60405180910390fd5b600954610be582610bd7610e83565b6123a190919063ffffffff16565b1115610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d9061370f565b60405180910390fd5b610c3082826123b7565b5050565b606060028054610c4390613b29565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90613b29565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050905090565b6000610cd1826123d5565b610d07576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d4d826114f6565b90508073ffffffffffffffffffffffffffffffffffffffff16610d6e612434565b73ffffffffffffffffffffffffffffffffffffffff1614610dd157610d9a81610d95612434565b612166565b610dd0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e8d61243c565b6001546000540303905090565b610ea2612399565b73ffffffffffffffffffffffffffffffffffffffff16610ec061177d565b73ffffffffffffffffffffffffffffffffffffffff1614610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d906137ef565b60405180910390fd5b6001600b60006101000a81548160ff02191690831515021790555080600a9080519060200190610f47929190612d1e565b5050565b600e60009054906101000a900460ff1681565b6000610f6982612445565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fdc84612522565b91509150610ff28187610fed612434565b612544565b61103e5761100786611002612434565b612166565b61103d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156110a5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110b28686866001612588565b80156110bd57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061118b8561116788888761258e565b7c0200000000000000000000000000000000000000000000000000000000176125b6565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611213576000600185019050600060046000838152602001908152602001600020541415611211576000548114611210578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461127b86868660016125e1565b505050505050565b60125481565b611291612399565b73ffffffffffffffffffffffffffffffffffffffff166112af61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc906137ef565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161132b9061361b565b60006040518083038185875af1925050503d8060008114611368576040519150601f19603f3d011682016040523d82523d6000602084013e61136d565b606091505b50509050806113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a8906137cf565b60405180910390fd5b50565b6113cf83838360405180602001604052806000815250611f31565b505050565b60095481565b6113e2612399565b73ffffffffffffffffffffffffffffffffffffffff1661140061177d565b73ffffffffffffffffffffffffffffffffffffffff1614611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d906137ef565b60405180910390fd5b80600a908051906020019061146c929190612d1e565b5050565b611478612399565b73ffffffffffffffffffffffffffffffffffffffff1661149661177d565b73ffffffffffffffffffffffffffffffffffffffff16146114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e3906137ef565b60405180910390fd5b8060108190555050565b600061150182612445565b9050919050565b611510612399565b73ffffffffffffffffffffffffffffffffffffffff1661152e61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906137ef565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611618576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611671612399565b73ffffffffffffffffffffffffffffffffffffffff1661168f61177d565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc906137ef565b60405180910390fd5b6116ef60006125e7565b565b60105481565b6116ff612399565b73ffffffffffffffffffffffffffffffffffffffff1661171d61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a906137ef565b60405180910390fd5b8060128190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117af612399565b73ffffffffffffffffffffffffffffffffffffffff166117cd61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a906137ef565b60405180910390fd5b80600c8190555050565b60606003805461183c90613b29565b80601f016020809104026020016040519081016040528092919081815260200182805461186890613b29565b80156118b55780601f1061188a576101008083540402835291602001916118b5565b820191906000526020600020905b81548152906001019060200180831161189857829003601f168201915b5050505050905090565b6000336040516020016118d291906135d1565b604051602081830303815290604052805190602001209050611938838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601254836126ad565b611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e906137af565b60405180910390fd5b600e60019054906101000a900460ff166119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061376f565b60405180910390fd5b600f5484111580156119d85750600084115b611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e9061372f565b60405180910390fd5b601154611a3585611a2733612154565b6123a190919063ffffffff16565b11158015611a435750600084115b611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a799061372f565b60405180910390fd5b611a97600d54856126c490919063ffffffff16565b341015611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad09061374f565b60405180910390fd5b600954611af685611ae8610e83565b6123a190919063ffffffff16565b1115611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e9061378f565b60405180910390fd5b611b4133856123b7565b50505050565b600c5481565b600e60009054906101000a900460ff16611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b939061382f565b60405180910390fd5b600f548111158015611bae5750600081115b611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be49061372f565b60405180910390fd5b601054611c0b82611bfd33612154565b6123a190919063ffffffff16565b11158015611c195750600081115b611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f9061372f565b60405180910390fd5b611c6d600c54826126c490919063ffffffff16565b341015611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca69061374f565b60405180910390fd5b600954611ccc82611cbe610e83565b6123a190919063ffffffff16565b1115611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d049061378f565b60405180910390fd5b611d1733826123b7565b50565b611d22612434565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d87576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d94612434565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e41612434565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e869190613697565b60405180910390a35050565b600b60009054906101000a900460ff1681565b611ead612399565b73ffffffffffffffffffffffffffffffffffffffff16611ecb61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f18906137ef565b60405180910390fd5b8060118190555050565b60115481565b611f3c848484610f5e565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f9e57611f67848484846126da565b611f9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611fac612399565b73ffffffffffffffffffffffffffffffffffffffff16611fca61177d565b73ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612017906137ef565b60405180910390fd5b80600f8190555050565b6060612035826123d5565b612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b9061380f565b60405180910390fd5b600b60009054906101000a900460ff16156120bb57600a6120948361283a565b6040516020016120a59291906135ec565b6040516020818303038152906040529050612149565b600a80546120c890613b29565b80601f01602080910402602001604051908101604052809291908181526020018280546120f490613b29565b80156121415780601f1061211657610100808354040283529160200191612141565b820191906000526020600020905b81548152906001019060200180831161212457829003601f168201915b505050505090505b919050565b600f5481565b600061215f8261299b565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a805461220790613b29565b80601f016020809104026020016040519081016040528092919081815260200182805461223390613b29565b80156122805780601f1061225557610100808354040283529160200191612280565b820191906000526020600020905b81548152906001019060200180831161226357829003601f168201915b505050505081565b600d5481565b612296612399565b73ffffffffffffffffffffffffffffffffffffffff166122b461177d565b73ffffffffffffffffffffffffffffffffffffffff161461230a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612301906137ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561237a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612371906136ef565b60405180910390fd5b612383816125e7565b50565b600e60019054906101000a900460ff1681565b600033905090565b600081836123af9190613954565b905092915050565b6123d18282604051806020016040528060008152506129f2565b5050565b6000816123e061243c565b111580156123ef575060005482105b801561242d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061245461243c565b116124eb576000548110156124ea5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156124e8575b60008114156124de576124c1600183612a8f90919063ffffffff16565b9150600460008381526020019081526020016000205490506124a4565b809250505061251d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125a5868684612aa5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826126ba8584612aae565b1490509392505050565b600081836126d291906139db565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612700612434565b8786866040518563ffffffff1660e01b8152600401612722949392919061364b565b602060405180830381600087803b15801561273c57600080fd5b505af192505050801561276d57506040513d601f19601f8201168201806040525081019061276a9190613192565b60015b6127e7573d806000811461279d576040519150601f19603f3d011682016040523d82523d6000602084013e6127a2565b606091505b506000815114156127df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612882576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612996565b600082905060005b600082146128b457808061289d90613b8c565b915050600a826128ad91906139aa565b915061288a565b60008167ffffffffffffffff8111156128d0576128cf613ce6565b5b6040519080825280601f01601f1916602001820160405280156129025781602001600182028036833780820191505090505b5090505b6000851461298f5760018261291b9190613a35565b9150600a8561292a9190613bf9565b60306129369190613954565b60f81b81838151811061294c5761294b613cb7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561298891906139aa565b9450612906565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6129fc8383612b23565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a8a57600080549050600083820390505b612a3c60008683806001019450866126da565b612a72576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a29578160005414612a8757600080fd5b50505b505050565b60008183612a9d9190613a35565b905092915050565b60009392505050565b60008082905060005b8451811015612b18576000858281518110612ad557612ad4613cb7565b5b60200260200101519050808311612af757612af08382612cf7565b9250612b04565b612b018184612cf7565b92505b508080612b1090613b8c565b915050612ab7565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b90576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612bcb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd86000848385612588565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c4f83612c40600086600061258e565b612c4985612d0e565b176125b6565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c7357806000819055505050612cf260008483856125e1565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612d2a90613b29565b90600052602060002090601f016020900481019282612d4c5760008555612d93565b82601f10612d6557805160ff1916838001178555612d93565b82800160010185558215612d93579182015b82811115612d92578251825591602001919060010190612d77565b5b509050612da09190612da4565b5090565b5b80821115612dbd576000816000905550600101612da5565b5090565b6000612dd4612dcf8461388f565b61386a565b905082815260208101848484011115612df057612def613d24565b5b612dfb848285613ae7565b509392505050565b6000612e16612e11846138c0565b61386a565b905082815260208101848484011115612e3257612e31613d24565b5b612e3d848285613ae7565b509392505050565b600081359050612e5481613fb2565b92915050565b60008083601f840112612e7057612e6f613d1a565b5b8235905067ffffffffffffffff811115612e8d57612e8c613d15565b5b602083019150836020820283011115612ea957612ea8613d1f565b5b9250929050565b600081359050612ebf81613fc9565b92915050565b600081359050612ed481613fe0565b92915050565b600081359050612ee981613ff7565b92915050565b600081519050612efe81613ff7565b92915050565b600082601f830112612f1957612f18613d1a565b5b8135612f29848260208601612dc1565b91505092915050565b600082601f830112612f4757612f46613d1a565b5b8135612f57848260208601612e03565b91505092915050565b600081359050612f6f8161400e565b92915050565b600060208284031215612f8b57612f8a613d2e565b5b6000612f9984828501612e45565b91505092915050565b60008060408385031215612fb957612fb8613d2e565b5b6000612fc785828601612e45565b9250506020612fd885828601612e45565b9150509250929050565b600080600060608486031215612ffb57612ffa613d2e565b5b600061300986828701612e45565b935050602061301a86828701612e45565b925050604061302b86828701612f60565b9150509250925092565b6000806000806080858703121561304f5761304e613d2e565b5b600061305d87828801612e45565b945050602061306e87828801612e45565b935050604061307f87828801612f60565b925050606085013567ffffffffffffffff8111156130a05761309f613d29565b5b6130ac87828801612f04565b91505092959194509250565b600080604083850312156130cf576130ce613d2e565b5b60006130dd85828601612e45565b92505060206130ee85828601612eb0565b9150509250929050565b6000806040838503121561310f5761310e613d2e565b5b600061311d85828601612e45565b925050602061312e85828601612f60565b9150509250929050565b60006020828403121561314e5761314d613d2e565b5b600061315c84828501612ec5565b91505092915050565b60006020828403121561317b5761317a613d2e565b5b600061318984828501612eda565b91505092915050565b6000602082840312156131a8576131a7613d2e565b5b60006131b684828501612eef565b91505092915050565b6000602082840312156131d5576131d4613d2e565b5b600082013567ffffffffffffffff8111156131f3576131f2613d29565b5b6131ff84828501612f32565b91505092915050565b60006020828403121561321e5761321d613d2e565b5b600061322c84828501612f60565b91505092915050565b60008060006040848603121561324e5761324d613d2e565b5b600061325c86828701612f60565b935050602084013567ffffffffffffffff81111561327d5761327c613d29565b5b61328986828701612e5a565b92509250509250925092565b61329e81613a69565b82525050565b6132b56132b082613a69565b613bd5565b82525050565b6132c481613a7b565b82525050565b6132d381613a87565b82525050565b60006132e482613906565b6132ee818561391c565b93506132fe818560208601613af6565b61330781613d33565b840191505092915050565b600061331d82613911565b6133278185613938565b9350613337818560208601613af6565b61334081613d33565b840191505092915050565b600061335682613911565b6133608185613949565b9350613370818560208601613af6565b80840191505092915050565b6000815461338981613b29565b6133938186613949565b945060018216600081146133ae57600181146133bf576133f2565b60ff198316865281860193506133f2565b6133c8856138f1565b60005b838110156133ea578154818901526001820191506020810190506133cb565b838801955050505b50505092915050565b6000613408602683613938565b915061341382613d51565b604082019050919050565b600061342b602183613938565b915061343682613da0565b604082019050919050565b600061344e601783613938565b915061345982613def565b602082019050919050565b6000613471602083613938565b915061347c82613e18565b602082019050919050565b6000613494601e83613938565b915061349f82613e41565b602082019050919050565b60006134b7601e83613938565b91506134c282613e6a565b602082019050919050565b60006134da600f83613938565b91506134e582613e93565b602082019050919050565b60006134fd601a83613938565b915061350882613ebc565b602082019050919050565b6000613520600583613949565b915061352b82613ee5565b600582019050919050565b6000613543602083613938565b915061354e82613f0e565b602082019050919050565b6000613566602f83613938565b915061357182613f37565b604082019050919050565b6000613589601b83613938565b915061359482613f86565b602082019050919050565b60006135ac60008361392d565b91506135b782613faf565b600082019050919050565b6135cb81613add565b82525050565b60006135dd82846132a4565b60148201915081905092915050565b60006135f8828561337c565b9150613604828461334b565b915061360f82613513565b91508190509392505050565b60006136268261359f565b9150819050919050565b60006020820190506136456000830184613295565b92915050565b60006080820190506136606000830187613295565b61366d6020830186613295565b61367a60408301856135c2565b818103606083015261368c81846132d9565b905095945050505050565b60006020820190506136ac60008301846132bb565b92915050565b60006020820190506136c760008301846132ca565b92915050565b600060208201905081810360008301526136e78184613312565b905092915050565b60006020820190508181036000830152613708816133fb565b9050919050565b600060208201905081810360008301526137288161341e565b9050919050565b6000602082019050818103600083015261374881613441565b9050919050565b6000602082019050818103600083015261376881613464565b9050919050565b6000602082019050818103600083015261378881613487565b9050919050565b600060208201905081810360008301526137a8816134aa565b9050919050565b600060208201905081810360008301526137c8816134cd565b9050919050565b600060208201905081810360008301526137e8816134f0565b9050919050565b6000602082019050818103600083015261380881613536565b9050919050565b6000602082019050818103600083015261382881613559565b9050919050565b600060208201905081810360008301526138488161357c565b9050919050565b600060208201905061386460008301846135c2565b92915050565b6000613874613885565b90506138808282613b5b565b919050565b6000604051905090565b600067ffffffffffffffff8211156138aa576138a9613ce6565b5b6138b382613d33565b9050602081019050919050565b600067ffffffffffffffff8211156138db576138da613ce6565b5b6138e482613d33565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061395f82613add565b915061396a83613add565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399f5761399e613c2a565b5b828201905092915050565b60006139b582613add565b91506139c083613add565b9250826139d0576139cf613c59565b5b828204905092915050565b60006139e682613add565b91506139f183613add565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2a57613a29613c2a565b5b828202905092915050565b6000613a4082613add565b9150613a4b83613add565b925082821015613a5e57613a5d613c2a565b5b828203905092915050565b6000613a7482613abd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b14578082015181840152602081019050613af9565b83811115613b23576000848401525b50505050565b60006002820490506001821680613b4157607f821691505b60208210811415613b5557613b54613c88565b5b50919050565b613b6482613d33565b810181811067ffffffffffffffff82111715613b8357613b82613ce6565b5b80604052505050565b6000613b9782613add565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bca57613bc9613c2a565b5b600182019050919050565b6000613be082613be7565b9050919050565b6000613bf282613d44565b9050919050565b6000613c0482613add565b9150613c0f83613add565b925082613c1f57613c1e613c59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f476976656177617920657863656564732063757272656e74206261746368212160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e74207175616e746974792121000000000000000000600082015250565b7f496e73756666696369656e74206574682073656e7420666f72206d696e742121600082015250565b7f57686974656c697374204d696e74696e67206e6f742061637469766521210000600082015250565b7f4d696e74206578636565647320436f6c6c656374696f6e2073697a6521210000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f52657761726420646973747269627574696f6e206661696c6564000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c6963204d696e74696e67206e6f742061637469766521210000000000600082015250565b50565b613fbb81613a69565b8114613fc657600080fd5b50565b613fd281613a7b565b8114613fdd57600080fd5b50565b613fe981613a87565b8114613ff457600080fd5b50565b61400081613a91565b811461400b57600080fd5b50565b61401781613add565b811461402257600080fd5b5056fea2646970667358221220f42efafa83de5fe45f4c0e6f68bdc85e842189e472989486581c7bf60b37087564736f6c63430008070033

Deployed Bytecode Sourcemap

54563:4114:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24353:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57069:78;;;;;;;;;;;;;:::i;:::-;;57548:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55506:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30078:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32024:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31572:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23407:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57337:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54970:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41289:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55162:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57958:192;;;;;;;;;;;;;:::i;:::-;;32914:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54685:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57237:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57749:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29867:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57153:76;;;;;;;;;;;;;:::i;:::-;;25032:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10114:103;;;;;;;;;;;;;:::i;:::-;;55081:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55263:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9891:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57456:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30247:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55737:763;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54883:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56508:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32300:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54848:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57849:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55119:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33170:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57648:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58158:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55041:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58561:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32679:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54730:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54924:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10226:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55003:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24353:615;24438:4;24753:10;24738:25;;:11;:25;;;;:102;;;;24830:10;24815:25;;:11;:25;;;;24738:102;:179;;;;24907:10;24892:25;;:11;:25;;;;24738:179;24718:199;;24353:615;;;:::o;57069:78::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57130:9:::1;;;;;;;;;;;57129:10;57117:9;;:22;;;;;;;;;;;;;;;;;;57069:78::o:0;57548:92::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57626:6:::1;57615:8;:17;;;;57548:92:::0;:::o;55506:223::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55628:14:::1;;55597:27;55615:8;55597:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:45;;55589:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;55691:30;55701:9;55712:8;55691:9;:30::i;:::-;55506:223:::0;;:::o;30078:100::-;30132:13;30165:5;30158:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30078:100;:::o;32024:204::-;32092:7;32117:16;32125:7;32117;:16::i;:::-;32112:64;;32142:34;;;;;;;;;;;;;;32112:64;32196:15;:24;32212:7;32196:24;;;;;;;;;;;;;;;;;;;;;32189:31;;32024:204;;;:::o;31572:386::-;31645:13;31661:16;31669:7;31661;:16::i;:::-;31645:32;;31717:5;31694:28;;:19;:17;:19::i;:::-;:28;;;31690:175;;31742:44;31759:5;31766:19;:17;:19::i;:::-;31742:16;:44::i;:::-;31737:128;;31814:35;;;;;;;;;;;;;;31737:128;31690:175;31904:2;31877:15;:24;31893:7;31877:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31942:7;31938:2;31922:28;;31931:5;31922:28;;;;;;;;;;;;31634:324;31572:386;;:::o;23407:315::-;23460:7;23688:15;:13;:15::i;:::-;23673:12;;23657:13;;:28;:46;23650:53;;23407:315;:::o;57337:111::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57415:4:::1;57406:6;;:13;;;;;;;;;;;;;;;;;;57436:4;57430:3;:10;;;;;;;;;;;;:::i;:::-;;57337:111:::0;:::o;54970:26::-;;;;;;;;;;;;;:::o;41289:2800::-;41423:27;41453;41472:7;41453:18;:27::i;:::-;41423:57;;41538:4;41497:45;;41513:19;41497:45;;;41493:86;;41551:28;;;;;;;;;;;;;;41493:86;41593:27;41622:23;41649:28;41669:7;41649:19;:28::i;:::-;41592:85;;;;41777:62;41796:15;41813:4;41819:19;:17;:19::i;:::-;41777:18;:62::i;:::-;41772:174;;41859:43;41876:4;41882:19;:17;:19::i;:::-;41859:16;:43::i;:::-;41854:92;;41911:35;;;;;;;;;;;;;;41854:92;41772:174;41977:1;41963:16;;:2;:16;;;41959:52;;;41988:23;;;;;;;;;;;;;;41959:52;42024:43;42046:4;42052:2;42056:7;42065:1;42024:21;:43::i;:::-;42160:15;42157:160;;;42300:1;42279:19;42272:30;42157:160;42695:18;:24;42714:4;42695:24;;;;;;;;;;;;;;;;42693:26;;;;;;;;;;;;42764:18;:22;42783:2;42764:22;;;;;;;;;;;;;;;;42762:24;;;;;;;;;;;43086:145;43123:2;43171:45;43186:4;43192:2;43196:19;43171:14;:45::i;:::-;20635:8;43144:72;43086:18;:145::i;:::-;43057:17;:26;43075:7;43057:26;;;;;;;;;;;:174;;;;43401:1;20635:8;43351:19;:46;:51;43347:626;;;43423:19;43455:1;43445:7;:11;43423:33;;43612:1;43578:17;:30;43596:11;43578:30;;;;;;;;;;;;:35;43574:384;;;43716:13;;43701:11;:28;43697:242;;43896:19;43863:17;:30;43881:11;43863:30;;;;;;;;;;;:52;;;;43697:242;43574:384;43404:569;43347:626;44020:7;44016:2;44001:27;;44010:4;44001:27;;;;;;;;;;;;44039:42;44060:4;44066:2;44070:7;44079:1;44039:20;:42::i;:::-;41412:2677;;;41289:2800;;;:::o;55162:94::-;;;;:::o;57958:192::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58007:13:::1;58034:10;58026:24;;58058:21;58026:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58006:78;;;58103:8;58095:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;57995:155;57958:192::o:0;32914:185::-;33052:39;33069:4;33075:2;33079:7;33052:39;;;;;;;;;;;;:16;:39::i;:::-;32914:185;;;:::o;54685:36::-;;;;:::o;57237:92::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57314:7:::1;57308:3;:13;;;;;;;;;;;;:::i;:::-;;57237:92:::0;:::o;57749:94::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57829:6:::1;57815:11;:20;;;;57749:94:::0;:::o;29867:144::-;29931:7;29974:27;29993:7;29974:18;:27::i;:::-;29951:52;;29867:144;;;:::o;57153:76::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57215:6:::1;;;;;;;;;;;57214:7;57205:6;;:16;;;;;;;;;;;;;;;;;;57153:76::o:0;25032:224::-;25096:7;25137:1;25120:19;;:5;:19;;;25116:60;;;25148:28;;;;;;;;;;;;;;25116:60;19587:13;25194:18;:25;25213:5;25194:25;;;;;;;;;;;;;;;;:54;25187:61;;25032:224;;;:::o;10114:103::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10179:30:::1;10206:1;10179:18;:30::i;:::-;10114:103::o:0;55081:31::-;;;;:::o;55263:83::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55337:1:::1;55324:10;:14;;;;55263:83:::0;:::o;9891:87::-;9937:7;9964:6;;;;;;;;;;;9957:13;;9891:87;:::o;57456:86::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57528:6:::1;57520:5;:14;;;;57456:86:::0;:::o;30247:104::-;30303:13;30336:7;30329:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30247:104;:::o;55737:763::-;55830:12;55872:10;55855:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55845:39;;;;;;55830:54;;55903:50;55923:11;;55903:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55936:10;;55948:4;55903:18;:50::i;:::-;55895:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56001:9;;;;;;;;;;;55993:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;56076:11;;56064:8;:23;;:39;;;;;56102:1;56091:8;:12;56064:39;56056:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56192:14;;56150:38;56179:8;56150:24;56163:10;56150:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:56;;:72;;;;;56221:1;56210:8;:12;56150:72;56142:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;56282:22;56295:8;;56282;:12;;:22;;;;:::i;:::-;56269:9;:35;;56261:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;56391:14;;56360:27;56378:8;56360:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:45;;56352:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;56461:31;56471:10;56483:8;56461:9;:31::i;:::-;55819:681;55737:763;;;:::o;54883:34::-;;;;:::o;56508:553::-;56574:6;;;;;;;;;;;56566:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56643:11;;56631:8;:23;;:39;;;;;56669:1;56658:8;:12;56631:39;56623:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56759:11;;56717:38;56746:8;56717:24;56730:10;56717:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:53;;:69;;;;;56785:1;56774:8;:12;56717:69;56709:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;56846:19;56859:5;;56846:8;:12;;:19;;;;:::i;:::-;56833:9;:32;;56825:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56952:14;;56921:27;56939:8;56921:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:45;;56913:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;57022:31;57032:10;57044:8;57022:9;:31::i;:::-;56508:553;:::o;32300:308::-;32411:19;:17;:19::i;:::-;32399:31;;:8;:31;;;32395:61;;;32439:17;;;;;;;;;;;;;;32395:61;32521:8;32469:18;:39;32488:19;:17;:19::i;:::-;32469:39;;;;;;;;;;;;;;;:49;32509:8;32469:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32581:8;32545:55;;32560:19;:17;:19::i;:::-;32545:55;;;32591:8;32545:55;;;;;;:::i;:::-;;;;;;;;32300:308;;:::o;54848:26::-;;;;;;;;;;;;;:::o;57849:100::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57935:6:::1;57918:14;:23;;;;57849:100:::0;:::o;55119:34::-;;;;:::o;33170:399::-;33337:31;33350:4;33356:2;33360:7;33337:12;:31::i;:::-;33401:1;33383:2;:14;;;:19;33379:183;;33422:56;33453:4;33459:2;33463:7;33472:5;33422:30;:56::i;:::-;33417:145;;33506:40;;;;;;;;;;;;;;33417:145;33379:183;33170:399;;;;:::o;57648:93::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57727:6:::1;57713:11;:20;;;;57648:93:::0;:::o;58158:298::-;58223:13;58257:16;58265:7;58257;:16::i;:::-;58249:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;58339:6;;;;;;;;;;;58336:91;;;58391:3;58396:20;58397:7;58396:18;:20::i;:::-;58374:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58360:67;;;;58336:91;58445:3;58438:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58158:298;;;;:::o;55041:31::-;;;;:::o;58561:113::-;58619:7;58646:20;58660:5;58646:13;:20::i;:::-;58639:27;;58561:113;;;:::o;32679:164::-;32776:4;32800:18;:25;32819:5;32800:25;;;;;;;;;;;;;;;:35;32826:8;32800:35;;;;;;;;;;;;;;;;;;;;;;;;;32793:42;;32679:164;;;;:::o;54730:111::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54924:37::-;;;;:::o;10226:201::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10335:1:::1;10315:22;;:8;:22;;;;10307:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10391:28;10410:8;10391:18;:28::i;:::-;10226:201:::0;:::o;55003:29::-;;;;;;;;;;;;;:::o;9434:98::-;9487:7;9514:10;9507:17;;9434:98;:::o;3384:::-;3442:7;3473:1;3469;:5;;;;:::i;:::-;3462:12;;3384:98;;;;:::o;34181:104::-;34250:27;34260:2;34264:8;34250:27;;;;;;;;;;;;:9;:27::i;:::-;34181:104;;:::o;33824:273::-;33881:4;33937:7;33918:15;:13;:15::i;:::-;:26;;:66;;;;;33971:13;;33961:7;:23;33918:66;:152;;;;;34069:1;20357:8;34022:17;:26;34040:7;34022:26;;;;;;;;;;;;:43;:48;33918:152;33898:172;;33824:273;;;:::o;52385:105::-;52445:7;52472:10;52465:17;;52385:105;:::o;58462:93::-;58519:7;58546:1;58539:8;;58462:93;:::o;26739:1174::-;26806:7;26826:12;26841:7;26826:22;;26909:4;26890:15;:13;:15::i;:::-;:23;26886:960;;26943:13;;26936:4;:20;26932:914;;;26981:14;26998:17;:23;27016:4;26998:23;;;;;;;;;;;;26981:40;;27114:1;20357:8;27087:6;:23;:28;27083:744;;;27606:158;27623:1;27613:6;:11;27606:158;;;27662:11;27671:1;27662:4;:8;;:11;;;;:::i;:::-;27657:16;;27713:17;:23;27731:4;27713:23;;;;;;;;;;;;27704:32;;27606:158;;;27797:6;27790:13;;;;;;27083:744;26958:888;26932:914;26886:960;27874:31;;;;;;;;;;;;;;26739:1174;;;;:::o;39625:652::-;39720:27;39749:23;39790:53;39846:15;39790:71;;40032:7;40026:4;40019:21;40067:22;40061:4;40054:36;40143:4;40137;40127:21;40104:44;;40239:19;40233:26;40214:45;;39970:300;39625:652;;;:::o;40390:645::-;40532:11;40694:15;40688:4;40684:26;40676:34;;40853:15;40842:9;40838:31;40825:44;;41000:15;40989:9;40986:30;40979:4;40968:9;40965:19;40962:55;40952:65;;40390:645;;;;;:::o;51218:159::-;;;;;:::o;49530:309::-;49665:7;49685:16;20758:3;49711:19;:40;;49685:67;;20758:3;49778:31;49789:4;49795:2;49799:9;49778:10;:31::i;:::-;49770:40;;:61;;49763:68;;;49530:309;;;;;:::o;29358:447::-;29438:14;29606:15;29599:5;29595:27;29586:36;;29780:5;29766:11;29742:22;29738:40;29735:51;29728:5;29725:62;29715:72;;29358:447;;;;:::o;52036:158::-;;;;;:::o;10436:191::-;10510:16;10529:6;;;;;;;;;;;10510:25;;10555:8;10546:6;;:17;;;;;;;;;;;;;;;;;;10610:8;10579:40;;10600:8;10579:40;;;;;;;;;;;;10499:128;10436:191;:::o;85:190::-;210:4;263;234:25;247:5;254:4;234:12;:25::i;:::-;:33;227:40;;85:190;;;;;:::o;4122:98::-;4180:7;4211:1;4207;:5;;;;:::i;:::-;4200:12;;4122:98;;;;:::o;48040:716::-;48203:4;48249:2;48224:45;;;48270:19;:17;:19::i;:::-;48291:4;48297:7;48306:5;48224:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48220:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48524:1;48507:6;:13;:18;48503:235;;;48553:40;;;;;;;;;;;;;;48503:235;48696:6;48690:13;48681:6;48677:2;48673:15;48666:38;48220:529;48393:54;;;48383:64;;;:6;:64;;;;48376:71;;;48040:716;;;;;;:::o;8051:533::-;8107:13;8147:1;8138:5;:10;8134:53;;;8165:10;;;;;;;;;;;;;;;;;;;;;8134:53;8197:12;8212:5;8197:20;;8228:14;8253:78;8268:1;8260:4;:9;8253:78;;8286:8;;;;;:::i;:::-;;;;8317:2;8309:10;;;;;:::i;:::-;;;8253:78;;;8341:19;8373:6;8363:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8341:39;;8391:154;8407:1;8398:5;:10;8391:154;;8435:1;8425:11;;;;;:::i;:::-;;;8502:2;8494:5;:10;;;;:::i;:::-;8481:2;:24;;;;:::i;:::-;8468:39;;8451:6;8458;8451:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8531:2;8522:11;;;;;:::i;:::-;;;8391:154;;;8569:6;8555:21;;;;;8051:533;;;;:::o;25338:176::-;25399:7;19587:13;19724:2;25427:18;:25;25446:5;25427:25;;;;;;;;;;;;;;;;:49;;25426:80;25419:87;;25338:176;;;:::o;34701:681::-;34824:19;34830:2;34834:8;34824:5;:19::i;:::-;34903:1;34885:2;:14;;;:19;34881:483;;34925:11;34939:13;;34925:27;;34971:13;34993:8;34987:3;:14;34971:30;;35020:233;35051:62;35090:1;35094:2;35098:7;;;;;;35107:5;35051:30;:62::i;:::-;35046:167;;35149:40;;;;;;;;;;;;;;35046:167;35248:3;35240:5;:11;35020:233;;35335:3;35318:13;;:20;35314:34;;35340:8;;;35314:34;34906:458;;34881:483;34701:681;;;:::o;3765:98::-;3823:7;3854:1;3850;:5;;;;:::i;:::-;3843:12;;3765:98;;;;:::o;50415:147::-;50552:6;50415:147;;;;;:::o;280:517::-;363:7;383:20;406:4;383:27;;426:9;421:339;445:5;:12;441:1;:16;421:339;;;479:20;502:5;508:1;502:8;;;;;;;;:::i;:::-;;;;;;;;479:31;;545:12;529;:28;525:224;;593:42;608:12;622;593:14;:42::i;:::-;578:57;;525:224;;;691:42;706:12;720;691:14;:42::i;:::-;676:57;;525:224;464:296;459:3;;;;;:::i;:::-;;;;421:339;;;;777:12;770:19;;;280:517;;;;:::o;35655:1529::-;35720:20;35743:13;;35720:36;;35785:1;35771:16;;:2;:16;;;35767:48;;;35796:19;;;;;;;;;;;;;;35767:48;35842:1;35830:8;:13;35826:44;;;35852:18;;;;;;;;;;;;;;35826:44;35883:61;35913:1;35917:2;35921:12;35935:8;35883:21;:61::i;:::-;36426:1;19724:2;36397:1;:25;;36396:31;36384:8;:44;36358:18;:22;36377:2;36358:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;36705:139;36742:2;36796:33;36819:1;36823:2;36827:1;36796:14;:33::i;:::-;36763:30;36784:8;36763:20;:30::i;:::-;:66;36705:18;:139::i;:::-;36671:17;:31;36689:12;36671:31;;;;;;;;;;;:173;;;;36861:15;36879:12;36861:30;;36906:11;36935:8;36920:12;:23;36906:37;;36958:101;37010:9;;;;;;37006:2;36985:35;;37002:1;36985:35;;;;;;;;;;;;37054:3;37044:7;:13;36958:101;;37091:3;37075:13;:19;;;;36132:974;;37116:60;37145:1;37149:2;37153:12;37167:8;37116:20;:60::i;:::-;35709:1475;35655:1529;;:::o;805:224::-;873:13;936:1;930:4;923:15;965:1;959:4;952:15;1006:4;1000;990:21;981:30;;805:224;;;;:::o;31188:322::-;31258:14;31489:1;31479:8;31476:15;31451:23;31447:45;31437:55;;31188:322;;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:329::-;6415:6;6464:2;6452:9;6443:7;6439:23;6435:32;6432:119;;;6470:79;;:::i;:::-;6432:119;6590:1;6615:53;6660:7;6651:6;6640:9;6636:22;6615:53;:::i;:::-;6605:63;;6561:117;6356:329;;;;:::o;6691:327::-;6749:6;6798:2;6786:9;6777:7;6773:23;6769:32;6766:119;;;6804:79;;:::i;:::-;6766:119;6924:1;6949:52;6993:7;6984:6;6973:9;6969:22;6949:52;:::i;:::-;6939:62;;6895:116;6691:327;;;;:::o;7024:349::-;7093:6;7142:2;7130:9;7121:7;7117:23;7113:32;7110:119;;;7148:79;;:::i;:::-;7110:119;7268:1;7293:63;7348:7;7339:6;7328:9;7324:22;7293:63;:::i;:::-;7283:73;;7239:127;7024:349;;;;:::o;7379:509::-;7448:6;7497:2;7485:9;7476:7;7472:23;7468:32;7465:119;;;7503:79;;:::i;:::-;7465:119;7651:1;7640:9;7636:17;7623:31;7681:18;7673:6;7670:30;7667:117;;;7703:79;;:::i;:::-;7667:117;7808:63;7863:7;7854:6;7843:9;7839:22;7808:63;:::i;:::-;7798:73;;7594:287;7379:509;;;;:::o;7894:329::-;7953:6;8002:2;7990:9;7981:7;7977:23;7973:32;7970:119;;;8008:79;;:::i;:::-;7970:119;8128:1;8153:53;8198:7;8189:6;8178:9;8174:22;8153:53;:::i;:::-;8143:63;;8099:117;7894:329;;;;:::o;8229:704::-;8324:6;8332;8340;8389:2;8377:9;8368:7;8364:23;8360:32;8357:119;;;8395:79;;:::i;:::-;8357:119;8515:1;8540:53;8585:7;8576:6;8565:9;8561:22;8540:53;:::i;:::-;8530:63;;8486:117;8670:2;8659:9;8655:18;8642:32;8701:18;8693:6;8690:30;8687:117;;;8723:79;;:::i;:::-;8687:117;8836:80;8908:7;8899:6;8888:9;8884:22;8836:80;:::i;:::-;8818:98;;;;8613:313;8229:704;;;;;:::o;8939:118::-;9026:24;9044:5;9026:24;:::i;:::-;9021:3;9014:37;8939:118;;:::o;9063:157::-;9168:45;9188:24;9206:5;9188:24;:::i;:::-;9168:45;:::i;:::-;9163:3;9156:58;9063:157;;:::o;9226:109::-;9307:21;9322:5;9307:21;:::i;:::-;9302:3;9295:34;9226:109;;:::o;9341:118::-;9428:24;9446:5;9428:24;:::i;:::-;9423:3;9416:37;9341:118;;:::o;9465:360::-;9551:3;9579:38;9611:5;9579:38;:::i;:::-;9633:70;9696:6;9691:3;9633:70;:::i;:::-;9626:77;;9712:52;9757:6;9752:3;9745:4;9738:5;9734:16;9712:52;:::i;:::-;9789:29;9811:6;9789:29;:::i;:::-;9784:3;9780:39;9773:46;;9555:270;9465:360;;;;:::o;9831:364::-;9919:3;9947:39;9980:5;9947:39;:::i;:::-;10002:71;10066:6;10061:3;10002:71;:::i;:::-;9995:78;;10082:52;10127:6;10122:3;10115:4;10108:5;10104:16;10082:52;:::i;:::-;10159:29;10181:6;10159:29;:::i;:::-;10154:3;10150:39;10143:46;;9923:272;9831:364;;;;:::o;10201:377::-;10307:3;10335:39;10368:5;10335:39;:::i;:::-;10390:89;10472:6;10467:3;10390:89;:::i;:::-;10383:96;;10488:52;10533:6;10528:3;10521:4;10514:5;10510:16;10488:52;:::i;:::-;10565:6;10560:3;10556:16;10549:23;;10311:267;10201:377;;;;:::o;10608:845::-;10711:3;10748:5;10742:12;10777:36;10803:9;10777:36;:::i;:::-;10829:89;10911:6;10906:3;10829:89;:::i;:::-;10822:96;;10949:1;10938:9;10934:17;10965:1;10960:137;;;;11111:1;11106:341;;;;10927:520;;10960:137;11044:4;11040:9;11029;11025:25;11020:3;11013:38;11080:6;11075:3;11071:16;11064:23;;10960:137;;11106:341;11173:38;11205:5;11173:38;:::i;:::-;11233:1;11247:154;11261:6;11258:1;11255:13;11247:154;;;11335:7;11329:14;11325:1;11320:3;11316:11;11309:35;11385:1;11376:7;11372:15;11361:26;;11283:4;11280:1;11276:12;11271:17;;11247:154;;;11430:6;11425:3;11421:16;11414:23;;11113:334;;10927:520;;10715:738;;10608:845;;;;:::o;11459:366::-;11601:3;11622:67;11686:2;11681:3;11622:67;:::i;:::-;11615:74;;11698:93;11787:3;11698:93;:::i;:::-;11816:2;11811:3;11807:12;11800:19;;11459:366;;;:::o;11831:::-;11973:3;11994:67;12058:2;12053:3;11994:67;:::i;:::-;11987:74;;12070:93;12159:3;12070:93;:::i;:::-;12188:2;12183:3;12179:12;12172:19;;11831:366;;;:::o;12203:::-;12345:3;12366:67;12430:2;12425:3;12366:67;:::i;:::-;12359:74;;12442:93;12531:3;12442:93;:::i;:::-;12560:2;12555:3;12551:12;12544:19;;12203:366;;;:::o;12575:::-;12717:3;12738:67;12802:2;12797:3;12738:67;:::i;:::-;12731:74;;12814:93;12903:3;12814:93;:::i;:::-;12932:2;12927:3;12923:12;12916:19;;12575:366;;;:::o;12947:::-;13089:3;13110:67;13174:2;13169:3;13110:67;:::i;:::-;13103:74;;13186:93;13275:3;13186:93;:::i;:::-;13304:2;13299:3;13295:12;13288:19;;12947:366;;;:::o;13319:::-;13461:3;13482:67;13546:2;13541:3;13482:67;:::i;:::-;13475:74;;13558:93;13647:3;13558:93;:::i;:::-;13676:2;13671:3;13667:12;13660:19;;13319:366;;;:::o;13691:::-;13833:3;13854:67;13918:2;13913:3;13854:67;:::i;:::-;13847:74;;13930:93;14019:3;13930:93;:::i;:::-;14048:2;14043:3;14039:12;14032:19;;13691:366;;;:::o;14063:::-;14205:3;14226:67;14290:2;14285:3;14226:67;:::i;:::-;14219:74;;14302:93;14391:3;14302:93;:::i;:::-;14420:2;14415:3;14411:12;14404:19;;14063:366;;;:::o;14435:400::-;14595:3;14616:84;14698:1;14693:3;14616:84;:::i;:::-;14609:91;;14709:93;14798:3;14709:93;:::i;:::-;14827:1;14822:3;14818:11;14811:18;;14435:400;;;:::o;14841:366::-;14983:3;15004:67;15068:2;15063:3;15004:67;:::i;:::-;14997:74;;15080:93;15169:3;15080:93;:::i;:::-;15198:2;15193:3;15189:12;15182:19;;14841:366;;;:::o;15213:::-;15355:3;15376:67;15440:2;15435:3;15376:67;:::i;:::-;15369:74;;15452:93;15541:3;15452:93;:::i;:::-;15570:2;15565:3;15561:12;15554:19;;15213:366;;;:::o;15585:::-;15727:3;15748:67;15812:2;15807:3;15748:67;:::i;:::-;15741:74;;15824:93;15913:3;15824:93;:::i;:::-;15942:2;15937:3;15933:12;15926:19;;15585:366;;;:::o;15957:398::-;16116:3;16137:83;16218:1;16213:3;16137:83;:::i;:::-;16130:90;;16229:93;16318:3;16229:93;:::i;:::-;16347:1;16342:3;16338:11;16331:18;;15957:398;;;:::o;16361:118::-;16448:24;16466:5;16448:24;:::i;:::-;16443:3;16436:37;16361:118;;:::o;16485:256::-;16597:3;16612:75;16683:3;16674:6;16612:75;:::i;:::-;16712:2;16707:3;16703:12;16696:19;;16732:3;16725:10;;16485:256;;;;:::o;16747:695::-;17025:3;17047:92;17135:3;17126:6;17047:92;:::i;:::-;17040:99;;17156:95;17247:3;17238:6;17156:95;:::i;:::-;17149:102;;17268:148;17412:3;17268:148;:::i;:::-;17261:155;;17433:3;17426:10;;16747:695;;;;;:::o;17448:379::-;17632:3;17654:147;17797:3;17654:147;:::i;:::-;17647:154;;17818:3;17811:10;;17448:379;;;:::o;17833:222::-;17926:4;17964:2;17953:9;17949:18;17941:26;;17977:71;18045:1;18034:9;18030:17;18021:6;17977:71;:::i;:::-;17833:222;;;;:::o;18061:640::-;18256:4;18294:3;18283:9;18279:19;18271:27;;18308:71;18376:1;18365:9;18361:17;18352:6;18308:71;:::i;:::-;18389:72;18457:2;18446:9;18442:18;18433:6;18389:72;:::i;:::-;18471;18539:2;18528:9;18524:18;18515:6;18471:72;:::i;:::-;18590:9;18584:4;18580:20;18575:2;18564:9;18560:18;18553:48;18618:76;18689:4;18680:6;18618:76;:::i;:::-;18610:84;;18061:640;;;;;;;:::o;18707:210::-;18794:4;18832:2;18821:9;18817:18;18809:26;;18845:65;18907:1;18896:9;18892:17;18883:6;18845:65;:::i;:::-;18707:210;;;;:::o;18923:222::-;19016:4;19054:2;19043:9;19039:18;19031:26;;19067:71;19135:1;19124:9;19120:17;19111:6;19067:71;:::i;:::-;18923:222;;;;:::o;19151:313::-;19264:4;19302:2;19291:9;19287:18;19279:26;;19351:9;19345:4;19341:20;19337:1;19326:9;19322:17;19315:47;19379:78;19452:4;19443:6;19379:78;:::i;:::-;19371:86;;19151:313;;;;:::o;19470:419::-;19636:4;19674:2;19663:9;19659:18;19651:26;;19723:9;19717:4;19713:20;19709:1;19698:9;19694:17;19687:47;19751:131;19877:4;19751:131;:::i;:::-;19743:139;;19470:419;;;:::o;19895:::-;20061:4;20099:2;20088:9;20084:18;20076:26;;20148:9;20142:4;20138:20;20134:1;20123:9;20119:17;20112:47;20176:131;20302:4;20176:131;:::i;:::-;20168:139;;19895:419;;;:::o;20320:::-;20486:4;20524:2;20513:9;20509:18;20501:26;;20573:9;20567:4;20563:20;20559:1;20548:9;20544:17;20537:47;20601:131;20727:4;20601:131;:::i;:::-;20593:139;;20320:419;;;:::o;20745:::-;20911:4;20949:2;20938:9;20934:18;20926:26;;20998:9;20992:4;20988:20;20984:1;20973:9;20969:17;20962:47;21026:131;21152:4;21026:131;:::i;:::-;21018:139;;20745:419;;;:::o;21170:::-;21336:4;21374:2;21363:9;21359:18;21351:26;;21423:9;21417:4;21413:20;21409:1;21398:9;21394:17;21387:47;21451:131;21577:4;21451:131;:::i;:::-;21443:139;;21170:419;;;:::o;21595:::-;21761:4;21799:2;21788:9;21784:18;21776:26;;21848:9;21842:4;21838:20;21834:1;21823:9;21819:17;21812:47;21876:131;22002:4;21876:131;:::i;:::-;21868:139;;21595:419;;;:::o;22020:::-;22186:4;22224:2;22213:9;22209:18;22201:26;;22273:9;22267:4;22263:20;22259:1;22248:9;22244:17;22237:47;22301:131;22427:4;22301:131;:::i;:::-;22293:139;;22020:419;;;:::o;22445:::-;22611:4;22649:2;22638:9;22634:18;22626:26;;22698:9;22692:4;22688:20;22684:1;22673:9;22669:17;22662:47;22726:131;22852:4;22726:131;:::i;:::-;22718:139;;22445:419;;;:::o;22870:::-;23036:4;23074:2;23063:9;23059:18;23051:26;;23123:9;23117:4;23113:20;23109:1;23098:9;23094:17;23087:47;23151:131;23277:4;23151:131;:::i;:::-;23143:139;;22870:419;;;:::o;23295:::-;23461:4;23499:2;23488:9;23484:18;23476:26;;23548:9;23542:4;23538:20;23534:1;23523:9;23519:17;23512:47;23576:131;23702:4;23576:131;:::i;:::-;23568:139;;23295:419;;;:::o;23720:::-;23886:4;23924:2;23913:9;23909:18;23901:26;;23973:9;23967:4;23963:20;23959:1;23948:9;23944:17;23937:47;24001:131;24127:4;24001:131;:::i;:::-;23993:139;;23720:419;;;:::o;24145:222::-;24238:4;24276:2;24265:9;24261:18;24253:26;;24289:71;24357:1;24346:9;24342:17;24333:6;24289:71;:::i;:::-;24145:222;;;;:::o;24373:129::-;24407:6;24434:20;;:::i;:::-;24424:30;;24463:33;24491:4;24483:6;24463:33;:::i;:::-;24373:129;;;:::o;24508:75::-;24541:6;24574:2;24568:9;24558:19;;24508:75;:::o;24589:307::-;24650:4;24740:18;24732:6;24729:30;24726:56;;;24762:18;;:::i;:::-;24726:56;24800:29;24822:6;24800:29;:::i;:::-;24792:37;;24884:4;24878;24874:15;24866:23;;24589:307;;;:::o;24902:308::-;24964:4;25054:18;25046:6;25043:30;25040:56;;;25076:18;;:::i;:::-;25040:56;25114:29;25136:6;25114:29;:::i;:::-;25106:37;;25198:4;25192;25188:15;25180:23;;24902:308;;;:::o;25216:141::-;25265:4;25288:3;25280:11;;25311:3;25308:1;25301:14;25345:4;25342:1;25332:18;25324:26;;25216:141;;;:::o;25363:98::-;25414:6;25448:5;25442:12;25432:22;;25363:98;;;:::o;25467:99::-;25519:6;25553:5;25547:12;25537:22;;25467:99;;;:::o;25572:168::-;25655:11;25689:6;25684:3;25677:19;25729:4;25724:3;25720:14;25705:29;;25572:168;;;;:::o;25746:147::-;25847:11;25884:3;25869:18;;25746:147;;;;:::o;25899:169::-;25983:11;26017:6;26012:3;26005:19;26057:4;26052:3;26048:14;26033:29;;25899:169;;;;:::o;26074:148::-;26176:11;26213:3;26198:18;;26074:148;;;;:::o;26228:305::-;26268:3;26287:20;26305:1;26287:20;:::i;:::-;26282:25;;26321:20;26339:1;26321:20;:::i;:::-;26316:25;;26475:1;26407:66;26403:74;26400:1;26397:81;26394:107;;;26481:18;;:::i;:::-;26394:107;26525:1;26522;26518:9;26511:16;;26228:305;;;;:::o;26539:185::-;26579:1;26596:20;26614:1;26596:20;:::i;:::-;26591:25;;26630:20;26648:1;26630:20;:::i;:::-;26625:25;;26669:1;26659:35;;26674:18;;:::i;:::-;26659:35;26716:1;26713;26709:9;26704:14;;26539:185;;;;:::o;26730:348::-;26770:7;26793:20;26811:1;26793:20;:::i;:::-;26788:25;;26827:20;26845:1;26827:20;:::i;:::-;26822:25;;27015:1;26947:66;26943:74;26940:1;26937:81;26932:1;26925:9;26918:17;26914:105;26911:131;;;27022:18;;:::i;:::-;26911:131;27070:1;27067;27063:9;27052:20;;26730:348;;;;:::o;27084:191::-;27124:4;27144:20;27162:1;27144:20;:::i;:::-;27139:25;;27178:20;27196:1;27178:20;:::i;:::-;27173:25;;27217:1;27214;27211:8;27208:34;;;27222:18;;:::i;:::-;27208:34;27267:1;27264;27260:9;27252:17;;27084:191;;;;:::o;27281:96::-;27318:7;27347:24;27365:5;27347:24;:::i;:::-;27336:35;;27281:96;;;:::o;27383:90::-;27417:7;27460:5;27453:13;27446:21;27435:32;;27383:90;;;:::o;27479:77::-;27516:7;27545:5;27534:16;;27479:77;;;:::o;27562:149::-;27598:7;27638:66;27631:5;27627:78;27616:89;;27562:149;;;:::o;27717:126::-;27754:7;27794:42;27787:5;27783:54;27772:65;;27717:126;;;:::o;27849:77::-;27886:7;27915:5;27904:16;;27849:77;;;:::o;27932:154::-;28016:6;28011:3;28006;27993:30;28078:1;28069:6;28064:3;28060:16;28053:27;27932:154;;;:::o;28092:307::-;28160:1;28170:113;28184:6;28181:1;28178:13;28170:113;;;28269:1;28264:3;28260:11;28254:18;28250:1;28245:3;28241:11;28234:39;28206:2;28203:1;28199:10;28194:15;;28170:113;;;28301:6;28298:1;28295:13;28292:101;;;28381:1;28372:6;28367:3;28363:16;28356:27;28292:101;28141:258;28092:307;;;:::o;28405:320::-;28449:6;28486:1;28480:4;28476:12;28466:22;;28533:1;28527:4;28523:12;28554:18;28544:81;;28610:4;28602:6;28598:17;28588:27;;28544:81;28672:2;28664:6;28661:14;28641:18;28638:38;28635:84;;;28691:18;;:::i;:::-;28635:84;28456:269;28405:320;;;:::o;28731:281::-;28814:27;28836:4;28814:27;:::i;:::-;28806:6;28802:40;28944:6;28932:10;28929:22;28908:18;28896:10;28893:34;28890:62;28887:88;;;28955:18;;:::i;:::-;28887:88;28995:10;28991:2;28984:22;28774:238;28731:281;;:::o;29018:233::-;29057:3;29080:24;29098:5;29080:24;:::i;:::-;29071:33;;29126:66;29119:5;29116:77;29113:103;;;29196:18;;:::i;:::-;29113:103;29243:1;29236:5;29232:13;29225:20;;29018:233;;;:::o;29257:100::-;29296:7;29325:26;29345:5;29325:26;:::i;:::-;29314:37;;29257:100;;;:::o;29363:94::-;29402:7;29431:20;29445:5;29431:20;:::i;:::-;29420:31;;29363:94;;;:::o;29463:176::-;29495:1;29512:20;29530:1;29512:20;:::i;:::-;29507:25;;29546:20;29564:1;29546:20;:::i;:::-;29541:25;;29585:1;29575:35;;29590:18;;:::i;:::-;29575:35;29631:1;29628;29624:9;29619:14;;29463:176;;;;:::o;29645:180::-;29693:77;29690:1;29683:88;29790:4;29787:1;29780:15;29814:4;29811:1;29804:15;29831:180;29879:77;29876:1;29869:88;29976:4;29973:1;29966:15;30000:4;29997:1;29990:15;30017:180;30065:77;30062:1;30055:88;30162:4;30159:1;30152:15;30186:4;30183:1;30176:15;30203:180;30251:77;30248:1;30241:88;30348:4;30345:1;30338:15;30372:4;30369:1;30362:15;30389:180;30437:77;30434:1;30427:88;30534:4;30531:1;30524:15;30558:4;30555:1;30548:15;30575:117;30684:1;30681;30674:12;30698:117;30807:1;30804;30797:12;30821:117;30930:1;30927;30920:12;30944:117;31053:1;31050;31043:12;31067:117;31176:1;31173;31166:12;31190:117;31299:1;31296;31289:12;31313:102;31354:6;31405:2;31401:7;31396:2;31389:5;31385:14;31381:28;31371:38;;31313:102;;;:::o;31421:94::-;31454:8;31502:5;31498:2;31494:14;31473:35;;31421:94;;;:::o;31521:225::-;31661:34;31657:1;31649:6;31645:14;31638:58;31730:8;31725:2;31717:6;31713:15;31706:33;31521:225;:::o;31752:220::-;31892:34;31888:1;31880:6;31876:14;31869:58;31961:3;31956:2;31948:6;31944:15;31937:28;31752:220;:::o;31978:173::-;32118:25;32114:1;32106:6;32102:14;32095:49;31978:173;:::o;32157:182::-;32297:34;32293:1;32285:6;32281:14;32274:58;32157:182;:::o;32345:180::-;32485:32;32481:1;32473:6;32469:14;32462:56;32345:180;:::o;32531:::-;32671:32;32667:1;32659:6;32655:14;32648:56;32531:180;:::o;32717:165::-;32857:17;32853:1;32845:6;32841:14;32834:41;32717:165;:::o;32888:176::-;33028:28;33024:1;33016:6;33012:14;33005:52;32888:176;:::o;33070:155::-;33210:7;33206:1;33198:6;33194:14;33187:31;33070:155;:::o;33231:182::-;33371:34;33367:1;33359:6;33355:14;33348:58;33231:182;:::o;33419:234::-;33559:34;33555:1;33547:6;33543:14;33536:58;33628:17;33623:2;33615:6;33611:15;33604:42;33419:234;:::o;33659:177::-;33799:29;33795:1;33787:6;33783:14;33776:53;33659:177;:::o;33842:114::-;;:::o;33962:122::-;34035:24;34053:5;34035:24;:::i;:::-;34028:5;34025:35;34015:63;;34074:1;34071;34064:12;34015:63;33962:122;:::o;34090:116::-;34160:21;34175:5;34160:21;:::i;:::-;34153:5;34150:32;34140:60;;34196:1;34193;34186:12;34140:60;34090:116;:::o;34212:122::-;34285:24;34303:5;34285:24;:::i;:::-;34278:5;34275:35;34265:63;;34324:1;34321;34314:12;34265:63;34212:122;:::o;34340:120::-;34412:23;34429:5;34412:23;:::i;:::-;34405:5;34402:34;34392:62;;34450:1;34447;34440:12;34392:62;34340:120;:::o;34466:122::-;34539:24;34557:5;34539:24;:::i;:::-;34532:5;34529:35;34519:63;;34578:1;34575;34568:12;34519:63;34466:122;:::o

Swarm Source

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