ETH Price: $3,564.87 (+6.85%)

Token

DEGENPEPE (DPEPE)
 

Overview

Max Total Supply

999 DPEPE

Holders

468

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 DPEPE
0xb6c0ed367dfa573e28f4adddf4abc4247d59e8fd
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:
DegenPepe

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-08-04
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721ABurnable compliant contract.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;

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

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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.4;

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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (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 auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {// Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

    unchecked {
        if (_startTokenId() <= curr)
            if (curr < _currentIndex) {
                uint256 packed = _packedOwnerships[curr];
                // If not burned.
                if (packed & BITMASK_BURNED == 0) {
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    //
                    // We can directly compare the packed value.
                    // If the address is zero, packed is zero.
                    while (packed == 0) {
                        packed = _packedOwnerships[--curr];
                    }
                    return packed;
                }
            }
    }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
    unchecked {
        // Updates:
        // - `balance += quantity`.
        // - `numberMinted += quantity`.
        //
        // We can directly add to the balance and number minted.
        _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
    unchecked {
        // Updates:
        // - `balance += quantity`.
        // - `numberMinted += quantity`.
        //
        // We can directly add to the balance and number minted.
        _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

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

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

        do {
            emit Transfer(address(0), to, updatedIndex++);
        }
        while (updatedIndex < end);

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

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

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

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
    unchecked {
        // Updates:
        // - `balance -= 1`.
        // - `numberBurned += 1`.
        //
        // We can directly decrement the balance, and increment the number burned.
        // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
        _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

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

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

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

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

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

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

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

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

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

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

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

            let length := sub(end, ptr)
        // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
        // Store the length.
            mstore(ptr, length)
        }
    }
}

pragma solidity ^0.8.4;

/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

pragma solidity ^0.8.4;

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
    unchecked {
        uint256 tokenIdsLength = tokenIds.length;
        TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
        for (uint256 i; i != tokenIdsLength; ++i) {
            ownerships[i] = explicitOwnershipOf(tokenIds[i]);
        }
        return ownerships;
    }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
    unchecked {
        if (start >= stop) revert InvalidQueryRange();
        uint256 tokenIdsIdx;
        uint256 stopLimit = _nextTokenId();
        // Set `start = max(start, _startTokenId())`.
        if (start < _startTokenId()) {
            start = _startTokenId();
        }
        // Set `stop = min(stop, stopLimit)`.
        if (stop > stopLimit) {
            stop = stopLimit;
        }
        uint256 tokenIdsMaxLength = balanceOf(owner);
        // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
        // to cater for cases where `balanceOf(owner)` is too big.
        if (start < stop) {
            uint256 rangeLength = stop - start;
            if (rangeLength < tokenIdsMaxLength) {
                tokenIdsMaxLength = rangeLength;
            }
        } else {
            tokenIdsMaxLength = 0;
        }
        uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
        if (tokenIdsMaxLength == 0) {
            return tokenIds;
        }
        // We need to call `explicitOwnershipOf(start)`,
        // because the slot at `start` may not be initialized.
        TokenOwnership memory ownership = explicitOwnershipOf(start);
        address currOwnershipAddr;
        // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
        // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
        if (!ownership.burned) {
            currOwnershipAddr = ownership.addr;
        }
        for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
            ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                tokenIds[tokenIdsIdx++] = i;
            }
        }
        // Downsize the array to fit.
        assembly {
            mstore(tokenIds, tokenIdsIdx)
        }
        return tokenIds;
    }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
    unchecked {
        uint256 tokenIdsIdx;
        address currOwnershipAddr;
        uint256 tokenIdsLength = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenIdsLength);
        TokenOwnership memory ownership;
        for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
            ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                tokenIds[tokenIdsIdx++] = i;
            }
        }
        return tokenIds;
    }
    }
}


pragma solidity ^0.8.4;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex;
                // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

contract DegenPepe is ERC721AQueryable, ERC721ABurnable, Ownable {
    using EnumerableSet for EnumerableSet.UintSet;

    uint256 public constant MAX_SUPPLY = 999;

    uint256 public maxByWallet = 2;
    mapping(address => uint256) public mintedByWallet;
    mapping(address => uint256) public walletWhitelist;

    // 0:close | 1:whitelist | 2:open
    uint8 public saleState = 0;

    bool public collectMarketing = true;

    //baseURI
    string public baseURI;

    //uriSuffix
    string public uriSuffix;

    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI_,
        string memory uriSuffix_
    ) ERC721A(name, symbol) {
        baseURI = baseURI_;
        uriSuffix = uriSuffix_;
    }

    uint256 public MINT_PRICE = .01 ether;

    /******************** PUBLIC ********************/

    function mint(uint256 amount) external payable {
        require(saleState != 0, "Cant mint yet");
        require(msg.sender == tx.origin, "not allowed");
        require(amount + _totalMinted()  <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
        require(amount > 0, "Amount can't be 0");

        if(saleState == 1) {
            require(amount + mintedByWallet[msg.sender] <= walletWhitelist[msg.sender], "Exceed whitelist mint for this wallet");
            mintedByWallet[msg.sender] += amount;
            _safeMint(msg.sender, amount);
        } else if(saleState == 2) {
            require(amount + mintedByWallet[msg.sender] <= (maxByWallet + walletWhitelist[msg.sender]), "Exceed maxByWallet");
            if (collectMarketing) {
                require(amount * MINT_PRICE <= msg.value, "Invalid payment amount");
            }

            mintedByWallet[msg.sender] += amount;
            _safeMint(msg.sender, amount);            
        }
    }

    /******************** OVERRIDES ********************/

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

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

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

        if (bytes(baseURI).length == 0) {
            return _toString(tokenId);
        }

        return string(abi.encodePacked(baseURI, _toString(tokenId), uriSuffix));
    }

    /******************** OWNER ********************/

    /// @notice Set baseURI.
    /// @param newBaseURI New baseURI.
    /// @param newUriSuffix New uriSuffix.
    function setBaseURI(string memory newBaseURI, string memory newUriSuffix) external onlyOwner {
        baseURI = newBaseURI;
        uriSuffix = newUriSuffix;
    }

    /// @notice Set saleState.
    /// @param newSaleState New sale state.
    function setSaleState(uint8 newSaleState) external onlyOwner {
        saleState = newSaleState;
    }

    /// @notice Set collectMarketing.
    /// @param newCollectMarketing New collect marketing flag.
    function setCollectMarketing(bool newCollectMarketing) external onlyOwner {
        collectMarketing = newCollectMarketing;
    }

    /// @notice Set maxByWallet.
    /// @param newMaxByWallet New max by wallet
    function setMaxByWallet(uint256 newMaxByWallet) external onlyOwner {
        maxByWallet = newMaxByWallet;
    }

    /******************** ALPHA MINT ********************/

    function alphaMint(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        require(saleState == 0, "sale is open!");
        require(addresses.length == count.length, "mismatching lengths!");

        for (uint256 i; i < addresses.length; i++) {
            _safeMint(addresses[i], count[i]);
        }

        require(_totalMinted() <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
    }

    function setWhitelist(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        require(saleState == 0, "sale is open!");

        require(addresses.length == count.length, "mismatching lengths!");

        for (uint256 i; i < addresses.length; i++) {
            walletWhitelist[addresses[i]]=count[i];
        }
    }


    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"uriSuffix_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"alphaMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"},{"internalType":"string","name":"newUriSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newCollectMarketing","type":"bool"}],"name":"setCollectMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxByWallet","type":"uint256"}],"name":"setMaxByWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newSaleState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260026009556000600c60006101000a81548160ff021916908360ff1602179055506001600c60016101000a81548160ff021916908315150217905550662386f26fc10000600f553480156200005857600080fd5b5060405162004ea838038062004ea883398181016040528101906200007e91906200032b565b8383816002908051906020019062000098929190620001fd565b508060039080519060200190620000b1929190620001fd565b50620000c26200012660201b60201c565b6000819055505050620000ea620000de6200012f60201b60201c565b6200013760201b60201c565b81600d908051906020019062000102929190620001fd565b5080600e90805190602001906200011b929190620001fd565b50505050506200059d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020b90620004ae565b90600052602060002090601f0160209004810192826200022f57600085556200027b565b82601f106200024a57805160ff19168380011785556200027b565b828001600101855582156200027b579182015b828111156200027a5782518255916020019190600101906200025d565b5b5090506200028a91906200028e565b5090565b5b80821115620002a95760008160009055506001016200028f565b5090565b6000620002c4620002be8462000442565b62000419565b905082815260208101848484011115620002e357620002e26200057d565b5b620002f084828562000478565b509392505050565b600082601f83011262000310576200030f62000578565b5b815162000322848260208601620002ad565b91505092915050565b6000806000806080858703121562000348576200034762000587565b5b600085015167ffffffffffffffff81111562000369576200036862000582565b5b6200037787828801620002f8565b945050602085015167ffffffffffffffff8111156200039b576200039a62000582565b5b620003a987828801620002f8565b935050604085015167ffffffffffffffff811115620003cd57620003cc62000582565b5b620003db87828801620002f8565b925050606085015167ffffffffffffffff811115620003ff57620003fe62000582565b5b6200040d87828801620002f8565b91505092959194509250565b60006200042562000438565b9050620004338282620004e4565b919050565b6000604051905090565b600067ffffffffffffffff82111562000460576200045f62000549565b5b6200046b826200058c565b9050602081019050919050565b60005b83811015620004985780820151818401526020810190506200047b565b83811115620004a8576000848401525b50505050565b60006002820490506001821680620004c757607f821691505b60208210811415620004de57620004dd6200051a565b5b50919050565b620004ef826200058c565b810181811067ffffffffffffffff8211171562000511576200051062000549565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6148fb80620005ad6000396000f3fe6080604052600436106102305760003560e01c80636352211e1161012e578063a0712d68116100ab578063c87b56dd1161006f578063c87b56dd14610854578063e985e9c514610891578063f013e0e1146108ce578063f09a03c0146108f7578063f2fde38b1461092057610230565b8063a0712d681461077e578063a22cb4651461079a578063b88d4fde146107c3578063c002d23d146107ec578063c23dc68f1461081757610230565b80638462151c116100f25780638462151c146106835780638da5cb5b146106c05780639434b805146106eb57806395d89b411461071657806399a2557a1461074157610230565b80636352211e1461059e5780636790a9de146105db5780636c0360eb1461060457806370a082311461062f578063715018a61461066c57610230565b806332cb6b0c116101bc5780634a81d9dd116101805780634a81d9dd146104a55780635503a0e8146104e25780635a67de071461050d5780635bbb217714610536578063603f4d521461057357610230565b806332cb6b0c146103e657806334ecc70a146104115780633ccfd60b1461043c57806342842e0e1461045357806342966c681461047c57610230565b80630d758111116102035780630d7581111461030357806317d985141461034057806318160ddd1461036957806323b872dd146103945780632e067421146103bd57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613927565b610949565b6040516102699190613fba565b60405180910390f35b34801561027e57600080fd5b506102876109db565b6040516102949190613fd5565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906139f9565b610a6d565b6040516102d19190613f0f565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061379d565b610ae9565b005b34801561030f57600080fd5b5061032a6004803603810190610325919061361a565b610c90565b6040516103379190614172565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906138fa565b610ca8565b005b34801561037557600080fd5b5061037e610d41565b60405161038b9190614172565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613687565b610d58565b005b3480156103c957600080fd5b506103e460048036038101906103df91906139f9565b610d68565b005b3480156103f257600080fd5b506103fb610dee565b6040516104089190614172565b60405180910390f35b34801561041d57600080fd5b50610426610df4565b6040516104339190614172565b60405180910390f35b34801561044857600080fd5b50610451610dfa565b005b34801561045f57600080fd5b5061047a60048036038101906104759190613687565b610ec6565b005b34801561048857600080fd5b506104a3600480360381019061049e91906139f9565b610ee6565b005b3480156104b157600080fd5b506104cc60048036038101906104c7919061361a565b610ef4565b6040516104d99190614172565b60405180910390f35b3480156104ee57600080fd5b506104f7610f0c565b6040516105049190613fd5565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190613a26565b610f9a565b005b34801561054257600080fd5b5061055d600480360381019061055891906138b1565b611034565b60405161056a9190613f76565b60405180910390f35b34801561057f57600080fd5b506105886110f5565b604051610595919061418d565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c091906139f9565b611108565b6040516105d29190613f0f565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613981565b61111a565b005b34801561061057600080fd5b506106196111c8565b6040516106269190613fd5565b60405180910390f35b34801561063b57600080fd5b506106566004803603810190610651919061361a565b611256565b6040516106639190614172565b60405180910390f35b34801561067857600080fd5b5061068161130f565b005b34801561068f57600080fd5b506106aa60048036038101906106a5919061361a565b611397565b6040516106b79190613f98565b60405180910390f35b3480156106cc57600080fd5b506106d56114e1565b6040516106e29190613f0f565b60405180910390f35b3480156106f757600080fd5b5061070061150b565b60405161070d9190613fba565b60405180910390f35b34801561072257600080fd5b5061072b61151e565b6040516107389190613fd5565b60405180910390f35b34801561074d57600080fd5b50610768600480360381019061076391906137dd565b6115b0565b6040516107759190613f98565b60405180910390f35b610798600480360381019061079391906139f9565b6117c4565b005b3480156107a657600080fd5b506107c160048036038101906107bc919061375d565b611c2d565b005b3480156107cf57600080fd5b506107ea60048036038101906107e591906136da565b611da5565b005b3480156107f857600080fd5b50610801611e18565b60405161080e9190614172565b60405180910390f35b34801561082357600080fd5b5061083e600480360381019061083991906139f9565b611e1e565b60405161084b9190614157565b60405180910390f35b34801561086057600080fd5b5061087b600480360381019061087691906139f9565b611e88565b6040516108889190613fd5565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b39190613647565b611f26565b6040516108c59190613fba565b60405180910390f35b3480156108da57600080fd5b506108f560048036038101906108f09190613830565b611fba565b005b34801561090357600080fd5b5061091e60048036038101906109199190613830565b61217f565b005b34801561092c57600080fd5b506109476004803603810190610942919061361a565b612356565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109a457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109ea906144ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610a16906144ac565b8015610a635780601f10610a3857610100808354040283529160200191610a63565b820191906000526020600020905b815481529060010190602001808311610a4657829003601f168201915b5050505050905090565b6000610a788261244e565b610aae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af4826124ad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7b61257b565b73ffffffffffffffffffffffffffffffffffffffff1614610bde57610ba781610ba261257b565b611f26565b610bdd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a6020528060005260406000206000915090505481565b610cb0612583565b73ffffffffffffffffffffffffffffffffffffffff16610cce6114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90614117565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610d4b61258b565b6001546000540303905090565b610d63838383612594565b505050565b610d70612583565b73ffffffffffffffffffffffffffffffffffffffff16610d8e6114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90614117565b60405180910390fd5b8060098190555050565b6103e781565b60095481565b610e02612583565b73ffffffffffffffffffffffffffffffffffffffff16610e206114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d90614117565b60405180910390fd5b610e7e6114e1565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ec3573d6000803e3d6000fd5b50565b610ee183838360405180602001604052806000815250611da5565b505050565b610ef181600161293e565b50565b600b6020528060005260406000206000915090505481565b600e8054610f19906144ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610f45906144ac565b8015610f925780601f10610f6757610100808354040283529160200191610f92565b820191906000526020600020905b815481529060010190602001808311610f7557829003601f168201915b505050505081565b610fa2612583565b73ffffffffffffffffffffffffffffffffffffffff16610fc06114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d90614117565b60405180910390fd5b80600c60006101000a81548160ff021916908360ff16021790555050565b606060008251905060008167ffffffffffffffff811115611058576110576145e5565b5b60405190808252806020026020018201604052801561109157816020015b61107e61328c565b8152602001906001900390816110765790505b50905060005b8281146110ea576110c18582815181106110b4576110b36145b6565b5b6020026020010151611e1e565b8282815181106110d4576110d36145b6565b5b6020026020010181905250806001019050611097565b508092505050919050565b600c60009054906101000a900460ff1681565b6000611113826124ad565b9050919050565b611122612583565b73ffffffffffffffffffffffffffffffffffffffff166111406114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614117565b60405180910390fd5b81600d90805190602001906111ac9291906132cf565b5080600e90805190602001906111c39291906132cf565b505050565b600d80546111d5906144ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611201906144ac565b801561124e5780601f106112235761010080835404028352916020019161124e565b820191906000526020600020905b81548152906001019060200180831161123157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112be576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611317612583565b73ffffffffffffffffffffffffffffffffffffffff166113356114e1565b73ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290614117565b60405180910390fd5b6113956000612c16565b565b606060008060006113a785611256565b905060008167ffffffffffffffff8111156113c5576113c46145e5565b5b6040519080825280602002602001820160405280156113f35781602001602082028036833780820191505090505b5090506113fe61328c565b600061140861258b565b90505b8386146114d35761141b81612cdc565b915081604001511561142c576114c8565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461146c57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114c757808387806001019850815181106114ba576114b96145b6565b5b6020026020010181815250505b5b80600101905061140b565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60019054906101000a900460ff1681565b60606003805461152d906144ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611559906144ac565b80156115a65780601f1061157b576101008083540402835291602001916115a6565b820191906000526020600020905b81548152906001019060200180831161158957829003601f168201915b5050505050905090565b60608183106115eb576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806115f6612d07565b905061160061258b565b8510156116125761160f61258b565b94505b8084111561161e578093505b600061162987611256565b90508486101561164c576000868603905081811015611646578091505b50611651565b600090505b60008167ffffffffffffffff81111561166d5761166c6145e5565b5b60405190808252806020026020018201604052801561169b5781602001602082028036833780820191505090505b50905060008214156116b357809450505050506117bd565b60006116be88611e1e565b9050600081604001516116d357816000015190505b60008990505b8881141580156116e95750848714155b156117af576116f781612cdc565b9250826040015115611708576117a4565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461174857826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a35780848880600101995081518110611796576117956145b6565b5b6020026020010181815250505b5b8060010190506116d9565b508583528296505050505050505b9392505050565b6000600c60009054906101000a900460ff1660ff16141561181a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611811906140b7565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90614097565b60405180910390fd5b6103e7611893612d10565b8261189e9190614325565b11156118df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d690614137565b60405180910390fd5b60008111611922576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611919906140d7565b60405180910390fd5b6001600c60009054906101000a900460ff1660ff161415611a6e57600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826119c89190614325565b1115611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a00906140f7565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a589190614325565b92505081905550611a693382612d23565b611c2a565b6002600c60009054906101000a900460ff1660ff161415611c2957600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600954611ad69190614325565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611b219190614325565b1115611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614017565b60405180910390fd5b600c60019054906101000a900460ff1615611bc85734600f5482611b86919061437b565b1115611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe90614057565b60405180910390fd5b5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c179190614325565b92505081905550611c283382612d23565b5b5b50565b611c3561257b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c9a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611ca761257b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5461257b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d999190613fba565b60405180910390a35050565b611db0848484612594565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e1257611ddb84848484612d41565b611e11576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f5481565b611e2661328c565b611e2e61328c565b611e3661258b565b831080611e4a5750611e46612d07565b8310155b15611e585780915050611e83565b611e6183612cdc565b9050806040015115611e765780915050611e83565b611e7f83612ea1565b9150505b919050565b6060611e938261244e565b611ec9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d8054611ed8906144ac565b90501415611ef057611ee982612ec1565b9050611f21565b600d611efb83612ec1565b600e604051602001611f0f93929190613ede565b60405160208183030381529060405290505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fc2612583565b73ffffffffffffffffffffffffffffffffffffffff16611fe06114e1565b73ffffffffffffffffffffffffffffffffffffffff1614612036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202d90614117565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff161461208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290613ff7565b60405180910390fd5b8181905084849050146120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614077565b60405180910390fd5b60005b84849050811015612178578282828181106120f4576120f36145b6565b5b90506020020135600b6000878785818110612112576121116145b6565b5b9050602002016020810190612127919061361a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806121709061450f565b9150506120d6565b5050505050565b612187612583565b73ffffffffffffffffffffffffffffffffffffffff166121a56114e1565b73ffffffffffffffffffffffffffffffffffffffff16146121fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f290614117565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff1614612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224790613ff7565b60405180910390fd5b818190508484905014612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f90614077565b60405180910390fd5b60005b84849050811015612303576122f08585838181106122bc576122bb6145b6565b5b90506020020160208101906122d1919061361a565b8484848181106122e4576122e36145b6565b5b90506020020135612d23565b80806122fb9061450f565b91505061229b565b506103e761230f612d10565b1115612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234790614137565b60405180910390fd5b50505050565b61235e612583565b73ffffffffffffffffffffffffffffffffffffffff1661237c6114e1565b73ffffffffffffffffffffffffffffffffffffffff16146123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614117565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990614037565b60405180910390fd5b61244b81612c16565b50565b60008161245961258b565b11158015612468575060005482105b80156124a6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806124bc61258b565b11612544576000548110156125435760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612541575b600081141561253757600460008360019003935083815260200190815260200160002054905061250c565b8092505050612576565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b600061259f826124ad565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612606576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661262761257b565b73ffffffffffffffffffffffffffffffffffffffff16148061265657506126558561265061257b565b611f26565b5b8061269b575061266461257b565b73ffffffffffffffffffffffffffffffffffffffff1661268384610a6d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126d4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561273b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127488585856001612f1b565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61284586612f21565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156128cf5760006001840190506000600460008381526020019081526020016000205414156128cd5760005481146128cc578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129378585856001612f2b565b5050505050565b6000612949836124ad565b905060008190508215612a265760008173ffffffffffffffffffffffffffffffffffffffff1661297761257b565b73ffffffffffffffffffffffffffffffffffffffff1614806129a657506129a5826129a061257b565b611f26565b5b806129eb57506129b461257b565b73ffffffffffffffffffffffffffffffffffffffff166129d386610a6d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a24576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b612a34816000866001612f1b565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b612b0984612f21565b171717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612b94576000600185019050600060046000838152602001908152602001600020541415612b92576000548114612b91578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bfe816000866001612f2b565b60016000815480929190600101919050555050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ce461328c565b612d006004600084815260200190815260200160002054612f31565b9050919050565b60008054905090565b6000612d1a61258b565b60005403905090565b612d3d828260405180602001604052806000815250612fcd565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d6761257b565b8786866040518563ffffffff1660e01b8152600401612d899493929190613f2a565b602060405180830381600087803b158015612da357600080fd5b505af1925050508015612dd457506040513d601f19601f82011682018060405250810190612dd19190613954565b60015b612e4e573d8060008114612e04576040519150601f19603f3d011682016040523d82523d6000602084013e612e09565b606091505b50600081511415612e46576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ea961328c565b612eba612eb5836124ad565b612f31565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612f0757600183039250600a81066030018353600a81049050612ee7565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b612f3961328c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561303a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613075576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130826000858386612f1b565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16130e760018514613282565b901b60a042901b6130f786612f21565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146131fb575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131ab6000878480600101955087612d41565b6131e1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061313c5782600054146131f657600080fd5b613266565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106131fc575b81600081905550505061327c6000858386612f2b565b50505050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546132db906144ac565b90600052602060002090601f0160209004810192826132fd5760008555613344565b82601f1061331657805160ff1916838001178555613344565b82800160010185558215613344579182015b82811115613343578251825591602001919060010190613328565b5b5090506133519190613355565b5090565b5b8082111561336e576000816000905550600101613356565b5090565b6000613385613380846141cd565b6141a8565b905080838252602082019050828560208602820111156133a8576133a761461e565b5b60005b858110156133d857816133be88826135f0565b8452602084019350602083019250506001810190506133ab565b5050509392505050565b60006133f56133f0846141f9565b6141a8565b90508281526020810184848401111561341157613410614623565b5b61341c84828561446a565b509392505050565b60006134376134328461422a565b6141a8565b90508281526020810184848401111561345357613452614623565b5b61345e84828561446a565b509392505050565b60008135905061347581614852565b92915050565b60008083601f84011261349157613490614619565b5b8235905067ffffffffffffffff8111156134ae576134ad614614565b5b6020830191508360208202830111156134ca576134c961461e565b5b9250929050565b60008083601f8401126134e7576134e6614619565b5b8235905067ffffffffffffffff81111561350457613503614614565b5b6020830191508360208202830111156135205761351f61461e565b5b9250929050565b600082601f83011261353c5761353b614619565b5b813561354c848260208601613372565b91505092915050565b60008135905061356481614869565b92915050565b60008135905061357981614880565b92915050565b60008151905061358e81614880565b92915050565b600082601f8301126135a9576135a8614619565b5b81356135b98482602086016133e2565b91505092915050565b600082601f8301126135d7576135d6614619565b5b81356135e7848260208601613424565b91505092915050565b6000813590506135ff81614897565b92915050565b600081359050613614816148ae565b92915050565b6000602082840312156136305761362f61462d565b5b600061363e84828501613466565b91505092915050565b6000806040838503121561365e5761365d61462d565b5b600061366c85828601613466565b925050602061367d85828601613466565b9150509250929050565b6000806000606084860312156136a05761369f61462d565b5b60006136ae86828701613466565b93505060206136bf86828701613466565b92505060406136d0868287016135f0565b9150509250925092565b600080600080608085870312156136f4576136f361462d565b5b600061370287828801613466565b945050602061371387828801613466565b9350506040613724878288016135f0565b925050606085013567ffffffffffffffff81111561374557613744614628565b5b61375187828801613594565b91505092959194509250565b600080604083850312156137745761377361462d565b5b600061378285828601613466565b925050602061379385828601613555565b9150509250929050565b600080604083850312156137b4576137b361462d565b5b60006137c285828601613466565b92505060206137d3858286016135f0565b9150509250929050565b6000806000606084860312156137f6576137f561462d565b5b600061380486828701613466565b9350506020613815868287016135f0565b9250506040613826868287016135f0565b9150509250925092565b6000806000806040858703121561384a5761384961462d565b5b600085013567ffffffffffffffff81111561386857613867614628565b5b6138748782880161347b565b9450945050602085013567ffffffffffffffff81111561389757613896614628565b5b6138a3878288016134d1565b925092505092959194509250565b6000602082840312156138c7576138c661462d565b5b600082013567ffffffffffffffff8111156138e5576138e4614628565b5b6138f184828501613527565b91505092915050565b6000602082840312156139105761390f61462d565b5b600061391e84828501613555565b91505092915050565b60006020828403121561393d5761393c61462d565b5b600061394b8482850161356a565b91505092915050565b60006020828403121561396a5761396961462d565b5b60006139788482850161357f565b91505092915050565b600080604083850312156139985761399761462d565b5b600083013567ffffffffffffffff8111156139b6576139b5614628565b5b6139c2858286016135c2565b925050602083013567ffffffffffffffff8111156139e3576139e2614628565b5b6139ef858286016135c2565b9150509250929050565b600060208284031215613a0f57613a0e61462d565b5b6000613a1d848285016135f0565b91505092915050565b600060208284031215613a3c57613a3b61462d565b5b6000613a4a84828501613605565b91505092915050565b6000613a5f8383613e1e565b60608301905092915050565b6000613a778383613ea2565b60208301905092915050565b613a8c816143d5565b82525050565b613a9b816143d5565b82525050565b6000613aac82614290565b613ab681856142d6565b9350613ac18361425b565b8060005b83811015613af2578151613ad98882613a53565b9750613ae4836142bc565b925050600181019050613ac5565b5085935050505092915050565b6000613b0a8261429b565b613b1481856142e7565b9350613b1f8361426b565b8060005b83811015613b50578151613b378882613a6b565b9750613b42836142c9565b925050600181019050613b23565b5085935050505092915050565b613b66816143e7565b82525050565b613b75816143e7565b82525050565b6000613b86826142a6565b613b9081856142f8565b9350613ba0818560208601614479565b613ba981614632565b840191505092915050565b6000613bbf826142b1565b613bc98185614309565b9350613bd9818560208601614479565b613be281614632565b840191505092915050565b6000613bf8826142b1565b613c02818561431a565b9350613c12818560208601614479565b80840191505092915050565b60008154613c2b816144ac565b613c35818661431a565b94506001821660008114613c505760018114613c6157613c94565b60ff19831686528186019350613c94565b613c6a8561427b565b60005b83811015613c8c57815481890152600182019150602081019050613c6d565b838801955050505b50505092915050565b6000613caa600d83614309565b9150613cb582614643565b602082019050919050565b6000613ccd601283614309565b9150613cd88261466c565b602082019050919050565b6000613cf0602683614309565b9150613cfb82614695565b604082019050919050565b6000613d13601683614309565b9150613d1e826146e4565b602082019050919050565b6000613d36601483614309565b9150613d418261470d565b602082019050919050565b6000613d59600b83614309565b9150613d6482614736565b602082019050919050565b6000613d7c600d83614309565b9150613d878261475f565b602082019050919050565b6000613d9f601183614309565b9150613daa82614788565b602082019050919050565b6000613dc2602583614309565b9150613dcd826147b1565b604082019050919050565b6000613de5602083614309565b9150613df082614800565b602082019050919050565b6000613e08601183614309565b9150613e1382614829565b602082019050919050565b606082016000820151613e346000850182613a83565b506020820151613e476020850182613ec0565b506040820151613e5a6040850182613b5d565b50505050565b606082016000820151613e766000850182613a83565b506020820151613e896020850182613ec0565b506040820151613e9c6040850182613b5d565b50505050565b613eab8161443f565b82525050565b613eba8161443f565b82525050565b613ec981614449565b82525050565b613ed88161445d565b82525050565b6000613eea8286613c1e565b9150613ef68285613bed565b9150613f028284613c1e565b9150819050949350505050565b6000602082019050613f246000830184613a92565b92915050565b6000608082019050613f3f6000830187613a92565b613f4c6020830186613a92565b613f596040830185613eb1565b8181036060830152613f6b8184613b7b565b905095945050505050565b60006020820190508181036000830152613f908184613aa1565b905092915050565b60006020820190508181036000830152613fb28184613aff565b905092915050565b6000602082019050613fcf6000830184613b6c565b92915050565b60006020820190508181036000830152613fef8184613bb4565b905092915050565b6000602082019050818103600083015261401081613c9d565b9050919050565b6000602082019050818103600083015261403081613cc0565b9050919050565b6000602082019050818103600083015261405081613ce3565b9050919050565b6000602082019050818103600083015261407081613d06565b9050919050565b6000602082019050818103600083015261409081613d29565b9050919050565b600060208201905081810360008301526140b081613d4c565b9050919050565b600060208201905081810360008301526140d081613d6f565b9050919050565b600060208201905081810360008301526140f081613d92565b9050919050565b6000602082019050818103600083015261411081613db5565b9050919050565b6000602082019050818103600083015261413081613dd8565b9050919050565b6000602082019050818103600083015261415081613dfb565b9050919050565b600060608201905061416c6000830184613e60565b92915050565b60006020820190506141876000830184613eb1565b92915050565b60006020820190506141a26000830184613ecf565b92915050565b60006141b26141c3565b90506141be82826144de565b919050565b6000604051905090565b600067ffffffffffffffff8211156141e8576141e76145e5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614214576142136145e5565b5b61421d82614632565b9050602081019050919050565b600067ffffffffffffffff821115614245576142446145e5565b5b61424e82614632565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143308261443f565b915061433b8361443f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143705761436f614558565b5b828201905092915050565b60006143868261443f565b91506143918361443f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ca576143c9614558565b5b828202905092915050565b60006143e08261441f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561449757808201518184015260208101905061447c565b838111156144a6576000848401525b50505050565b600060028204905060018216806144c457607f821691505b602082108114156144d8576144d7614587565b5b50919050565b6144e782614632565b810181811067ffffffffffffffff82111715614506576145056145e5565b5b80604052505050565b600061451a8261443f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561454d5761454c614558565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f73616c65206973206f70656e2100000000000000000000000000000000000000600082015250565b7f457863656564206d6178427957616c6c65740000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b7f6d69736d61746368696e67206c656e6774687321000000000000000000000000600082015250565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f43616e74206d696e742079657400000000000000000000000000000000000000600082015250565b7f416d6f756e742063616e27742062652030000000000000000000000000000000600082015250565b7f4578636565642077686974656c697374206d696e7420666f722074686973207760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f457863656564204d41585f535550504c59000000000000000000000000000000600082015250565b61485b816143d5565b811461486657600080fd5b50565b614872816143e7565b811461487d57600080fd5b50565b614889816143f3565b811461489457600080fd5b50565b6148a08161443f565b81146148ab57600080fd5b50565b6148b78161445d565b81146148c257600080fd5b5056fea264697066735822122033b2fcf05826dd93a928027a0551ac50a60325ce8263eb6eb12b5bb595c1691d64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000009444547454e50455045000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054450455045000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f307873796e657267792e78797a2f6170692f6d6574615f64702f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c80636352211e1161012e578063a0712d68116100ab578063c87b56dd1161006f578063c87b56dd14610854578063e985e9c514610891578063f013e0e1146108ce578063f09a03c0146108f7578063f2fde38b1461092057610230565b8063a0712d681461077e578063a22cb4651461079a578063b88d4fde146107c3578063c002d23d146107ec578063c23dc68f1461081757610230565b80638462151c116100f25780638462151c146106835780638da5cb5b146106c05780639434b805146106eb57806395d89b411461071657806399a2557a1461074157610230565b80636352211e1461059e5780636790a9de146105db5780636c0360eb1461060457806370a082311461062f578063715018a61461066c57610230565b806332cb6b0c116101bc5780634a81d9dd116101805780634a81d9dd146104a55780635503a0e8146104e25780635a67de071461050d5780635bbb217714610536578063603f4d521461057357610230565b806332cb6b0c146103e657806334ecc70a146104115780633ccfd60b1461043c57806342842e0e1461045357806342966c681461047c57610230565b80630d758111116102035780630d7581111461030357806317d985141461034057806318160ddd1461036957806323b872dd146103945780632e067421146103bd57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613927565b610949565b6040516102699190613fba565b60405180910390f35b34801561027e57600080fd5b506102876109db565b6040516102949190613fd5565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906139f9565b610a6d565b6040516102d19190613f0f565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061379d565b610ae9565b005b34801561030f57600080fd5b5061032a6004803603810190610325919061361a565b610c90565b6040516103379190614172565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906138fa565b610ca8565b005b34801561037557600080fd5b5061037e610d41565b60405161038b9190614172565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613687565b610d58565b005b3480156103c957600080fd5b506103e460048036038101906103df91906139f9565b610d68565b005b3480156103f257600080fd5b506103fb610dee565b6040516104089190614172565b60405180910390f35b34801561041d57600080fd5b50610426610df4565b6040516104339190614172565b60405180910390f35b34801561044857600080fd5b50610451610dfa565b005b34801561045f57600080fd5b5061047a60048036038101906104759190613687565b610ec6565b005b34801561048857600080fd5b506104a3600480360381019061049e91906139f9565b610ee6565b005b3480156104b157600080fd5b506104cc60048036038101906104c7919061361a565b610ef4565b6040516104d99190614172565b60405180910390f35b3480156104ee57600080fd5b506104f7610f0c565b6040516105049190613fd5565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190613a26565b610f9a565b005b34801561054257600080fd5b5061055d600480360381019061055891906138b1565b611034565b60405161056a9190613f76565b60405180910390f35b34801561057f57600080fd5b506105886110f5565b604051610595919061418d565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c091906139f9565b611108565b6040516105d29190613f0f565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613981565b61111a565b005b34801561061057600080fd5b506106196111c8565b6040516106269190613fd5565b60405180910390f35b34801561063b57600080fd5b506106566004803603810190610651919061361a565b611256565b6040516106639190614172565b60405180910390f35b34801561067857600080fd5b5061068161130f565b005b34801561068f57600080fd5b506106aa60048036038101906106a5919061361a565b611397565b6040516106b79190613f98565b60405180910390f35b3480156106cc57600080fd5b506106d56114e1565b6040516106e29190613f0f565b60405180910390f35b3480156106f757600080fd5b5061070061150b565b60405161070d9190613fba565b60405180910390f35b34801561072257600080fd5b5061072b61151e565b6040516107389190613fd5565b60405180910390f35b34801561074d57600080fd5b50610768600480360381019061076391906137dd565b6115b0565b6040516107759190613f98565b60405180910390f35b610798600480360381019061079391906139f9565b6117c4565b005b3480156107a657600080fd5b506107c160048036038101906107bc919061375d565b611c2d565b005b3480156107cf57600080fd5b506107ea60048036038101906107e591906136da565b611da5565b005b3480156107f857600080fd5b50610801611e18565b60405161080e9190614172565b60405180910390f35b34801561082357600080fd5b5061083e600480360381019061083991906139f9565b611e1e565b60405161084b9190614157565b60405180910390f35b34801561086057600080fd5b5061087b600480360381019061087691906139f9565b611e88565b6040516108889190613fd5565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b39190613647565b611f26565b6040516108c59190613fba565b60405180910390f35b3480156108da57600080fd5b506108f560048036038101906108f09190613830565b611fba565b005b34801561090357600080fd5b5061091e60048036038101906109199190613830565b61217f565b005b34801561092c57600080fd5b506109476004803603810190610942919061361a565b612356565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109a457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109ea906144ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610a16906144ac565b8015610a635780601f10610a3857610100808354040283529160200191610a63565b820191906000526020600020905b815481529060010190602001808311610a4657829003601f168201915b5050505050905090565b6000610a788261244e565b610aae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af4826124ad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7b61257b565b73ffffffffffffffffffffffffffffffffffffffff1614610bde57610ba781610ba261257b565b611f26565b610bdd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a6020528060005260406000206000915090505481565b610cb0612583565b73ffffffffffffffffffffffffffffffffffffffff16610cce6114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90614117565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610d4b61258b565b6001546000540303905090565b610d63838383612594565b505050565b610d70612583565b73ffffffffffffffffffffffffffffffffffffffff16610d8e6114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90614117565b60405180910390fd5b8060098190555050565b6103e781565b60095481565b610e02612583565b73ffffffffffffffffffffffffffffffffffffffff16610e206114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d90614117565b60405180910390fd5b610e7e6114e1565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ec3573d6000803e3d6000fd5b50565b610ee183838360405180602001604052806000815250611da5565b505050565b610ef181600161293e565b50565b600b6020528060005260406000206000915090505481565b600e8054610f19906144ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610f45906144ac565b8015610f925780601f10610f6757610100808354040283529160200191610f92565b820191906000526020600020905b815481529060010190602001808311610f7557829003601f168201915b505050505081565b610fa2612583565b73ffffffffffffffffffffffffffffffffffffffff16610fc06114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d90614117565b60405180910390fd5b80600c60006101000a81548160ff021916908360ff16021790555050565b606060008251905060008167ffffffffffffffff811115611058576110576145e5565b5b60405190808252806020026020018201604052801561109157816020015b61107e61328c565b8152602001906001900390816110765790505b50905060005b8281146110ea576110c18582815181106110b4576110b36145b6565b5b6020026020010151611e1e565b8282815181106110d4576110d36145b6565b5b6020026020010181905250806001019050611097565b508092505050919050565b600c60009054906101000a900460ff1681565b6000611113826124ad565b9050919050565b611122612583565b73ffffffffffffffffffffffffffffffffffffffff166111406114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614117565b60405180910390fd5b81600d90805190602001906111ac9291906132cf565b5080600e90805190602001906111c39291906132cf565b505050565b600d80546111d5906144ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611201906144ac565b801561124e5780601f106112235761010080835404028352916020019161124e565b820191906000526020600020905b81548152906001019060200180831161123157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112be576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611317612583565b73ffffffffffffffffffffffffffffffffffffffff166113356114e1565b73ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290614117565b60405180910390fd5b6113956000612c16565b565b606060008060006113a785611256565b905060008167ffffffffffffffff8111156113c5576113c46145e5565b5b6040519080825280602002602001820160405280156113f35781602001602082028036833780820191505090505b5090506113fe61328c565b600061140861258b565b90505b8386146114d35761141b81612cdc565b915081604001511561142c576114c8565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461146c57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114c757808387806001019850815181106114ba576114b96145b6565b5b6020026020010181815250505b5b80600101905061140b565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60019054906101000a900460ff1681565b60606003805461152d906144ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611559906144ac565b80156115a65780601f1061157b576101008083540402835291602001916115a6565b820191906000526020600020905b81548152906001019060200180831161158957829003601f168201915b5050505050905090565b60608183106115eb576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806115f6612d07565b905061160061258b565b8510156116125761160f61258b565b94505b8084111561161e578093505b600061162987611256565b90508486101561164c576000868603905081811015611646578091505b50611651565b600090505b60008167ffffffffffffffff81111561166d5761166c6145e5565b5b60405190808252806020026020018201604052801561169b5781602001602082028036833780820191505090505b50905060008214156116b357809450505050506117bd565b60006116be88611e1e565b9050600081604001516116d357816000015190505b60008990505b8881141580156116e95750848714155b156117af576116f781612cdc565b9250826040015115611708576117a4565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461174857826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a35780848880600101995081518110611796576117956145b6565b5b6020026020010181815250505b5b8060010190506116d9565b508583528296505050505050505b9392505050565b6000600c60009054906101000a900460ff1660ff16141561181a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611811906140b7565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90614097565b60405180910390fd5b6103e7611893612d10565b8261189e9190614325565b11156118df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d690614137565b60405180910390fd5b60008111611922576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611919906140d7565b60405180910390fd5b6001600c60009054906101000a900460ff1660ff161415611a6e57600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826119c89190614325565b1115611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a00906140f7565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a589190614325565b92505081905550611a693382612d23565b611c2a565b6002600c60009054906101000a900460ff1660ff161415611c2957600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600954611ad69190614325565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611b219190614325565b1115611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614017565b60405180910390fd5b600c60019054906101000a900460ff1615611bc85734600f5482611b86919061437b565b1115611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe90614057565b60405180910390fd5b5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c179190614325565b92505081905550611c283382612d23565b5b5b50565b611c3561257b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c9a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611ca761257b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5461257b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d999190613fba565b60405180910390a35050565b611db0848484612594565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e1257611ddb84848484612d41565b611e11576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f5481565b611e2661328c565b611e2e61328c565b611e3661258b565b831080611e4a5750611e46612d07565b8310155b15611e585780915050611e83565b611e6183612cdc565b9050806040015115611e765780915050611e83565b611e7f83612ea1565b9150505b919050565b6060611e938261244e565b611ec9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d8054611ed8906144ac565b90501415611ef057611ee982612ec1565b9050611f21565b600d611efb83612ec1565b600e604051602001611f0f93929190613ede565b60405160208183030381529060405290505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fc2612583565b73ffffffffffffffffffffffffffffffffffffffff16611fe06114e1565b73ffffffffffffffffffffffffffffffffffffffff1614612036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202d90614117565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff161461208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290613ff7565b60405180910390fd5b8181905084849050146120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614077565b60405180910390fd5b60005b84849050811015612178578282828181106120f4576120f36145b6565b5b90506020020135600b6000878785818110612112576121116145b6565b5b9050602002016020810190612127919061361a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806121709061450f565b9150506120d6565b5050505050565b612187612583565b73ffffffffffffffffffffffffffffffffffffffff166121a56114e1565b73ffffffffffffffffffffffffffffffffffffffff16146121fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f290614117565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff1614612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224790613ff7565b60405180910390fd5b818190508484905014612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f90614077565b60405180910390fd5b60005b84849050811015612303576122f08585838181106122bc576122bb6145b6565b5b90506020020160208101906122d1919061361a565b8484848181106122e4576122e36145b6565b5b90506020020135612d23565b80806122fb9061450f565b91505061229b565b506103e761230f612d10565b1115612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234790614137565b60405180910390fd5b50505050565b61235e612583565b73ffffffffffffffffffffffffffffffffffffffff1661237c6114e1565b73ffffffffffffffffffffffffffffffffffffffff16146123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614117565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990614037565b60405180910390fd5b61244b81612c16565b50565b60008161245961258b565b11158015612468575060005482105b80156124a6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806124bc61258b565b11612544576000548110156125435760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612541575b600081141561253757600460008360019003935083815260200190815260200160002054905061250c565b8092505050612576565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b600061259f826124ad565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612606576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661262761257b565b73ffffffffffffffffffffffffffffffffffffffff16148061265657506126558561265061257b565b611f26565b5b8061269b575061266461257b565b73ffffffffffffffffffffffffffffffffffffffff1661268384610a6d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126d4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561273b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127488585856001612f1b565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61284586612f21565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156128cf5760006001840190506000600460008381526020019081526020016000205414156128cd5760005481146128cc578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129378585856001612f2b565b5050505050565b6000612949836124ad565b905060008190508215612a265760008173ffffffffffffffffffffffffffffffffffffffff1661297761257b565b73ffffffffffffffffffffffffffffffffffffffff1614806129a657506129a5826129a061257b565b611f26565b5b806129eb57506129b461257b565b73ffffffffffffffffffffffffffffffffffffffff166129d386610a6d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a24576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b612a34816000866001612f1b565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b612b0984612f21565b171717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612b94576000600185019050600060046000838152602001908152602001600020541415612b92576000548114612b91578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bfe816000866001612f2b565b60016000815480929190600101919050555050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ce461328c565b612d006004600084815260200190815260200160002054612f31565b9050919050565b60008054905090565b6000612d1a61258b565b60005403905090565b612d3d828260405180602001604052806000815250612fcd565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d6761257b565b8786866040518563ffffffff1660e01b8152600401612d899493929190613f2a565b602060405180830381600087803b158015612da357600080fd5b505af1925050508015612dd457506040513d601f19601f82011682018060405250810190612dd19190613954565b60015b612e4e573d8060008114612e04576040519150601f19603f3d011682016040523d82523d6000602084013e612e09565b606091505b50600081511415612e46576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ea961328c565b612eba612eb5836124ad565b612f31565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612f0757600183039250600a81066030018353600a81049050612ee7565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b612f3961328c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561303a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613075576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130826000858386612f1b565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16130e760018514613282565b901b60a042901b6130f786612f21565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146131fb575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131ab6000878480600101955087612d41565b6131e1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061313c5782600054146131f657600080fd5b613266565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106131fc575b81600081905550505061327c6000858386612f2b565b50505050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546132db906144ac565b90600052602060002090601f0160209004810192826132fd5760008555613344565b82601f1061331657805160ff1916838001178555613344565b82800160010185558215613344579182015b82811115613343578251825591602001919060010190613328565b5b5090506133519190613355565b5090565b5b8082111561336e576000816000905550600101613356565b5090565b6000613385613380846141cd565b6141a8565b905080838252602082019050828560208602820111156133a8576133a761461e565b5b60005b858110156133d857816133be88826135f0565b8452602084019350602083019250506001810190506133ab565b5050509392505050565b60006133f56133f0846141f9565b6141a8565b90508281526020810184848401111561341157613410614623565b5b61341c84828561446a565b509392505050565b60006134376134328461422a565b6141a8565b90508281526020810184848401111561345357613452614623565b5b61345e84828561446a565b509392505050565b60008135905061347581614852565b92915050565b60008083601f84011261349157613490614619565b5b8235905067ffffffffffffffff8111156134ae576134ad614614565b5b6020830191508360208202830111156134ca576134c961461e565b5b9250929050565b60008083601f8401126134e7576134e6614619565b5b8235905067ffffffffffffffff81111561350457613503614614565b5b6020830191508360208202830111156135205761351f61461e565b5b9250929050565b600082601f83011261353c5761353b614619565b5b813561354c848260208601613372565b91505092915050565b60008135905061356481614869565b92915050565b60008135905061357981614880565b92915050565b60008151905061358e81614880565b92915050565b600082601f8301126135a9576135a8614619565b5b81356135b98482602086016133e2565b91505092915050565b600082601f8301126135d7576135d6614619565b5b81356135e7848260208601613424565b91505092915050565b6000813590506135ff81614897565b92915050565b600081359050613614816148ae565b92915050565b6000602082840312156136305761362f61462d565b5b600061363e84828501613466565b91505092915050565b6000806040838503121561365e5761365d61462d565b5b600061366c85828601613466565b925050602061367d85828601613466565b9150509250929050565b6000806000606084860312156136a05761369f61462d565b5b60006136ae86828701613466565b93505060206136bf86828701613466565b92505060406136d0868287016135f0565b9150509250925092565b600080600080608085870312156136f4576136f361462d565b5b600061370287828801613466565b945050602061371387828801613466565b9350506040613724878288016135f0565b925050606085013567ffffffffffffffff81111561374557613744614628565b5b61375187828801613594565b91505092959194509250565b600080604083850312156137745761377361462d565b5b600061378285828601613466565b925050602061379385828601613555565b9150509250929050565b600080604083850312156137b4576137b361462d565b5b60006137c285828601613466565b92505060206137d3858286016135f0565b9150509250929050565b6000806000606084860312156137f6576137f561462d565b5b600061380486828701613466565b9350506020613815868287016135f0565b9250506040613826868287016135f0565b9150509250925092565b6000806000806040858703121561384a5761384961462d565b5b600085013567ffffffffffffffff81111561386857613867614628565b5b6138748782880161347b565b9450945050602085013567ffffffffffffffff81111561389757613896614628565b5b6138a3878288016134d1565b925092505092959194509250565b6000602082840312156138c7576138c661462d565b5b600082013567ffffffffffffffff8111156138e5576138e4614628565b5b6138f184828501613527565b91505092915050565b6000602082840312156139105761390f61462d565b5b600061391e84828501613555565b91505092915050565b60006020828403121561393d5761393c61462d565b5b600061394b8482850161356a565b91505092915050565b60006020828403121561396a5761396961462d565b5b60006139788482850161357f565b91505092915050565b600080604083850312156139985761399761462d565b5b600083013567ffffffffffffffff8111156139b6576139b5614628565b5b6139c2858286016135c2565b925050602083013567ffffffffffffffff8111156139e3576139e2614628565b5b6139ef858286016135c2565b9150509250929050565b600060208284031215613a0f57613a0e61462d565b5b6000613a1d848285016135f0565b91505092915050565b600060208284031215613a3c57613a3b61462d565b5b6000613a4a84828501613605565b91505092915050565b6000613a5f8383613e1e565b60608301905092915050565b6000613a778383613ea2565b60208301905092915050565b613a8c816143d5565b82525050565b613a9b816143d5565b82525050565b6000613aac82614290565b613ab681856142d6565b9350613ac18361425b565b8060005b83811015613af2578151613ad98882613a53565b9750613ae4836142bc565b925050600181019050613ac5565b5085935050505092915050565b6000613b0a8261429b565b613b1481856142e7565b9350613b1f8361426b565b8060005b83811015613b50578151613b378882613a6b565b9750613b42836142c9565b925050600181019050613b23565b5085935050505092915050565b613b66816143e7565b82525050565b613b75816143e7565b82525050565b6000613b86826142a6565b613b9081856142f8565b9350613ba0818560208601614479565b613ba981614632565b840191505092915050565b6000613bbf826142b1565b613bc98185614309565b9350613bd9818560208601614479565b613be281614632565b840191505092915050565b6000613bf8826142b1565b613c02818561431a565b9350613c12818560208601614479565b80840191505092915050565b60008154613c2b816144ac565b613c35818661431a565b94506001821660008114613c505760018114613c6157613c94565b60ff19831686528186019350613c94565b613c6a8561427b565b60005b83811015613c8c57815481890152600182019150602081019050613c6d565b838801955050505b50505092915050565b6000613caa600d83614309565b9150613cb582614643565b602082019050919050565b6000613ccd601283614309565b9150613cd88261466c565b602082019050919050565b6000613cf0602683614309565b9150613cfb82614695565b604082019050919050565b6000613d13601683614309565b9150613d1e826146e4565b602082019050919050565b6000613d36601483614309565b9150613d418261470d565b602082019050919050565b6000613d59600b83614309565b9150613d6482614736565b602082019050919050565b6000613d7c600d83614309565b9150613d878261475f565b602082019050919050565b6000613d9f601183614309565b9150613daa82614788565b602082019050919050565b6000613dc2602583614309565b9150613dcd826147b1565b604082019050919050565b6000613de5602083614309565b9150613df082614800565b602082019050919050565b6000613e08601183614309565b9150613e1382614829565b602082019050919050565b606082016000820151613e346000850182613a83565b506020820151613e476020850182613ec0565b506040820151613e5a6040850182613b5d565b50505050565b606082016000820151613e766000850182613a83565b506020820151613e896020850182613ec0565b506040820151613e9c6040850182613b5d565b50505050565b613eab8161443f565b82525050565b613eba8161443f565b82525050565b613ec981614449565b82525050565b613ed88161445d565b82525050565b6000613eea8286613c1e565b9150613ef68285613bed565b9150613f028284613c1e565b9150819050949350505050565b6000602082019050613f246000830184613a92565b92915050565b6000608082019050613f3f6000830187613a92565b613f4c6020830186613a92565b613f596040830185613eb1565b8181036060830152613f6b8184613b7b565b905095945050505050565b60006020820190508181036000830152613f908184613aa1565b905092915050565b60006020820190508181036000830152613fb28184613aff565b905092915050565b6000602082019050613fcf6000830184613b6c565b92915050565b60006020820190508181036000830152613fef8184613bb4565b905092915050565b6000602082019050818103600083015261401081613c9d565b9050919050565b6000602082019050818103600083015261403081613cc0565b9050919050565b6000602082019050818103600083015261405081613ce3565b9050919050565b6000602082019050818103600083015261407081613d06565b9050919050565b6000602082019050818103600083015261409081613d29565b9050919050565b600060208201905081810360008301526140b081613d4c565b9050919050565b600060208201905081810360008301526140d081613d6f565b9050919050565b600060208201905081810360008301526140f081613d92565b9050919050565b6000602082019050818103600083015261411081613db5565b9050919050565b6000602082019050818103600083015261413081613dd8565b9050919050565b6000602082019050818103600083015261415081613dfb565b9050919050565b600060608201905061416c6000830184613e60565b92915050565b60006020820190506141876000830184613eb1565b92915050565b60006020820190506141a26000830184613ecf565b92915050565b60006141b26141c3565b90506141be82826144de565b919050565b6000604051905090565b600067ffffffffffffffff8211156141e8576141e76145e5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614214576142136145e5565b5b61421d82614632565b9050602081019050919050565b600067ffffffffffffffff821115614245576142446145e5565b5b61424e82614632565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143308261443f565b915061433b8361443f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143705761436f614558565b5b828201905092915050565b60006143868261443f565b91506143918361443f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ca576143c9614558565b5b828202905092915050565b60006143e08261441f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561449757808201518184015260208101905061447c565b838111156144a6576000848401525b50505050565b600060028204905060018216806144c457607f821691505b602082108114156144d8576144d7614587565b5b50919050565b6144e782614632565b810181811067ffffffffffffffff82111715614506576145056145e5565b5b80604052505050565b600061451a8261443f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561454d5761454c614558565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f73616c65206973206f70656e2100000000000000000000000000000000000000600082015250565b7f457863656564206d6178427957616c6c65740000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b7f6d69736d61746368696e67206c656e6774687321000000000000000000000000600082015250565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f43616e74206d696e742079657400000000000000000000000000000000000000600082015250565b7f416d6f756e742063616e27742062652030000000000000000000000000000000600082015250565b7f4578636565642077686974656c697374206d696e7420666f722074686973207760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f457863656564204d41585f535550504c59000000000000000000000000000000600082015250565b61485b816143d5565b811461486657600080fd5b50565b614872816143e7565b811461487d57600080fd5b50565b614889816143f3565b811461489457600080fd5b50565b6148a08161443f565b81146148ab57600080fd5b50565b6148b78161445d565b81146148c257600080fd5b5056fea264697066735822122033b2fcf05826dd93a928027a0551ac50a60325ce8263eb6eb12b5bb595c1691d64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000009444547454e50455045000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054450455045000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f307873796e657267792e78797a2f6170692f6d6574615f64702f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): DEGENPEPE
Arg [1] : symbol (string): DPEPE
Arg [2] : baseURI_ (string): https://0xsynergy.xyz/api/meta_dp/
Arg [3] : uriSuffix_ (string):

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 444547454e504550450000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4450455045000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [9] : 68747470733a2f2f307873796e657267792e78797a2f6170692f6d6574615f64
Arg [10] : 702f000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62156:4453:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18757:612;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25781:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25241:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62368:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65307:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17835:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26667:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65529:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62282:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62331:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66500:106;;;;;;;;;;;;;:::i;:::-;;26908:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43790:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62424:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62663:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65092:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45290:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62522:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23502:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64840:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62616:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19433:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13028:103;;;;;;;;;;;;;:::i;:::-;;48854:812;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12377:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62557:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23882:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46116:2289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63046:975;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26057:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27164:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62942:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44711:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64315:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26436:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66136:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65713:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13286:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18757:612;18842:4;19153:10;19138:25;;:11;:25;;;;:98;;;;19226:10;19211:25;;:11;:25;;;;19138:98;:171;;;;19299:10;19284:25;;:11;:25;;;;19138:171;19122:187;;18757:612;;;:::o;23713:100::-;23767:13;23800:5;23793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23713:100;:::o;25781:204::-;25849:7;25874:16;25882:7;25874;:16::i;:::-;25869:64;;25899:34;;;;;;;;;;;;;;25869:64;25953:15;:24;25969:7;25953:24;;;;;;;;;;;;;;;;;;;;;25946:31;;25781:204;;;:::o;25241:474::-;25314:13;25346:27;25365:7;25346:18;:27::i;:::-;25314:61;;25396:5;25390:11;;:2;:11;;;25386:48;;;25410:24;;;;;;;;;;;;;;25386:48;25474:5;25451:28;;:19;:17;:19::i;:::-;:28;;;25447:175;;25499:44;25516:5;25523:19;:17;:19::i;:::-;25499:16;:44::i;:::-;25494:128;;25571:35;;;;;;;;;;;;;;25494:128;25447:175;25661:2;25634:15;:24;25650:7;25634:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25699:7;25695:2;25679:28;;25688:5;25679:28;;;;;;;;;;;;25303:412;25241:474;;:::o;62368:49::-;;;;;;;;;;;;;;;;;:::o;65307:131::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65411:19:::1;65392:16;;:38;;;;;;;;;;;;;;;;;;65307:131:::0;:::o;17835:303::-;17888:7;18108:15;:13;:15::i;:::-;18093:12;;18077:13;;:28;:46;18070:53;;17835:303;:::o;26667:170::-;26801:28;26811:4;26817:2;26821:7;26801:9;:28::i;:::-;26667:170;;;:::o;65529:114::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65621:14:::1;65607:11;:28;;;;65529:114:::0;:::o;62282:40::-;62319:3;62282:40;:::o;62331:30::-;;;;:::o;66500:106::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66558:7:::1;:5;:7::i;:::-;66550:25;;:48;66576:21;66550:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66500:106::o:0;26908:185::-;27046:39;27063:4;27069:2;27073:7;27046:39;;;;;;;;;;;;:16;:39::i;:::-;26908:185;;;:::o;43790:94::-;43856:20;43862:7;43871:4;43856:5;:20::i;:::-;43790:94;:::o;62424:50::-;;;;;;;;;;;;;;;;;:::o;62663:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65092:104::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65176:12:::1;65164:9;;:24;;;;;;;;;;;;;;;;;;65092:104:::0;:::o;45290:436::-;45379:23;45432:22;45457:8;:15;45432:40;;45483:34;45541:14;45520:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45483:73;;45572:9;45567:117;45588:14;45583:1;:19;45567:117;;45640:32;45660:8;45669:1;45660:11;;;;;;;;:::i;:::-;;;;;;;;45640:19;:32::i;:::-;45624:10;45635:1;45624:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;45604:3;;;;;45567:117;;;;45701:10;45694:17;;;;45290:436;;;:::o;62522:26::-;;;;;;;;;;;;;:::o;23502:144::-;23566:7;23609:27;23628:7;23609:18;:27::i;:::-;23586:52;;23502:144;;;:::o;64840:167::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64954:10:::1;64944:7;:20;;;;;;;;;;;;:::i;:::-;;64987:12;64975:9;:24;;;;;;;;;;;;:::i;:::-;;64840:167:::0;;:::o;62616:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19433:224::-;19497:7;19538:1;19521:19;;:5;:19;;;19517:60;;;19549:28;;;;;;;;;;;;;;19517:60;14805:13;19595:18;:25;19614:5;19595:25;;;;;;;;;;;;;;;;:54;19588:61;;19433:224;;;:::o;13028:103::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13093:30:::1;13120:1;13093:18;:30::i;:::-;13028:103::o:0;48854:812::-;48924:16;48970:19;49000:25;49036:22;49061:16;49071:5;49061:9;:16::i;:::-;49036:41;;49088:25;49130:14;49116:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49088:57;;49156:31;;:::i;:::-;49203:9;49215:15;:13;:15::i;:::-;49203:27;;49198:428;49247:14;49232:11;:29;49198:428;;49295:15;49308:1;49295:12;:15::i;:::-;49283:27;;49329:9;:16;;;49325:65;;;49366:8;;49325:65;49434:1;49408:28;;:9;:14;;;:28;;;49404:103;;49477:9;:14;;;49457:34;;49404:103;49546:5;49525:26;;:17;:26;;;49521:94;;;49598:1;49572:8;49581:13;;;;;;49572:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;49521:94;49198:428;49263:3;;;;;49198:428;;;;49643:8;49636:15;;;;;;;48854:812;;;:::o;12377:87::-;12423:7;12450:6;;;;;;;;;;;12443:13;;12377:87;:::o;62557:35::-;;;;;;;;;;;;;:::o;23882:104::-;23938:13;23971:7;23964:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23882:104;:::o;46116:2289::-;46251:16;46310:4;46301:5;:13;46297:45;;46323:19;;;;;;;;;;;;;;46297:45;46353:19;46383:17;46403:14;:12;:14::i;:::-;46383:34;;46495:15;:13;:15::i;:::-;46487:5;:23;46483:79;;;46535:15;:13;:15::i;:::-;46527:23;;46483:79;46630:9;46623:4;:16;46619:65;;;46663:9;46656:16;;46619:65;46694:25;46722:16;46732:5;46722:9;:16::i;:::-;46694:44;;46904:4;46896:5;:12;46892:250;;;46925:19;46954:5;46947:4;:12;46925:34;;46992:17;46978:11;:31;46974:103;;;47050:11;47030:31;;46974:103;46910:178;46892:250;;;47129:1;47109:21;;46892:250;47152:25;47194:17;47180:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47152:60;;47248:1;47227:17;:22;47223:70;;;47273:8;47266:15;;;;;;;;47223:70;47425:31;47459:26;47479:5;47459:19;:26::i;:::-;47425:60;;47496:25;47729:9;:16;;;47724:84;;47782:9;:14;;;47762:34;;47724:84;47823:9;47835:5;47823:17;;47818:434;47847:4;47842:1;:9;;:45;;;;;47870:17;47855:11;:32;;47842:45;47818:434;;;47921:15;47934:1;47921:12;:15::i;:::-;47909:27;;47955:9;:16;;;47951:65;;;47992:8;;47951:65;48060:1;48034:28;;:9;:14;;;:28;;;48030:103;;48103:9;:14;;;48083:34;;48030:103;48172:5;48151:26;;:17;:26;;;48147:94;;;48224:1;48198:8;48207:13;;;;;;48198:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;48147:94;47818:434;47889:3;;;;;47818:434;;;;48342:11;48332:8;48325:29;48382:8;48375:15;;;;;;;;46116:2289;;;;;;:::o;63046:975::-;63125:1;63112:9;;;;;;;;;;;:14;;;;63104:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;63177:9;63163:23;;:10;:23;;;63155:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;62319:3;63230:14;:12;:14::i;:::-;63221:6;:23;;;;:::i;:::-;:38;;63213:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63309:1;63300:6;:10;63292:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;63361:1;63348:9;;;;;;;;;;;:14;;;63345:669;;;63426:15;:27;63442:10;63426:27;;;;;;;;;;;;;;;;63396:14;:26;63411:10;63396:26;;;;;;;;;;;;;;;;63387:6;:35;;;;:::i;:::-;:66;;63379:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;63540:6;63510:14;:26;63525:10;63510:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;63561:29;63571:10;63583:6;63561:9;:29::i;:::-;63345:669;;;63624:1;63611:9;;;;;;;;;;;:14;;;63608:406;;;63704:15;:27;63720:10;63704:27;;;;;;;;;;;;;;;;63690:11;;:41;;;;:::i;:::-;63659:14;:26;63674:10;63659:26;;;;;;;;;;;;;;;;63650:6;:35;;;;:::i;:::-;:82;;63642:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;63774:16;;;;;;;;;;;63770:124;;;63842:9;63828:10;;63819:6;:19;;;;:::i;:::-;:32;;63811:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63770:124;63940:6;63910:14;:26;63925:10;63910:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;63961:29;63971:10;63983:6;63961:9;:29::i;:::-;63608:406;63345:669;63046:975;:::o;26057:308::-;26168:19;:17;:19::i;:::-;26156:31;;:8;:31;;;26152:61;;;26196:17;;;;;;;;;;;;;;26152:61;26278:8;26226:18;:39;26245:19;:17;:19::i;:::-;26226:39;;;;;;;;;;;;;;;:49;26266:8;26226:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26338:8;26302:55;;26317:19;:17;:19::i;:::-;26302:55;;;26348:8;26302:55;;;;;;:::i;:::-;;;;;;;;26057:308;;:::o;27164:396::-;27331:28;27341:4;27347:2;27351:7;27331:9;:28::i;:::-;27392:1;27374:2;:14;;;:19;27370:183;;27413:56;27444:4;27450:2;27454:7;27463:5;27413:30;:56::i;:::-;27408:145;;27497:40;;;;;;;;;;;;;;27408:145;27370:183;27164:396;;;;:::o;62942:37::-;;;;:::o;44711:420::-;44787:21;;:::i;:::-;44821:31;;:::i;:::-;44877:15;:13;:15::i;:::-;44867:7;:25;:54;;;;44907:14;:12;:14::i;:::-;44896:7;:25;;44867:54;44863:103;;;44945:9;44938:16;;;;;44863:103;44988:21;45001:7;44988:12;:21::i;:::-;44976:33;;45024:9;:16;;;45020:65;;;45064:9;45057:16;;;;;45020:65;45102:21;45115:7;45102:12;:21::i;:::-;45095:28;;;44711:420;;;;:::o;64315:346::-;64388:13;64419:16;64427:7;64419;:16::i;:::-;64414:59;;64444:29;;;;;;;;;;;;;;64414:59;64515:1;64496:7;64490:21;;;;;:::i;:::-;;;:26;64486:84;;;64540:18;64550:7;64540:9;:18::i;:::-;64533:25;;;;64486:84;64613:7;64622:18;64632:7;64622:9;:18::i;:::-;64642:9;64596:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64582:71;;64315:346;;;;:::o;26436:164::-;26533:4;26557:18;:25;26576:5;26557:25;;;;;;;;;;;;;;;:35;26583:8;26557:35;;;;;;;;;;;;;;;;;;;;;;;;;26550:42;;26436:164;;;;:::o;66136:354::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66265:1:::1;66252:9;;;;;;;;;;;:14;;;66244:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;66325:5;;:12;;66305:9;;:16;;:32;66297:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66380:9;66375:108;66395:9;;:16;;66391:1;:20;66375:108;;;66463:5;;66469:1;66463:8;;;;;;;:::i;:::-;;;;;;;;66433:15;:29;66449:9;;66459:1;66449:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66433:29;;;;;;;;;;;;;;;:38;;;;66413:3;;;;;:::i;:::-;;;;66375:108;;;;66136:354:::0;;;;:::o;65713:415::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65839:1:::1;65826:9;;;;;;;;;;;:14;;;65818:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;65897:5;;:12;;65877:9;;:16;;:32;65869:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;65952:9;65947:103;65967:9;;:16;;65963:1;:20;65947:103;;;66005:33;66015:9;;66025:1;66015:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66029:5;;66035:1;66029:8;;;;;;;:::i;:::-;;;;;;;;66005:9;:33::i;:::-;65985:3;;;;;:::i;:::-;;;;65947:103;;;;62319:3;66070:14;:12;:14::i;:::-;:28;;66062:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65713:415:::0;;;;:::o;13286:201::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13395:1:::1;13375:22;;:8;:22;;;;13367:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13451:28;13470:8;13451:18;:28::i;:::-;13286:201:::0;:::o;27815:270::-;27872:4;27924:7;27905:15;:13;:15::i;:::-;:26;;:62;;;;;27954:13;;27944:7;:23;27905:62;:144;;;;;28048:1;15575:8;28001:17;:26;28019:7;28001:26;;;;;;;;;;;;:43;:48;27905:144;27889:160;;27815:270;;;:::o;21070:1049::-;21137:7;21157:12;21172:7;21157:22;;21232:4;21213:15;:13;:15::i;:::-;:23;21209:847;;21262:13;;21255:4;:20;21251:805;;;21296:14;21313:17;:23;21331:4;21313:23;;;;;;;;;;;;21296:40;;21421:1;15575:8;21394:6;:23;:28;21390:651;;;21881:105;21898:1;21888:6;:11;21881:105;;;21937:17;:25;21955:6;;;;;;;21937:25;;;;;;;;;;;;21928:34;;21881:105;;;22015:6;22008:13;;;;;;21390:651;21277:779;21251:805;21209:847;22080:31;;;;;;;;;;;;;;21070:1049;;;;:::o;41310:105::-;41370:7;41397:10;41390:17;;41310:105;:::o;11217:98::-;11270:7;11297:10;11290:17;;11217:98;:::o;64090:101::-;64155:7;64182:1;64175:8;;64090:101;:::o;32834:2409::-;32949:27;32979;32998:7;32979:18;:27::i;:::-;32949:57;;33064:4;33023:45;;33039:19;33023:45;;;33019:86;;33077:28;;;;;;;;;;;;;;33019:86;33118:22;33167:4;33144:27;;:19;:17;:19::i;:::-;:27;;;:83;;;;33184:43;33201:4;33207:19;:17;:19::i;:::-;33184:16;:43::i;:::-;33144:83;:139;;;;33264:19;:17;:19::i;:::-;33240:43;;:20;33252:7;33240:11;:20::i;:::-;:43;;;33144:139;33118:166;;33302:17;33297:66;;33328:35;;;;;;;;;;;;;;33297:66;33392:1;33378:16;;:2;:16;;;33374:52;;;33403:23;;;;;;;;;;;;;;33374:52;33439:43;33461:4;33467:2;33471:7;33480:1;33439:21;:43::i;:::-;33555:15;:24;33571:7;33555:24;;;;;;;;;;;;33548:31;;;;;;;;;;;33935:18;:24;33954:4;33935:24;;;;;;;;;;;;;;;;33933:26;;;;;;;;;;;;34009:18;:22;34028:2;34009:22;;;;;;;;;;;;;;;;34007:24;;;;;;;;;;;15853:8;15459:3;34359:15;:41;;34325:21;34343:2;34325:17;:21::i;:::-;:76;:112;34287:17;:26;34305:7;34287:26;;;;;;;;;;;:150;;;;34599:1;15853:8;34549:19;:46;:51;34545:586;;;34617:19;34649:1;34639:7;:11;34617:33;;34798:1;34764:17;:30;34782:11;34764:30;;;;;;;;;;;;:35;34760:360;;;34894:13;;34879:11;:28;34875:230;;35066:19;35033:17;:30;35051:11;35033:30;;;;;;;;;;;:52;;;;34875:230;34760:360;34602:529;34545:586;35174:7;35170:2;35155:27;;35164:4;35155:27;;;;;;;;;;;;35193:42;35214:4;35220:2;35224:7;35233:1;35193:20;:42::i;:::-;32938:2305;;32834:2409;;;:::o;35639:2648::-;35719:27;35749;35768:7;35749:18;:27::i;:::-;35719:57;;35789:12;35820:19;35789:52;;35858:13;35854:303;;;35888:22;35937:4;35914:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;35958:43;35975:4;35981:19;:17;:19::i;:::-;35958:16;:43::i;:::-;35914:87;:147;;;;36042:19;:17;:19::i;:::-;36018:43;;:20;36030:7;36018:11;:20::i;:::-;:43;;;35914:147;35888:174;;36084:17;36079:66;;36110:35;;;;;;;;;;;;;;36079:66;35873:284;35854:303;36169:51;36191:4;36205:1;36209:7;36218:1;36169:21;:51::i;:::-;36293:15;:24;36309:7;36293:24;;;;;;;;;;;;36286:31;;;;;;;;;;;36932:1;15068:3;36903:1;:25;;36902:31;36874:18;:24;36893:4;36874:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;15853:8;15575;15459:3;37221:15;:41;;37185:23;37203:4;37185:17;:23::i;:::-;:78;:104;:140;37147:17;:26;37165:7;37147:26;;;;;;;;;;;:178;;;;37487:1;15853:8;37437:19;:46;:51;37433:586;;;37505:19;37537:1;37527:7;:11;37505:33;;37686:1;37652:17;:30;37670:11;37652:30;;;;;;;;;;;;:35;37648:360;;;37782:13;;37767:11;:28;37763:230;;37954:19;37921:17;:30;37939:11;37921:30;;;;;;;;;;;:52;;;;37763:230;37648:360;37490:529;37433:586;38070:7;38066:1;38043:35;;38052:4;38043:35;;;;;;;;;;;;38089:50;38110:4;38124:1;38128:7;38137:1;38089:20;:50::i;:::-;38258:12;;:14;;;;;;;;;;;;;35708:2579;;35639:2648;;:::o;13647:191::-;13721:16;13740:6;;;;;;;;;;;13721:25;;13766:8;13757:6;;:17;;;;;;;;;;;;;;;;;;13821:8;13790:40;;13811:8;13790:40;;;;;;;;;;;;13710:128;13647:191;:::o;22626:153::-;22686:21;;:::i;:::-;22727:44;22746:17;:24;22764:5;22746:24;;;;;;;;;;;;22727:18;:44::i;:::-;22720:51;;22626:153;;;:::o;17530:95::-;17577:7;17604:13;;17597:20;;17530:95;:::o;18236:273::-;18283:7;18479:15;:13;:15::i;:::-;18463:13;;:31;18456:38;;18236:273;:::o;28169:104::-;28238:27;28248:2;28252:8;28238:27;;;;;;;;;;;;:9;:27::i;:::-;28169:104;;:::o;38779:716::-;38942:4;38988:2;38963:45;;;39009:19;:17;:19::i;:::-;39030:4;39036:7;39045:5;38963:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38959:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39263:1;39246:6;:13;:18;39242:235;;;39292:40;;;;;;;;;;;;;;39242:235;39435:6;39429:13;39420:6;39416:2;39412:15;39405:38;38959:529;39132:54;;;39122:64;;;:6;:64;;;;39115:71;;;38779:716;;;;;;:::o;23282:158::-;23344:21;;:::i;:::-;23385:47;23404:27;23423:7;23404:18;:27::i;:::-;23385:18;:47::i;:::-;23378:54;;23282:158;;;:::o;41521:1878::-;41578:17;41981:3;41974:4;41968:11;41964:21;41957:28;;42068:3;42062:4;42055:17;42170:3;42606:5;42732:1;42727:3;42723:11;42716:18;;42865:2;42859:4;42855:13;42851:2;42847:22;42842:3;42834:36;42906:2;42900:4;42896:13;42888:21;;42502:663;42925:4;42502:663;;;43094:1;43089:3;43085:11;43078:18;;43145:2;43139:4;43135:13;43131:2;43127:22;43122:3;43114:36;43016:2;43010:4;43006:13;42998:21;;42502:663;;;42506:418;43204:3;43199;43195:13;43315:2;43310:3;43306:12;43299:19;;43374:6;43369:3;43362:19;41617:1775;;41521:1878;;;:::o;40143:159::-;;;;;:::o;24802:148::-;24866:14;24927:5;24917:15;;24802:148;;;:::o;40961:158::-;;;;;:::o;22213:322::-;22279:31;;:::i;:::-;22356:6;22323:9;:14;;:41;;;;;;;;;;;15459:3;22409:6;:32;;22375:9;:24;;:67;;;;;;;;;;;22499:1;15575:8;22472:6;:23;:28;;22453:9;:16;;:47;;;;;;;;;;;22213:322;;;:::o;28646:2114::-;28769:20;28792:13;;28769:36;;28834:1;28820:16;;:2;:16;;;28816:48;;;28845:19;;;;;;;;;;;;;;28816:48;28891:1;28879:8;:13;28875:44;;;28901:18;;;;;;;;;;;;;;28875:44;28932:61;28962:1;28966:2;28970:12;28984:8;28932:21;:61::i;:::-;29508:1;14942:2;29479:1;:25;;29478:31;29466:8;:44;29440:18;:22;29459:2;29440:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;15718:3;29861:29;29888:1;29876:8;:13;29861:14;:29::i;:::-;:56;;15459:3;29806:15;:41;;29772:21;29790:2;29772:17;:21::i;:::-;:76;:146;29729:17;:31;29747:12;29729:31;;;;;;;;;;;:189;;;;29931:20;29954:12;29931:35;;29977:11;30006:8;29991:12;:23;29977:37;;30049:1;30031:2;:14;;;:19;30027:609;;30067:306;30119:12;30115:2;30094:38;;30111:1;30094:38;;;;;;;;;;;;30156:69;30195:1;30199:2;30203:14;;;;;;30219:5;30156:30;:69::i;:::-;30151:166;;30257:40;;;;;;;;;;;;;;30151:166;30368:3;30353:12;:18;30067:306;;30446:12;30429:13;;:29;30425:43;;30460:8;;;30425:43;30027:609;;;30501:124;30553:14;;;;;;30549:2;30528:40;;30545:1;30528:40;;;;;;;;;;;;30620:3;30605:12;:18;30501:124;;30027:609;30662:12;30646:13;:28;;;;29241:1441;;30692:60;30721:1;30725:2;30729:12;30743:8;30692:20;:60::i;:::-;28758:2002;28646:2114;;;:::o;25037:142::-;25095:14;25156:5;25146:15;;25037:142;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:::-;2412:8;2422:6;2472:3;2465:4;2457:6;2453:17;2449:27;2439:122;;2480:79;;:::i;:::-;2439:122;2593:6;2580:20;2570:30;;2623:18;2615:6;2612:30;2609:117;;;2645:79;;:::i;:::-;2609:117;2759:4;2751:6;2747:17;2735:29;;2813:3;2805:4;2797:6;2793:17;2783:8;2779:32;2776:41;2773:128;;;2820:79;;:::i;:::-;2773:128;2339:568;;;;;:::o;2930:370::-;3001:5;3050:3;3043:4;3035:6;3031:17;3027:27;3017:122;;3058:79;;:::i;:::-;3017:122;3175:6;3162:20;3200:94;3290:3;3282:6;3275:4;3267:6;3263:17;3200:94;:::i;:::-;3191:103;;3007:293;2930:370;;;;:::o;3306:133::-;3349:5;3387:6;3374:20;3365:29;;3403:30;3427:5;3403:30;:::i;:::-;3306:133;;;;:::o;3445:137::-;3490:5;3528:6;3515:20;3506:29;;3544:32;3570:5;3544:32;:::i;:::-;3445:137;;;;:::o;3588:141::-;3644:5;3675:6;3669:13;3660:22;;3691:32;3717:5;3691:32;:::i;:::-;3588:141;;;;:::o;3748:338::-;3803:5;3852:3;3845:4;3837:6;3833:17;3829:27;3819:122;;3860:79;;:::i;:::-;3819:122;3977:6;3964:20;4002:78;4076:3;4068:6;4061:4;4053:6;4049:17;4002:78;:::i;:::-;3993:87;;3809:277;3748:338;;;;:::o;4106:340::-;4162:5;4211:3;4204:4;4196:6;4192:17;4188:27;4178:122;;4219:79;;:::i;:::-;4178:122;4336:6;4323:20;4361:79;4436:3;4428:6;4421:4;4413:6;4409:17;4361:79;:::i;:::-;4352:88;;4168:278;4106:340;;;;:::o;4452:139::-;4498:5;4536:6;4523:20;4514:29;;4552:33;4579:5;4552:33;:::i;:::-;4452:139;;;;:::o;4597:135::-;4641:5;4679:6;4666:20;4657:29;;4695:31;4720:5;4695:31;:::i;:::-;4597:135;;;;:::o;4738:329::-;4797:6;4846:2;4834:9;4825:7;4821:23;4817:32;4814:119;;;4852:79;;:::i;:::-;4814:119;4972:1;4997:53;5042:7;5033:6;5022:9;5018:22;4997:53;:::i;:::-;4987:63;;4943:117;4738:329;;;;:::o;5073:474::-;5141:6;5149;5198:2;5186:9;5177:7;5173:23;5169:32;5166:119;;;5204:79;;:::i;:::-;5166:119;5324:1;5349:53;5394:7;5385:6;5374:9;5370:22;5349:53;:::i;:::-;5339:63;;5295:117;5451:2;5477:53;5522:7;5513:6;5502:9;5498:22;5477:53;:::i;:::-;5467:63;;5422:118;5073:474;;;;;:::o;5553:619::-;5630:6;5638;5646;5695:2;5683:9;5674:7;5670:23;5666:32;5663:119;;;5701:79;;:::i;:::-;5663:119;5821:1;5846:53;5891:7;5882:6;5871:9;5867:22;5846:53;:::i;:::-;5836:63;;5792:117;5948:2;5974:53;6019:7;6010:6;5999:9;5995:22;5974:53;:::i;:::-;5964:63;;5919:118;6076:2;6102:53;6147:7;6138:6;6127:9;6123:22;6102:53;:::i;:::-;6092:63;;6047:118;5553:619;;;;;:::o;6178:943::-;6273:6;6281;6289;6297;6346:3;6334:9;6325:7;6321:23;6317:33;6314:120;;;6353:79;;:::i;:::-;6314:120;6473:1;6498:53;6543:7;6534:6;6523:9;6519:22;6498:53;:::i;:::-;6488:63;;6444:117;6600:2;6626:53;6671:7;6662:6;6651:9;6647:22;6626:53;:::i;:::-;6616:63;;6571:118;6728:2;6754:53;6799:7;6790:6;6779:9;6775:22;6754:53;:::i;:::-;6744:63;;6699:118;6884:2;6873:9;6869:18;6856:32;6915:18;6907:6;6904:30;6901:117;;;6937:79;;:::i;:::-;6901:117;7042:62;7096:7;7087:6;7076:9;7072:22;7042:62;:::i;:::-;7032:72;;6827:287;6178:943;;;;;;;:::o;7127:468::-;7192:6;7200;7249:2;7237:9;7228:7;7224:23;7220:32;7217:119;;;7255:79;;:::i;:::-;7217:119;7375:1;7400:53;7445:7;7436:6;7425:9;7421:22;7400:53;:::i;:::-;7390:63;;7346:117;7502:2;7528:50;7570:7;7561:6;7550:9;7546:22;7528:50;:::i;:::-;7518:60;;7473:115;7127:468;;;;;:::o;7601:474::-;7669:6;7677;7726:2;7714:9;7705:7;7701:23;7697:32;7694:119;;;7732:79;;:::i;:::-;7694:119;7852:1;7877:53;7922:7;7913:6;7902:9;7898:22;7877:53;:::i;:::-;7867:63;;7823:117;7979:2;8005:53;8050:7;8041:6;8030:9;8026:22;8005:53;:::i;:::-;7995:63;;7950:118;7601:474;;;;;:::o;8081:619::-;8158:6;8166;8174;8223:2;8211:9;8202:7;8198:23;8194:32;8191:119;;;8229:79;;:::i;:::-;8191:119;8349:1;8374:53;8419:7;8410:6;8399:9;8395:22;8374:53;:::i;:::-;8364:63;;8320:117;8476:2;8502:53;8547:7;8538:6;8527:9;8523:22;8502:53;:::i;:::-;8492:63;;8447:118;8604:2;8630:53;8675:7;8666:6;8655:9;8651:22;8630:53;:::i;:::-;8620:63;;8575:118;8081:619;;;;;:::o;8706:934::-;8828:6;8836;8844;8852;8901:2;8889:9;8880:7;8876:23;8872:32;8869:119;;;8907:79;;:::i;:::-;8869:119;9055:1;9044:9;9040:17;9027:31;9085:18;9077:6;9074:30;9071:117;;;9107:79;;:::i;:::-;9071:117;9220:80;9292:7;9283:6;9272:9;9268:22;9220:80;:::i;:::-;9202:98;;;;8998:312;9377:2;9366:9;9362:18;9349:32;9408:18;9400:6;9397:30;9394:117;;;9430:79;;:::i;:::-;9394:117;9543:80;9615:7;9606:6;9595:9;9591:22;9543:80;:::i;:::-;9525:98;;;;9320:313;8706:934;;;;;;;:::o;9646:539::-;9730:6;9779:2;9767:9;9758:7;9754:23;9750:32;9747:119;;;9785:79;;:::i;:::-;9747:119;9933:1;9922:9;9918:17;9905:31;9963:18;9955:6;9952:30;9949:117;;;9985:79;;:::i;:::-;9949:117;10090:78;10160:7;10151:6;10140:9;10136:22;10090:78;:::i;:::-;10080:88;;9876:302;9646:539;;;;:::o;10191:323::-;10247:6;10296:2;10284:9;10275:7;10271:23;10267:32;10264:119;;;10302:79;;:::i;:::-;10264:119;10422:1;10447:50;10489:7;10480:6;10469:9;10465:22;10447:50;:::i;:::-;10437:60;;10393:114;10191:323;;;;:::o;10520:327::-;10578:6;10627:2;10615:9;10606:7;10602:23;10598:32;10595:119;;;10633:79;;:::i;:::-;10595:119;10753:1;10778:52;10822:7;10813:6;10802:9;10798:22;10778:52;:::i;:::-;10768:62;;10724:116;10520:327;;;;:::o;10853:349::-;10922:6;10971:2;10959:9;10950:7;10946:23;10942:32;10939:119;;;10977:79;;:::i;:::-;10939:119;11097:1;11122:63;11177:7;11168:6;11157:9;11153:22;11122:63;:::i;:::-;11112:73;;11068:127;10853:349;;;;:::o;11208:834::-;11296:6;11304;11353:2;11341:9;11332:7;11328:23;11324:32;11321:119;;;11359:79;;:::i;:::-;11321:119;11507:1;11496:9;11492:17;11479:31;11537:18;11529:6;11526:30;11523:117;;;11559:79;;:::i;:::-;11523:117;11664:63;11719:7;11710:6;11699:9;11695:22;11664:63;:::i;:::-;11654:73;;11450:287;11804:2;11793:9;11789:18;11776:32;11835:18;11827:6;11824:30;11821:117;;;11857:79;;:::i;:::-;11821:117;11962:63;12017:7;12008:6;11997:9;11993:22;11962:63;:::i;:::-;11952:73;;11747:288;11208:834;;;;;:::o;12048:329::-;12107:6;12156:2;12144:9;12135:7;12131:23;12127:32;12124:119;;;12162:79;;:::i;:::-;12124:119;12282:1;12307:53;12352:7;12343:6;12332:9;12328:22;12307:53;:::i;:::-;12297:63;;12253:117;12048:329;;;;:::o;12383:325::-;12440:6;12489:2;12477:9;12468:7;12464:23;12460:32;12457:119;;;12495:79;;:::i;:::-;12457:119;12615:1;12640:51;12683:7;12674:6;12663:9;12659:22;12640:51;:::i;:::-;12630:61;;12586:115;12383:325;;;;:::o;12714:299::-;12843:10;12864:106;12966:3;12958:6;12864:106;:::i;:::-;13002:4;12997:3;12993:14;12979:28;;12714:299;;;;:::o;13019:179::-;13088:10;13109:46;13151:3;13143:6;13109:46;:::i;:::-;13187:4;13182:3;13178:14;13164:28;;13019:179;;;;:::o;13204:108::-;13281:24;13299:5;13281:24;:::i;:::-;13276:3;13269:37;13204:108;;:::o;13318:118::-;13405:24;13423:5;13405:24;:::i;:::-;13400:3;13393:37;13318:118;;:::o;13518:972::-;13697:3;13726:84;13804:5;13726:84;:::i;:::-;13826:116;13935:6;13930:3;13826:116;:::i;:::-;13819:123;;13966:86;14046:5;13966:86;:::i;:::-;14075:7;14106:1;14091:374;14116:6;14113:1;14110:13;14091:374;;;14192:6;14186:13;14219:123;14338:3;14323:13;14219:123;:::i;:::-;14212:130;;14365:90;14448:6;14365:90;:::i;:::-;14355:100;;14151:314;14138:1;14135;14131:9;14126:14;;14091:374;;;14095:14;14481:3;14474:10;;13702:788;;;13518:972;;;;:::o;14526:732::-;14645:3;14674:54;14722:5;14674:54;:::i;:::-;14744:86;14823:6;14818:3;14744:86;:::i;:::-;14737:93;;14854:56;14904:5;14854:56;:::i;:::-;14933:7;14964:1;14949:284;14974:6;14971:1;14968:13;14949:284;;;15050:6;15044:13;15077:63;15136:3;15121:13;15077:63;:::i;:::-;15070:70;;15163:60;15216:6;15163:60;:::i;:::-;15153:70;;15009:224;14996:1;14993;14989:9;14984:14;;14949:284;;;14953:14;15249:3;15242:10;;14650:608;;;14526:732;;;;:::o;15264:99::-;15335:21;15350:5;15335:21;:::i;:::-;15330:3;15323:34;15264:99;;:::o;15369:109::-;15450:21;15465:5;15450:21;:::i;:::-;15445:3;15438:34;15369:109;;:::o;15484:360::-;15570:3;15598:38;15630:5;15598:38;:::i;:::-;15652:70;15715:6;15710:3;15652:70;:::i;:::-;15645:77;;15731:52;15776:6;15771:3;15764:4;15757:5;15753:16;15731:52;:::i;:::-;15808:29;15830:6;15808:29;:::i;:::-;15803:3;15799:39;15792:46;;15574:270;15484:360;;;;:::o;15850:364::-;15938:3;15966:39;15999:5;15966:39;:::i;:::-;16021:71;16085:6;16080:3;16021:71;:::i;:::-;16014:78;;16101:52;16146:6;16141:3;16134:4;16127:5;16123:16;16101:52;:::i;:::-;16178:29;16200:6;16178:29;:::i;:::-;16173:3;16169:39;16162:46;;15942:272;15850:364;;;;:::o;16220:377::-;16326:3;16354:39;16387:5;16354:39;:::i;:::-;16409:89;16491:6;16486:3;16409:89;:::i;:::-;16402:96;;16507:52;16552:6;16547:3;16540:4;16533:5;16529:16;16507:52;:::i;:::-;16584:6;16579:3;16575:16;16568:23;;16330:267;16220:377;;;;:::o;16627:845::-;16730:3;16767:5;16761:12;16796:36;16822:9;16796:36;:::i;:::-;16848:89;16930:6;16925:3;16848:89;:::i;:::-;16841:96;;16968:1;16957:9;16953:17;16984:1;16979:137;;;;17130:1;17125:341;;;;16946:520;;16979:137;17063:4;17059:9;17048;17044:25;17039:3;17032:38;17099:6;17094:3;17090:16;17083:23;;16979:137;;17125:341;17192:38;17224:5;17192:38;:::i;:::-;17252:1;17266:154;17280:6;17277:1;17274:13;17266:154;;;17354:7;17348:14;17344:1;17339:3;17335:11;17328:35;17404:1;17395:7;17391:15;17380:26;;17302:4;17299:1;17295:12;17290:17;;17266:154;;;17449:6;17444:3;17440:16;17433:23;;17132:334;;16946:520;;16734:738;;16627:845;;;;:::o;17478:366::-;17620:3;17641:67;17705:2;17700:3;17641:67;:::i;:::-;17634:74;;17717:93;17806:3;17717:93;:::i;:::-;17835:2;17830:3;17826:12;17819:19;;17478:366;;;:::o;17850:::-;17992:3;18013:67;18077:2;18072:3;18013:67;:::i;:::-;18006:74;;18089:93;18178:3;18089:93;:::i;:::-;18207:2;18202:3;18198:12;18191:19;;17850:366;;;:::o;18222:::-;18364:3;18385:67;18449:2;18444:3;18385:67;:::i;:::-;18378:74;;18461:93;18550:3;18461:93;:::i;:::-;18579:2;18574:3;18570:12;18563:19;;18222:366;;;:::o;18594:::-;18736:3;18757:67;18821:2;18816:3;18757:67;:::i;:::-;18750:74;;18833:93;18922:3;18833:93;:::i;:::-;18951:2;18946:3;18942:12;18935:19;;18594:366;;;:::o;18966:::-;19108:3;19129:67;19193:2;19188:3;19129:67;:::i;:::-;19122:74;;19205:93;19294:3;19205:93;:::i;:::-;19323:2;19318:3;19314:12;19307:19;;18966:366;;;:::o;19338:::-;19480:3;19501:67;19565:2;19560:3;19501:67;:::i;:::-;19494:74;;19577:93;19666:3;19577:93;:::i;:::-;19695:2;19690:3;19686:12;19679:19;;19338:366;;;:::o;19710:::-;19852:3;19873:67;19937:2;19932:3;19873:67;:::i;:::-;19866:74;;19949:93;20038:3;19949:93;:::i;:::-;20067:2;20062:3;20058:12;20051:19;;19710:366;;;:::o;20082:::-;20224:3;20245:67;20309:2;20304:3;20245:67;:::i;:::-;20238:74;;20321:93;20410:3;20321:93;:::i;:::-;20439:2;20434:3;20430:12;20423:19;;20082:366;;;:::o;20454:::-;20596:3;20617:67;20681:2;20676:3;20617:67;:::i;:::-;20610:74;;20693:93;20782:3;20693:93;:::i;:::-;20811:2;20806:3;20802:12;20795:19;;20454:366;;;:::o;20826:::-;20968:3;20989:67;21053:2;21048:3;20989:67;:::i;:::-;20982:74;;21065:93;21154:3;21065:93;:::i;:::-;21183:2;21178:3;21174:12;21167:19;;20826:366;;;:::o;21198:::-;21340:3;21361:67;21425:2;21420:3;21361:67;:::i;:::-;21354:74;;21437:93;21526:3;21437:93;:::i;:::-;21555:2;21550:3;21546:12;21539:19;;21198:366;;;:::o;21642:685::-;21789:4;21784:3;21780:14;21876:4;21869:5;21865:16;21859:23;21895:63;21952:4;21947:3;21943:14;21929:12;21895:63;:::i;:::-;21804:164;22060:4;22053:5;22049:16;22043:23;22079:61;22134:4;22129:3;22125:14;22111:12;22079:61;:::i;:::-;21978:172;22234:4;22227:5;22223:16;22217:23;22253:57;22304:4;22299:3;22295:14;22281:12;22253:57;:::i;:::-;22160:160;21758:569;21642:685;;:::o;22405:695::-;22562:4;22557:3;22553:14;22649:4;22642:5;22638:16;22632:23;22668:63;22725:4;22720:3;22716:14;22702:12;22668:63;:::i;:::-;22577:164;22833:4;22826:5;22822:16;22816:23;22852:61;22907:4;22902:3;22898:14;22884:12;22852:61;:::i;:::-;22751:172;23007:4;23000:5;22996:16;22990:23;23026:57;23077:4;23072:3;23068:14;23054:12;23026:57;:::i;:::-;22933:160;22531:569;22405:695;;:::o;23106:108::-;23183:24;23201:5;23183:24;:::i;:::-;23178:3;23171:37;23106:108;;:::o;23220:118::-;23307:24;23325:5;23307:24;:::i;:::-;23302:3;23295:37;23220:118;;:::o;23344:105::-;23419:23;23436:5;23419:23;:::i;:::-;23414:3;23407:36;23344:105;;:::o;23455:112::-;23538:22;23554:5;23538:22;:::i;:::-;23533:3;23526:35;23455:112;;:::o;23573:583::-;23795:3;23817:92;23905:3;23896:6;23817:92;:::i;:::-;23810:99;;23926:95;24017:3;24008:6;23926:95;:::i;:::-;23919:102;;24038:92;24126:3;24117:6;24038:92;:::i;:::-;24031:99;;24147:3;24140:10;;23573:583;;;;;;:::o;24162:222::-;24255:4;24293:2;24282:9;24278:18;24270:26;;24306:71;24374:1;24363:9;24359:17;24350:6;24306:71;:::i;:::-;24162:222;;;;:::o;24390:640::-;24585:4;24623:3;24612:9;24608:19;24600:27;;24637:71;24705:1;24694:9;24690:17;24681:6;24637:71;:::i;:::-;24718:72;24786:2;24775:9;24771:18;24762:6;24718:72;:::i;:::-;24800;24868:2;24857:9;24853:18;24844:6;24800:72;:::i;:::-;24919:9;24913:4;24909:20;24904:2;24893:9;24889:18;24882:48;24947:76;25018:4;25009:6;24947:76;:::i;:::-;24939:84;;24390:640;;;;;;;:::o;25036:493::-;25239:4;25277:2;25266:9;25262:18;25254:26;;25326:9;25320:4;25316:20;25312:1;25301:9;25297:17;25290:47;25354:168;25517:4;25508:6;25354:168;:::i;:::-;25346:176;;25036:493;;;;:::o;25535:373::-;25678:4;25716:2;25705:9;25701:18;25693:26;;25765:9;25759:4;25755:20;25751:1;25740:9;25736:17;25729:47;25793:108;25896:4;25887:6;25793:108;:::i;:::-;25785:116;;25535:373;;;;:::o;25914:210::-;26001:4;26039:2;26028:9;26024:18;26016:26;;26052:65;26114:1;26103:9;26099:17;26090:6;26052:65;:::i;:::-;25914:210;;;;:::o;26130:313::-;26243:4;26281:2;26270:9;26266:18;26258:26;;26330:9;26324:4;26320:20;26316:1;26305:9;26301:17;26294:47;26358:78;26431:4;26422:6;26358:78;:::i;:::-;26350:86;;26130:313;;;;:::o;26449:419::-;26615:4;26653:2;26642:9;26638:18;26630:26;;26702:9;26696:4;26692:20;26688:1;26677:9;26673:17;26666:47;26730:131;26856:4;26730:131;:::i;:::-;26722:139;;26449:419;;;:::o;26874:::-;27040:4;27078:2;27067:9;27063:18;27055:26;;27127:9;27121:4;27117:20;27113:1;27102:9;27098:17;27091:47;27155:131;27281:4;27155:131;:::i;:::-;27147:139;;26874:419;;;:::o;27299:::-;27465:4;27503:2;27492:9;27488:18;27480:26;;27552:9;27546:4;27542:20;27538:1;27527:9;27523:17;27516:47;27580:131;27706:4;27580:131;:::i;:::-;27572:139;;27299:419;;;:::o;27724:::-;27890:4;27928:2;27917:9;27913:18;27905:26;;27977:9;27971:4;27967:20;27963:1;27952:9;27948:17;27941:47;28005:131;28131:4;28005:131;:::i;:::-;27997:139;;27724:419;;;:::o;28149:::-;28315:4;28353:2;28342:9;28338:18;28330:26;;28402:9;28396:4;28392:20;28388:1;28377:9;28373:17;28366:47;28430:131;28556:4;28430:131;:::i;:::-;28422:139;;28149:419;;;:::o;28574:::-;28740:4;28778:2;28767:9;28763:18;28755:26;;28827:9;28821:4;28817:20;28813:1;28802:9;28798:17;28791:47;28855:131;28981:4;28855:131;:::i;:::-;28847:139;;28574:419;;;:::o;28999:::-;29165:4;29203:2;29192:9;29188:18;29180:26;;29252:9;29246:4;29242:20;29238:1;29227:9;29223:17;29216:47;29280:131;29406:4;29280:131;:::i;:::-;29272:139;;28999:419;;;:::o;29424:::-;29590:4;29628:2;29617:9;29613:18;29605:26;;29677:9;29671:4;29667:20;29663:1;29652:9;29648:17;29641:47;29705:131;29831:4;29705:131;:::i;:::-;29697:139;;29424:419;;;:::o;29849:::-;30015:4;30053:2;30042:9;30038:18;30030:26;;30102:9;30096:4;30092:20;30088:1;30077:9;30073:17;30066:47;30130:131;30256:4;30130:131;:::i;:::-;30122:139;;29849:419;;;:::o;30274:::-;30440:4;30478:2;30467:9;30463:18;30455:26;;30527:9;30521:4;30517:20;30513:1;30502:9;30498:17;30491:47;30555:131;30681:4;30555:131;:::i;:::-;30547:139;;30274:419;;;:::o;30699:::-;30865:4;30903:2;30892:9;30888:18;30880:26;;30952:9;30946:4;30942:20;30938:1;30927:9;30923:17;30916:47;30980:131;31106:4;30980:131;:::i;:::-;30972:139;;30699:419;;;:::o;31124:342::-;31277:4;31315:2;31304:9;31300:18;31292:26;;31328:131;31456:1;31445:9;31441:17;31432:6;31328:131;:::i;:::-;31124:342;;;;:::o;31472:222::-;31565:4;31603:2;31592:9;31588:18;31580:26;;31616:71;31684:1;31673:9;31669:17;31660:6;31616:71;:::i;:::-;31472:222;;;;:::o;31700:214::-;31789:4;31827:2;31816:9;31812:18;31804:26;;31840:67;31904:1;31893:9;31889:17;31880:6;31840:67;:::i;:::-;31700:214;;;;:::o;31920:129::-;31954:6;31981:20;;:::i;:::-;31971:30;;32010:33;32038:4;32030:6;32010:33;:::i;:::-;31920:129;;;:::o;32055:75::-;32088:6;32121:2;32115:9;32105:19;;32055:75;:::o;32136:311::-;32213:4;32303:18;32295:6;32292:30;32289:56;;;32325:18;;:::i;:::-;32289:56;32375:4;32367:6;32363:17;32355:25;;32435:4;32429;32425:15;32417:23;;32136:311;;;:::o;32453:307::-;32514:4;32604:18;32596:6;32593:30;32590:56;;;32626:18;;:::i;:::-;32590:56;32664:29;32686:6;32664:29;:::i;:::-;32656:37;;32748:4;32742;32738:15;32730:23;;32453:307;;;:::o;32766:308::-;32828:4;32918:18;32910:6;32907:30;32904:56;;;32940:18;;:::i;:::-;32904:56;32978:29;33000:6;32978:29;:::i;:::-;32970:37;;33062:4;33056;33052:15;33044:23;;32766:308;;;:::o;33080:162::-;33177:4;33200:3;33192:11;;33230:4;33225:3;33221:14;33213:22;;33080:162;;;:::o;33248:132::-;33315:4;33338:3;33330:11;;33368:4;33363:3;33359:14;33351:22;;33248:132;;;:::o;33386:141::-;33435:4;33458:3;33450:11;;33481:3;33478:1;33471:14;33515:4;33512:1;33502:18;33494:26;;33386:141;;;:::o;33533:144::-;33630:6;33664:5;33658:12;33648:22;;33533:144;;;:::o;33683:114::-;33750:6;33784:5;33778:12;33768:22;;33683:114;;;:::o;33803:98::-;33854:6;33888:5;33882:12;33872:22;;33803:98;;;:::o;33907:99::-;33959:6;33993:5;33987:12;33977:22;;33907:99;;;:::o;34012:143::-;34112:4;34144;34139:3;34135:14;34127:22;;34012:143;;;:::o;34161:113::-;34231:4;34263;34258:3;34254:14;34246:22;;34161:113;;;:::o;34280:214::-;34409:11;34443:6;34438:3;34431:19;34483:4;34478:3;34474:14;34459:29;;34280:214;;;;:::o;34500:184::-;34599:11;34633:6;34628:3;34621:19;34673:4;34668:3;34664:14;34649:29;;34500:184;;;;:::o;34690:168::-;34773:11;34807:6;34802:3;34795:19;34847:4;34842:3;34838:14;34823:29;;34690:168;;;;:::o;34864:169::-;34948:11;34982:6;34977:3;34970:19;35022:4;35017:3;35013:14;34998:29;;34864:169;;;;:::o;35039:148::-;35141:11;35178:3;35163:18;;35039:148;;;;:::o;35193:305::-;35233:3;35252:20;35270:1;35252:20;:::i;:::-;35247:25;;35286:20;35304:1;35286:20;:::i;:::-;35281:25;;35440:1;35372:66;35368:74;35365:1;35362:81;35359:107;;;35446:18;;:::i;:::-;35359:107;35490:1;35487;35483:9;35476:16;;35193:305;;;;:::o;35504:348::-;35544:7;35567:20;35585:1;35567:20;:::i;:::-;35562:25;;35601:20;35619:1;35601:20;:::i;:::-;35596:25;;35789:1;35721:66;35717:74;35714:1;35711:81;35706:1;35699:9;35692:17;35688:105;35685:131;;;35796:18;;:::i;:::-;35685:131;35844:1;35841;35837:9;35826:20;;35504:348;;;;:::o;35858:96::-;35895:7;35924:24;35942:5;35924:24;:::i;:::-;35913:35;;35858:96;;;:::o;35960:90::-;35994:7;36037:5;36030:13;36023:21;36012:32;;35960:90;;;:::o;36056:149::-;36092:7;36132:66;36125:5;36121:78;36110:89;;36056:149;;;:::o;36211:126::-;36248:7;36288:42;36281:5;36277:54;36266:65;;36211:126;;;:::o;36343:77::-;36380:7;36409:5;36398:16;;36343:77;;;:::o;36426:101::-;36462:7;36502:18;36495:5;36491:30;36480:41;;36426:101;;;:::o;36533:86::-;36568:7;36608:4;36601:5;36597:16;36586:27;;36533:86;;;:::o;36625:154::-;36709:6;36704:3;36699;36686:30;36771:1;36762:6;36757:3;36753:16;36746:27;36625:154;;;:::o;36785:307::-;36853:1;36863:113;36877:6;36874:1;36871:13;36863:113;;;36962:1;36957:3;36953:11;36947:18;36943:1;36938:3;36934:11;36927:39;36899:2;36896:1;36892:10;36887:15;;36863:113;;;36994:6;36991:1;36988:13;36985:101;;;37074:1;37065:6;37060:3;37056:16;37049:27;36985:101;36834:258;36785:307;;;:::o;37098:320::-;37142:6;37179:1;37173:4;37169:12;37159:22;;37226:1;37220:4;37216:12;37247:18;37237:81;;37303:4;37295:6;37291:17;37281:27;;37237:81;37365:2;37357:6;37354:14;37334:18;37331:38;37328:84;;;37384:18;;:::i;:::-;37328:84;37149:269;37098:320;;;:::o;37424:281::-;37507:27;37529:4;37507:27;:::i;:::-;37499:6;37495:40;37637:6;37625:10;37622:22;37601:18;37589:10;37586:34;37583:62;37580:88;;;37648:18;;:::i;:::-;37580:88;37688:10;37684:2;37677:22;37467:238;37424:281;;:::o;37711:233::-;37750:3;37773:24;37791:5;37773:24;:::i;:::-;37764:33;;37819:66;37812:5;37809:77;37806:103;;;37889:18;;:::i;:::-;37806:103;37936:1;37929:5;37925:13;37918:20;;37711:233;;;:::o;37950:180::-;37998:77;37995:1;37988:88;38095:4;38092:1;38085:15;38119:4;38116:1;38109:15;38136:180;38184:77;38181:1;38174:88;38281:4;38278:1;38271:15;38305:4;38302:1;38295:15;38322:180;38370:77;38367:1;38360:88;38467:4;38464:1;38457:15;38491:4;38488:1;38481:15;38508:180;38556:77;38553:1;38546:88;38653:4;38650:1;38643:15;38677:4;38674:1;38667:15;38694:117;38803:1;38800;38793:12;38817:117;38926:1;38923;38916:12;38940:117;39049:1;39046;39039:12;39063:117;39172:1;39169;39162:12;39186:117;39295:1;39292;39285:12;39309:117;39418:1;39415;39408:12;39432:102;39473:6;39524:2;39520:7;39515:2;39508:5;39504:14;39500:28;39490:38;;39432:102;;;:::o;39540:163::-;39680:15;39676:1;39668:6;39664:14;39657:39;39540:163;:::o;39709:168::-;39849:20;39845:1;39837:6;39833:14;39826:44;39709:168;:::o;39883:225::-;40023:34;40019:1;40011:6;40007:14;40000:58;40092:8;40087:2;40079:6;40075:15;40068:33;39883:225;:::o;40114:172::-;40254:24;40250:1;40242:6;40238:14;40231:48;40114:172;:::o;40292:170::-;40432:22;40428:1;40420:6;40416:14;40409:46;40292:170;:::o;40468:161::-;40608:13;40604:1;40596:6;40592:14;40585:37;40468:161;:::o;40635:163::-;40775:15;40771:1;40763:6;40759:14;40752:39;40635:163;:::o;40804:167::-;40944:19;40940:1;40932:6;40928:14;40921:43;40804:167;:::o;40977:224::-;41117:34;41113:1;41105:6;41101:14;41094:58;41186:7;41181:2;41173:6;41169:15;41162:32;40977:224;:::o;41207:182::-;41347:34;41343:1;41335:6;41331:14;41324:58;41207:182;:::o;41395:167::-;41535:19;41531:1;41523:6;41519:14;41512:43;41395:167;:::o;41568:122::-;41641:24;41659:5;41641:24;:::i;:::-;41634:5;41631:35;41621:63;;41680:1;41677;41670:12;41621:63;41568:122;:::o;41696:116::-;41766:21;41781:5;41766:21;:::i;:::-;41759:5;41756:32;41746:60;;41802:1;41799;41792:12;41746:60;41696:116;:::o;41818:120::-;41890:23;41907:5;41890:23;:::i;:::-;41883:5;41880:34;41870:62;;41928:1;41925;41918:12;41870:62;41818:120;:::o;41944:122::-;42017:24;42035:5;42017:24;:::i;:::-;42010:5;42007:35;41997:63;;42056:1;42053;42046:12;41997:63;41944:122;:::o;42072:118::-;42143:22;42159:5;42143:22;:::i;:::-;42136:5;42133:33;42123:61;;42180:1;42177;42170:12;42123:61;42072:118;:::o

Swarm Source

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