ETH Price: $3,105.16 (+0.77%)
Gas: 4 Gwei

Token

The End (END)
 

Overview

Max Total Supply

667 END

Holders

444

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 END
0x4e82ad13eec9d857ef7e3b014dfebf32ddbd8884
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:
End

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 8 of 8: TheEnd.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/interfaces/IERC2981.sol";
// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

import "./ERC721A.sol";
import "./Ownable.sol";
import "./IERC2981.sol";
import "./IERC20.sol";

/**********************************************
 ******** In the end, there is no end. ********
 **********************************************/

contract End is ERC721A, IERC2981, Ownable {
    bool public theend;
    string public limbo;
    address public void;
    uint256 public constant nightmares = 667;
    mapping(address => bool) public souls;

    constructor() ERC721A("The End", "END") {}

    function joinToEnd() external {
        uint256 demons = _totalMinted();

        require(msg.sender == tx.origin, "must be someone");
        require(theend, "there is no end");
        require(!souls[msg.sender], "already in the end");
        require(demons + 1 <= nightmares, "the end is once");

        _mint(msg.sender, 1);
        souls[msg.sender] = true;
    }

    function generateNightmare(address soul, uint256 nightmare) external onlyOwner {
        uint256 demons = _totalMinted();
        require(demons + nightmare <= nightmares, "too much");

        _mint(soul, nightmare);
    }

    function end(bool _theend) external onlyOwner {
        theend = _theend;
    }

    function bind(string calldata _limbo) external onlyOwner {
        limbo = _limbo;
    }

    function fall(address _void) external onlyOwner {
        void = _void;
    }

    function alchemy() external onlyOwner {
        (bool success, ) = owner().call{value: address(this).balance}("");
        require(success);
    }

    function alchemize(address token) external onlyOwner {
        uint256 balance = IERC20(token).balanceOf(address(this));
        IERC20(token).transfer(msg.sender, balance);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, IERC165)
        returns (bool)
    {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

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

    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "in the limbo");
        return (void, (salePrice * 7) / 100);
    }
}

File 1 of 8: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 2 of 8: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (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;
    }

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

File 3 of 8: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 4 of 8: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 5 of 8: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 6 of 8: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 8: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"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":[{"internalType":"address","name":"token","type":"address"}],"name":"alchemize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"alchemy","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":[{"internalType":"string","name":"_limbo","type":"string"}],"name":"bind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_theend","type":"bool"}],"name":"end","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_void","type":"address"}],"name":"fall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"soul","type":"address"},{"internalType":"uint256","name":"nightmare","type":"uint256"}],"name":"generateNightmare","outputs":[],"stateMutability":"nonpayable","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":"joinToEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limbo","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nightmares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"souls","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"theend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"void","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600781526020017f54686520456e64000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f454e440000000000000000000000000000000000000000000000000000000000815250816002908051906020019062000096929190620001c1565b508060039080519060200190620000af929190620001c1565b50620000c0620000ee60201b60201c565b6000819055505050620000e8620000dc620000f360201b60201c565b620000fb60201b60201c565b620002d5565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf90620002a0565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002b957607f821691505b602082108103620002cf57620002ce62000271565b5b50919050565b6131a080620002e56000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063ac4c25b2116100a2578063d358446a11610071578063d358446a14610530578063e985e9c51461054c578063f2fde38b1461057c578063f5fefa3414610598576101da565b8063ac4c25b2146104aa578063b88d4fde146104c8578063c87b56dd146104e4578063cec3321914610514576101da565b80638da5cb5b116100de5780638da5cb5b1461042257806395d89b4114610440578063a22cb4651461045e578063a24f81371461047a576101da565b806370a08231146103ca578063715018a6146103fa57806386bbee3e14610404576101da565b806318160ddd1161017c57806334e08a381161014b57806334e08a381461035857806342842e0e146103745780636352211e14610390578063674b80ee146103c0576101da565b806318160ddd146102cf57806323b872dd146102ed5780632a55205a146103095780632ac70d241461033a576101da565b806307ce0288116101b857806307ce028814610249578063081812fc14610267578063095ea7b3146102975780630e79b0f7146102b3576101da565b80630174b105146101df57806301ffc9a7146101fb57806306fdde031461022b575b600080fd5b6101f960048036038101906101f491906123a4565b6105a2565b005b61021560048036038101906102109190612429565b61071f565b6040516102229190612471565b60405180910390f35b610233610799565b6040516102409190612525565b60405180910390f35b61025161082b565b60405161025e9190612471565b60405180910390f35b610281600480360381019061027c919061257d565b61083e565b60405161028e91906125b9565b60405180910390f35b6102b160048036038101906102ac91906125d4565b6108ba565b005b6102cd60048036038101906102c89190612640565b610a60565b005b6102d7610af9565b6040516102e4919061267c565b60405180910390f35b61030760048036038101906103029190612697565b610b10565b005b610323600480360381019061031e91906126ea565b610b20565b60405161033192919061272a565b60405180910390f35b610342610bb2565b60405161034f9190612525565b60405180910390f35b610372600480360381019061036d91906127b8565b610c40565b005b61038e60048036038101906103899190612697565b610cd2565b005b6103aa60048036038101906103a5919061257d565b610cf2565b6040516103b791906125b9565b60405180910390f35b6103c8610d04565b005b6103e460048036038101906103df91906123a4565b610e00565b6040516103f1919061267c565b60405180910390f35b610402610eb8565b005b61040c610f40565b604051610419919061267c565b60405180910390f35b61042a610f46565b60405161043791906125b9565b60405180910390f35b610448610f70565b6040516104559190612525565b60405180910390f35b61047860048036038101906104739190612805565b611002565b005b610494600480360381019061048f91906123a4565b611179565b6040516104a19190612471565b60405180910390f35b6104b2611199565b6040516104bf91906125b9565b60405180910390f35b6104e260048036038101906104dd9190612975565b6111bf565b005b6104fe60048036038101906104f9919061257d565b611232565b60405161050b9190612525565b60405180910390f35b61052e600480360381019061052991906123a4565b6112d0565b005b61054a600480360381019061054591906125d4565b611390565b005b610566600480360381019061056191906129f8565b611477565b6040516105739190612471565b60405180910390f35b610596600480360381019061059191906123a4565b61150b565b005b6105a0611602565b005b6105aa61180f565b73ffffffffffffffffffffffffffffffffffffffff166105c8610f46565b73ffffffffffffffffffffffffffffffffffffffff161461061e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061590612a84565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161065991906125b9565b602060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069a9190612ab9565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016106d792919061272a565b6020604051808303816000875af11580156106f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071a9190612afb565b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610792575061079182611817565b5b9050919050565b6060600280546107a890612b57565b80601f01602080910402602001604051908101604052809291908181526020018280546107d490612b57565b80156108215780601f106107f657610100808354040283529160200191610821565b820191906000526020600020905b81548152906001019060200180831161080457829003601f168201915b5050505050905090565b600860149054906101000a900460ff1681565b6000610849826118a9565b61087f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c582611908565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361092c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094b6119d4565b73ffffffffffffffffffffffffffffffffffffffff16146109ae57610977816109726119d4565b611477565b6109ad576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610a6861180f565b73ffffffffffffffffffffffffffffffffffffffff16610a86610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390612a84565b60405180910390fd5b80600860146101000a81548160ff02191690831515021790555050565b6000610b036119dc565b6001546000540303905090565b610b1b8383836119e1565b505050565b600080610b2c846118a9565b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290612bd4565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600785610b9d9190612c23565b610ba79190612cac565b915091509250929050565b60098054610bbf90612b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610beb90612b57565b8015610c385780601f10610c0d57610100808354040283529160200191610c38565b820191906000526020600020905b815481529060010190602001808311610c1b57829003601f168201915b505050505081565b610c4861180f565b73ffffffffffffffffffffffffffffffffffffffff16610c66610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb390612a84565b60405180910390fd5b818160099190610ccd92919061228f565b505050565b610ced838383604051806020016040528060008152506111bf565b505050565b6000610cfd82611908565b9050919050565b610d0c61180f565b73ffffffffffffffffffffffffffffffffffffffff16610d2a610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790612a84565b60405180910390fd5b6000610d8a610f46565b73ffffffffffffffffffffffffffffffffffffffff1647604051610dad90612d0e565b60006040518083038185875af1925050503d8060008114610dea576040519150601f19603f3d011682016040523d82523d6000602084013e610def565b606091505b5050905080610dfd57600080fd5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e67576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610ec061180f565b73ffffffffffffffffffffffffffffffffffffffff16610ede610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90612a84565b60405180910390fd5b610f3e6000611d88565b565b61029b81565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f7f90612b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610fab90612b57565b8015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b61100a6119d4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361106e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061107b6119d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111286119d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161116d9190612471565b60405180910390a35050565b600b6020528060005260406000206000915054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111ca8484846119e1565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461122c576111f584848484611e4e565b61122b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061123d826118a9565b611273576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061127d611f9e565b9050600081510361129d57604051806020016040528060008152506112c8565b806112a784612030565b6040516020016112b8929190612d5f565b6040516020818303038152906040525b915050919050565b6112d861180f565b73ffffffffffffffffffffffffffffffffffffffff166112f6610f46565b73ffffffffffffffffffffffffffffffffffffffff161461134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390612a84565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61139861180f565b73ffffffffffffffffffffffffffffffffffffffff166113b6610f46565b73ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390612a84565b60405180910390fd5b600061141661208a565b905061029b82826114279190612d83565b1115611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90612e25565b60405180910390fd5b611472838361209d565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61151361180f565b73ffffffffffffffffffffffffffffffffffffffff16611531610f46565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90612a84565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90612eb7565b60405180910390fd5b6115ff81611d88565b50565b600061160c61208a565b90503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390612f23565b60405180910390fd5b600860149054906101000a900460ff166116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290612f8f565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f90612ffb565b60405180910390fd5b61029b6001826117689190612d83565b11156117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613067565b60405180910390fd5b6117b433600161209d565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061187257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118a25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000816118b46119dc565b111580156118c3575060005482105b8015611901575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806119176119dc565b1161199d5760005481101561199c5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361199a575b60008103611990576004600083600190039350838152602001908152602001600020549050611966565b80925050506119cf565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006119ec82611908565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a53576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a746119d4565b73ffffffffffffffffffffffffffffffffffffffff161480611aa35750611aa285611a9d6119d4565b611477565b5b80611ae85750611ab16119d4565b73ffffffffffffffffffffffffffffffffffffffff16611ad08461083e565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b21576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b87576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b94858585600161226f565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611c9186612275565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611d195760006001840190506000600460008381526020019081526020016000205403611d17576000548114611d16578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d81858585600161227f565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e746119d4565b8786866040518563ffffffff1660e01b8152600401611e9694939291906130dc565b6020604051808303816000875af1925050508015611ed257506040513d601f19601f82011682018060405250810190611ecf919061313d565b60015b611f4b573d8060008114611f02576040519150601f19603f3d011682016040523d82523d6000602084013e611f07565b606091505b506000815103611f43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611fad90612b57565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd990612b57565b80156120265780601f10611ffb57610100808354040283529160200191612026565b820191906000526020600020905b81548152906001019060200180831161200957829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561207657600183039250600a81066030018353600a81049050612056565b508181036020830392508083525050919050565b60006120946119dc565b60005403905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612109576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612143576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612150600084838561226f565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16121b560018414612285565b901b60a042901b6121c585612275565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106121eb5781600081905550505061226a600084838561227f565b505050565b50505050565b6000819050919050565b50505050565b6000819050919050565b82805461229b90612b57565b90600052602060002090601f0160209004810192826122bd5760008555612304565b82601f106122d657803560ff1916838001178555612304565b82800160010185558215612304579182015b828111156123035782358255916020019190600101906122e8565b5b5090506123119190612315565b5090565b5b8082111561232e576000816000905550600101612316565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061237182612346565b9050919050565b61238181612366565b811461238c57600080fd5b50565b60008135905061239e81612378565b92915050565b6000602082840312156123ba576123b961233c565b5b60006123c88482850161238f565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612406816123d1565b811461241157600080fd5b50565b600081359050612423816123fd565b92915050565b60006020828403121561243f5761243e61233c565b5b600061244d84828501612414565b91505092915050565b60008115159050919050565b61246b81612456565b82525050565b60006020820190506124866000830184612462565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124c65780820151818401526020810190506124ab565b838111156124d5576000848401525b50505050565b6000601f19601f8301169050919050565b60006124f78261248c565b6125018185612497565b93506125118185602086016124a8565b61251a816124db565b840191505092915050565b6000602082019050818103600083015261253f81846124ec565b905092915050565b6000819050919050565b61255a81612547565b811461256557600080fd5b50565b60008135905061257781612551565b92915050565b6000602082840312156125935761259261233c565b5b60006125a184828501612568565b91505092915050565b6125b381612366565b82525050565b60006020820190506125ce60008301846125aa565b92915050565b600080604083850312156125eb576125ea61233c565b5b60006125f98582860161238f565b925050602061260a85828601612568565b9150509250929050565b61261d81612456565b811461262857600080fd5b50565b60008135905061263a81612614565b92915050565b6000602082840312156126565761265561233c565b5b60006126648482850161262b565b91505092915050565b61267681612547565b82525050565b6000602082019050612691600083018461266d565b92915050565b6000806000606084860312156126b0576126af61233c565b5b60006126be8682870161238f565b93505060206126cf8682870161238f565b92505060406126e086828701612568565b9150509250925092565b600080604083850312156127015761270061233c565b5b600061270f85828601612568565b925050602061272085828601612568565b9150509250929050565b600060408201905061273f60008301856125aa565b61274c602083018461266d565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261277857612777612753565b5b8235905067ffffffffffffffff81111561279557612794612758565b5b6020830191508360018202830111156127b1576127b061275d565b5b9250929050565b600080602083850312156127cf576127ce61233c565b5b600083013567ffffffffffffffff8111156127ed576127ec612341565b5b6127f985828601612762565b92509250509250929050565b6000806040838503121561281c5761281b61233c565b5b600061282a8582860161238f565b925050602061283b8582860161262b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612882826124db565b810181811067ffffffffffffffff821117156128a1576128a061284a565b5b80604052505050565b60006128b4612332565b90506128c08282612879565b919050565b600067ffffffffffffffff8211156128e0576128df61284a565b5b6128e9826124db565b9050602081019050919050565b82818337600083830152505050565b6000612918612913846128c5565b6128aa565b90508281526020810184848401111561293457612933612845565b5b61293f8482856128f6565b509392505050565b600082601f83011261295c5761295b612753565b5b813561296c848260208601612905565b91505092915050565b6000806000806080858703121561298f5761298e61233c565b5b600061299d8782880161238f565b94505060206129ae8782880161238f565b93505060406129bf87828801612568565b925050606085013567ffffffffffffffff8111156129e0576129df612341565b5b6129ec87828801612947565b91505092959194509250565b60008060408385031215612a0f57612a0e61233c565b5b6000612a1d8582860161238f565b9250506020612a2e8582860161238f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a6e602083612497565b9150612a7982612a38565b602082019050919050565b60006020820190508181036000830152612a9d81612a61565b9050919050565b600081519050612ab381612551565b92915050565b600060208284031215612acf57612ace61233c565b5b6000612add84828501612aa4565b91505092915050565b600081519050612af581612614565b92915050565b600060208284031215612b1157612b1061233c565b5b6000612b1f84828501612ae6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b6f57607f821691505b602082108103612b8257612b81612b28565b5b50919050565b7f696e20746865206c696d626f0000000000000000000000000000000000000000600082015250565b6000612bbe600c83612497565b9150612bc982612b88565b602082019050919050565b60006020820190508181036000830152612bed81612bb1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c2e82612547565b9150612c3983612547565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c7257612c71612bf4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612cb782612547565b9150612cc283612547565b925082612cd257612cd1612c7d565b5b828204905092915050565b600081905092915050565b50565b6000612cf8600083612cdd565b9150612d0382612ce8565b600082019050919050565b6000612d1982612ceb565b9150819050919050565b600081905092915050565b6000612d398261248c565b612d438185612d23565b9350612d538185602086016124a8565b80840191505092915050565b6000612d6b8285612d2e565b9150612d778284612d2e565b91508190509392505050565b6000612d8e82612547565b9150612d9983612547565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dce57612dcd612bf4565b5b828201905092915050565b7f746f6f206d756368000000000000000000000000000000000000000000000000600082015250565b6000612e0f600883612497565b9150612e1a82612dd9565b602082019050919050565b60006020820190508181036000830152612e3e81612e02565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ea1602683612497565b9150612eac82612e45565b604082019050919050565b60006020820190508181036000830152612ed081612e94565b9050919050565b7f6d75737420626520736f6d656f6e650000000000000000000000000000000000600082015250565b6000612f0d600f83612497565b9150612f1882612ed7565b602082019050919050565b60006020820190508181036000830152612f3c81612f00565b9050919050565b7f7468657265206973206e6f20656e640000000000000000000000000000000000600082015250565b6000612f79600f83612497565b9150612f8482612f43565b602082019050919050565b60006020820190508181036000830152612fa881612f6c565b9050919050565b7f616c726561647920696e2074686520656e640000000000000000000000000000600082015250565b6000612fe5601283612497565b9150612ff082612faf565b602082019050919050565b6000602082019050818103600083015261301481612fd8565b9050919050565b7f74686520656e64206973206f6e63650000000000000000000000000000000000600082015250565b6000613051600f83612497565b915061305c8261301b565b602082019050919050565b6000602082019050818103600083015261308081613044565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130ae82613087565b6130b88185613092565b93506130c88185602086016124a8565b6130d1816124db565b840191505092915050565b60006080820190506130f160008301876125aa565b6130fe60208301866125aa565b61310b604083018561266d565b818103606083015261311d81846130a3565b905095945050505050565b600081519050613137816123fd565b92915050565b6000602082840312156131535761315261233c565b5b600061316184828501613128565b9150509291505056fea26469706673582212207d46aa9976fb64703462440c337363d87fc97981920d9e2a86c8b19b1c519e0364736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063ac4c25b2116100a2578063d358446a11610071578063d358446a14610530578063e985e9c51461054c578063f2fde38b1461057c578063f5fefa3414610598576101da565b8063ac4c25b2146104aa578063b88d4fde146104c8578063c87b56dd146104e4578063cec3321914610514576101da565b80638da5cb5b116100de5780638da5cb5b1461042257806395d89b4114610440578063a22cb4651461045e578063a24f81371461047a576101da565b806370a08231146103ca578063715018a6146103fa57806386bbee3e14610404576101da565b806318160ddd1161017c57806334e08a381161014b57806334e08a381461035857806342842e0e146103745780636352211e14610390578063674b80ee146103c0576101da565b806318160ddd146102cf57806323b872dd146102ed5780632a55205a146103095780632ac70d241461033a576101da565b806307ce0288116101b857806307ce028814610249578063081812fc14610267578063095ea7b3146102975780630e79b0f7146102b3576101da565b80630174b105146101df57806301ffc9a7146101fb57806306fdde031461022b575b600080fd5b6101f960048036038101906101f491906123a4565b6105a2565b005b61021560048036038101906102109190612429565b61071f565b6040516102229190612471565b60405180910390f35b610233610799565b6040516102409190612525565b60405180910390f35b61025161082b565b60405161025e9190612471565b60405180910390f35b610281600480360381019061027c919061257d565b61083e565b60405161028e91906125b9565b60405180910390f35b6102b160048036038101906102ac91906125d4565b6108ba565b005b6102cd60048036038101906102c89190612640565b610a60565b005b6102d7610af9565b6040516102e4919061267c565b60405180910390f35b61030760048036038101906103029190612697565b610b10565b005b610323600480360381019061031e91906126ea565b610b20565b60405161033192919061272a565b60405180910390f35b610342610bb2565b60405161034f9190612525565b60405180910390f35b610372600480360381019061036d91906127b8565b610c40565b005b61038e60048036038101906103899190612697565b610cd2565b005b6103aa60048036038101906103a5919061257d565b610cf2565b6040516103b791906125b9565b60405180910390f35b6103c8610d04565b005b6103e460048036038101906103df91906123a4565b610e00565b6040516103f1919061267c565b60405180910390f35b610402610eb8565b005b61040c610f40565b604051610419919061267c565b60405180910390f35b61042a610f46565b60405161043791906125b9565b60405180910390f35b610448610f70565b6040516104559190612525565b60405180910390f35b61047860048036038101906104739190612805565b611002565b005b610494600480360381019061048f91906123a4565b611179565b6040516104a19190612471565b60405180910390f35b6104b2611199565b6040516104bf91906125b9565b60405180910390f35b6104e260048036038101906104dd9190612975565b6111bf565b005b6104fe60048036038101906104f9919061257d565b611232565b60405161050b9190612525565b60405180910390f35b61052e600480360381019061052991906123a4565b6112d0565b005b61054a600480360381019061054591906125d4565b611390565b005b610566600480360381019061056191906129f8565b611477565b6040516105739190612471565b60405180910390f35b610596600480360381019061059191906123a4565b61150b565b005b6105a0611602565b005b6105aa61180f565b73ffffffffffffffffffffffffffffffffffffffff166105c8610f46565b73ffffffffffffffffffffffffffffffffffffffff161461061e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061590612a84565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161065991906125b9565b602060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069a9190612ab9565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016106d792919061272a565b6020604051808303816000875af11580156106f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071a9190612afb565b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610792575061079182611817565b5b9050919050565b6060600280546107a890612b57565b80601f01602080910402602001604051908101604052809291908181526020018280546107d490612b57565b80156108215780601f106107f657610100808354040283529160200191610821565b820191906000526020600020905b81548152906001019060200180831161080457829003601f168201915b5050505050905090565b600860149054906101000a900460ff1681565b6000610849826118a9565b61087f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c582611908565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361092c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094b6119d4565b73ffffffffffffffffffffffffffffffffffffffff16146109ae57610977816109726119d4565b611477565b6109ad576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610a6861180f565b73ffffffffffffffffffffffffffffffffffffffff16610a86610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390612a84565b60405180910390fd5b80600860146101000a81548160ff02191690831515021790555050565b6000610b036119dc565b6001546000540303905090565b610b1b8383836119e1565b505050565b600080610b2c846118a9565b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290612bd4565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600785610b9d9190612c23565b610ba79190612cac565b915091509250929050565b60098054610bbf90612b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610beb90612b57565b8015610c385780601f10610c0d57610100808354040283529160200191610c38565b820191906000526020600020905b815481529060010190602001808311610c1b57829003601f168201915b505050505081565b610c4861180f565b73ffffffffffffffffffffffffffffffffffffffff16610c66610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb390612a84565b60405180910390fd5b818160099190610ccd92919061228f565b505050565b610ced838383604051806020016040528060008152506111bf565b505050565b6000610cfd82611908565b9050919050565b610d0c61180f565b73ffffffffffffffffffffffffffffffffffffffff16610d2a610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790612a84565b60405180910390fd5b6000610d8a610f46565b73ffffffffffffffffffffffffffffffffffffffff1647604051610dad90612d0e565b60006040518083038185875af1925050503d8060008114610dea576040519150601f19603f3d011682016040523d82523d6000602084013e610def565b606091505b5050905080610dfd57600080fd5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e67576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610ec061180f565b73ffffffffffffffffffffffffffffffffffffffff16610ede610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90612a84565b60405180910390fd5b610f3e6000611d88565b565b61029b81565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f7f90612b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610fab90612b57565b8015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b61100a6119d4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361106e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061107b6119d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111286119d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161116d9190612471565b60405180910390a35050565b600b6020528060005260406000206000915054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111ca8484846119e1565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461122c576111f584848484611e4e565b61122b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061123d826118a9565b611273576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061127d611f9e565b9050600081510361129d57604051806020016040528060008152506112c8565b806112a784612030565b6040516020016112b8929190612d5f565b6040516020818303038152906040525b915050919050565b6112d861180f565b73ffffffffffffffffffffffffffffffffffffffff166112f6610f46565b73ffffffffffffffffffffffffffffffffffffffff161461134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390612a84565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61139861180f565b73ffffffffffffffffffffffffffffffffffffffff166113b6610f46565b73ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390612a84565b60405180910390fd5b600061141661208a565b905061029b82826114279190612d83565b1115611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90612e25565b60405180910390fd5b611472838361209d565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61151361180f565b73ffffffffffffffffffffffffffffffffffffffff16611531610f46565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90612a84565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90612eb7565b60405180910390fd5b6115ff81611d88565b50565b600061160c61208a565b90503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390612f23565b60405180910390fd5b600860149054906101000a900460ff166116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290612f8f565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f90612ffb565b60405180910390fd5b61029b6001826117689190612d83565b11156117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613067565b60405180910390fd5b6117b433600161209d565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061187257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118a25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000816118b46119dc565b111580156118c3575060005482105b8015611901575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806119176119dc565b1161199d5760005481101561199c5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361199a575b60008103611990576004600083600190039350838152602001908152602001600020549050611966565b80925050506119cf565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006119ec82611908565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a53576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a746119d4565b73ffffffffffffffffffffffffffffffffffffffff161480611aa35750611aa285611a9d6119d4565b611477565b5b80611ae85750611ab16119d4565b73ffffffffffffffffffffffffffffffffffffffff16611ad08461083e565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b21576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b87576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b94858585600161226f565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611c9186612275565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611d195760006001840190506000600460008381526020019081526020016000205403611d17576000548114611d16578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d81858585600161227f565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e746119d4565b8786866040518563ffffffff1660e01b8152600401611e9694939291906130dc565b6020604051808303816000875af1925050508015611ed257506040513d601f19601f82011682018060405250810190611ecf919061313d565b60015b611f4b573d8060008114611f02576040519150601f19603f3d011682016040523d82523d6000602084013e611f07565b606091505b506000815103611f43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611fad90612b57565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd990612b57565b80156120265780601f10611ffb57610100808354040283529160200191612026565b820191906000526020600020905b81548152906001019060200180831161200957829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561207657600183039250600a81066030018353600a81049050612056565b508181036020830392508083525050919050565b60006120946119dc565b60005403905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612109576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612143576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612150600084838561226f565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16121b560018414612285565b901b60a042901b6121c585612275565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106121eb5781600081905550505061226a600084838561227f565b505050565b50505050565b6000819050919050565b50505050565b6000819050919050565b82805461229b90612b57565b90600052602060002090601f0160209004810192826122bd5760008555612304565b82601f106122d657803560ff1916838001178555612304565b82800160010185558215612304579182015b828111156123035782358255916020019190600101906122e8565b5b5090506123119190612315565b5090565b5b8082111561232e576000816000905550600101612316565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061237182612346565b9050919050565b61238181612366565b811461238c57600080fd5b50565b60008135905061239e81612378565b92915050565b6000602082840312156123ba576123b961233c565b5b60006123c88482850161238f565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612406816123d1565b811461241157600080fd5b50565b600081359050612423816123fd565b92915050565b60006020828403121561243f5761243e61233c565b5b600061244d84828501612414565b91505092915050565b60008115159050919050565b61246b81612456565b82525050565b60006020820190506124866000830184612462565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124c65780820151818401526020810190506124ab565b838111156124d5576000848401525b50505050565b6000601f19601f8301169050919050565b60006124f78261248c565b6125018185612497565b93506125118185602086016124a8565b61251a816124db565b840191505092915050565b6000602082019050818103600083015261253f81846124ec565b905092915050565b6000819050919050565b61255a81612547565b811461256557600080fd5b50565b60008135905061257781612551565b92915050565b6000602082840312156125935761259261233c565b5b60006125a184828501612568565b91505092915050565b6125b381612366565b82525050565b60006020820190506125ce60008301846125aa565b92915050565b600080604083850312156125eb576125ea61233c565b5b60006125f98582860161238f565b925050602061260a85828601612568565b9150509250929050565b61261d81612456565b811461262857600080fd5b50565b60008135905061263a81612614565b92915050565b6000602082840312156126565761265561233c565b5b60006126648482850161262b565b91505092915050565b61267681612547565b82525050565b6000602082019050612691600083018461266d565b92915050565b6000806000606084860312156126b0576126af61233c565b5b60006126be8682870161238f565b93505060206126cf8682870161238f565b92505060406126e086828701612568565b9150509250925092565b600080604083850312156127015761270061233c565b5b600061270f85828601612568565b925050602061272085828601612568565b9150509250929050565b600060408201905061273f60008301856125aa565b61274c602083018461266d565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261277857612777612753565b5b8235905067ffffffffffffffff81111561279557612794612758565b5b6020830191508360018202830111156127b1576127b061275d565b5b9250929050565b600080602083850312156127cf576127ce61233c565b5b600083013567ffffffffffffffff8111156127ed576127ec612341565b5b6127f985828601612762565b92509250509250929050565b6000806040838503121561281c5761281b61233c565b5b600061282a8582860161238f565b925050602061283b8582860161262b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612882826124db565b810181811067ffffffffffffffff821117156128a1576128a061284a565b5b80604052505050565b60006128b4612332565b90506128c08282612879565b919050565b600067ffffffffffffffff8211156128e0576128df61284a565b5b6128e9826124db565b9050602081019050919050565b82818337600083830152505050565b6000612918612913846128c5565b6128aa565b90508281526020810184848401111561293457612933612845565b5b61293f8482856128f6565b509392505050565b600082601f83011261295c5761295b612753565b5b813561296c848260208601612905565b91505092915050565b6000806000806080858703121561298f5761298e61233c565b5b600061299d8782880161238f565b94505060206129ae8782880161238f565b93505060406129bf87828801612568565b925050606085013567ffffffffffffffff8111156129e0576129df612341565b5b6129ec87828801612947565b91505092959194509250565b60008060408385031215612a0f57612a0e61233c565b5b6000612a1d8582860161238f565b9250506020612a2e8582860161238f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a6e602083612497565b9150612a7982612a38565b602082019050919050565b60006020820190508181036000830152612a9d81612a61565b9050919050565b600081519050612ab381612551565b92915050565b600060208284031215612acf57612ace61233c565b5b6000612add84828501612aa4565b91505092915050565b600081519050612af581612614565b92915050565b600060208284031215612b1157612b1061233c565b5b6000612b1f84828501612ae6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b6f57607f821691505b602082108103612b8257612b81612b28565b5b50919050565b7f696e20746865206c696d626f0000000000000000000000000000000000000000600082015250565b6000612bbe600c83612497565b9150612bc982612b88565b602082019050919050565b60006020820190508181036000830152612bed81612bb1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c2e82612547565b9150612c3983612547565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c7257612c71612bf4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612cb782612547565b9150612cc283612547565b925082612cd257612cd1612c7d565b5b828204905092915050565b600081905092915050565b50565b6000612cf8600083612cdd565b9150612d0382612ce8565b600082019050919050565b6000612d1982612ceb565b9150819050919050565b600081905092915050565b6000612d398261248c565b612d438185612d23565b9350612d538185602086016124a8565b80840191505092915050565b6000612d6b8285612d2e565b9150612d778284612d2e565b91508190509392505050565b6000612d8e82612547565b9150612d9983612547565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dce57612dcd612bf4565b5b828201905092915050565b7f746f6f206d756368000000000000000000000000000000000000000000000000600082015250565b6000612e0f600883612497565b9150612e1a82612dd9565b602082019050919050565b60006020820190508181036000830152612e3e81612e02565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ea1602683612497565b9150612eac82612e45565b604082019050919050565b60006020820190508181036000830152612ed081612e94565b9050919050565b7f6d75737420626520736f6d656f6e650000000000000000000000000000000000600082015250565b6000612f0d600f83612497565b9150612f1882612ed7565b602082019050919050565b60006020820190508181036000830152612f3c81612f00565b9050919050565b7f7468657265206973206e6f20656e640000000000000000000000000000000000600082015250565b6000612f79600f83612497565b9150612f8482612f43565b602082019050919050565b60006020820190508181036000830152612fa881612f6c565b9050919050565b7f616c726561647920696e2074686520656e640000000000000000000000000000600082015250565b6000612fe5601283612497565b9150612ff082612faf565b602082019050919050565b6000602082019050818103600083015261301481612fd8565b9050919050565b7f74686520656e64206973206f6e63650000000000000000000000000000000000600082015250565b6000613051600f83612497565b915061305c8261301b565b602082019050919050565b6000602082019050818103600083015261308081613044565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130ae82613087565b6130b88185613092565b93506130c88185602086016124a8565b6130d1816124db565b840191505092915050565b60006080820190506130f160008301876125aa565b6130fe60208301866125aa565b61310b604083018561266d565b818103606083015261311d81846130a3565b905095945050505050565b600081519050613137816123fd565b92915050565b6000602082840312156131535761315261233c565b5b600061316184828501613128565b9150509291505056fea26469706673582212207d46aa9976fb64703462440c337363d87fc97981920d9e2a86c8b19b1c519e0364736f6c634300080d0033

Deployed Bytecode Sourcemap

486:2155:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1951:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9768:98:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;535:18:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11769:200:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11245:463;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1352:79:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3963:309:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12629:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2369:270:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;559:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1437:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12859:179:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9564:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1614:146:7;;;:::i;:::-;;5546:221:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:6;;;:::i;:::-;;609:40:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9930:102:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12036:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;655:37:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;584:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13104:385:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10098:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1531:77:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1123:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12405:162:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;747:370:7;;;:::i;:::-;;1766:179;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1829:15:7::1;1854:5;1847:23;;;1879:4;1847:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1829:56;;1902:5;1895:22;;;1918:10;1930:7;1895:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1819:126;1766:179:::0;:::o;1951:258::-;2094:4;2136:26;2121:41;;;:11;:41;;;;:81;;;;2166:36;2190:11;2166:23;:36::i;:::-;2121:81;2114:88;;1951:258;;;:::o;9768:98:1:-;9822:13;9854:5;9847:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9768:98;:::o;535:18:7:-;;;;;;;;;;;;;:::o;11769:200:1:-;11837:7;11861:16;11869:7;11861;:16::i;:::-;11856:64;;11886:34;;;;;;;;;;;;;;11856:64;11938:15;:24;11954:7;11938:24;;;;;;;;;;;;;;;;;;;;;11931:31;;11769:200;;;:::o;11245:463::-;11317:13;11349:27;11368:7;11349:18;:27::i;:::-;11317:61;;11398:5;11392:11;;:2;:11;;;11388:48;;11412:24;;;;;;;;;;;;;;11388:48;11474:5;11451:28;;:19;:17;:19::i;:::-;:28;;;11447:172;;11498:44;11515:5;11522:19;:17;:19::i;:::-;11498:16;:44::i;:::-;11493:126;;11569:35;;;;;;;;;;;;;;11493:126;11447:172;11656:2;11629:15;:24;11645:7;11629:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11693:7;11689:2;11673:28;;11682:5;11673:28;;;;;;;;;;;;11307:401;11245:463;;:::o;1352:79:7:-;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1417:7:7::1;1408:6;;:16;;;;;;;;;;;;;;;;;;1352:79:::0;:::o;3963:309:1:-;4016:7;4240:15;:13;:15::i;:::-;4225:12;;4209:13;;:28;:46;4202:53;;3963:309;:::o;12629:164::-;12758:28;12768:4;12774:2;12778:7;12758:9;:28::i;:::-;12629:164;;;:::o;2369:270:7:-;2490:16;2508:21;2553:16;2561:7;2553;:16::i;:::-;2545:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2604:4;;;;;;;;;;;2628:3;2623:1;2611:9;:13;;;;:::i;:::-;2610:21;;;;:::i;:::-;2596:36;;;;2369:270;;;;;:::o;559:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1437:88::-;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1512:6:7::1;;1504:5;:14;;;;;;;:::i;:::-;;1437:88:::0;;:::o;12859:179:1:-;12992:39;13009:4;13015:2;13019:7;12992:39;;;;;;;;;;;;:16;:39::i;:::-;12859:179;;;:::o;9564:142::-;9628:7;9670:27;9689:7;9670:18;:27::i;:::-;9647:52;;9564:142;;;:::o;1614:146:7:-;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1663:12:7::1;1681:7;:5;:7::i;:::-;:12;;1701:21;1681:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1662:65;;;1745:7;1737:16;;;::::0;::::1;;1652:108;1614:146::o:0;5546:221:1:-;5610:7;5650:1;5633:19;;:5;:19;;;5629:60;;5661:28;;;;;;;;;;;;;;5629:60;1017:13;5706:18;:25;5725:5;5706:25;;;;;;;;;;;;;;;;:54;5699:61;;5546:221;;;:::o;1661:101:6:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;609:40:7:-;646:3;609:40;:::o;1029:85:6:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;9930:102:1:-;9986:13;10018:7;10011:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9930:102;:::o;12036:303::-;12146:19;:17;:19::i;:::-;12134:31;;:8;:31;;;12130:61;;12174:17;;;;;;;;;;;;;;12130:61;12254:8;12202:18;:39;12221:19;:17;:19::i;:::-;12202:39;;;;;;;;;;;;;;;:49;12242:8;12202:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12313:8;12277:55;;12292:19;:17;:19::i;:::-;12277:55;;;12323:8;12277:55;;;;;;:::i;:::-;;;;;;;;12036:303;;:::o;655:37:7:-;;;;;;;;;;;;;;;;;;;;;;:::o;584:19::-;;;;;;;;;;;;;:::o;13104:385:1:-;13265:28;13275:4;13281:2;13285:7;13265:9;:28::i;:::-;13325:1;13307:2;:14;;;:19;13303:180;;13345:56;13376:4;13382:2;13386:7;13395:5;13345:30;:56::i;:::-;13340:143;;13428:40;;;;;;;;;;;;;;13340:143;13303:180;13104:385;;;;:::o;10098:313::-;10171:13;10201:16;10209:7;10201;:16::i;:::-;10196:59;;10226:29;;;;;;;;;;;;;;10196:59;10266:21;10290:10;:8;:10::i;:::-;10266:34;;10342:1;10323:7;10317:21;:26;:87;;;;;;;;;;;;;;;;;10370:7;10379:18;10389:7;10379:9;:18::i;:::-;10353:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10317:87;10310:94;;;10098:313;;;:::o;1531:77:7:-;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1596:5:7::1;1589:4;;:12;;;;;;;;;;;;;;;;;;1531:77:::0;:::o;1123:223::-;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1212:14:7::1;1229;:12;:14::i;:::-;1212:31;;646:3;1270:9;1261:6;:18;;;;:::i;:::-;:32;;1253:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;1317:22;1323:4;1329:9;1317:5;:22::i;:::-;1202:144;1123:223:::0;;:::o;12405:162:1:-;12502:4;12525:18;:25;12544:5;12525:25;;;;;;;;;;;;;;;:35;12551:8;12525:35;;;;;;;;;;;;;;;;;;;;;;;;;12518:42;;12405:162;;;;:::o;1911:198:6:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;::::0;1991:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;747:370:7:-;787:14;804;:12;:14::i;:::-;787:31;;851:9;837:23;;:10;:23;;;829:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;898:6;;;;;;;;;;;890:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;943:5;:17;949:10;943:17;;;;;;;;;;;;;;;;;;;;;;;;;942:18;934:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;646:3;1010:1;1001:6;:10;;;;:::i;:::-;:24;;993:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1056:20;1062:10;1074:1;1056:5;:20::i;:::-;1106:4;1086:5;:17;1092:10;1086:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;777:340;747:370::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;4880:607:1:-;4965:4;5275:10;5260:25;;:11;:25;;;;:101;;;;5351:10;5336:25;;:11;:25;;;;5260:101;:177;;;;5427:10;5412:25;;:11;:25;;;;5260:177;5241:196;;4880:607;;;:::o;13735:268::-;13792:4;13846:7;13827:15;:13;:15::i;:::-;:26;;:65;;;;;13879:13;;13869:7;:23;13827:65;:150;;;;;13976:1;1769:8;13929:17;:26;13947:7;13929:26;;;;;;;;;;;;:43;:48;13827:150;13808:169;;13735:268;;;:::o;7141:1105::-;7208:7;7227:12;7242:7;7227:22;;7307:4;7288:15;:13;:15::i;:::-;:23;7284:898;;7340:13;;7333:4;:20;7329:853;;;7377:14;7394:17;:23;7412:4;7394:23;;;;;;;;;;;;7377:40;;7508:1;1769:8;7481:6;:23;:28;7477:687;;7992:111;8009:1;7999:6;:11;7992:111;;8051:17;:25;8069:6;;;;;;;8051:25;;;;;;;;;;;;8042:34;;7992:111;;;8135:6;8128:13;;;;;;7477:687;7355:827;7329:853;7284:898;8208:31;;;;;;;;;;;;;;7141:1105;;;;:::o;27360:103::-;27420:7;27446:10;27439:17;;27360:103;:::o;3502:90::-;3558:7;3502:90;:::o;18835:2460::-;18945:27;18975;18994:7;18975:18;:27::i;:::-;18945:57;;19058:4;19017:45;;19033:19;19017:45;;;19013:86;;19071:28;;;;;;;;;;;;;;19013:86;19110:22;19159:4;19136:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;19179:43;19196:4;19202:19;:17;:19::i;:::-;19179:16;:43::i;:::-;19136:86;:145;;;;19262:19;:17;:19::i;:::-;19238:43;;:20;19250:7;19238:11;:20::i;:::-;:43;;;19136:145;19110:172;;19298:17;19293:66;;19324:35;;;;;;;;;;;;;;19293:66;19387:1;19373:16;;:2;:16;;;19369:52;;19398:23;;;;;;;;;;;;;;19369:52;19432:43;19454:4;19460:2;19464:7;19473:1;19432:21;:43::i;:::-;19545:15;:24;19561:7;19545:24;;;;;;;;;;;;19538:31;;;;;;;;;;;19930:18;:24;19949:4;19930:24;;;;;;;;;;;;;;;;19928:26;;;;;;;;;;;;19998:18;:22;20017:2;19998:22;;;;;;;;;;;;;;;;19996:24;;;;;;;;;;;2045:8;1656:3;20370:15;:41;;20329:21;20347:2;20329:17;:21::i;:::-;:83;:126;20284:17;:26;20302:7;20284:26;;;;;;;;;;;:171;;;;20622:1;2045:8;20572:19;:46;:51;20568:616;;20643:19;20675:1;20665:7;:11;20643:33;;20830:1;20796:17;:30;20814:11;20796:30;;;;;;;;;;;;:35;20792:378;;20932:13;;20917:11;:28;20913:239;;21110:19;21077:17;:30;21095:11;21077:30;;;;;;;;;;;:52;;;;20913:239;20792:378;20625:559;20568:616;21228:7;21224:2;21209:27;;21218:4;21209:27;;;;;;;;;;;;21246:42;21267:4;21273:2;21277:7;21286:1;21246:20;:42::i;:::-;18935:2360;;18835:2460;;;:::o;2263:187:6:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;24900:697:1:-;25058:4;25103:2;25078:45;;;25124:19;:17;:19::i;:::-;25145:4;25151:7;25160:5;25078:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25074:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25373:1;25356:6;:13;:18;25352:229;;25401:40;;;;;;;;;;;;;;25352:229;25541:6;25535:13;25526:6;25522:2;25518:15;25511:38;25074:517;25244:54;;;25234:64;;;:6;:64;;;;25227:71;;;24900:697;;;;;;:::o;2215:148:7:-;2315:13;2351:5;2344:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2215:148;:::o;27564:1920:1:-;27621:17;28036:3;28029:4;28023:11;28019:21;28012:28;;28125:3;28119:4;28112:17;28228:3;28677:5;28805:1;28800:3;28796:11;28789:18;;28940:2;28934:4;28930:13;28926:2;28922:22;28917:3;28909:36;28980:2;28974:4;28970:13;28962:21;;28570:668;28998:4;28570:668;;;29169:1;29164:3;29160:11;29153:18;;29219:2;29213:4;29209:13;29205:2;29201:22;29196:3;29188:36;29092:2;29086:4;29082:13;29074:21;;28570:668;;;28574:423;29287:3;29282;29278:13;29400:2;29395:3;29391:12;29384:19;;29461:6;29456:3;29449:19;27659:1819;;27564:1920;;;:::o;4365:279::-;4412:7;4612:15;:13;:15::i;:::-;4596:13;;:31;4589:38;;4365:279;:::o;16975:1618::-;17039:20;17062:13;;17039:36;;17103:1;17089:16;;:2;:16;;;17085:48;;17114:19;;;;;;;;;;;;;;17085:48;17159:1;17147:8;:13;17143:44;;17169:18;;;;;;;;;;;;;;17143:44;17198:61;17228:1;17232:2;17236:12;17250:8;17198:21;:61::i;:::-;17791:1;1151:2;17762:1;:25;;17761:31;17749:8;:44;17723:18;:22;17742:2;17723:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1913:3;18182:29;18209:1;18197:8;:13;18182:14;:29::i;:::-;:56;;1656:3;18120:15;:41;;18079:21;18097:2;18079:17;:21::i;:::-;:83;:160;18029:17;:31;18047:12;18029:31;;;;;;;;;;;:210;;;;18254:20;18277:12;18254:35;;18303:11;18332:8;18317:12;:23;18303:37;;18355:109;18406:14;;;;;;18402:2;18381:40;;18398:1;18381:40;;;;;;;;;;;;18459:3;18444:12;:18;18355:109;;18494:12;18478:13;:28;;;;17506:1011;;18526:60;18555:1;18559:2;18563:12;18577:8;18526:20;:60::i;:::-;17029:1564;16975:1618;;:::o;26228:154::-;;;;;:::o;10824:144::-;10888:14;10947:5;10937:15;;10824:144;;;:::o;27023:153::-;;;;;:::o;11050:138::-;11108:14;11167:5;11157:15;;11050:138;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:8:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:149::-;1212:7;1252:66;1245:5;1241:78;1230:89;;1176:149;;;:::o;1331:120::-;1403:23;1420:5;1403:23;:::i;:::-;1396:5;1393:34;1383:62;;1441:1;1438;1431:12;1383:62;1331:120;:::o;1457:137::-;1502:5;1540:6;1527:20;1518:29;;1556:32;1582:5;1556:32;:::i;:::-;1457:137;;;;:::o;1600:327::-;1658:6;1707:2;1695:9;1686:7;1682:23;1678:32;1675:119;;;1713:79;;:::i;:::-;1675:119;1833:1;1858:52;1902:7;1893:6;1882:9;1878:22;1858:52;:::i;:::-;1848:62;;1804:116;1600:327;;;;:::o;1933:90::-;1967:7;2010:5;2003:13;1996:21;1985:32;;1933:90;;;:::o;2029:109::-;2110:21;2125:5;2110:21;:::i;:::-;2105:3;2098:34;2029:109;;:::o;2144:210::-;2231:4;2269:2;2258:9;2254:18;2246:26;;2282:65;2344:1;2333:9;2329:17;2320:6;2282:65;:::i;:::-;2144:210;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:116::-;5343:21;5358:5;5343:21;:::i;:::-;5336:5;5333:32;5323:60;;5379:1;5376;5369:12;5323:60;5273:116;:::o;5395:133::-;5438:5;5476:6;5463:20;5454:29;;5492:30;5516:5;5492:30;:::i;:::-;5395:133;;;;:::o;5534:323::-;5590:6;5639:2;5627:9;5618:7;5614:23;5610:32;5607:119;;;5645:79;;:::i;:::-;5607:119;5765:1;5790:50;5832:7;5823:6;5812:9;5808:22;5790:50;:::i;:::-;5780:60;;5736:114;5534:323;;;;:::o;5863:118::-;5950:24;5968:5;5950:24;:::i;:::-;5945:3;5938:37;5863:118;;:::o;5987:222::-;6080:4;6118:2;6107:9;6103:18;6095:26;;6131:71;6199:1;6188:9;6184:17;6175:6;6131:71;:::i;:::-;5987:222;;;;:::o;6215:619::-;6292:6;6300;6308;6357:2;6345:9;6336:7;6332:23;6328:32;6325:119;;;6363:79;;:::i;:::-;6325:119;6483:1;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6454:117;6610:2;6636:53;6681:7;6672:6;6661:9;6657:22;6636:53;:::i;:::-;6626:63;;6581:118;6738:2;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6709:118;6215:619;;;;;:::o;6840:474::-;6908:6;6916;6965:2;6953:9;6944:7;6940:23;6936:32;6933:119;;;6971:79;;:::i;:::-;6933:119;7091:1;7116:53;7161:7;7152:6;7141:9;7137:22;7116:53;:::i;:::-;7106:63;;7062:117;7218:2;7244:53;7289:7;7280:6;7269:9;7265:22;7244:53;:::i;:::-;7234:63;;7189:118;6840:474;;;;;:::o;7320:332::-;7441:4;7479:2;7468:9;7464:18;7456:26;;7492:71;7560:1;7549:9;7545:17;7536:6;7492:71;:::i;:::-;7573:72;7641:2;7630:9;7626:18;7617:6;7573:72;:::i;:::-;7320:332;;;;;:::o;7658:117::-;7767:1;7764;7757:12;7781:117;7890:1;7887;7880:12;7904:117;8013:1;8010;8003:12;8041:553;8099:8;8109:6;8159:3;8152:4;8144:6;8140:17;8136:27;8126:122;;8167:79;;:::i;:::-;8126:122;8280:6;8267:20;8257:30;;8310:18;8302:6;8299:30;8296:117;;;8332:79;;:::i;:::-;8296:117;8446:4;8438:6;8434:17;8422:29;;8500:3;8492:4;8484:6;8480:17;8470:8;8466:32;8463:41;8460:128;;;8507:79;;:::i;:::-;8460:128;8041:553;;;;;:::o;8600:529::-;8671:6;8679;8728:2;8716:9;8707:7;8703:23;8699:32;8696:119;;;8734:79;;:::i;:::-;8696:119;8882:1;8871:9;8867:17;8854:31;8912:18;8904:6;8901:30;8898:117;;;8934:79;;:::i;:::-;8898:117;9047:65;9104:7;9095:6;9084:9;9080:22;9047:65;:::i;:::-;9029:83;;;;8825:297;8600:529;;;;;:::o;9135:468::-;9200:6;9208;9257:2;9245:9;9236:7;9232:23;9228:32;9225:119;;;9263:79;;:::i;:::-;9225:119;9383:1;9408:53;9453:7;9444:6;9433:9;9429:22;9408:53;:::i;:::-;9398:63;;9354:117;9510:2;9536:50;9578:7;9569:6;9558:9;9554:22;9536:50;:::i;:::-;9526:60;;9481:115;9135:468;;;;;:::o;9609:117::-;9718:1;9715;9708:12;9732:180;9780:77;9777:1;9770:88;9877:4;9874:1;9867:15;9901:4;9898:1;9891:15;9918:281;10001:27;10023:4;10001:27;:::i;:::-;9993:6;9989:40;10131:6;10119:10;10116:22;10095:18;10083:10;10080:34;10077:62;10074:88;;;10142:18;;:::i;:::-;10074:88;10182:10;10178:2;10171:22;9961:238;9918:281;;:::o;10205:129::-;10239:6;10266:20;;:::i;:::-;10256:30;;10295:33;10323:4;10315:6;10295:33;:::i;:::-;10205:129;;;:::o;10340:307::-;10401:4;10491:18;10483:6;10480:30;10477:56;;;10513:18;;:::i;:::-;10477:56;10551:29;10573:6;10551:29;:::i;:::-;10543:37;;10635:4;10629;10625:15;10617:23;;10340:307;;;:::o;10653:154::-;10737:6;10732:3;10727;10714:30;10799:1;10790:6;10785:3;10781:16;10774:27;10653:154;;;:::o;10813:410::-;10890:5;10915:65;10931:48;10972:6;10931:48;:::i;:::-;10915:65;:::i;:::-;10906:74;;11003:6;10996:5;10989:21;11041:4;11034:5;11030:16;11079:3;11070:6;11065:3;11061:16;11058:25;11055:112;;;11086:79;;:::i;:::-;11055:112;11176:41;11210:6;11205:3;11200;11176:41;:::i;:::-;10896:327;10813:410;;;;;:::o;11242:338::-;11297:5;11346:3;11339:4;11331:6;11327:17;11323:27;11313:122;;11354:79;;:::i;:::-;11313:122;11471:6;11458:20;11496:78;11570:3;11562:6;11555:4;11547:6;11543:17;11496:78;:::i;:::-;11487:87;;11303:277;11242:338;;;;:::o;11586:943::-;11681:6;11689;11697;11705;11754:3;11742:9;11733:7;11729:23;11725:33;11722:120;;;11761:79;;:::i;:::-;11722:120;11881:1;11906:53;11951:7;11942:6;11931:9;11927:22;11906:53;:::i;:::-;11896:63;;11852:117;12008:2;12034:53;12079:7;12070:6;12059:9;12055:22;12034:53;:::i;:::-;12024:63;;11979:118;12136:2;12162:53;12207:7;12198:6;12187:9;12183:22;12162:53;:::i;:::-;12152:63;;12107:118;12292:2;12281:9;12277:18;12264:32;12323:18;12315:6;12312:30;12309:117;;;12345:79;;:::i;:::-;12309:117;12450:62;12504:7;12495:6;12484:9;12480:22;12450:62;:::i;:::-;12440:72;;12235:287;11586:943;;;;;;;:::o;12535:474::-;12603:6;12611;12660:2;12648:9;12639:7;12635:23;12631:32;12628:119;;;12666:79;;:::i;:::-;12628:119;12786:1;12811:53;12856:7;12847:6;12836:9;12832:22;12811:53;:::i;:::-;12801:63;;12757:117;12913:2;12939:53;12984:7;12975:6;12964:9;12960:22;12939:53;:::i;:::-;12929:63;;12884:118;12535:474;;;;;:::o;13015:182::-;13155:34;13151:1;13143:6;13139:14;13132:58;13015:182;:::o;13203:366::-;13345:3;13366:67;13430:2;13425:3;13366:67;:::i;:::-;13359:74;;13442:93;13531:3;13442:93;:::i;:::-;13560:2;13555:3;13551:12;13544:19;;13203:366;;;:::o;13575:419::-;13741:4;13779:2;13768:9;13764:18;13756:26;;13828:9;13822:4;13818:20;13814:1;13803:9;13799:17;13792:47;13856:131;13982:4;13856:131;:::i;:::-;13848:139;;13575:419;;;:::o;14000:143::-;14057:5;14088:6;14082:13;14073:22;;14104:33;14131:5;14104:33;:::i;:::-;14000:143;;;;:::o;14149:351::-;14219:6;14268:2;14256:9;14247:7;14243:23;14239:32;14236:119;;;14274:79;;:::i;:::-;14236:119;14394:1;14419:64;14475:7;14466:6;14455:9;14451:22;14419:64;:::i;:::-;14409:74;;14365:128;14149:351;;;;:::o;14506:137::-;14560:5;14591:6;14585:13;14576:22;;14607:30;14631:5;14607:30;:::i;:::-;14506:137;;;;:::o;14649:345::-;14716:6;14765:2;14753:9;14744:7;14740:23;14736:32;14733:119;;;14771:79;;:::i;:::-;14733:119;14891:1;14916:61;14969:7;14960:6;14949:9;14945:22;14916:61;:::i;:::-;14906:71;;14862:125;14649:345;;;;:::o;15000:180::-;15048:77;15045:1;15038:88;15145:4;15142:1;15135:15;15169:4;15166:1;15159:15;15186:320;15230:6;15267:1;15261:4;15257:12;15247:22;;15314:1;15308:4;15304:12;15335:18;15325:81;;15391:4;15383:6;15379:17;15369:27;;15325:81;15453:2;15445:6;15442:14;15422:18;15419:38;15416:84;;15472:18;;:::i;:::-;15416:84;15237:269;15186:320;;;:::o;15512:162::-;15652:14;15648:1;15640:6;15636:14;15629:38;15512:162;:::o;15680:366::-;15822:3;15843:67;15907:2;15902:3;15843:67;:::i;:::-;15836:74;;15919:93;16008:3;15919:93;:::i;:::-;16037:2;16032:3;16028:12;16021:19;;15680:366;;;:::o;16052:419::-;16218:4;16256:2;16245:9;16241:18;16233:26;;16305:9;16299:4;16295:20;16291:1;16280:9;16276:17;16269:47;16333:131;16459:4;16333:131;:::i;:::-;16325:139;;16052:419;;;:::o;16477:180::-;16525:77;16522:1;16515:88;16622:4;16619:1;16612:15;16646:4;16643:1;16636:15;16663:348;16703:7;16726:20;16744:1;16726:20;:::i;:::-;16721:25;;16760:20;16778:1;16760:20;:::i;:::-;16755:25;;16948:1;16880:66;16876:74;16873:1;16870:81;16865:1;16858:9;16851:17;16847:105;16844:131;;;16955:18;;:::i;:::-;16844:131;17003:1;17000;16996:9;16985:20;;16663:348;;;;:::o;17017:180::-;17065:77;17062:1;17055:88;17162:4;17159:1;17152:15;17186:4;17183:1;17176:15;17203:185;17243:1;17260:20;17278:1;17260:20;:::i;:::-;17255:25;;17294:20;17312:1;17294:20;:::i;:::-;17289:25;;17333:1;17323:35;;17338:18;;:::i;:::-;17323:35;17380:1;17377;17373:9;17368:14;;17203:185;;;;:::o;17394:147::-;17495:11;17532:3;17517:18;;17394:147;;;;:::o;17547:114::-;;:::o;17667:398::-;17826:3;17847:83;17928:1;17923:3;17847:83;:::i;:::-;17840:90;;17939:93;18028:3;17939:93;:::i;:::-;18057:1;18052:3;18048:11;18041:18;;17667:398;;;:::o;18071:379::-;18255:3;18277:147;18420:3;18277:147;:::i;:::-;18270:154;;18441:3;18434:10;;18071:379;;;:::o;18456:148::-;18558:11;18595:3;18580:18;;18456:148;;;;:::o;18610:377::-;18716:3;18744:39;18777:5;18744:39;:::i;:::-;18799:89;18881:6;18876:3;18799:89;:::i;:::-;18792:96;;18897:52;18942:6;18937:3;18930:4;18923:5;18919:16;18897:52;:::i;:::-;18974:6;18969:3;18965:16;18958:23;;18720:267;18610:377;;;;:::o;18993:435::-;19173:3;19195:95;19286:3;19277:6;19195:95;:::i;:::-;19188:102;;19307:95;19398:3;19389:6;19307:95;:::i;:::-;19300:102;;19419:3;19412:10;;18993:435;;;;;:::o;19434:305::-;19474:3;19493:20;19511:1;19493:20;:::i;:::-;19488:25;;19527:20;19545:1;19527:20;:::i;:::-;19522:25;;19681:1;19613:66;19609:74;19606:1;19603:81;19600:107;;;19687:18;;:::i;:::-;19600:107;19731:1;19728;19724:9;19717:16;;19434:305;;;;:::o;19745:158::-;19885:10;19881:1;19873:6;19869:14;19862:34;19745:158;:::o;19909:365::-;20051:3;20072:66;20136:1;20131:3;20072:66;:::i;:::-;20065:73;;20147:93;20236:3;20147:93;:::i;:::-;20265:2;20260:3;20256:12;20249:19;;19909:365;;;:::o;20280:419::-;20446:4;20484:2;20473:9;20469:18;20461:26;;20533:9;20527:4;20523:20;20519:1;20508:9;20504:17;20497:47;20561:131;20687:4;20561:131;:::i;:::-;20553:139;;20280:419;;;:::o;20705:225::-;20845:34;20841:1;20833:6;20829:14;20822:58;20914:8;20909:2;20901:6;20897:15;20890:33;20705:225;:::o;20936:366::-;21078:3;21099:67;21163:2;21158:3;21099:67;:::i;:::-;21092:74;;21175:93;21264:3;21175:93;:::i;:::-;21293:2;21288:3;21284:12;21277:19;;20936:366;;;:::o;21308:419::-;21474:4;21512:2;21501:9;21497:18;21489:26;;21561:9;21555:4;21551:20;21547:1;21536:9;21532:17;21525:47;21589:131;21715:4;21589:131;:::i;:::-;21581:139;;21308:419;;;:::o;21733:165::-;21873:17;21869:1;21861:6;21857:14;21850:41;21733:165;:::o;21904:366::-;22046:3;22067:67;22131:2;22126:3;22067:67;:::i;:::-;22060:74;;22143:93;22232:3;22143:93;:::i;:::-;22261:2;22256:3;22252:12;22245:19;;21904:366;;;:::o;22276:419::-;22442:4;22480:2;22469:9;22465:18;22457:26;;22529:9;22523:4;22519:20;22515:1;22504:9;22500:17;22493:47;22557:131;22683:4;22557:131;:::i;:::-;22549:139;;22276:419;;;:::o;22701:165::-;22841:17;22837:1;22829:6;22825:14;22818:41;22701:165;:::o;22872:366::-;23014:3;23035:67;23099:2;23094:3;23035:67;:::i;:::-;23028:74;;23111:93;23200:3;23111:93;:::i;:::-;23229:2;23224:3;23220:12;23213:19;;22872:366;;;:::o;23244:419::-;23410:4;23448:2;23437:9;23433:18;23425:26;;23497:9;23491:4;23487:20;23483:1;23472:9;23468:17;23461:47;23525:131;23651:4;23525:131;:::i;:::-;23517:139;;23244:419;;;:::o;23669:168::-;23809:20;23805:1;23797:6;23793:14;23786:44;23669:168;:::o;23843:366::-;23985:3;24006:67;24070:2;24065:3;24006:67;:::i;:::-;23999:74;;24082:93;24171:3;24082:93;:::i;:::-;24200:2;24195:3;24191:12;24184:19;;23843:366;;;:::o;24215:419::-;24381:4;24419:2;24408:9;24404:18;24396:26;;24468:9;24462:4;24458:20;24454:1;24443:9;24439:17;24432:47;24496:131;24622:4;24496:131;:::i;:::-;24488:139;;24215:419;;;:::o;24640:165::-;24780:17;24776:1;24768:6;24764:14;24757:41;24640:165;:::o;24811:366::-;24953:3;24974:67;25038:2;25033:3;24974:67;:::i;:::-;24967:74;;25050:93;25139:3;25050:93;:::i;:::-;25168:2;25163:3;25159:12;25152:19;;24811:366;;;:::o;25183:419::-;25349:4;25387:2;25376:9;25372:18;25364:26;;25436:9;25430:4;25426:20;25422:1;25411:9;25407:17;25400:47;25464:131;25590:4;25464:131;:::i;:::-;25456:139;;25183:419;;;:::o;25608:98::-;25659:6;25693:5;25687:12;25677:22;;25608:98;;;:::o;25712:168::-;25795:11;25829:6;25824:3;25817:19;25869:4;25864:3;25860:14;25845:29;;25712:168;;;;:::o;25886:360::-;25972:3;26000:38;26032:5;26000:38;:::i;:::-;26054:70;26117:6;26112:3;26054:70;:::i;:::-;26047:77;;26133:52;26178:6;26173:3;26166:4;26159:5;26155:16;26133:52;:::i;:::-;26210:29;26232:6;26210:29;:::i;:::-;26205:3;26201:39;26194:46;;25976:270;25886:360;;;;:::o;26252:640::-;26447:4;26485:3;26474:9;26470:19;26462:27;;26499:71;26567:1;26556:9;26552:17;26543:6;26499:71;:::i;:::-;26580:72;26648:2;26637:9;26633:18;26624:6;26580:72;:::i;:::-;26662;26730:2;26719:9;26715:18;26706:6;26662:72;:::i;:::-;26781:9;26775:4;26771:20;26766:2;26755:9;26751:18;26744:48;26809:76;26880:4;26871:6;26809:76;:::i;:::-;26801:84;;26252:640;;;;;;;:::o;26898:141::-;26954:5;26985:6;26979:13;26970:22;;27001:32;27027:5;27001:32;:::i;:::-;26898:141;;;;:::o;27045:349::-;27114:6;27163:2;27151:9;27142:7;27138:23;27134:32;27131:119;;;27169:79;;:::i;:::-;27131:119;27289:1;27314:63;27369:7;27360:6;27349:9;27345:22;27314:63;:::i;:::-;27304:73;;27260:127;27045:349;;;;:::o

Swarm Source

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