ETH Price: $3,003.49 (+3.03%)
Gas: 2 Gwei

EnchantedApesClub (EAC)
 

Overview

TokenID

652

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
EnchantedApesClub

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 14 : enchantedapes.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./ERC721A.sol";
import "./ERC721AQueryable.sol";


interface MainContractInterface is IERC721A{}


contract EnchantedApesClub is ERC721A, ERC721AQueryable, Ownable {

    string private _baseTokenURI;
    bool  public claimingOn= false; 
    mapping (uint256 => bool) private _MainTokenUsed;

    MainContractInterface public MainContract;
   
    constructor(address _mainContractAddress) ERC721A("EnchantedApesClub", "EAC") {        
        setMainContract(_mainContractAddress);        
    }

   function setMainContract(address _mainContractAddress) public onlyOwner {
        MainContract = MainContractInterface(_mainContractAddress);
    }
   
    
    function claim(uint256[] memory _tokensId) public {
        
	    require(claimingOn, "Claiming not active");

        for (uint256 i = 0; i < _tokensId.length; i++) {
            require(canClaim(_tokensId[i]), "Already claimed");
            require(MainContract.ownerOf(_tokensId[i]) == _msgSender(), "Bad owner!");
            _MainTokenUsed[_tokensId[i]] = true;            
        }
        _mint(msg.sender, _tokensId.length);
    }
    function canClaim(uint256 _tokenId) public view returns(bool) {
        return _MainTokenUsed[_tokenId] == false;
    }

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

   function toggleClaiming() public onlyOwner {
        claimingOn= !claimingOn;
    }
 
    function devMintForHolder (address _holderWalletAddress,uint256[] memory _tokensId) external onlyOwner {         
        for (uint256 i = 0; i < _tokensId.length; i++) {
            require(canClaim(_tokensId[i]), "Already claimed"); 
            require(MainContract.ownerOf(_tokensId[i]) == _holderWalletAddress, "Bad owner!");           
            _MainTokenUsed[_tokensId[i]] = true;            
        }
        _mint(_holderWalletAddress, _tokensId.length);                
    }

}

File 2 of 14 : ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import '../ERC721A.sol';

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

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

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

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

File 3 of 14 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';

/**
 * @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 Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    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();
        }
    }

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual 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, tokenId.toString())) : '';
    }

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev 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.isContract()) 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 && !_ownerships[tokenId].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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

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

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

    /**
     * @dev 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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

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

            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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

File 4 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 5 of 14 : IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '../IERC721A.sol';

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

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

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

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

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

File 6 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 7 of 14 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

File 8 of 14 : 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 9 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 10 of 14 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 14 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * 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();

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

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

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

File 12 of 14 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 13 of 14 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 14 of 14 : 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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_mainContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MainContract","outputs":[{"internalType":"contract MainContractInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokensId","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimingOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holderWalletAddress","type":"address"},{"internalType":"uint256[]","name":"_tokensId","type":"uint256[]"}],"name":"devMintForHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mainContractAddress","type":"address"}],"name":"setMainContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleClaiming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040516200461a3803806200461a83398181016040528101906200005291906200037e565b6040518060400160405280601181526020017f456e6368616e74656441706573436c75620000000000000000000000000000008152506040518060400160405280600381526020017f45414300000000000000000000000000000000000000000000000000000000008152508160029081620000cf91906200062a565b508060039081620000e191906200062a565b50620000f26200013260201b60201c565b60008190555050506200011a6200010e6200013760201b60201c565b6200013f60201b60201c565b6200012b816200020560201b60201c565b5062000794565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002156200025960201b60201c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620002696200013760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200028f620002ea60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002df9062000772565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003468262000319565b9050919050565b620003588162000339565b81146200036457600080fd5b50565b60008151905062000378816200034d565b92915050565b60006020828403121562000397576200039662000314565b5b6000620003a78482850162000367565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200043257607f821691505b602082108103620004485762000447620003ea565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004b27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000473565b620004be868362000473565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200050b62000505620004ff84620004d6565b620004e0565b620004d6565b9050919050565b6000819050919050565b6200052783620004ea565b6200053f620005368262000512565b84845462000480565b825550505050565b600090565b6200055662000547565b620005638184846200051c565b505050565b5b818110156200058b576200057f6000826200054c565b60018101905062000569565b5050565b601f821115620005da57620005a4816200044e565b620005af8462000463565b81016020851015620005bf578190505b620005d7620005ce8562000463565b83018262000568565b50505b505050565b600082821c905092915050565b6000620005ff60001984600802620005df565b1980831691505092915050565b60006200061a8383620005ec565b9150826002028217905092915050565b6200063582620003b0565b67ffffffffffffffff811115620006515762000650620003bb565b5b6200065d825462000419565b6200066a8282856200058f565b600060209050601f831160018114620006a257600084156200068d578287015190505b6200069985826200060c565b86555062000709565b601f198416620006b2866200044e565b60005b82811015620006dc57848901518255600182019150602085019450602081019050620006b5565b86831015620006fc5784890151620006f8601f891682620005ec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200075a60208362000711565b9150620007678262000722565b602082019050919050565b600060208201905081810360008301526200078d816200074b565b9050919050565b613e7680620007a46000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd14610518578063c95c0d8914610548578063e985e9c514610578578063f2fde38b146105a8576101cf565b8063a22cb46514610492578063b516cf2e146104ae578063b88d4fde146104cc578063c23dc68f146104e8576101cf565b8063893856a5116100de578063893856a51461040a5780638da5cb5b1461042657806395d89b411461044457806399a2557a14610462576101cf565b8063715018a6146103c65780638010fc45146103d05780638462151c146103da576101cf565b80633ded33bc116101715780635bbb21771161014b5780635bbb21771461031a5780636352211e1461034a5780636ba4c1381461037a57806370a0823114610396576101cf565b80633ded33bc146102c657806342842e0e146102e257806355f804b3146102fe576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c5780632959258f146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190612b3c565b6105c4565b6040516101fb9190612b84565b60405180910390f35b61020c6106a6565b6040516102199190612c2f565b60405180910390f35b61023c60048036038101906102379190612c87565b610738565b6040516102499190612cf5565b60405180910390f35b61026c60048036038101906102679190612d3c565b6107b4565b005b6102766108b8565b6040516102839190612d8b565b60405180910390f35b6102a660048036038101906102a19190612da6565b6108cf565b005b6102b06108df565b6040516102bd9190612b84565b60405180910390f35b6102e060048036038101906102db9190612df9565b6108f2565b005b6102fc60048036038101906102f79190612da6565b61093e565b005b61031860048036038101906103139190612e8b565b61095e565b005b610334600480360381019061032f9190613016565b61097c565b6040516103419190613191565b60405180910390f35b610364600480360381019061035f9190612c87565b610a3d565b6040516103719190612cf5565b60405180910390f35b610394600480360381019061038f9190613016565b610a53565b005b6103b060048036038101906103ab9190612df9565b610ca2565b6040516103bd9190612d8b565b60405180910390f35b6103ce610d71565b005b6103d8610d85565b005b6103f460048036038101906103ef9190612df9565b610db9565b6040516104019190613271565b60405180910390f35b610424600480360381019061041f9190613293565b610fb4565b005b61042e6111b6565b60405161043b9190612cf5565b60405180910390f35b61044c6111e0565b6040516104599190612c2f565b60405180910390f35b61047c600480360381019061047791906132ef565b611272565b6040516104899190613271565b60405180910390f35b6104ac60048036038101906104a7919061336e565b611531565b005b6104b66116a8565b6040516104c3919061340d565b60405180910390f35b6104e660048036038101906104e191906134dd565b6116ce565b005b61050260048036038101906104fd9190612c87565b611746565b60405161050f91906135a2565b60405180910390f35b610532600480360381019061052d9190612c87565b611863565b60405161053f9190612c2f565b60405180910390f35b610562600480360381019061055d9190612c87565b611901565b60405161056f9190612b84565b60405180910390f35b610592600480360381019061058d91906135bd565b611931565b60405161059f9190612b84565b60405180910390f35b6105c260048036038101906105bd9190612df9565b6119c5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061069f575061069e82611a48565b5b9050919050565b6060600280546106b59061362c565b80601f01602080910402602001604051908101604052809291908181526020018280546106e19061362c565b801561072e5780601f106107035761010080835404028352916020019161072e565b820191906000526020600020905b81548152906001019060200180831161071157829003601f168201915b5050505050905090565b600061074382611ab2565b610779576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107bf82610a3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610826576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610845611b00565b73ffffffffffffffffffffffffffffffffffffffff16146108a8576108718161086c611b00565b611931565b6108a7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6108b3838383611b08565b505050565b60006108c2611bba565b6001546000540303905090565b6108da838383611bbf565b505050565b600a60009054906101000a900460ff1681565b6108fa612073565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610959838383604051806020016040528060008152506116ce565b505050565b610966612073565b81816009918261097792919061380a565b505050565b606060008251905060008167ffffffffffffffff8111156109a05761099f612ed8565b5b6040519080825280602002602001820160405280156109d957816020015b6109c6612a8d565b8152602001906001900390816109be5790505b50905060005b828114610a3257610a098582815181106109fc576109fb6138da565b5b6020026020010151611746565b828281518110610a1c57610a1b6138da565b5b60200260200101819052508060010190506109df565b508092505050919050565b6000610a48826120f1565b600001519050919050565b600a60009054906101000a900460ff16610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9990613955565b60405180910390fd5b60005b8151811015610c9357610ad1828281518110610ac457610ac36138da565b5b6020026020010151611901565b610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b07906139c1565b60405180910390fd5b610b18611b00565b73ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610b7f57610b7e6138da565b5b60200260200101516040518263ffffffff1660e01b8152600401610ba39190612d8b565b602060405180830381865afa158015610bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be491906139f6565b73ffffffffffffffffffffffffffffffffffffffff1614610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3190613a6f565b60405180910390fd5b6001600b6000848481518110610c5357610c526138da565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610c8b90613abe565b915050610aa5565b50610c9f33825161237c565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d09576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d79612073565b610d836000612656565b565b610d8d612073565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b60606000806000610dc985610ca2565b905060008167ffffffffffffffff811115610de757610de6612ed8565b5b604051908082528060200260200182016040528015610e155781602001602082028036833780820191505090505b509050610e20612a8d565b6000610e2a611bba565b90505b838614610fa657600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505091508160400151610f9b57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614610f4057816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f9a5780838780600101985081518110610f8d57610f8c6138da565b5b6020026020010181815250505b5b806001019050610e2d565b508195505050505050919050565b610fbc612073565b60005b81518110156111a657610feb828281518110610fde57610fdd6138da565b5b6020026020010151611901565b61102a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611021906139c1565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110611092576110916138da565b5b60200260200101516040518263ffffffff1660e01b81526004016110b69190612d8b565b602060405180830381865afa1580156110d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f791906139f6565b73ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613a6f565b60405180910390fd5b6001600b6000848481518110611166576111656138da565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061119e90613abe565b915050610fbf565b506111b282825161237c565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111ef9061362c565b80601f016020809104026020016040519081016040528092919081815260200182805461121b9061362c565b80156112685780601f1061123d57610100808354040283529160200191611268565b820191906000526020600020905b81548152906001019060200180831161124b57829003601f168201915b5050505050905090565b60608183106112ad576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060005490506112bd611bba565b8510156112cf576112cc611bba565b94505b808411156112db578093505b60006112e687610ca2565b905084861015611309576000868603905081811015611303578091505b5061130e565b600090505b60008167ffffffffffffffff81111561132a57611329612ed8565b5b6040519080825280602002602001820160405280156113585781602001602082028036833780820191505090505b5090506000820361136f578094505050505061152a565b600061137a88611746565b90506000816040015161138f57816000015190505b60008990505b8881141580156113a55750848714155b1561151c57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015161151157600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146114b657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115105780848880600101995081518110611503576115026138da565b5b6020026020010181815250505b5b806001019050611395565b508583528296505050505050505b9392505050565b611539611b00565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361159d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115aa611b00565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611657611b00565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169c9190612b84565b60405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116d9848484611bbf565b6116f88373ffffffffffffffffffffffffffffffffffffffff1661271c565b15611740576117098484848461273f565b61173f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61174e612a8d565b611756612a8d565b61175e611bba565b83108061176d57506000548310155b1561177b578091505061185e565b600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611851578091505061185e565b61185a836120f1565b9150505b919050565b606061186e82611ab2565b6118a4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118ae61288f565b905060008151036118ce57604051806020016040528060008152506118f9565b806118d884612921565b6040516020016118e9929190613b42565b6040516020818303038152906040525b915050919050565b6000801515600b600084815260200190815260200160002060009054906101000a900460ff161515149050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119cd612073565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3390613bd8565b60405180910390fd5b611a4581612656565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611abd611bba565b11158015611acc575060005482105b8015611af9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611bca826120f1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c35576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611c56611b00565b73ffffffffffffffffffffffffffffffffffffffff161480611c855750611c8485611c7f611b00565b611931565b5b80611cca5750611c93611b00565b73ffffffffffffffffffffffffffffffffffffffff16611cb284610738565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d03576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d69576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d768585856001612a81565b611d8260008487611b08565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361200157600054821461200057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461206c8585856001612a87565b5050505050565b61207b611b00565b73ffffffffffffffffffffffffffffffffffffffff166120996111b6565b73ffffffffffffffffffffffffffffffffffffffff16146120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690613c44565b60405180910390fd5b565b6120f9612a8d565b600082905080612107611bba565b1161234557600054811015612344576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161234257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612226578092505050612377565b5b60011561234157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461233c578092505050612377565b612227565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612422576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61242f6000848385612a81565b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106125d2578160008190555050506126516000848385612a87565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612765611b00565b8786866040518563ffffffff1660e01b81526004016127879493929190613cb9565b6020604051808303816000875af19250505080156127c357506040513d601f19601f820116820180604052508101906127c09190613d1a565b60015b61283c573d80600081146127f3576040519150601f19603f3d011682016040523d82523d6000602084013e6127f8565b606091505b506000815103612834576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461289e9061362c565b80601f01602080910402602001604051908101604052809291908181526020018280546128ca9061362c565b80156129175780601f106128ec57610100808354040283529160200191612917565b820191906000526020600020905b8154815290600101906020018083116128fa57829003601f168201915b5050505050905090565b606060008203612968576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a7c565b600082905060005b6000821461299a57808061298390613abe565b915050600a826129939190613d76565b9150612970565b60008167ffffffffffffffff8111156129b6576129b5612ed8565b5b6040519080825280601f01601f1916602001820160405280156129e85781602001600182028036833780820191505090505b5090505b60008514612a7557600182612a019190613da7565b9150600a85612a109190613ddb565b6030612a1c9190613e0c565b60f81b818381518110612a3257612a316138da565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a6e9190613d76565b94506129ec565b8093505050505b919050565b50505050565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b1981612ae4565b8114612b2457600080fd5b50565b600081359050612b3681612b10565b92915050565b600060208284031215612b5257612b51612ada565b5b6000612b6084828501612b27565b91505092915050565b60008115159050919050565b612b7e81612b69565b82525050565b6000602082019050612b996000830184612b75565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bd9578082015181840152602081019050612bbe565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c0182612b9f565b612c0b8185612baa565b9350612c1b818560208601612bbb565b612c2481612be5565b840191505092915050565b60006020820190508181036000830152612c498184612bf6565b905092915050565b6000819050919050565b612c6481612c51565b8114612c6f57600080fd5b50565b600081359050612c8181612c5b565b92915050565b600060208284031215612c9d57612c9c612ada565b5b6000612cab84828501612c72565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cdf82612cb4565b9050919050565b612cef81612cd4565b82525050565b6000602082019050612d0a6000830184612ce6565b92915050565b612d1981612cd4565b8114612d2457600080fd5b50565b600081359050612d3681612d10565b92915050565b60008060408385031215612d5357612d52612ada565b5b6000612d6185828601612d27565b9250506020612d7285828601612c72565b9150509250929050565b612d8581612c51565b82525050565b6000602082019050612da06000830184612d7c565b92915050565b600080600060608486031215612dbf57612dbe612ada565b5b6000612dcd86828701612d27565b9350506020612dde86828701612d27565b9250506040612def86828701612c72565b9150509250925092565b600060208284031215612e0f57612e0e612ada565b5b6000612e1d84828501612d27565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612e4b57612e4a612e26565b5b8235905067ffffffffffffffff811115612e6857612e67612e2b565b5b602083019150836001820283011115612e8457612e83612e30565b5b9250929050565b60008060208385031215612ea257612ea1612ada565b5b600083013567ffffffffffffffff811115612ec057612ebf612adf565b5b612ecc85828601612e35565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f1082612be5565b810181811067ffffffffffffffff82111715612f2f57612f2e612ed8565b5b80604052505050565b6000612f42612ad0565b9050612f4e8282612f07565b919050565b600067ffffffffffffffff821115612f6e57612f6d612ed8565b5b602082029050602081019050919050565b6000612f92612f8d84612f53565b612f38565b90508083825260208201905060208402830185811115612fb557612fb4612e30565b5b835b81811015612fde5780612fca8882612c72565b845260208401935050602081019050612fb7565b5050509392505050565b600082601f830112612ffd57612ffc612e26565b5b813561300d848260208601612f7f565b91505092915050565b60006020828403121561302c5761302b612ada565b5b600082013567ffffffffffffffff81111561304a57613049612adf565b5b61305684828501612fe8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61309481612cd4565b82525050565b600067ffffffffffffffff82169050919050565b6130b78161309a565b82525050565b6130c681612b69565b82525050565b6060820160008201516130e2600085018261308b565b5060208201516130f560208501826130ae565b50604082015161310860408501826130bd565b50505050565b600061311a83836130cc565b60608301905092915050565b6000602082019050919050565b600061313e8261305f565b613148818561306a565b93506131538361307b565b8060005b8381101561318457815161316b888261310e565b975061317683613126565b925050600181019050613157565b5085935050505092915050565b600060208201905081810360008301526131ab8184613133565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6131e881612c51565b82525050565b60006131fa83836131df565b60208301905092915050565b6000602082019050919050565b600061321e826131b3565b61322881856131be565b9350613233836131cf565b8060005b8381101561326457815161324b88826131ee565b975061325683613206565b925050600181019050613237565b5085935050505092915050565b6000602082019050818103600083015261328b8184613213565b905092915050565b600080604083850312156132aa576132a9612ada565b5b60006132b885828601612d27565b925050602083013567ffffffffffffffff8111156132d9576132d8612adf565b5b6132e585828601612fe8565b9150509250929050565b60008060006060848603121561330857613307612ada565b5b600061331686828701612d27565b935050602061332786828701612c72565b925050604061333886828701612c72565b9150509250925092565b61334b81612b69565b811461335657600080fd5b50565b60008135905061336881613342565b92915050565b6000806040838503121561338557613384612ada565b5b600061339385828601612d27565b92505060206133a485828601613359565b9150509250929050565b6000819050919050565b60006133d36133ce6133c984612cb4565b6133ae565b612cb4565b9050919050565b60006133e5826133b8565b9050919050565b60006133f7826133da565b9050919050565b613407816133ec565b82525050565b600060208201905061342260008301846133fe565b92915050565b600080fd5b600067ffffffffffffffff82111561344857613447612ed8565b5b61345182612be5565b9050602081019050919050565b82818337600083830152505050565b600061348061347b8461342d565b612f38565b90508281526020810184848401111561349c5761349b613428565b5b6134a784828561345e565b509392505050565b600082601f8301126134c4576134c3612e26565b5b81356134d484826020860161346d565b91505092915050565b600080600080608085870312156134f7576134f6612ada565b5b600061350587828801612d27565b945050602061351687828801612d27565b935050604061352787828801612c72565b925050606085013567ffffffffffffffff81111561354857613547612adf565b5b613554878288016134af565b91505092959194509250565b606082016000820151613576600085018261308b565b50602082015161358960208501826130ae565b50604082015161359c60408501826130bd565b50505050565b60006060820190506135b76000830184613560565b92915050565b600080604083850312156135d4576135d3612ada565b5b60006135e285828601612d27565b92505060206135f385828601612d27565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061364457607f821691505b602082108103613657576136566135fd565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261368d565b6136d4868361368d565b95508019841693508086168417925050509392505050565b60006137076137026136fd84612c51565b6133ae565b612c51565b9050919050565b6000819050919050565b613721836136ec565b61373561372d8261370e565b84845461369a565b825550505050565b600090565b61374a61373d565b613755818484613718565b505050565b5b818110156137795761376e600082613742565b60018101905061375b565b5050565b601f8211156137be5761378f81613668565b6137988461367d565b810160208510156137a7578190505b6137bb6137b38561367d565b83018261375a565b50505b505050565b600082821c905092915050565b60006137e1600019846008026137c3565b1980831691505092915050565b60006137fa83836137d0565b9150826002028217905092915050565b613814838361365d565b67ffffffffffffffff81111561382d5761382c612ed8565b5b613837825461362c565b61384282828561377d565b6000601f831160018114613871576000841561385f578287013590505b61386985826137ee565b8655506138d1565b601f19841661387f86613668565b60005b828110156138a757848901358255600182019150602085019450602081019050613882565b868310156138c457848901356138c0601f8916826137d0565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f436c61696d696e67206e6f742061637469766500000000000000000000000000600082015250565b600061393f601383612baa565b915061394a82613909565b602082019050919050565b6000602082019050818103600083015261396e81613932565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b60006139ab600f83612baa565b91506139b682613975565b602082019050919050565b600060208201905081810360008301526139da8161399e565b9050919050565b6000815190506139f081612d10565b92915050565b600060208284031215613a0c57613a0b612ada565b5b6000613a1a848285016139e1565b91505092915050565b7f426164206f776e65722100000000000000000000000000000000000000000000600082015250565b6000613a59600a83612baa565b9150613a6482613a23565b602082019050919050565b60006020820190508181036000830152613a8881613a4c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ac982612c51565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613afb57613afa613a8f565b5b600182019050919050565b600081905092915050565b6000613b1c82612b9f565b613b268185613b06565b9350613b36818560208601612bbb565b80840191505092915050565b6000613b4e8285613b11565b9150613b5a8284613b11565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bc2602683612baa565b9150613bcd82613b66565b604082019050919050565b60006020820190508181036000830152613bf181613bb5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c2e602083612baa565b9150613c3982613bf8565b602082019050919050565b60006020820190508181036000830152613c5d81613c21565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c8b82613c64565b613c958185613c6f565b9350613ca5818560208601612bbb565b613cae81612be5565b840191505092915050565b6000608082019050613cce6000830187612ce6565b613cdb6020830186612ce6565b613ce86040830185612d7c565b8181036060830152613cfa8184613c80565b905095945050505050565b600081519050613d1481612b10565b92915050565b600060208284031215613d3057613d2f612ada565b5b6000613d3e84828501613d05565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d8182612c51565b9150613d8c83612c51565b925082613d9c57613d9b613d47565b5b828204905092915050565b6000613db282612c51565b9150613dbd83612c51565b9250828203905081811115613dd557613dd4613a8f565b5b92915050565b6000613de682612c51565b9150613df183612c51565b925082613e0157613e00613d47565b5b828206905092915050565b6000613e1782612c51565b9150613e2283612c51565b9250828201905080821115613e3a57613e39613a8f565b5b9291505056fea26469706673582212203353735c341b8c32412a656deb2ac796bbc10c27d8f7cee0d8655b23e0fad28964736f6c6343000811003300000000000000000000000052daa968dc4c5f49a0e97c960fbbf79ba6bcd992

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd14610518578063c95c0d8914610548578063e985e9c514610578578063f2fde38b146105a8576101cf565b8063a22cb46514610492578063b516cf2e146104ae578063b88d4fde146104cc578063c23dc68f146104e8576101cf565b8063893856a5116100de578063893856a51461040a5780638da5cb5b1461042657806395d89b411461044457806399a2557a14610462576101cf565b8063715018a6146103c65780638010fc45146103d05780638462151c146103da576101cf565b80633ded33bc116101715780635bbb21771161014b5780635bbb21771461031a5780636352211e1461034a5780636ba4c1381461037a57806370a0823114610396576101cf565b80633ded33bc146102c657806342842e0e146102e257806355f804b3146102fe576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c5780632959258f146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190612b3c565b6105c4565b6040516101fb9190612b84565b60405180910390f35b61020c6106a6565b6040516102199190612c2f565b60405180910390f35b61023c60048036038101906102379190612c87565b610738565b6040516102499190612cf5565b60405180910390f35b61026c60048036038101906102679190612d3c565b6107b4565b005b6102766108b8565b6040516102839190612d8b565b60405180910390f35b6102a660048036038101906102a19190612da6565b6108cf565b005b6102b06108df565b6040516102bd9190612b84565b60405180910390f35b6102e060048036038101906102db9190612df9565b6108f2565b005b6102fc60048036038101906102f79190612da6565b61093e565b005b61031860048036038101906103139190612e8b565b61095e565b005b610334600480360381019061032f9190613016565b61097c565b6040516103419190613191565b60405180910390f35b610364600480360381019061035f9190612c87565b610a3d565b6040516103719190612cf5565b60405180910390f35b610394600480360381019061038f9190613016565b610a53565b005b6103b060048036038101906103ab9190612df9565b610ca2565b6040516103bd9190612d8b565b60405180910390f35b6103ce610d71565b005b6103d8610d85565b005b6103f460048036038101906103ef9190612df9565b610db9565b6040516104019190613271565b60405180910390f35b610424600480360381019061041f9190613293565b610fb4565b005b61042e6111b6565b60405161043b9190612cf5565b60405180910390f35b61044c6111e0565b6040516104599190612c2f565b60405180910390f35b61047c600480360381019061047791906132ef565b611272565b6040516104899190613271565b60405180910390f35b6104ac60048036038101906104a7919061336e565b611531565b005b6104b66116a8565b6040516104c3919061340d565b60405180910390f35b6104e660048036038101906104e191906134dd565b6116ce565b005b61050260048036038101906104fd9190612c87565b611746565b60405161050f91906135a2565b60405180910390f35b610532600480360381019061052d9190612c87565b611863565b60405161053f9190612c2f565b60405180910390f35b610562600480360381019061055d9190612c87565b611901565b60405161056f9190612b84565b60405180910390f35b610592600480360381019061058d91906135bd565b611931565b60405161059f9190612b84565b60405180910390f35b6105c260048036038101906105bd9190612df9565b6119c5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061069f575061069e82611a48565b5b9050919050565b6060600280546106b59061362c565b80601f01602080910402602001604051908101604052809291908181526020018280546106e19061362c565b801561072e5780601f106107035761010080835404028352916020019161072e565b820191906000526020600020905b81548152906001019060200180831161071157829003601f168201915b5050505050905090565b600061074382611ab2565b610779576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107bf82610a3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610826576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610845611b00565b73ffffffffffffffffffffffffffffffffffffffff16146108a8576108718161086c611b00565b611931565b6108a7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6108b3838383611b08565b505050565b60006108c2611bba565b6001546000540303905090565b6108da838383611bbf565b505050565b600a60009054906101000a900460ff1681565b6108fa612073565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610959838383604051806020016040528060008152506116ce565b505050565b610966612073565b81816009918261097792919061380a565b505050565b606060008251905060008167ffffffffffffffff8111156109a05761099f612ed8565b5b6040519080825280602002602001820160405280156109d957816020015b6109c6612a8d565b8152602001906001900390816109be5790505b50905060005b828114610a3257610a098582815181106109fc576109fb6138da565b5b6020026020010151611746565b828281518110610a1c57610a1b6138da565b5b60200260200101819052508060010190506109df565b508092505050919050565b6000610a48826120f1565b600001519050919050565b600a60009054906101000a900460ff16610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9990613955565b60405180910390fd5b60005b8151811015610c9357610ad1828281518110610ac457610ac36138da565b5b6020026020010151611901565b610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b07906139c1565b60405180910390fd5b610b18611b00565b73ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610b7f57610b7e6138da565b5b60200260200101516040518263ffffffff1660e01b8152600401610ba39190612d8b565b602060405180830381865afa158015610bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be491906139f6565b73ffffffffffffffffffffffffffffffffffffffff1614610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3190613a6f565b60405180910390fd5b6001600b6000848481518110610c5357610c526138da565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610c8b90613abe565b915050610aa5565b50610c9f33825161237c565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d09576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d79612073565b610d836000612656565b565b610d8d612073565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b60606000806000610dc985610ca2565b905060008167ffffffffffffffff811115610de757610de6612ed8565b5b604051908082528060200260200182016040528015610e155781602001602082028036833780820191505090505b509050610e20612a8d565b6000610e2a611bba565b90505b838614610fa657600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505091508160400151610f9b57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614610f4057816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f9a5780838780600101985081518110610f8d57610f8c6138da565b5b6020026020010181815250505b5b806001019050610e2d565b508195505050505050919050565b610fbc612073565b60005b81518110156111a657610feb828281518110610fde57610fdd6138da565b5b6020026020010151611901565b61102a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611021906139c1565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110611092576110916138da565b5b60200260200101516040518263ffffffff1660e01b81526004016110b69190612d8b565b602060405180830381865afa1580156110d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f791906139f6565b73ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613a6f565b60405180910390fd5b6001600b6000848481518110611166576111656138da565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061119e90613abe565b915050610fbf565b506111b282825161237c565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111ef9061362c565b80601f016020809104026020016040519081016040528092919081815260200182805461121b9061362c565b80156112685780601f1061123d57610100808354040283529160200191611268565b820191906000526020600020905b81548152906001019060200180831161124b57829003601f168201915b5050505050905090565b60608183106112ad576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060005490506112bd611bba565b8510156112cf576112cc611bba565b94505b808411156112db578093505b60006112e687610ca2565b905084861015611309576000868603905081811015611303578091505b5061130e565b600090505b60008167ffffffffffffffff81111561132a57611329612ed8565b5b6040519080825280602002602001820160405280156113585781602001602082028036833780820191505090505b5090506000820361136f578094505050505061152a565b600061137a88611746565b90506000816040015161138f57816000015190505b60008990505b8881141580156113a55750848714155b1561151c57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015161151157600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146114b657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115105780848880600101995081518110611503576115026138da565b5b6020026020010181815250505b5b806001019050611395565b508583528296505050505050505b9392505050565b611539611b00565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361159d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115aa611b00565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611657611b00565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169c9190612b84565b60405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116d9848484611bbf565b6116f88373ffffffffffffffffffffffffffffffffffffffff1661271c565b15611740576117098484848461273f565b61173f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61174e612a8d565b611756612a8d565b61175e611bba565b83108061176d57506000548310155b1561177b578091505061185e565b600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611851578091505061185e565b61185a836120f1565b9150505b919050565b606061186e82611ab2565b6118a4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118ae61288f565b905060008151036118ce57604051806020016040528060008152506118f9565b806118d884612921565b6040516020016118e9929190613b42565b6040516020818303038152906040525b915050919050565b6000801515600b600084815260200190815260200160002060009054906101000a900460ff161515149050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119cd612073565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3390613bd8565b60405180910390fd5b611a4581612656565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611abd611bba565b11158015611acc575060005482105b8015611af9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611bca826120f1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c35576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611c56611b00565b73ffffffffffffffffffffffffffffffffffffffff161480611c855750611c8485611c7f611b00565b611931565b5b80611cca5750611c93611b00565b73ffffffffffffffffffffffffffffffffffffffff16611cb284610738565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d03576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d69576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d768585856001612a81565b611d8260008487611b08565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361200157600054821461200057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461206c8585856001612a87565b5050505050565b61207b611b00565b73ffffffffffffffffffffffffffffffffffffffff166120996111b6565b73ffffffffffffffffffffffffffffffffffffffff16146120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690613c44565b60405180910390fd5b565b6120f9612a8d565b600082905080612107611bba565b1161234557600054811015612344576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161234257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612226578092505050612377565b5b60011561234157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461233c578092505050612377565b612227565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612422576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61242f6000848385612a81565b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106125d2578160008190555050506126516000848385612a87565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612765611b00565b8786866040518563ffffffff1660e01b81526004016127879493929190613cb9565b6020604051808303816000875af19250505080156127c357506040513d601f19601f820116820180604052508101906127c09190613d1a565b60015b61283c573d80600081146127f3576040519150601f19603f3d011682016040523d82523d6000602084013e6127f8565b606091505b506000815103612834576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461289e9061362c565b80601f01602080910402602001604051908101604052809291908181526020018280546128ca9061362c565b80156129175780601f106128ec57610100808354040283529160200191612917565b820191906000526020600020905b8154815290600101906020018083116128fa57829003601f168201915b5050505050905090565b606060008203612968576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a7c565b600082905060005b6000821461299a57808061298390613abe565b915050600a826129939190613d76565b9150612970565b60008167ffffffffffffffff8111156129b6576129b5612ed8565b5b6040519080825280601f01601f1916602001820160405280156129e85781602001600182028036833780820191505090505b5090505b60008514612a7557600182612a019190613da7565b9150600a85612a109190613ddb565b6030612a1c9190613e0c565b60f81b818381518110612a3257612a316138da565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a6e9190613d76565b94506129ec565b8093505050505b919050565b50505050565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b1981612ae4565b8114612b2457600080fd5b50565b600081359050612b3681612b10565b92915050565b600060208284031215612b5257612b51612ada565b5b6000612b6084828501612b27565b91505092915050565b60008115159050919050565b612b7e81612b69565b82525050565b6000602082019050612b996000830184612b75565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bd9578082015181840152602081019050612bbe565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c0182612b9f565b612c0b8185612baa565b9350612c1b818560208601612bbb565b612c2481612be5565b840191505092915050565b60006020820190508181036000830152612c498184612bf6565b905092915050565b6000819050919050565b612c6481612c51565b8114612c6f57600080fd5b50565b600081359050612c8181612c5b565b92915050565b600060208284031215612c9d57612c9c612ada565b5b6000612cab84828501612c72565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cdf82612cb4565b9050919050565b612cef81612cd4565b82525050565b6000602082019050612d0a6000830184612ce6565b92915050565b612d1981612cd4565b8114612d2457600080fd5b50565b600081359050612d3681612d10565b92915050565b60008060408385031215612d5357612d52612ada565b5b6000612d6185828601612d27565b9250506020612d7285828601612c72565b9150509250929050565b612d8581612c51565b82525050565b6000602082019050612da06000830184612d7c565b92915050565b600080600060608486031215612dbf57612dbe612ada565b5b6000612dcd86828701612d27565b9350506020612dde86828701612d27565b9250506040612def86828701612c72565b9150509250925092565b600060208284031215612e0f57612e0e612ada565b5b6000612e1d84828501612d27565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612e4b57612e4a612e26565b5b8235905067ffffffffffffffff811115612e6857612e67612e2b565b5b602083019150836001820283011115612e8457612e83612e30565b5b9250929050565b60008060208385031215612ea257612ea1612ada565b5b600083013567ffffffffffffffff811115612ec057612ebf612adf565b5b612ecc85828601612e35565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f1082612be5565b810181811067ffffffffffffffff82111715612f2f57612f2e612ed8565b5b80604052505050565b6000612f42612ad0565b9050612f4e8282612f07565b919050565b600067ffffffffffffffff821115612f6e57612f6d612ed8565b5b602082029050602081019050919050565b6000612f92612f8d84612f53565b612f38565b90508083825260208201905060208402830185811115612fb557612fb4612e30565b5b835b81811015612fde5780612fca8882612c72565b845260208401935050602081019050612fb7565b5050509392505050565b600082601f830112612ffd57612ffc612e26565b5b813561300d848260208601612f7f565b91505092915050565b60006020828403121561302c5761302b612ada565b5b600082013567ffffffffffffffff81111561304a57613049612adf565b5b61305684828501612fe8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61309481612cd4565b82525050565b600067ffffffffffffffff82169050919050565b6130b78161309a565b82525050565b6130c681612b69565b82525050565b6060820160008201516130e2600085018261308b565b5060208201516130f560208501826130ae565b50604082015161310860408501826130bd565b50505050565b600061311a83836130cc565b60608301905092915050565b6000602082019050919050565b600061313e8261305f565b613148818561306a565b93506131538361307b565b8060005b8381101561318457815161316b888261310e565b975061317683613126565b925050600181019050613157565b5085935050505092915050565b600060208201905081810360008301526131ab8184613133565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6131e881612c51565b82525050565b60006131fa83836131df565b60208301905092915050565b6000602082019050919050565b600061321e826131b3565b61322881856131be565b9350613233836131cf565b8060005b8381101561326457815161324b88826131ee565b975061325683613206565b925050600181019050613237565b5085935050505092915050565b6000602082019050818103600083015261328b8184613213565b905092915050565b600080604083850312156132aa576132a9612ada565b5b60006132b885828601612d27565b925050602083013567ffffffffffffffff8111156132d9576132d8612adf565b5b6132e585828601612fe8565b9150509250929050565b60008060006060848603121561330857613307612ada565b5b600061331686828701612d27565b935050602061332786828701612c72565b925050604061333886828701612c72565b9150509250925092565b61334b81612b69565b811461335657600080fd5b50565b60008135905061336881613342565b92915050565b6000806040838503121561338557613384612ada565b5b600061339385828601612d27565b92505060206133a485828601613359565b9150509250929050565b6000819050919050565b60006133d36133ce6133c984612cb4565b6133ae565b612cb4565b9050919050565b60006133e5826133b8565b9050919050565b60006133f7826133da565b9050919050565b613407816133ec565b82525050565b600060208201905061342260008301846133fe565b92915050565b600080fd5b600067ffffffffffffffff82111561344857613447612ed8565b5b61345182612be5565b9050602081019050919050565b82818337600083830152505050565b600061348061347b8461342d565b612f38565b90508281526020810184848401111561349c5761349b613428565b5b6134a784828561345e565b509392505050565b600082601f8301126134c4576134c3612e26565b5b81356134d484826020860161346d565b91505092915050565b600080600080608085870312156134f7576134f6612ada565b5b600061350587828801612d27565b945050602061351687828801612d27565b935050604061352787828801612c72565b925050606085013567ffffffffffffffff81111561354857613547612adf565b5b613554878288016134af565b91505092959194509250565b606082016000820151613576600085018261308b565b50602082015161358960208501826130ae565b50604082015161359c60408501826130bd565b50505050565b60006060820190506135b76000830184613560565b92915050565b600080604083850312156135d4576135d3612ada565b5b60006135e285828601612d27565b92505060206135f385828601612d27565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061364457607f821691505b602082108103613657576136566135fd565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261368d565b6136d4868361368d565b95508019841693508086168417925050509392505050565b60006137076137026136fd84612c51565b6133ae565b612c51565b9050919050565b6000819050919050565b613721836136ec565b61373561372d8261370e565b84845461369a565b825550505050565b600090565b61374a61373d565b613755818484613718565b505050565b5b818110156137795761376e600082613742565b60018101905061375b565b5050565b601f8211156137be5761378f81613668565b6137988461367d565b810160208510156137a7578190505b6137bb6137b38561367d565b83018261375a565b50505b505050565b600082821c905092915050565b60006137e1600019846008026137c3565b1980831691505092915050565b60006137fa83836137d0565b9150826002028217905092915050565b613814838361365d565b67ffffffffffffffff81111561382d5761382c612ed8565b5b613837825461362c565b61384282828561377d565b6000601f831160018114613871576000841561385f578287013590505b61386985826137ee565b8655506138d1565b601f19841661387f86613668565b60005b828110156138a757848901358255600182019150602085019450602081019050613882565b868310156138c457848901356138c0601f8916826137d0565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f436c61696d696e67206e6f742061637469766500000000000000000000000000600082015250565b600061393f601383612baa565b915061394a82613909565b602082019050919050565b6000602082019050818103600083015261396e81613932565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b60006139ab600f83612baa565b91506139b682613975565b602082019050919050565b600060208201905081810360008301526139da8161399e565b9050919050565b6000815190506139f081612d10565b92915050565b600060208284031215613a0c57613a0b612ada565b5b6000613a1a848285016139e1565b91505092915050565b7f426164206f776e65722100000000000000000000000000000000000000000000600082015250565b6000613a59600a83612baa565b9150613a6482613a23565b602082019050919050565b60006020820190508181036000830152613a8881613a4c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ac982612c51565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613afb57613afa613a8f565b5b600182019050919050565b600081905092915050565b6000613b1c82612b9f565b613b268185613b06565b9350613b36818560208601612bbb565b80840191505092915050565b6000613b4e8285613b11565b9150613b5a8284613b11565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bc2602683612baa565b9150613bcd82613b66565b604082019050919050565b60006020820190508181036000830152613bf181613bb5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c2e602083612baa565b9150613c3982613bf8565b602082019050919050565b60006020820190508181036000830152613c5d81613c21565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c8b82613c64565b613c958185613c6f565b9350613ca5818560208601612bbb565b613cae81612be5565b840191505092915050565b6000608082019050613cce6000830187612ce6565b613cdb6020830186612ce6565b613ce86040830185612d7c565b8181036060830152613cfa8184613c80565b905095945050505050565b600081519050613d1481612b10565b92915050565b600060208284031215613d3057613d2f612ada565b5b6000613d3e84828501613d05565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d8182612c51565b9150613d8c83612c51565b925082613d9c57613d9b613d47565b5b828204905092915050565b6000613db282612c51565b9150613dbd83612c51565b9250828203905081811115613dd557613dd4613a8f565b5b92915050565b6000613de682612c51565b9150613df183612c51565b925082613e0157613e00613d47565b5b828206905092915050565b6000613e1782612c51565b9150613e2283612c51565b9250828201905080821115613e3a57613e39613a8f565b5b9291505056fea26469706673582212203353735c341b8c32412a656deb2ac796bbc10c27d8f7cee0d8655b23e0fad28964736f6c63430008110033

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

00000000000000000000000052daa968dc4c5f49a0e97c960fbbf79ba6bcd992

-----Decoded View---------------
Arg [0] : _mainContractAddress (address): 0x52dAa968dc4c5F49A0e97C960FBBF79ba6BCD992

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000052daa968dc4c5f49a0e97c960fbbf79ba6bcd992


Deployed Bytecode Sourcemap

230:1995:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3147:305:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6262:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7766:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7328:372;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2387:312;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8631:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;339:30:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;644:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8872:185:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1517:106:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1548:468:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6070:125:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;810:450:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3516:206:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;:::i;:::-;;1630:85:13;;;:::i;:::-;;5362:891:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1724:496:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6431:104:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2406:2507:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8042:287:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;434:41:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9128:370:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;971:418:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6606:318:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1266:121:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8400:164:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3147:305:9;3249:4;3301:25;3286:40;;;:11;:40;;;;:105;;;;3358:33;3343:48;;;:11;:48;;;;3286:105;:158;;;;3408:36;3432:11;3408:23;:36::i;:::-;3286:158;3266:178;;3147:305;;;:::o;6262:100::-;6316:13;6349:5;6342:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6262:100;:::o;7766:204::-;7834:7;7859:16;7867:7;7859;:16::i;:::-;7854:64;;7884:34;;;;;;;;;;;;;;7854:64;7938:15;:24;7954:7;7938:24;;;;;;;;;;;;;;;;;;;;;7931:31;;7766:204;;;:::o;7328:372::-;7401:13;7417:24;7433:7;7417:15;:24::i;:::-;7401:40;;7462:5;7456:11;;:2;:11;;;7452:48;;7476:24;;;;;;;;;;;;;;7452:48;7533:5;7517:21;;:12;:10;:12::i;:::-;:21;;;7513:139;;7544:37;7561:5;7568:12;:10;:12::i;:::-;7544:16;:37::i;:::-;7540:112;;7605:35;;;;;;;;;;;;;;7540:112;7513:139;7664:28;7673:2;7677:7;7686:5;7664:8;:28::i;:::-;7390:310;7328:372;;:::o;2387:312::-;2440:7;2665:15;:13;:15::i;:::-;2650:12;;2634:13;;:28;:46;2627:53;;2387:312;:::o;8631:170::-;8765:28;8775:4;8781:2;8785:7;8765:9;:28::i;:::-;8631:170;;;:::o;339:30:13:-;;;;;;;;;;;;;:::o;644:149::-;1094:13:0;:11;:13::i;:::-;764:20:13::1;727:12;;:58;;;;;;;;;;;;;;;;;;644:149:::0;:::o;8872:185:9:-;9010:39;9027:4;9033:2;9037:7;9010:39;;;;;;;;;;;;:16;:39::i;:::-;8872:185;;;:::o;1517:106:13:-;1094:13:0;:11;:13::i;:::-;1608:7:13::1;;1592:13;:23;;;;;;;:::i;:::-;;1517:106:::0;;:::o;1548:468:10:-;1637:23;1698:22;1723:8;:15;1698:40;;1753:34;1811:14;1790:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1753:73;;1846:9;1841:125;1862:14;1857:1;:19;1841:125;;1918:32;1938:8;1947:1;1938:11;;;;;;;;:::i;:::-;;;;;;;;1918:19;:32::i;:::-;1902:10;1913:1;1902:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;1878:3;;;;;1841:125;;;;1987:10;1980:17;;;;1548:468;;;:::o;6070:125:9:-;6134:7;6161:21;6174:7;6161:12;:21::i;:::-;:26;;;6154:33;;6070:125;;;:::o;810:450:13:-;886:10;;;;;;;;;;;878:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;938:9;933:274;957:9;:16;953:1;:20;933:274;;;1003:22;1012:9;1022:1;1012:12;;;;;;;;:::i;:::-;;;;;;;;1003:8;:22::i;:::-;995:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1106:12;:10;:12::i;:::-;1068:50;;:12;;;;;;;;;;;:20;;;1089:9;1099:1;1089:12;;;;;;;;:::i;:::-;;;;;;;;1068:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;1060:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1179:4;1148:14;:28;1163:9;1173:1;1163:12;;;;;;;;:::i;:::-;;;;;;;;1148:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;975:3;;;;;:::i;:::-;;;;933:274;;;;1217:35;1223:10;1235:9;:16;1217:5;:35::i;:::-;810:450;:::o;3516:206:9:-;3580:7;3621:1;3604:19;;:5;:19;;;3600:60;;3632:28;;;;;;;;;;;;;;3600:60;3686:12;:19;3699:5;3686:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;3678:36;;3671:43;;3516:206;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1630:85:13:-;1094:13:0;:11;:13::i;:::-;1697:10:13::1;;;;;;;;;;;1696:11;1684:10;;:23;;;;;;;;;;;;;;;;;;1630:85::o:0;5362:891:10:-;5432:16;5486:19;5520:25;5560:22;5585:16;5595:5;5585:9;:16::i;:::-;5560:41;;5616:25;5658:14;5644:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:57;;5688:31;;:::i;:::-;5739:9;5751:15;:13;:15::i;:::-;5739:27;;5734:471;5783:14;5768:11;:29;5734:471;;5835:11;:14;5847:1;5835:14;;;;;;;;;;;5823:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5872:9;:16;;;5913:8;5868:73;5989:1;5963:28;;:9;:14;;;:28;;;5959:111;;6036:9;:14;;;6016:34;;5959:111;6113:5;6092:26;;:17;:26;;;6088:102;;6169:1;6143:8;6152:13;;;;;;6143:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6088:102;5734:471;5799:3;;;;;5734:471;;;;6226:8;6219:15;;;;;;;5362:891;;;:::o;1724:496:13:-;1094:13:0;:11;:13::i;:::-;1852:9:13::1;1847:294;1871:9;:16;1867:1;:20;1847:294;;;1917:22;1926:9;1936:1;1926:12;;;;;;;;:::i;:::-;;;;;;;;1917:8;:22::i;:::-;1909:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;2021:20;1983:58;;:12;;;;;;;;;;;:20;;;2004:9;2014:1;2004:12;;;;;;;;:::i;:::-;;;;;;;;1983:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;;1975:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;2113:4;2082:14;:28;2097:9;2107:1;2097:12;;;;;;;;:::i;:::-;;;;;;;;2082:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;1889:3;;;;;:::i;:::-;;;;1847:294;;;;2151:45;2157:20;2179:9;:16;2151:5;:45::i;:::-;1724:496:::0;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;6431:104:9:-;6487:13;6520:7;6513:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6431:104;:::o;2406:2507:10:-;2541:16;2608:4;2599:5;:13;2595:45;;2621:19;;;;;;;;;;;;;;2595:45;2655:19;2689:17;2709:13;;2689:33;;2808:15;:13;:15::i;:::-;2800:5;:23;2796:87;;;2852:15;:13;:15::i;:::-;2844:23;;2796:87;2963:9;2956:4;:16;2952:73;;;3000:9;2993:16;;2952:73;3039:25;3067:16;3077:5;3067:9;:16::i;:::-;3039:44;;3261:4;3253:5;:12;3249:278;;;3286:19;3315:5;3308:4;:12;3286:34;;3357:17;3343:11;:31;3339:111;;;3419:11;3399:31;;3339:111;3267:198;3249:278;;;3510:1;3490:21;;3249:278;3541:25;3583:17;3569:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3541:60;;3641:1;3620:17;:22;3616:78;;3670:8;3663:15;;;;;;;;3616:78;3838:31;3872:26;3892:5;3872:19;:26::i;:::-;3838:60;;3913:25;4158:9;:16;;;4153:92;;4215:9;:14;;;4195:34;;4153:92;4264:9;4276:5;4264:17;;4259:477;4288:4;4283:1;:9;;:45;;;;;4311:17;4296:11;:32;;4283:45;4259:477;;;4366:11;:14;4378:1;4366:14;;;;;;;;;;;4354:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4403:9;:16;;;4444:8;4399:73;4520:1;4494:28;;:9;:14;;;:28;;;4490:111;;4567:9;:14;;;4547:34;;4490:111;4644:5;4623:26;;:17;:26;;;4619:102;;4700:1;4674:8;4683:13;;;;;;4674:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4619:102;4259:477;4330:3;;;;;4259:477;;;;4838:11;4828:8;4821:29;4886:8;4879:15;;;;;;;;2406:2507;;;;;;:::o;8042:287:9:-;8153:12;:10;:12::i;:::-;8141:24;;:8;:24;;;8137:54;;8174:17;;;;;;;;;;;;;;8137:54;8249:8;8204:18;:32;8223:12;:10;:12::i;:::-;8204:32;;;;;;;;;;;;;;;:42;8237:8;8204:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;8302:8;8273:48;;8288:12;:10;:12::i;:::-;8273:48;;;8312:8;8273:48;;;;;;:::i;:::-;;;;;;;;8042:287;;:::o;434:41:13:-;;;;;;;;;;;;;:::o;9128:370:9:-;9295:28;9305:4;9311:2;9315:7;9295:9;:28::i;:::-;9338:15;:2;:13;;;:15::i;:::-;9334:157;;;9359:56;9390:4;9396:2;9400:7;9409:5;9359:30;:56::i;:::-;9355:136;;9439:40;;;;;;;;;;;;;;9355:136;9334:157;9128:370;;;;:::o;971:418:10:-;1047:21;;:::i;:::-;1081:31;;:::i;:::-;1137:15;:13;:15::i;:::-;1127:7;:25;:53;;;;1167:13;;1156:7;:24;;1127:53;1123:102;;;1204:9;1197:16;;;;;1123:102;1247:11;:20;1259:7;1247:20;;;;;;;;;;;1235:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1282:9;:16;;;1278:65;;;1322:9;1315:16;;;;;1278:65;1360:21;1373:7;1360:12;:21::i;:::-;1353:28;;;971:418;;;;:::o;6606:318:9:-;6679:13;6710:16;6718:7;6710;:16::i;:::-;6705:59;;6735:29;;;;;;;;;;;;;;6705:59;6777:21;6801:10;:8;:10::i;:::-;6777:34;;6854:1;6835:7;6829:21;:26;:87;;;;;;;;;;;;;;;;;6882:7;6891:18;:7;:16;:18::i;:::-;6865:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6829:87;6822:94;;;6606:318;;;:::o;1266:121:13:-;1322:4;1374:5;1346:33;;:14;:24;1361:8;1346:24;;;;;;;;;;;;;;;;;;;;;:33;;;1339:40;;1266:121;;;:::o;8400:164:9:-;8497:4;8521:18;:25;8540:5;8521:25;;;;;;;;;;;;;;;:35;8547:8;8521:35;;;;;;;;;;;;;;;;;;;;;;;;;8514:42;;8400:164;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;829:155:7:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9753:174:9:-;9810:4;9853:7;9834:15;:13;:15::i;:::-;:26;;:53;;;;;9874:13;;9864:7;:23;9834:53;:85;;;;;9892:11;:20;9904:7;9892:20;;;;;;;;;;;:27;;;;;;;;;;;;9891:28;9834:85;9827:92;;9753:174;;;:::o;640:96:5:-;693:7;719:10;712:17;;640:96;:::o;18975:196:9:-;19117:2;19090:15;:24;19106:7;19090:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19155:7;19151:2;19135:28;;19144:5;19135:28;;;;;;;;;;;;18975:196;;;:::o;2161:92::-;2217:7;2161:92;:::o;13923:2130::-;14038:35;14076:21;14089:7;14076:12;:21::i;:::-;14038:59;;14136:4;14114:26;;:13;:18;;;:26;;;14110:67;;14149:28;;;;;;;;;;;;;;14110:67;14190:22;14232:4;14216:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;14253:36;14270:4;14276:12;:10;:12::i;:::-;14253:16;:36::i;:::-;14216:73;:126;;;;14330:12;:10;:12::i;:::-;14306:36;;:20;14318:7;14306:11;:20::i;:::-;:36;;;14216:126;14190:153;;14361:17;14356:66;;14387:35;;;;;;;;;;;;;;14356:66;14451:1;14437:16;;:2;:16;;;14433:52;;14462:23;;;;;;;;;;;;;;14433:52;14498:43;14520:4;14526:2;14530:7;14539:1;14498:21;:43::i;:::-;14606:35;14623:1;14627:7;14636:4;14606:8;:35::i;:::-;14967:1;14937:12;:18;14950:4;14937:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15011:1;14983:12;:16;14996:2;14983:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15029:31;15063:11;:20;15075:7;15063:20;;;;;;;;;;;15029:54;;15114:2;15098:8;:13;;;:18;;;;;;;;;;;;;;;;;;15164:15;15131:8;:23;;;:49;;;;;;;;;;;;;;;;;;15432:19;15464:1;15454:7;:11;15432:33;;15480:31;15514:11;:24;15526:11;15514:24;;;;;;;;;;;15480:58;;15582:1;15557:27;;:8;:13;;;;;;;;;;;;:27;;;15553:384;;15767:13;;15752:11;:28;15748:174;;15821:4;15805:8;:13;;;:20;;;;;;;;;;;;;;;;;;15874:13;:28;;;15848:8;:23;;;:54;;;;;;;;;;;;;;;;;;15748:174;15553:384;14912:1036;;;15984:7;15980:2;15965:27;;15974:4;15965:27;;;;;;;;;;;;16003:42;16024:4;16030:2;16034:7;16043:1;16003:20;:42::i;:::-;14027:2026;;13923:2130;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;4897:1111:9:-;4959:21;;:::i;:::-;4993:12;5008:7;4993:22;;5076:4;5057:15;:13;:15::i;:::-;:23;5053:888;;5093:13;;5086:4;:20;5082:859;;;5127:31;5161:11;:17;5173:4;5161:17;;;;;;;;;;;5127:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5202:9;:16;;;5197:729;;5273:1;5247:28;;:9;:14;;;:28;;;5243:101;;5311:9;5304:16;;;;;;5243:101;5646:261;5653:4;5646:261;;;5686:6;;;;;;;;5731:11;:17;5743:4;5731:17;;;;;;;;;;;5719:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5805:1;5779:28;;:9;:14;;;:28;;;5775:109;;5847:9;5840:16;;;;;;5775:109;5646:261;;;5197:729;5108:833;5082:859;5053:888;5969:31;;;;;;;;;;;;;;4897:1111;;;;:::o;12496:1173::-;12561:20;12584:13;;12561:36;;12626:1;12612:16;;:2;:16;;;12608:48;;12637:19;;;;;;;;;;;;;;12608:48;12683:1;12671:8;:13;12667:44;;12693:18;;;;;;;;;;;;;;12667:44;12724:61;12754:1;12758:2;12762:12;12776:8;12724:21;:61::i;:::-;13097:8;13062:12;:16;13075:2;13062:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13161:8;13121:12;:16;13134:2;13121:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13220:2;13187:11;:25;13199:12;13187:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13287:15;13237:11;:25;13249:12;13237:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13320:20;13343:12;13320:35;;13370:11;13399:8;13384:12;:23;13370:37;;13424:111;13476:14;;;;;;13472:2;13451:40;;13468:1;13451:40;;;;;;;;;;;;13530:3;13515:12;:18;13424:111;;13567:12;13551:13;:28;;;;13037:554;;13601:60;13630:1;13634:2;13638:12;13652:8;13601:20;:60::i;:::-;12550:1119;12496:1173;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;1175:320:4:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;19663:667:9:-;19826:4;19863:2;19847:36;;;19884:12;:10;:12::i;:::-;19898:4;19904:7;19913:5;19847:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19843:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20098:1;20081:6;:13;:18;20077:235;;20127:40;;;;;;;;;;;;;;20077:235;20270:6;20264:13;20255:6;20251:2;20247:15;20240:38;19843:480;19976:45;;;19966:55;;;:6;:55;;;;19959:62;;;19663:667;;;;;;:::o;1395:114:13:-;1455:13;1488;1481:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1395:114;:::o;392:703:6:-;448:13;674:1;665:5;:10;661:51;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;20978:159:9:-;;;;;:::o;21796:158::-;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;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:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:117;6557:1;6554;6547:12;6585:553;6643:8;6653:6;6703:3;6696:4;6688:6;6684:17;6680:27;6670:122;;6711:79;;:::i;:::-;6670:122;6824:6;6811:20;6801:30;;6854:18;6846:6;6843:30;6840:117;;;6876:79;;:::i;:::-;6840:117;6990:4;6982:6;6978:17;6966:29;;7044:3;7036:4;7028:6;7024:17;7014:8;7010:32;7007:41;7004:128;;;7051:79;;:::i;:::-;7004:128;6585:553;;;;;:::o;7144:529::-;7215:6;7223;7272:2;7260:9;7251:7;7247:23;7243:32;7240:119;;;7278:79;;:::i;:::-;7240:119;7426:1;7415:9;7411:17;7398:31;7456:18;7448:6;7445:30;7442:117;;;7478:79;;:::i;:::-;7442:117;7591:65;7648:7;7639:6;7628:9;7624:22;7591:65;:::i;:::-;7573:83;;;;7369:297;7144:529;;;;;:::o;7679:180::-;7727:77;7724:1;7717:88;7824:4;7821:1;7814:15;7848:4;7845:1;7838:15;7865:281;7948:27;7970:4;7948:27;:::i;:::-;7940:6;7936:40;8078:6;8066:10;8063:22;8042:18;8030:10;8027:34;8024:62;8021:88;;;8089:18;;:::i;:::-;8021:88;8129:10;8125:2;8118:22;7908:238;7865:281;;:::o;8152:129::-;8186:6;8213:20;;:::i;:::-;8203:30;;8242:33;8270:4;8262:6;8242:33;:::i;:::-;8152:129;;;:::o;8287:311::-;8364:4;8454:18;8446:6;8443:30;8440:56;;;8476:18;;:::i;:::-;8440:56;8526:4;8518:6;8514:17;8506:25;;8586:4;8580;8576:15;8568:23;;8287:311;;;:::o;8621:710::-;8717:5;8742:81;8758:64;8815:6;8758:64;:::i;:::-;8742:81;:::i;:::-;8733:90;;8843:5;8872:6;8865:5;8858:21;8906:4;8899:5;8895:16;8888:23;;8959:4;8951:6;8947:17;8939:6;8935:30;8988:3;8980:6;8977:15;8974:122;;;9007:79;;:::i;:::-;8974:122;9122:6;9105:220;9139:6;9134:3;9131:15;9105:220;;;9214:3;9243:37;9276:3;9264:10;9243:37;:::i;:::-;9238:3;9231:50;9310:4;9305:3;9301:14;9294:21;;9181:144;9165:4;9160:3;9156:14;9149:21;;9105:220;;;9109:21;8723:608;;8621:710;;;;;:::o;9354:370::-;9425:5;9474:3;9467:4;9459:6;9455:17;9451:27;9441:122;;9482:79;;:::i;:::-;9441:122;9599:6;9586:20;9624:94;9714:3;9706:6;9699:4;9691:6;9687:17;9624:94;:::i;:::-;9615:103;;9431:293;9354:370;;;;:::o;9730:539::-;9814:6;9863:2;9851:9;9842:7;9838:23;9834:32;9831:119;;;9869:79;;:::i;:::-;9831:119;10017:1;10006:9;10002:17;9989:31;10047:18;10039:6;10036:30;10033:117;;;10069:79;;:::i;:::-;10033:117;10174:78;10244:7;10235:6;10224:9;10220:22;10174:78;:::i;:::-;10164:88;;9960:302;9730:539;;;;:::o;10275:146::-;10374:6;10408:5;10402:12;10392:22;;10275:146;;;:::o;10427:216::-;10558:11;10592:6;10587:3;10580:19;10632:4;10627:3;10623:14;10608:29;;10427:216;;;;:::o;10649:164::-;10748:4;10771:3;10763:11;;10801:4;10796:3;10792:14;10784:22;;10649:164;;;:::o;10819:108::-;10896:24;10914:5;10896:24;:::i;:::-;10891:3;10884:37;10819:108;;:::o;10933:101::-;10969:7;11009:18;11002:5;10998:30;10987:41;;10933:101;;;:::o;11040:105::-;11115:23;11132:5;11115:23;:::i;:::-;11110:3;11103:36;11040:105;;:::o;11151:99::-;11222:21;11237:5;11222:21;:::i;:::-;11217:3;11210:34;11151:99;;:::o;11328:689::-;11479:4;11474:3;11470:14;11566:4;11559:5;11555:16;11549:23;11585:63;11642:4;11637:3;11633:14;11619:12;11585:63;:::i;:::-;11494:164;11750:4;11743:5;11739:16;11733:23;11769:61;11824:4;11819:3;11815:14;11801:12;11769:61;:::i;:::-;11668:172;11924:4;11917:5;11913:16;11907:23;11943:57;11994:4;11989:3;11985:14;11971:12;11943:57;:::i;:::-;11850:160;11448:569;11328:689;;:::o;12023:307::-;12156:10;12177:110;12283:3;12275:6;12177:110;:::i;:::-;12319:4;12314:3;12310:14;12296:28;;12023:307;;;;:::o;12336:145::-;12438:4;12470;12465:3;12461:14;12453:22;;12336:145;;;:::o;12563:988::-;12746:3;12775:86;12855:5;12775:86;:::i;:::-;12877:118;12988:6;12983:3;12877:118;:::i;:::-;12870:125;;13019:88;13101:5;13019:88;:::i;:::-;13130:7;13161:1;13146:380;13171:6;13168:1;13165:13;13146:380;;;13247:6;13241:13;13274:127;13397:3;13382:13;13274:127;:::i;:::-;13267:134;;13424:92;13509:6;13424:92;:::i;:::-;13414:102;;13206:320;13193:1;13190;13186:9;13181:14;;13146:380;;;13150:14;13542:3;13535:10;;12751:800;;;12563:988;;;;:::o;13557:501::-;13764:4;13802:2;13791:9;13787:18;13779:26;;13851:9;13845:4;13841:20;13837:1;13826:9;13822:17;13815:47;13879:172;14046:4;14037:6;13879:172;:::i;:::-;13871:180;;13557:501;;;;:::o;14064:114::-;14131:6;14165:5;14159:12;14149:22;;14064:114;;;:::o;14184:184::-;14283:11;14317:6;14312:3;14305:19;14357:4;14352:3;14348:14;14333:29;;14184:184;;;;:::o;14374:132::-;14441:4;14464:3;14456:11;;14494:4;14489:3;14485:14;14477:22;;14374:132;;;:::o;14512:108::-;14589:24;14607:5;14589:24;:::i;:::-;14584:3;14577:37;14512:108;;:::o;14626:179::-;14695:10;14716:46;14758:3;14750:6;14716:46;:::i;:::-;14794:4;14789:3;14785:14;14771:28;;14626:179;;;;:::o;14811:113::-;14881:4;14913;14908:3;14904:14;14896:22;;14811:113;;;:::o;14960:732::-;15079:3;15108:54;15156:5;15108:54;:::i;:::-;15178:86;15257:6;15252:3;15178:86;:::i;:::-;15171:93;;15288:56;15338:5;15288:56;:::i;:::-;15367:7;15398:1;15383:284;15408:6;15405:1;15402:13;15383:284;;;15484:6;15478:13;15511:63;15570:3;15555:13;15511:63;:::i;:::-;15504:70;;15597:60;15650:6;15597:60;:::i;:::-;15587:70;;15443:224;15430:1;15427;15423:9;15418:14;;15383:284;;;15387:14;15683:3;15676:10;;15084:608;;;14960:732;;;;:::o;15698:373::-;15841:4;15879:2;15868:9;15864:18;15856:26;;15928:9;15922:4;15918:20;15914:1;15903:9;15899:17;15892:47;15956:108;16059:4;16050:6;15956:108;:::i;:::-;15948:116;;15698:373;;;;:::o;16077:684::-;16170:6;16178;16227:2;16215:9;16206:7;16202:23;16198:32;16195:119;;;16233:79;;:::i;:::-;16195:119;16353:1;16378:53;16423:7;16414:6;16403:9;16399:22;16378:53;:::i;:::-;16368:63;;16324:117;16508:2;16497:9;16493:18;16480:32;16539:18;16531:6;16528:30;16525:117;;;16561:79;;:::i;:::-;16525:117;16666:78;16736:7;16727:6;16716:9;16712:22;16666:78;:::i;:::-;16656:88;;16451:303;16077:684;;;;;:::o;16767:619::-;16844:6;16852;16860;16909:2;16897:9;16888:7;16884:23;16880:32;16877:119;;;16915:79;;:::i;:::-;16877:119;17035:1;17060:53;17105:7;17096:6;17085:9;17081:22;17060:53;:::i;:::-;17050:63;;17006:117;17162:2;17188:53;17233:7;17224:6;17213:9;17209:22;17188:53;:::i;:::-;17178:63;;17133:118;17290:2;17316:53;17361:7;17352:6;17341:9;17337:22;17316:53;:::i;:::-;17306:63;;17261:118;16767:619;;;;;:::o;17392:116::-;17462:21;17477:5;17462:21;:::i;:::-;17455:5;17452:32;17442:60;;17498:1;17495;17488:12;17442:60;17392:116;:::o;17514:133::-;17557:5;17595:6;17582:20;17573:29;;17611:30;17635:5;17611:30;:::i;:::-;17514:133;;;;:::o;17653:468::-;17718:6;17726;17775:2;17763:9;17754:7;17750:23;17746:32;17743:119;;;17781:79;;:::i;:::-;17743:119;17901:1;17926:53;17971:7;17962:6;17951:9;17947:22;17926:53;:::i;:::-;17916:63;;17872:117;18028:2;18054:50;18096:7;18087:6;18076:9;18072:22;18054:50;:::i;:::-;18044:60;;17999:115;17653:468;;;;;:::o;18127:60::-;18155:3;18176:5;18169:12;;18127:60;;;:::o;18193:142::-;18243:9;18276:53;18294:34;18303:24;18321:5;18303:24;:::i;:::-;18294:34;:::i;:::-;18276:53;:::i;:::-;18263:66;;18193:142;;;:::o;18341:126::-;18391:9;18424:37;18455:5;18424:37;:::i;:::-;18411:50;;18341:126;;;:::o;18473:156::-;18553:9;18586:37;18617:5;18586:37;:::i;:::-;18573:50;;18473:156;;;:::o;18635:191::-;18752:67;18813:5;18752:67;:::i;:::-;18747:3;18740:80;18635:191;;:::o;18832:282::-;18955:4;18993:2;18982:9;18978:18;18970:26;;19006:101;19104:1;19093:9;19089:17;19080:6;19006:101;:::i;:::-;18832:282;;;;:::o;19120:117::-;19229:1;19226;19219:12;19243:307;19304:4;19394:18;19386:6;19383:30;19380:56;;;19416:18;;:::i;:::-;19380:56;19454:29;19476:6;19454:29;:::i;:::-;19446:37;;19538:4;19532;19528:15;19520:23;;19243:307;;;:::o;19556:146::-;19653:6;19648:3;19643;19630:30;19694:1;19685:6;19680:3;19676:16;19669:27;19556:146;;;:::o;19708:423::-;19785:5;19810:65;19826:48;19867:6;19826:48;:::i;:::-;19810:65;:::i;:::-;19801:74;;19898:6;19891:5;19884:21;19936:4;19929:5;19925:16;19974:3;19965:6;19960:3;19956:16;19953:25;19950:112;;;19981:79;;:::i;:::-;19950:112;20071:54;20118:6;20113:3;20108;20071:54;:::i;:::-;19791:340;19708:423;;;;;:::o;20150:338::-;20205:5;20254:3;20247:4;20239:6;20235:17;20231:27;20221:122;;20262:79;;:::i;:::-;20221:122;20379:6;20366:20;20404:78;20478:3;20470:6;20463:4;20455:6;20451:17;20404:78;:::i;:::-;20395:87;;20211:277;20150:338;;;;:::o;20494:943::-;20589:6;20597;20605;20613;20662:3;20650:9;20641:7;20637:23;20633:33;20630:120;;;20669:79;;:::i;:::-;20630:120;20789:1;20814:53;20859:7;20850:6;20839:9;20835:22;20814:53;:::i;:::-;20804:63;;20760:117;20916:2;20942:53;20987:7;20978:6;20967:9;20963:22;20942:53;:::i;:::-;20932:63;;20887:118;21044:2;21070:53;21115:7;21106:6;21095:9;21091:22;21070:53;:::i;:::-;21060:63;;21015:118;21200:2;21189:9;21185:18;21172:32;21231:18;21223:6;21220:30;21217:117;;;21253:79;;:::i;:::-;21217:117;21358:62;21412:7;21403:6;21392:9;21388:22;21358:62;:::i;:::-;21348:72;;21143:287;20494:943;;;;;;;:::o;21515:699::-;21676:4;21671:3;21667:14;21763:4;21756:5;21752:16;21746:23;21782:63;21839:4;21834:3;21830:14;21816:12;21782:63;:::i;:::-;21691:164;21947:4;21940:5;21936:16;21930:23;21966:61;22021:4;22016:3;22012:14;21998:12;21966:61;:::i;:::-;21865:172;22121:4;22114:5;22110:16;22104:23;22140:57;22191:4;22186:3;22182:14;22168:12;22140:57;:::i;:::-;22047:160;21645:569;21515:699;;:::o;22220:350::-;22377:4;22415:2;22404:9;22400:18;22392:26;;22428:135;22560:1;22549:9;22545:17;22536:6;22428:135;:::i;:::-;22220:350;;;;:::o;22576:474::-;22644:6;22652;22701:2;22689:9;22680:7;22676:23;22672:32;22669:119;;;22707:79;;:::i;:::-;22669:119;22827:1;22852:53;22897:7;22888:6;22877:9;22873:22;22852:53;:::i;:::-;22842:63;;22798:117;22954:2;22980:53;23025:7;23016:6;23005:9;23001:22;22980:53;:::i;:::-;22970:63;;22925:118;22576:474;;;;;:::o;23056:180::-;23104:77;23101:1;23094:88;23201:4;23198:1;23191:15;23225:4;23222:1;23215:15;23242:320;23286:6;23323:1;23317:4;23313:12;23303:22;;23370:1;23364:4;23360:12;23391:18;23381:81;;23447:4;23439:6;23435:17;23425:27;;23381:81;23509:2;23501:6;23498:14;23478:18;23475:38;23472:84;;23528:18;;:::i;:::-;23472:84;23293:269;23242:320;;;:::o;23568:97::-;23627:6;23655:3;23645:13;;23568:97;;;;:::o;23671:141::-;23720:4;23743:3;23735:11;;23766:3;23763:1;23756:14;23800:4;23797:1;23787:18;23779:26;;23671:141;;;:::o;23818:93::-;23855:6;23902:2;23897;23890:5;23886:14;23882:23;23872:33;;23818:93;;;:::o;23917:107::-;23961:8;24011:5;24005:4;24001:16;23980:37;;23917:107;;;;:::o;24030:393::-;24099:6;24149:1;24137:10;24133:18;24172:97;24202:66;24191:9;24172:97;:::i;:::-;24290:39;24320:8;24309:9;24290:39;:::i;:::-;24278:51;;24362:4;24358:9;24351:5;24347:21;24338:30;;24411:4;24401:8;24397:19;24390:5;24387:30;24377:40;;24106:317;;24030:393;;;;;:::o;24429:142::-;24479:9;24512:53;24530:34;24539:24;24557:5;24539:24;:::i;:::-;24530:34;:::i;:::-;24512:53;:::i;:::-;24499:66;;24429:142;;;:::o;24577:75::-;24620:3;24641:5;24634:12;;24577:75;;;:::o;24658:269::-;24768:39;24799:7;24768:39;:::i;:::-;24829:91;24878:41;24902:16;24878:41;:::i;:::-;24870:6;24863:4;24857:11;24829:91;:::i;:::-;24823:4;24816:105;24734:193;24658:269;;;:::o;24933:73::-;24978:3;24933:73;:::o;25012:189::-;25089:32;;:::i;:::-;25130:65;25188:6;25180;25174:4;25130:65;:::i;:::-;25065:136;25012:189;;:::o;25207:186::-;25267:120;25284:3;25277:5;25274:14;25267:120;;;25338:39;25375:1;25368:5;25338:39;:::i;:::-;25311:1;25304:5;25300:13;25291:22;;25267:120;;;25207:186;;:::o;25399:543::-;25500:2;25495:3;25492:11;25489:446;;;25534:38;25566:5;25534:38;:::i;:::-;25618:29;25636:10;25618:29;:::i;:::-;25608:8;25604:44;25801:2;25789:10;25786:18;25783:49;;;25822:8;25807:23;;25783:49;25845:80;25901:22;25919:3;25901:22;:::i;:::-;25891:8;25887:37;25874:11;25845:80;:::i;:::-;25504:431;;25489:446;25399:543;;;:::o;25948:117::-;26002:8;26052:5;26046:4;26042:16;26021:37;;25948:117;;;;:::o;26071:169::-;26115:6;26148:51;26196:1;26192:6;26184:5;26181:1;26177:13;26148:51;:::i;:::-;26144:56;26229:4;26223;26219:15;26209:25;;26122:118;26071:169;;;;:::o;26245:295::-;26321:4;26467:29;26492:3;26486:4;26467:29;:::i;:::-;26459:37;;26529:3;26526:1;26522:11;26516:4;26513:21;26505:29;;26245:295;;;;:::o;26545:1403::-;26669:44;26709:3;26704;26669:44;:::i;:::-;26778:18;26770:6;26767:30;26764:56;;;26800:18;;:::i;:::-;26764:56;26844:38;26876:4;26870:11;26844:38;:::i;:::-;26929:67;26989:6;26981;26975:4;26929:67;:::i;:::-;27023:1;27052:2;27044:6;27041:14;27069:1;27064:632;;;;27740:1;27757:6;27754:84;;;27813:9;27808:3;27804:19;27791:33;27782:42;;27754:84;27864:67;27924:6;27917:5;27864:67;:::i;:::-;27858:4;27851:81;27713:229;27034:908;;27064:632;27116:4;27112:9;27104:6;27100:22;27150:37;27182:4;27150:37;:::i;:::-;27209:1;27223:215;27237:7;27234:1;27231:14;27223:215;;;27323:9;27318:3;27314:19;27301:33;27293:6;27286:49;27374:1;27366:6;27362:14;27352:24;;27421:2;27410:9;27406:18;27393:31;;27260:4;27257:1;27253:12;27248:17;;27223:215;;;27466:6;27457:7;27454:19;27451:186;;;27531:9;27526:3;27522:19;27509:33;27574:48;27616:4;27608:6;27604:17;27593:9;27574:48;:::i;:::-;27566:6;27559:64;27474:163;27451:186;27683:1;27679;27671:6;27667:14;27663:22;27657:4;27650:36;27071:625;;;27034:908;;26644:1304;;;26545:1403;;;:::o;27954:180::-;28002:77;27999:1;27992:88;28099:4;28096:1;28089:15;28123:4;28120:1;28113:15;28140:169;28280:21;28276:1;28268:6;28264:14;28257:45;28140:169;:::o;28315:366::-;28457:3;28478:67;28542:2;28537:3;28478:67;:::i;:::-;28471:74;;28554:93;28643:3;28554:93;:::i;:::-;28672:2;28667:3;28663:12;28656:19;;28315:366;;;:::o;28687:419::-;28853:4;28891:2;28880:9;28876:18;28868:26;;28940:9;28934:4;28930:20;28926:1;28915:9;28911:17;28904:47;28968:131;29094:4;28968:131;:::i;:::-;28960:139;;28687:419;;;:::o;29112:165::-;29252:17;29248:1;29240:6;29236:14;29229:41;29112:165;:::o;29283:366::-;29425:3;29446:67;29510:2;29505:3;29446:67;:::i;:::-;29439:74;;29522:93;29611:3;29522:93;:::i;:::-;29640:2;29635:3;29631:12;29624:19;;29283:366;;;:::o;29655:419::-;29821:4;29859:2;29848:9;29844:18;29836:26;;29908:9;29902:4;29898:20;29894:1;29883:9;29879:17;29872:47;29936:131;30062:4;29936:131;:::i;:::-;29928:139;;29655:419;;;:::o;30080:143::-;30137:5;30168:6;30162:13;30153:22;;30184:33;30211:5;30184:33;:::i;:::-;30080:143;;;;:::o;30229:351::-;30299:6;30348:2;30336:9;30327:7;30323:23;30319:32;30316:119;;;30354:79;;:::i;:::-;30316:119;30474:1;30499:64;30555:7;30546:6;30535:9;30531:22;30499:64;:::i;:::-;30489:74;;30445:128;30229:351;;;;:::o;30586:160::-;30726:12;30722:1;30714:6;30710:14;30703:36;30586:160;:::o;30752:366::-;30894:3;30915:67;30979:2;30974:3;30915:67;:::i;:::-;30908:74;;30991:93;31080:3;30991:93;:::i;:::-;31109:2;31104:3;31100:12;31093:19;;30752:366;;;:::o;31124:419::-;31290:4;31328:2;31317:9;31313:18;31305:26;;31377:9;31371:4;31367:20;31363:1;31352:9;31348:17;31341:47;31405:131;31531:4;31405:131;:::i;:::-;31397:139;;31124:419;;;:::o;31549:180::-;31597:77;31594:1;31587:88;31694:4;31691:1;31684:15;31718:4;31715:1;31708:15;31735:233;31774:3;31797:24;31815:5;31797:24;:::i;:::-;31788:33;;31843:66;31836:5;31833:77;31830:103;;31913:18;;:::i;:::-;31830:103;31960:1;31953:5;31949:13;31942:20;;31735:233;;;:::o;31974:148::-;32076:11;32113:3;32098:18;;31974:148;;;;:::o;32128:390::-;32234:3;32262:39;32295:5;32262:39;:::i;:::-;32317:89;32399:6;32394:3;32317:89;:::i;:::-;32310:96;;32415:65;32473:6;32468:3;32461:4;32454:5;32450:16;32415:65;:::i;:::-;32505:6;32500:3;32496:16;32489:23;;32238:280;32128:390;;;;:::o;32524:435::-;32704:3;32726:95;32817:3;32808:6;32726:95;:::i;:::-;32719:102;;32838:95;32929:3;32920:6;32838:95;:::i;:::-;32831:102;;32950:3;32943:10;;32524:435;;;;;:::o;32965:225::-;33105:34;33101:1;33093:6;33089:14;33082:58;33174:8;33169:2;33161:6;33157:15;33150:33;32965:225;:::o;33196:366::-;33338:3;33359:67;33423:2;33418:3;33359:67;:::i;:::-;33352:74;;33435:93;33524:3;33435:93;:::i;:::-;33553:2;33548:3;33544:12;33537:19;;33196:366;;;:::o;33568:419::-;33734:4;33772:2;33761:9;33757:18;33749:26;;33821:9;33815:4;33811:20;33807:1;33796:9;33792:17;33785:47;33849:131;33975:4;33849:131;:::i;:::-;33841:139;;33568:419;;;:::o;33993:182::-;34133:34;34129:1;34121:6;34117:14;34110:58;33993:182;:::o;34181:366::-;34323:3;34344:67;34408:2;34403:3;34344:67;:::i;:::-;34337:74;;34420:93;34509:3;34420:93;:::i;:::-;34538:2;34533:3;34529:12;34522:19;;34181:366;;;:::o;34553:419::-;34719:4;34757:2;34746:9;34742:18;34734:26;;34806:9;34800:4;34796:20;34792:1;34781:9;34777:17;34770:47;34834:131;34960:4;34834:131;:::i;:::-;34826:139;;34553:419;;;:::o;34978:98::-;35029:6;35063:5;35057:12;35047:22;;34978:98;;;:::o;35082:168::-;35165:11;35199:6;35194:3;35187:19;35239:4;35234:3;35230:14;35215:29;;35082:168;;;;:::o;35256:373::-;35342:3;35370:38;35402:5;35370:38;:::i;:::-;35424:70;35487:6;35482:3;35424:70;:::i;:::-;35417:77;;35503:65;35561:6;35556:3;35549:4;35542:5;35538:16;35503:65;:::i;:::-;35593:29;35615:6;35593:29;:::i;:::-;35588:3;35584:39;35577:46;;35346:283;35256:373;;;;:::o;35635:640::-;35830:4;35868:3;35857:9;35853:19;35845:27;;35882:71;35950:1;35939:9;35935:17;35926:6;35882:71;:::i;:::-;35963:72;36031:2;36020:9;36016:18;36007:6;35963:72;:::i;:::-;36045;36113:2;36102:9;36098:18;36089:6;36045:72;:::i;:::-;36164:9;36158:4;36154:20;36149:2;36138:9;36134:18;36127:48;36192:76;36263:4;36254:6;36192:76;:::i;:::-;36184:84;;35635:640;;;;;;;:::o;36281:141::-;36337:5;36368:6;36362:13;36353:22;;36384:32;36410:5;36384:32;:::i;:::-;36281:141;;;;:::o;36428:349::-;36497:6;36546:2;36534:9;36525:7;36521:23;36517:32;36514:119;;;36552:79;;:::i;:::-;36514:119;36672:1;36697:63;36752:7;36743:6;36732:9;36728:22;36697:63;:::i;:::-;36687:73;;36643:127;36428:349;;;;:::o;36783:180::-;36831:77;36828:1;36821:88;36928:4;36925:1;36918:15;36952:4;36949:1;36942:15;36969:185;37009:1;37026:20;37044:1;37026:20;:::i;:::-;37021:25;;37060:20;37078:1;37060:20;:::i;:::-;37055:25;;37099:1;37089:35;;37104:18;;:::i;:::-;37089:35;37146:1;37143;37139:9;37134:14;;36969:185;;;;:::o;37160:194::-;37200:4;37220:20;37238:1;37220:20;:::i;:::-;37215:25;;37254:20;37272:1;37254:20;:::i;:::-;37249:25;;37298:1;37295;37291:9;37283:17;;37322:1;37316:4;37313:11;37310:37;;;37327:18;;:::i;:::-;37310:37;37160:194;;;;:::o;37360:176::-;37392:1;37409:20;37427:1;37409:20;:::i;:::-;37404:25;;37443:20;37461:1;37443:20;:::i;:::-;37438:25;;37482:1;37472:35;;37487:18;;:::i;:::-;37472:35;37528:1;37525;37521:9;37516:14;;37360:176;;;;:::o;37542:191::-;37582:3;37601:20;37619:1;37601:20;:::i;:::-;37596:25;;37635:20;37653:1;37635:20;:::i;:::-;37630:25;;37678:1;37675;37671:9;37664:16;;37699:3;37696:1;37693:10;37690:36;;;37706:18;;:::i;:::-;37690:36;37542:191;;;;:::o

Swarm Source

ipfs://3353735c341b8c32412a656deb2ac796bbc10c27d8f7cee0d8655b23e0fad289
Loading...
Loading
Loading...
Loading
[ 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.