ETH Price: $3,447.46 (-0.86%)
Gas: 3 Gwei

Token

Bocephi (BOCE)
 

Overview

Max Total Supply

421 BOCE

Holders

205

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 BOCE
0x050996E75Ba1a7b5d6C53Aee152d5A2DA376068D
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:
Bocephi

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/[email protected]
pragma solidity ^0.8.0;

library Address {

    function isContract(address account) internal view returns (bool) {

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

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

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

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

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            
            if (returndata.length > 0) {

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]
pragma solidity ^0.8.0;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

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

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File @openzeppelin/contracts/utils/[email protected]
pragma solidity ^0.8.0;

library Counters {
    struct Counter {
        
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File @openzeppelin/contracts/utils/introspection/[email protected]
pragma solidity ^0.8.0;

interface IERC165 {
    
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]
pragma solidity ^0.8.0;

interface IERC721 is IERC165 {
    
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC721/[email protected]
pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]
pragma solidity ^0.8.0;

interface IERC721Metadata is IERC721 {
    
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}





// File @openzeppelin/contracts/utils/[email protected]
pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


// File @openzeppelin/contracts/utils/introspection/[email protected]
pragma solidity ^0.8.0;

abstract contract ERC165 is IERC165 {

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


// File @openzeppelin/contracts/token/ERC721/[email protected]
pragma solidity ^0.8.0;

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _owners;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

interface IERC721Enumerable is IERC721 {
    
    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256[] private _allTokens;

    mapping(uint256 => uint256) private _allTokensIndex;

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

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId;
            _ownedTokensIndex[lastTokenId] = tokenIndex;
        }

        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; 
        _allTokensIndex[lastTokenId] = tokenIndex; 

        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 1;

     uint256 internal immutable maxBatchSize;

    string private _name;

    string private _symbol;

    mapping(uint256 => TokenOwnership) private _ownerships;

    mapping(address => AddressData) private _addressData;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_
    ) {
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
    }

    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "ERC721A: balance query for the zero address");
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), "ERC721A: number minted query for the zero address");
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721A: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId, owner);
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), "ERC721A: approve to caller");

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved");

        require(prevOwnership.addr == from, "ERC721A: transfer from incorrect owner");
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

        _approve(address(0), tokenId, prevOwnership.addr);

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

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

    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    uint256 public nextOwnerToExplicitlySet = 0;

    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > currentIndex - 1) {
            endIndex = currentIndex - 1;
        }
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(ownership.addr, ownership.startTimestamp);
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            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("ERC721A: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

pragma solidity ^0.8.0;

contract Bocephi is ERC721A
{
    using Strings for uint256;

    string public baseURI;
    uint256 public cost;
    uint256 public maxSupply;
    uint256 public maxMintAmount = 2;
    uint256 public maxMintPerTransaction = 2;
    address public owner;
    bool public preSaleLive;
    bool public mintLive;

    mapping(address => bool) private whiteList;
    mapping(address => uint256) private mintCount;

    modifier onlyOwner() {
        require(owner == msg.sender, "not owner");
        _;
    }

    modifier preSaleIsLive() {
        require(preSaleLive, "preSale not live");
        _;
    }

    modifier mintIsLive() {
        require(mintLive, "mint not live");
        _;
    }

    constructor(string memory defaultBaseURI) ERC721A("Bocephi", "BOCE", maxMintAmount) {
        owner = msg.sender;
        baseURI = defaultBaseURI;
        maxSupply = 421;
        maxMintPerTransaction;
        cost = 0;
    }

    function isWhiteListed(address _address) public view returns (bool){
        return whiteList[_address];
    }

    function mintedByAddressCount(address _address) public view returns (uint256){
        return mintCount[_address];
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    function setmaxMintPerTransaction(uint256 _newmaxMintPerTransaction) public onlyOwner {
        maxMintPerTransaction = _newmaxMintPerTransaction;
    }

    function mint(uint256 _mintAmount) external payable mintIsLive {
        address _to = msg.sender;
        uint256 minted = mintCount[_to];
        require(minted + _mintAmount <= maxMintAmount, "mint over max");
        require(_mintAmount <= maxMintPerTransaction, "amount must < max");
        require(totalSupply() + _mintAmount <= maxSupply, "mint over supply");
        require(msg.value >= cost * _mintAmount, "insufficient funds");

        mintCount[_to] = minted + _mintAmount;
        _safeMint(msg.sender, _mintAmount);
    }

    function preSaleMint(uint256 _mintAmount) external payable preSaleIsLive {
        address _to = msg.sender;
        uint256 minted = mintCount[_to];
        require(whiteList[_to], "not whitelisted");
        require(minted + _mintAmount <= maxMintAmount, "mint over max");
        require(totalSupply() + _mintAmount <= maxSupply, "mint over supply");
        require(msg.value >= cost * _mintAmount, "insufficient funds");

        mintCount[_to] = minted + _mintAmount;
        _safeMint(msg.sender, _mintAmount);
    }

    function mintByOwner(address _to, uint256 _mintAmount) external onlyOwner {
        require(totalSupply() + _mintAmount <= maxSupply, "mint over supply");
        if (_mintAmount <= maxBatchSize) {
            _safeMint(_to, _mintAmount);
            return;
        }
        
        uint256 leftToMint = _mintAmount;
        while (leftToMint > 0) {
            if (leftToMint <= maxBatchSize) {
                _safeMint(_to, leftToMint);
                return;
            }
            _safeMint(_to, maxBatchSize);
            leftToMint = leftToMint - maxBatchSize;
        }
    }

    function addToWhiteList(address[] calldata _addresses) external onlyOwner {
        for (uint256 i; i < _addresses.length; i++) {
            whiteList[_addresses[i]] = true;
        }
    }

    function togglePreSaleLive() external onlyOwner {
        if (preSaleLive) {
            preSaleLive = false;
            return;
        }
        preSaleLive = true;
    }

    function toggleMintLive() external onlyOwner {
        if (mintLive) {
            mintLive = false;
            return;
        }
        preSaleLive = false;
        mintLive = true;
    }

    function setBaseURI(string memory _newURI) external onlyOwner {
        baseURI = _newURI;
    }

    function withdraw() external payable onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }

    function setOwnersExplicit(uint256 quantity) external onlyOwner {
        _setOwnersExplicit(quantity);
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "URI query for nonexistent token");

        string memory baseTokenURI = _baseURI();
        string memory json = ".json";
        return bytes(baseTokenURI).length > 0
            ? string(abi.encodePacked(baseTokenURI, _tokenId.toString(), json))
            : '';
    }

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

    fallback() external payable { }

    receive() external payable { }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"defaultBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"mintedByAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","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":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintPerTransaction","type":"uint256"}],"name":"setmaxMintPerTransaction","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":"toggleMintLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePreSaleLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600160005560006007556002600b556002600c553480156200002557600080fd5b5060405162002c5438038062002c54833981016040819052620000489162000214565b60405180604001604052806007815260200166426f636570686960c81b81525060405180604001604052806004815260200163424f434560e01b815250600b5460008111620000ed5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840160405180910390fd5b82516200010290600190602086019062000158565b5081516200011890600290602085019062000158565b506080525050600d80546001600160a01b0319163317905580516200014590600890602084019062000158565b50506101a5600a5560006009556200032d565b8280546200016690620002f0565b90600052602060002090601f0160209004810192826200018a5760008555620001d5565b82601f10620001a557805160ff1916838001178555620001d5565b82800160010185558215620001d5579182015b82811115620001d5578251825591602001919060010190620001b8565b50620001e3929150620001e7565b5090565b5b80821115620001e35760008155600101620001e8565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200022857600080fd5b82516001600160401b03808211156200024057600080fd5b818501915085601f8301126200025557600080fd5b8151818111156200026a576200026a620001fe565b604051601f8201601f19908116603f01168101908382118183101715620002955762000295620001fe565b816040528281528886848701011115620002ae57600080fd5b600093505b82841015620002d25784840186015181850187015292850192620002b3565b82841115620002e45760008684830101525b98975050505050505050565b600181811c908216806200030557607f821691505b602082108114156200032757634e487b7160e01b600052602260045260246000fd5b50919050565b6080516128e16200037360003960008181610c3c01528181610c7901528181610cae01528181610cd701528181611bf201528181611c1c0152611fe201526128e16000f3fe60806040526004361061021c5760003560e01c80635bd90b76116101225780638da5cb5b116100a5578063c87b56dd1161006c578063c87b56dd1461064b578063d5abeb011461066b578063d7224ba014610681578063e8656fcc14610697578063e985e9c5146106b857005b80638da5cb5b146105c357806395d89b41146105e3578063a0712d68146105f8578063a22cb4651461060b578063b88d4fde1461062b57005b8063740d73f3116100e9578063740d73f31461053b5780637835c6351461055b57806378835f421461056e5780637f00c7a61461058e57806389bdeec6146105ae57005b80635bd90b761461048c5780636352211e146104ad5780636c0360eb146104cd5780636f9170f6146104e257806370a082311461051b57005b806323b872dd116101aa5780633ccfd60b116101715780633ccfd60b1461040457806342842e0e1461040c57806344a0d68a1461042c5780634f6ccce71461044c57806355f804b31461046c57005b806323b872dd1461034e5780632d20fb601461036e5780632f745c591461038e5780633542aee2146103ae57806337351b0f146103ce57005b8063095ea7b3116101ee578063095ea7b3146102d8578063105739b8146102f857806313faede61461030d57806318160ddd14610323578063239c70ae1461033857005b806301f569971461022557806301ffc9a71461024e57806306fdde031461027e578063081812fc146102a057005b3661022357005b005b34801561023157600080fd5b5061023b600c5481565b6040519081526020015b60405180910390f35b34801561025a57600080fd5b5061026e6102693660046122a6565b610701565b6040519015158152602001610245565b34801561028a57600080fd5b5061029361076e565b6040516102459190612322565b3480156102ac57600080fd5b506102c06102bb366004612335565b610800565b6040516001600160a01b039091168152602001610245565b3480156102e457600080fd5b506102236102f336600461236a565b610890565b34801561030457600080fd5b506102236109a8565b34801561031957600080fd5b5061023b60095481565b34801561032f57600080fd5b5060005461023b565b34801561034457600080fd5b5061023b600b5481565b34801561035a57600080fd5b50610223610369366004612394565b610a09565b34801561037a57600080fd5b50610223610389366004612335565b610a14565b34801561039a57600080fd5b5061023b6103a936600461236a565b610a4a565b3480156103ba57600080fd5b506102236103c936600461236a565b610bb8565b3480156103da57600080fd5b5061023b6103e93660046123d0565b6001600160a01b03166000908152600f602052604090205490565b610223610d03565b34801561041857600080fd5b50610223610427366004612394565b610db7565b34801561043857600080fd5b50610223610447366004612335565b610dd2565b34801561045857600080fd5b5061023b610467366004612335565b610e01565b34801561047857600080fd5b50610223610487366004612477565b610e63565b34801561049857600080fd5b50600d5461026e90600160a01b900460ff1681565b3480156104b957600080fd5b506102c06104c8366004612335565b610ea0565b3480156104d957600080fd5b50610293610eb2565b3480156104ee57600080fd5b5061026e6104fd3660046123d0565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561052757600080fd5b5061023b6105363660046123d0565b610f40565b34801561054757600080fd5b506102236105563660046124c0565b610fd1565b610223610569366004612335565b61106d565b34801561057a57600080fd5b50610223610589366004612335565b611238565b34801561059a57600080fd5b506102236105a9366004612335565b611267565b3480156105ba57600080fd5b50610223611296565b3480156105cf57600080fd5b50600d546102c0906001600160a01b031681565b3480156105ef57600080fd5b506102936112f6565b610223610606366004612335565b611305565b34801561061757600080fd5b50610223610626366004612535565b6113ef565b34801561063757600080fd5b50610223610646366004612571565b6114b4565b34801561065757600080fd5b50610293610666366004612335565b6114ed565b34801561067757600080fd5b5061023b600a5481565b34801561068d57600080fd5b5061023b60075481565b3480156106a357600080fd5b50600d5461026e90600160a81b900460ff1681565b3480156106c457600080fd5b5061026e6106d33660046125ed565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061073257506001600160e01b03198216635b5e139f60e01b145b8061074d57506001600160e01b0319821663780e9d6360e01b145b8061076857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461077d90612620565b80601f01602080910402602001604051908101604052809291908181526020018280546107a990612620565b80156107f65780601f106107cb576101008083540402835291602001916107f6565b820191906000526020600020905b8154815290600101906020018083116107d957829003601f168201915b5050505050905090565b600061080d826000541190565b6108745760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061089b82610ea0565b9050806001600160a01b0316836001600160a01b0316141561090a5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161086b565b336001600160a01b0382161480610926575061092681336106d3565b6109985760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161086b565b6109a38383836115c0565b505050565b600d546001600160a01b031633146109d25760405162461bcd60e51b815260040161086b9061265b565b600d54600160a81b900460ff16156109f357600d805460ff60a81b19169055565b600d805461ffff60a01b1916600160a81b179055565b6109a383838361161c565b600d546001600160a01b03163314610a3e5760405162461bcd60e51b815260040161086b9061265b565b610a47816119a4565b50565b6000610a5583610f40565b8210610aae5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161086b565b600080549080805b83811015610b58576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610b0957805192505b876001600160a01b0316836001600160a01b03161415610b455786841415610b375750935061076892505050565b83610b4181612694565b9450505b5080610b5081612694565b915050610ab6565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161086b565b600d546001600160a01b03163314610be25760405162461bcd60e51b815260040161086b9061265b565b600a5481610bef60005490565b610bf991906126af565b1115610c3a5760405162461bcd60e51b815260206004820152601060248201526f6d696e74206f76657220737570706c7960801b604482015260640161086b565b7f00000000000000000000000000000000000000000000000000000000000000008111610c6f57610c6b8282611b56565b5050565b805b80156109a3577f00000000000000000000000000000000000000000000000000000000000000008111610ca8576109a38382611b56565b610cd2837f0000000000000000000000000000000000000000000000000000000000000000611b56565b610cfc7f0000000000000000000000000000000000000000000000000000000000000000826126c7565b9050610c71565b600d546001600160a01b03163314610d2d5760405162461bcd60e51b815260040161086b9061265b565b604051600090339047908381818185875af1925050503d8060008114610d6f576040519150601f19603f3d011682016040523d82523d6000602084013e610d74565b606091505b5050905080610a475760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161086b565b6109a3838383604051806020016040528060008152506114b4565b600d546001600160a01b03163314610dfc5760405162461bcd60e51b815260040161086b9061265b565b600955565b600080548210610e5f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161086b565b5090565b600d546001600160a01b03163314610e8d5760405162461bcd60e51b815260040161086b9061265b565b8051610c6b906008906020840190612200565b6000610eab82611b70565b5192915050565b60088054610ebf90612620565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb90612620565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b60006001600160a01b038216610fac5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161086b565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b600d546001600160a01b03163314610ffb5760405162461bcd60e51b815260040161086b9061265b565b60005b818110156109a3576001600e600085858581811061101e5761101e6126de565b905060200201602081019061103391906123d0565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061106581612694565b915050610ffe565b600d54600160a01b900460ff166110b95760405162461bcd60e51b815260206004820152601060248201526f70726553616c65206e6f74206c69766560801b604482015260640161086b565b336000818152600f6020908152604080832054600e9092529091205460ff166111165760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161086b565b600b5461112384836126af565b11156111615760405162461bcd60e51b815260206004820152600d60248201526c0dad2dce840deeccae440dac2f609b1b604482015260640161086b565b600a548361116e60005490565b61117891906126af565b11156111b95760405162461bcd60e51b815260206004820152601060248201526f6d696e74206f76657220737570706c7960801b604482015260640161086b565b826009546111c791906126f4565b34101561120b5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015260640161086b565b61121583826126af565b6001600160a01b0383166000908152600f60205260409020556109a33384611b56565b600d546001600160a01b031633146112625760405162461bcd60e51b815260040161086b9061265b565b600c55565b600d546001600160a01b031633146112915760405162461bcd60e51b815260040161086b9061265b565b600b55565b600d546001600160a01b031633146112c05760405162461bcd60e51b815260040161086b9061265b565b600d54600160a01b900460ff16156112e157600d805460ff60a01b19169055565b600d805460ff60a01b1916600160a01b179055565b60606002805461077d90612620565b600d54600160a81b900460ff1661134e5760405162461bcd60e51b815260206004820152600d60248201526c6d696e74206e6f74206c69766560981b604482015260640161086b565b336000818152600f6020526040902054600b5461136b84836126af565b11156113a95760405162461bcd60e51b815260206004820152600d60248201526c0dad2dce840deeccae440dac2f609b1b604482015260640161086b565b600c548311156111615760405162461bcd60e51b81526020600482015260116024820152700c2dadeeadce840daeae6e8407840dac2f607b1b604482015260640161086b565b6001600160a01b0382163314156114485760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161086b565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114bf84848461161c565b6114cb84848484611d1a565b6114e75760405162461bcd60e51b815260040161086b90612713565b50505050565b60606114fa826000541190565b6115465760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604482015260640161086b565b6000611550611e18565b604080518082019091526005815264173539b7b760d91b602082015281519192509061158b57604051806020016040528060008152506115b8565b8161159585611e27565b826040516020016115a893929190612766565b6040516020818303038152906040525b949350505050565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061162782611b70565b80519091506000906001600160a01b0316336001600160a01b0316148061165e57503361165384610800565b6001600160a01b0316145b806116705750815161167090336106d3565b9050806116da5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161086b565b846001600160a01b031682600001516001600160a01b03161461174e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161086b565b6001600160a01b0384166117b25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161086b565b6117c260008484600001516115c0565b6001600160a01b03851660009081526004602052604081208054600192906117f49084906001600160801b03166127a9565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611840918591166127d1565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556118c88460016126af565b6000818152600360205260409020549091506001600160a01b031661195a576118f2816000541190565b1561195a5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600754816119f45760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161086b565b60006001611a0284846126af565b611a0c91906126c7565b90506001600054611a1d91906126c7565b811115611a36576001600054611a3391906126c7565b90505b611a41816000541190565b611a9c5760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b606482015260840161086b565b815b818111611b42576000818152600360205260409020546001600160a01b0316611b30576000611acc82611b70565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80611b3a81612694565b915050611a9e565b50611b4e8160016126af565b600755505050565b610c6b828260405180602001604052806000815250611f25565b6040805180820190915260008082526020820152611b8f826000541190565b611bee5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161086b565b60007f00000000000000000000000000000000000000000000000000000000000000008310611c4f57611c417f0000000000000000000000000000000000000000000000000000000000000000846126c7565b611c4c9060016126af565b90505b825b818110611cb9576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611ca657949350505050565b5080611cb1816127fc565b915050611c51565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161086b565b60006001600160a01b0384163b15611e0d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d5e903390899088908890600401612813565b6020604051808303816000875af1925050508015611d99575060408051601f3d908101601f19168201909252611d9691810190612850565b60015b611df3573d808015611dc7576040519150601f19603f3d011682016040523d82523d6000602084013e611dcc565b606091505b508051611deb5760405162461bcd60e51b815260040161086b90612713565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115b8565b506001949350505050565b60606008805461077d90612620565b606081611e4b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e755780611e5f81612694565b9150611e6e9050600a83612883565b9150611e4f565b60008167ffffffffffffffff811115611e9057611e906123eb565b6040519080825280601f01601f191660200182016040528015611eba576020820181803683370190505b5090505b84156115b857611ecf6001836126c7565b9150611edc600a86612897565b611ee79060306126af565b60f81b818381518110611efc57611efc6126de565b60200101906001600160f81b031916908160001a905350611f1e600a86612883565b9450611ebe565b6000546001600160a01b038416611f885760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161086b565b611f93816000541190565b15611fe05760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161086b565b7f000000000000000000000000000000000000000000000000000000000000000083111561205b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161086b565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906120b79087906127d1565b6001600160801b031681526020018583602001516120d591906127d1565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156121f55760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46121b96000888488611d1a565b6121d55760405162461bcd60e51b815260040161086b90612713565b816121df81612694565b92505080806121ed90612694565b91505061216c565b50600081905561199c565b82805461220c90612620565b90600052602060002090601f01602090048101928261222e5760008555612274565b82601f1061224757805160ff1916838001178555612274565b82800160010185558215612274579182015b82811115612274578251825591602001919060010190612259565b50610e5f9291505b80821115610e5f576000815560010161227c565b6001600160e01b031981168114610a4757600080fd5b6000602082840312156122b857600080fd5b81356122c381612290565b9392505050565b60005b838110156122e55781810151838201526020016122cd565b838111156114e75750506000910152565b6000815180845261230e8160208601602086016122ca565b601f01601f19169290920160200192915050565b6020815260006122c360208301846122f6565b60006020828403121561234757600080fd5b5035919050565b80356001600160a01b038116811461236557600080fd5b919050565b6000806040838503121561237d57600080fd5b6123868361234e565b946020939093013593505050565b6000806000606084860312156123a957600080fd5b6123b28461234e565b92506123c06020850161234e565b9150604084013590509250925092565b6000602082840312156123e257600080fd5b6122c38261234e565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561241c5761241c6123eb565b604051601f8501601f19908116603f01168101908282118183101715612444576124446123eb565b8160405280935085815286868601111561245d57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561248957600080fd5b813567ffffffffffffffff8111156124a057600080fd5b8201601f810184136124b157600080fd5b6115b884823560208401612401565b600080602083850312156124d357600080fd5b823567ffffffffffffffff808211156124eb57600080fd5b818501915085601f8301126124ff57600080fd5b81358181111561250e57600080fd5b8660208260051b850101111561252357600080fd5b60209290920196919550909350505050565b6000806040838503121561254857600080fd5b6125518361234e565b91506020830135801515811461256657600080fd5b809150509250929050565b6000806000806080858703121561258757600080fd5b6125908561234e565b935061259e6020860161234e565b925060408501359150606085013567ffffffffffffffff8111156125c157600080fd5b8501601f810187136125d257600080fd5b6125e187823560208401612401565b91505092959194509250565b6000806040838503121561260057600080fd5b6126098361234e565b91506126176020840161234e565b90509250929050565b600181811c9082168061263457607f821691505b6020821081141561265557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156126a8576126a861267e565b5060010190565b600082198211156126c2576126c261267e565b500190565b6000828210156126d9576126d961267e565b500390565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161561270e5761270e61267e565b500290565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600084516127788184602089016122ca565b84519083019061278c8183602089016122ca565b845191019061279f8183602088016122ca565b0195945050505050565b60006001600160801b03838116908316818110156127c9576127c961267e565b039392505050565b60006001600160801b038083168185168083038211156127f3576127f361267e565b01949350505050565b60008161280b5761280b61267e565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612846908301846122f6565b9695505050505050565b60006020828403121561286257600080fd5b81516122c381612290565b634e487b7160e01b600052601260045260246000fd5b6000826128925761289261286d565b500490565b6000826128a6576128a661286d565b50069056fea2646970667358221220fc4b297e55dccd2481a1748612d07bbf0c9013fa265499e66415103f14350b1e64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021c5760003560e01c80635bd90b76116101225780638da5cb5b116100a5578063c87b56dd1161006c578063c87b56dd1461064b578063d5abeb011461066b578063d7224ba014610681578063e8656fcc14610697578063e985e9c5146106b857005b80638da5cb5b146105c357806395d89b41146105e3578063a0712d68146105f8578063a22cb4651461060b578063b88d4fde1461062b57005b8063740d73f3116100e9578063740d73f31461053b5780637835c6351461055b57806378835f421461056e5780637f00c7a61461058e57806389bdeec6146105ae57005b80635bd90b761461048c5780636352211e146104ad5780636c0360eb146104cd5780636f9170f6146104e257806370a082311461051b57005b806323b872dd116101aa5780633ccfd60b116101715780633ccfd60b1461040457806342842e0e1461040c57806344a0d68a1461042c5780634f6ccce71461044c57806355f804b31461046c57005b806323b872dd1461034e5780632d20fb601461036e5780632f745c591461038e5780633542aee2146103ae57806337351b0f146103ce57005b8063095ea7b3116101ee578063095ea7b3146102d8578063105739b8146102f857806313faede61461030d57806318160ddd14610323578063239c70ae1461033857005b806301f569971461022557806301ffc9a71461024e57806306fdde031461027e578063081812fc146102a057005b3661022357005b005b34801561023157600080fd5b5061023b600c5481565b6040519081526020015b60405180910390f35b34801561025a57600080fd5b5061026e6102693660046122a6565b610701565b6040519015158152602001610245565b34801561028a57600080fd5b5061029361076e565b6040516102459190612322565b3480156102ac57600080fd5b506102c06102bb366004612335565b610800565b6040516001600160a01b039091168152602001610245565b3480156102e457600080fd5b506102236102f336600461236a565b610890565b34801561030457600080fd5b506102236109a8565b34801561031957600080fd5b5061023b60095481565b34801561032f57600080fd5b5060005461023b565b34801561034457600080fd5b5061023b600b5481565b34801561035a57600080fd5b50610223610369366004612394565b610a09565b34801561037a57600080fd5b50610223610389366004612335565b610a14565b34801561039a57600080fd5b5061023b6103a936600461236a565b610a4a565b3480156103ba57600080fd5b506102236103c936600461236a565b610bb8565b3480156103da57600080fd5b5061023b6103e93660046123d0565b6001600160a01b03166000908152600f602052604090205490565b610223610d03565b34801561041857600080fd5b50610223610427366004612394565b610db7565b34801561043857600080fd5b50610223610447366004612335565b610dd2565b34801561045857600080fd5b5061023b610467366004612335565b610e01565b34801561047857600080fd5b50610223610487366004612477565b610e63565b34801561049857600080fd5b50600d5461026e90600160a01b900460ff1681565b3480156104b957600080fd5b506102c06104c8366004612335565b610ea0565b3480156104d957600080fd5b50610293610eb2565b3480156104ee57600080fd5b5061026e6104fd3660046123d0565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561052757600080fd5b5061023b6105363660046123d0565b610f40565b34801561054757600080fd5b506102236105563660046124c0565b610fd1565b610223610569366004612335565b61106d565b34801561057a57600080fd5b50610223610589366004612335565b611238565b34801561059a57600080fd5b506102236105a9366004612335565b611267565b3480156105ba57600080fd5b50610223611296565b3480156105cf57600080fd5b50600d546102c0906001600160a01b031681565b3480156105ef57600080fd5b506102936112f6565b610223610606366004612335565b611305565b34801561061757600080fd5b50610223610626366004612535565b6113ef565b34801561063757600080fd5b50610223610646366004612571565b6114b4565b34801561065757600080fd5b50610293610666366004612335565b6114ed565b34801561067757600080fd5b5061023b600a5481565b34801561068d57600080fd5b5061023b60075481565b3480156106a357600080fd5b50600d5461026e90600160a81b900460ff1681565b3480156106c457600080fd5b5061026e6106d33660046125ed565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061073257506001600160e01b03198216635b5e139f60e01b145b8061074d57506001600160e01b0319821663780e9d6360e01b145b8061076857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461077d90612620565b80601f01602080910402602001604051908101604052809291908181526020018280546107a990612620565b80156107f65780601f106107cb576101008083540402835291602001916107f6565b820191906000526020600020905b8154815290600101906020018083116107d957829003601f168201915b5050505050905090565b600061080d826000541190565b6108745760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061089b82610ea0565b9050806001600160a01b0316836001600160a01b0316141561090a5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161086b565b336001600160a01b0382161480610926575061092681336106d3565b6109985760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161086b565b6109a38383836115c0565b505050565b600d546001600160a01b031633146109d25760405162461bcd60e51b815260040161086b9061265b565b600d54600160a81b900460ff16156109f357600d805460ff60a81b19169055565b600d805461ffff60a01b1916600160a81b179055565b6109a383838361161c565b600d546001600160a01b03163314610a3e5760405162461bcd60e51b815260040161086b9061265b565b610a47816119a4565b50565b6000610a5583610f40565b8210610aae5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161086b565b600080549080805b83811015610b58576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610b0957805192505b876001600160a01b0316836001600160a01b03161415610b455786841415610b375750935061076892505050565b83610b4181612694565b9450505b5080610b5081612694565b915050610ab6565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161086b565b600d546001600160a01b03163314610be25760405162461bcd60e51b815260040161086b9061265b565b600a5481610bef60005490565b610bf991906126af565b1115610c3a5760405162461bcd60e51b815260206004820152601060248201526f6d696e74206f76657220737570706c7960801b604482015260640161086b565b7f00000000000000000000000000000000000000000000000000000000000000028111610c6f57610c6b8282611b56565b5050565b805b80156109a3577f00000000000000000000000000000000000000000000000000000000000000028111610ca8576109a38382611b56565b610cd2837f0000000000000000000000000000000000000000000000000000000000000002611b56565b610cfc7f0000000000000000000000000000000000000000000000000000000000000002826126c7565b9050610c71565b600d546001600160a01b03163314610d2d5760405162461bcd60e51b815260040161086b9061265b565b604051600090339047908381818185875af1925050503d8060008114610d6f576040519150601f19603f3d011682016040523d82523d6000602084013e610d74565b606091505b5050905080610a475760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161086b565b6109a3838383604051806020016040528060008152506114b4565b600d546001600160a01b03163314610dfc5760405162461bcd60e51b815260040161086b9061265b565b600955565b600080548210610e5f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161086b565b5090565b600d546001600160a01b03163314610e8d5760405162461bcd60e51b815260040161086b9061265b565b8051610c6b906008906020840190612200565b6000610eab82611b70565b5192915050565b60088054610ebf90612620565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb90612620565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b60006001600160a01b038216610fac5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161086b565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b600d546001600160a01b03163314610ffb5760405162461bcd60e51b815260040161086b9061265b565b60005b818110156109a3576001600e600085858581811061101e5761101e6126de565b905060200201602081019061103391906123d0565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061106581612694565b915050610ffe565b600d54600160a01b900460ff166110b95760405162461bcd60e51b815260206004820152601060248201526f70726553616c65206e6f74206c69766560801b604482015260640161086b565b336000818152600f6020908152604080832054600e9092529091205460ff166111165760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161086b565b600b5461112384836126af565b11156111615760405162461bcd60e51b815260206004820152600d60248201526c0dad2dce840deeccae440dac2f609b1b604482015260640161086b565b600a548361116e60005490565b61117891906126af565b11156111b95760405162461bcd60e51b815260206004820152601060248201526f6d696e74206f76657220737570706c7960801b604482015260640161086b565b826009546111c791906126f4565b34101561120b5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015260640161086b565b61121583826126af565b6001600160a01b0383166000908152600f60205260409020556109a33384611b56565b600d546001600160a01b031633146112625760405162461bcd60e51b815260040161086b9061265b565b600c55565b600d546001600160a01b031633146112915760405162461bcd60e51b815260040161086b9061265b565b600b55565b600d546001600160a01b031633146112c05760405162461bcd60e51b815260040161086b9061265b565b600d54600160a01b900460ff16156112e157600d805460ff60a01b19169055565b600d805460ff60a01b1916600160a01b179055565b60606002805461077d90612620565b600d54600160a81b900460ff1661134e5760405162461bcd60e51b815260206004820152600d60248201526c6d696e74206e6f74206c69766560981b604482015260640161086b565b336000818152600f6020526040902054600b5461136b84836126af565b11156113a95760405162461bcd60e51b815260206004820152600d60248201526c0dad2dce840deeccae440dac2f609b1b604482015260640161086b565b600c548311156111615760405162461bcd60e51b81526020600482015260116024820152700c2dadeeadce840daeae6e8407840dac2f607b1b604482015260640161086b565b6001600160a01b0382163314156114485760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161086b565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114bf84848461161c565b6114cb84848484611d1a565b6114e75760405162461bcd60e51b815260040161086b90612713565b50505050565b60606114fa826000541190565b6115465760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604482015260640161086b565b6000611550611e18565b604080518082019091526005815264173539b7b760d91b602082015281519192509061158b57604051806020016040528060008152506115b8565b8161159585611e27565b826040516020016115a893929190612766565b6040516020818303038152906040525b949350505050565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061162782611b70565b80519091506000906001600160a01b0316336001600160a01b0316148061165e57503361165384610800565b6001600160a01b0316145b806116705750815161167090336106d3565b9050806116da5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161086b565b846001600160a01b031682600001516001600160a01b03161461174e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161086b565b6001600160a01b0384166117b25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161086b565b6117c260008484600001516115c0565b6001600160a01b03851660009081526004602052604081208054600192906117f49084906001600160801b03166127a9565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611840918591166127d1565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556118c88460016126af565b6000818152600360205260409020549091506001600160a01b031661195a576118f2816000541190565b1561195a5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600754816119f45760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161086b565b60006001611a0284846126af565b611a0c91906126c7565b90506001600054611a1d91906126c7565b811115611a36576001600054611a3391906126c7565b90505b611a41816000541190565b611a9c5760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b606482015260840161086b565b815b818111611b42576000818152600360205260409020546001600160a01b0316611b30576000611acc82611b70565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80611b3a81612694565b915050611a9e565b50611b4e8160016126af565b600755505050565b610c6b828260405180602001604052806000815250611f25565b6040805180820190915260008082526020820152611b8f826000541190565b611bee5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161086b565b60007f00000000000000000000000000000000000000000000000000000000000000028310611c4f57611c417f0000000000000000000000000000000000000000000000000000000000000002846126c7565b611c4c9060016126af565b90505b825b818110611cb9576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611ca657949350505050565b5080611cb1816127fc565b915050611c51565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161086b565b60006001600160a01b0384163b15611e0d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d5e903390899088908890600401612813565b6020604051808303816000875af1925050508015611d99575060408051601f3d908101601f19168201909252611d9691810190612850565b60015b611df3573d808015611dc7576040519150601f19603f3d011682016040523d82523d6000602084013e611dcc565b606091505b508051611deb5760405162461bcd60e51b815260040161086b90612713565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115b8565b506001949350505050565b60606008805461077d90612620565b606081611e4b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e755780611e5f81612694565b9150611e6e9050600a83612883565b9150611e4f565b60008167ffffffffffffffff811115611e9057611e906123eb565b6040519080825280601f01601f191660200182016040528015611eba576020820181803683370190505b5090505b84156115b857611ecf6001836126c7565b9150611edc600a86612897565b611ee79060306126af565b60f81b818381518110611efc57611efc6126de565b60200101906001600160f81b031916908160001a905350611f1e600a86612883565b9450611ebe565b6000546001600160a01b038416611f885760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161086b565b611f93816000541190565b15611fe05760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161086b565b7f000000000000000000000000000000000000000000000000000000000000000283111561205b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161086b565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906120b79087906127d1565b6001600160801b031681526020018583602001516120d591906127d1565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156121f55760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46121b96000888488611d1a565b6121d55760405162461bcd60e51b815260040161086b90612713565b816121df81612694565b92505080806121ed90612694565b91505061216c565b50600081905561199c565b82805461220c90612620565b90600052602060002090601f01602090048101928261222e5760008555612274565b82601f1061224757805160ff1916838001178555612274565b82800160010185558215612274579182015b82811115612274578251825591602001919060010190612259565b50610e5f9291505b80821115610e5f576000815560010161227c565b6001600160e01b031981168114610a4757600080fd5b6000602082840312156122b857600080fd5b81356122c381612290565b9392505050565b60005b838110156122e55781810151838201526020016122cd565b838111156114e75750506000910152565b6000815180845261230e8160208601602086016122ca565b601f01601f19169290920160200192915050565b6020815260006122c360208301846122f6565b60006020828403121561234757600080fd5b5035919050565b80356001600160a01b038116811461236557600080fd5b919050565b6000806040838503121561237d57600080fd5b6123868361234e565b946020939093013593505050565b6000806000606084860312156123a957600080fd5b6123b28461234e565b92506123c06020850161234e565b9150604084013590509250925092565b6000602082840312156123e257600080fd5b6122c38261234e565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561241c5761241c6123eb565b604051601f8501601f19908116603f01168101908282118183101715612444576124446123eb565b8160405280935085815286868601111561245d57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561248957600080fd5b813567ffffffffffffffff8111156124a057600080fd5b8201601f810184136124b157600080fd5b6115b884823560208401612401565b600080602083850312156124d357600080fd5b823567ffffffffffffffff808211156124eb57600080fd5b818501915085601f8301126124ff57600080fd5b81358181111561250e57600080fd5b8660208260051b850101111561252357600080fd5b60209290920196919550909350505050565b6000806040838503121561254857600080fd5b6125518361234e565b91506020830135801515811461256657600080fd5b809150509250929050565b6000806000806080858703121561258757600080fd5b6125908561234e565b935061259e6020860161234e565b925060408501359150606085013567ffffffffffffffff8111156125c157600080fd5b8501601f810187136125d257600080fd5b6125e187823560208401612401565b91505092959194509250565b6000806040838503121561260057600080fd5b6126098361234e565b91506126176020840161234e565b90509250929050565b600181811c9082168061263457607f821691505b6020821081141561265557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156126a8576126a861267e565b5060010190565b600082198211156126c2576126c261267e565b500190565b6000828210156126d9576126d961267e565b500390565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161561270e5761270e61267e565b500290565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600084516127788184602089016122ca565b84519083019061278c8183602089016122ca565b845191019061279f8183602088016122ca565b0195945050505050565b60006001600160801b03838116908316818110156127c9576127c961267e565b039392505050565b60006001600160801b038083168185168083038211156127f3576127f361267e565b01949350505050565b60008161280b5761280b61267e565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612846908301846122f6565b9695505050505050565b60006020828403121561286257600080fd5b81516122c381612290565b634e487b7160e01b600052601260045260246000fd5b6000826128925761289261286d565b500490565b6000826128a6576128a661286d565b50069056fea2646970667358221220fc4b297e55dccd2481a1748612d07bbf0c9013fa265499e66415103f14350b1e64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : defaultBaseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

31563:4927:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31757:40;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;31757:40:0;;;;;;;;22402:372;;;;;;;;;;-1:-1:-1;22402:372:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;22402:372:0;582:187:1;24038:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25123:214::-;;;;;;;;;;-1:-1:-1;25123:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;25123:214:0;1710:203:1;24702:413:0;;;;;;;;;;-1:-1:-1;24702:413:0;;;;;:::i;:::-;;:::i;35269:197::-;;;;;;;;;;;;;:::i;31661:19::-;;;;;;;;;;;;;;;;21268:100;;;;;;;;;;-1:-1:-1;21321:7:0;21348:12;21268:100;;31718:32;;;;;;;;;;;;;;;;25813:162;;;;;;;;;;-1:-1:-1;25813:162:0;;;;;:::i;:::-;;:::i;35768:111::-;;;;;;;;;;-1:-1:-1;35768:111:0;;;;;:::i;:::-;;:::i;21571:823::-;;;;;;;;;;-1:-1:-1;21571:823:0;;;;;:::i;:::-;;:::i;34266:606::-;;;;;;;;;;-1:-1:-1;34266:606:0;;;;;:::i;:::-;;:::i;32654:122::-;;;;;;;;;;-1:-1:-1;32654:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;32749:19:0;32723:7;32749:19;;;:9;:19;;;;;;;32654:122;35580:180;;;:::i;25983:177::-;;;;;;;;;;-1:-1:-1;25983:177:0;;;;;:::i;:::-;;:::i;32784:86::-;;;;;;;;;;-1:-1:-1;32784:86:0;;;;;:::i;:::-;;:::i;21376:187::-;;;;;;;;;;-1:-1:-1;21376:187:0;;;;;:::i;:::-;;:::i;35474:98::-;;;;;;;;;;-1:-1:-1;35474:98:0;;;;;:::i;:::-;;:::i;31831:23::-;;;;;;;;;;-1:-1:-1;31831:23:0;;;;-1:-1:-1;;;31831:23:0;;;;;;23906:124;;;;;;;;;;-1:-1:-1;23906:124:0;;;;;:::i;:::-;;:::i;31633:21::-;;;;;;;;;;;;;:::i;32534:112::-;;;;;;;;;;-1:-1:-1;32534:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;32619:19:0;32596:4;32619:19;;;:9;:19;;;;;;;;;32534:112;22782:221;;;;;;;;;;-1:-1:-1;22782:221:0;;;;;:::i;:::-;;:::i;34880:194::-;;;;;;;;;;-1:-1:-1;34880:194:0;;;;;:::i;:::-;;:::i;33725:533::-;;;;;;:::i;:::-;;:::i;33008:154::-;;;;;;;;;;-1:-1:-1;33008:154:0;;;;;:::i;:::-;;:::i;32878:122::-;;;;;;;;;;-1:-1:-1;32878:122:0;;;;;:::i;:::-;;:::i;35082:179::-;;;;;;;;;;;;;:::i;31804:20::-;;;;;;;;;;-1:-1:-1;31804:20:0;;;;-1:-1:-1;;;;;31804:20:0;;;24146:104;;;;;;;;;;;;;:::i;33170:547::-;;;;;;:::i;:::-;;:::i;25345:288::-;;;;;;;;;;-1:-1:-1;25345:288:0;;;;;:::i;:::-;;:::i;26168:355::-;;;;;;;;;;-1:-1:-1;26168:355:0;;;;;:::i;:::-;;:::i;35887:407::-;;;;;;;;;;-1:-1:-1;35887:407:0;;;;;:::i;:::-;;:::i;31687:24::-;;;;;;;;;;;;;;;;29552:43;;;;;;;;;;;;;;;;31861:20;;;;;;;;;;-1:-1:-1;31861:20:0;;;;-1:-1:-1;;;31861:20:0;;;;;;25641:164;;;;;;;;;;-1:-1:-1;25641:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25762:25:0;;;25738:4;25762:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25641:164;22402:372;22504:4;-1:-1:-1;;;;;;22541:40:0;;-1:-1:-1;;;22541:40:0;;:105;;-1:-1:-1;;;;;;;22598:48:0;;-1:-1:-1;;;22598:48:0;22541:105;:172;;;-1:-1:-1;;;;;;;22663:50:0;;-1:-1:-1;;;22663:50:0;22541:172;:225;;;-1:-1:-1;;;;;;;;;;8761:40:0;;;22730:36;22521:245;22402:372;-1:-1:-1;;22402:372:0:o;24038:100::-;24092:13;24125:5;24118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24038:100;:::o;25123:214::-;25191:7;25219:16;25227:7;26588:4;26622:12;-1:-1:-1;26612:22:0;26531:111;25219:16;25211:74;;;;-1:-1:-1;;;25211:74:0;;6600:2:1;25211:74:0;;;6582:21:1;6639:2;6619:18;;;6612:30;6678:34;6658:18;;;6651:62;-1:-1:-1;;;6729:18:1;;;6722:43;6782:19;;25211:74:0;;;;;;;;;-1:-1:-1;25305:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25305:24:0;;25123:214::o;24702:413::-;24775:13;24791:24;24807:7;24791:15;:24::i;:::-;24775:40;;24840:5;-1:-1:-1;;;;;24834:11:0;:2;-1:-1:-1;;;;;24834:11:0;;;24826:58;;;;-1:-1:-1;;;24826:58:0;;7014:2:1;24826:58:0;;;6996:21:1;7053:2;7033:18;;;7026:30;7092:34;7072:18;;;7065:62;-1:-1:-1;;;7143:18:1;;;7136:32;7185:19;;24826:58:0;6812:398:1;24826:58:0;8373:10;-1:-1:-1;;;;;24919:21:0;;;;:62;;-1:-1:-1;24944:37:0;24961:5;8373:10;25641:164;:::i;24944:37::-;24897:169;;;;-1:-1:-1;;;24897:169:0;;7417:2:1;24897:169:0;;;7399:21:1;7456:2;7436:18;;;7429:30;7495:34;7475:18;;;7468:62;7566:27;7546:18;;;7539:55;7611:19;;24897:169:0;7215:421:1;24897:169:0;25079:28;25088:2;25092:7;25101:5;25079:8;:28::i;:::-;24764:351;24702:413;;:::o;35269:197::-;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;35329:8:::1;::::0;-1:-1:-1;;;35329:8:0;::::1;;;35325:78;;;35354:8;:16:::0;;-1:-1:-1;;;;35354:16:0::1;::::0;;35269:197::o;35325:78::-:1;35413:11;:19:::0;;-1:-1:-1;;;;35443:15:0;-1:-1:-1;;;35443:15:0::1;::::0;;35269:197::o;25813:162::-;25939:28;25949:4;25955:2;25959:7;25939:9;:28::i;35768:111::-;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;35843:28:::1;35862:8;35843:18;:28::i;:::-;35768:111:::0;:::o;21571:823::-;21660:7;21696:16;21706:5;21696:9;:16::i;:::-;21688:5;:24;21680:71;;;;-1:-1:-1;;;21680:71:0;;8180:2:1;21680:71:0;;;8162:21:1;8219:2;8199:18;;;8192:30;8258:34;8238:18;;;8231:62;-1:-1:-1;;;8309:18:1;;;8302:32;8351:19;;21680:71:0;7978:398:1;21680:71:0;21762:22;21348:12;;;21762:22;;21894:426;21918:14;21914:1;:18;21894:426;;;21954:31;21988:14;;;:11;:14;;;;;;;;;21954:48;;;;;;;;;-1:-1:-1;;;;;21954:48:0;;;;;-1:-1:-1;;;21954:48:0;;;;;;;;;;;;22021:28;22017:103;;22090:14;;;-1:-1:-1;22017:103:0;22159:5;-1:-1:-1;;;;;22138:26:0;:17;-1:-1:-1;;;;;22138:26:0;;22134:175;;;22204:5;22189:11;:20;22185:77;;;-1:-1:-1;22241:1:0;-1:-1:-1;22234:8:0;;-1:-1:-1;;;22234:8:0;22185:77;22280:13;;;;:::i;:::-;;;;22134:175;-1:-1:-1;21934:3:0;;;;:::i;:::-;;;;21894:426;;;-1:-1:-1;22330:56:0;;-1:-1:-1;;;22330:56:0;;8855:2:1;22330:56:0;;;8837:21:1;8894:2;8874:18;;;8867:30;8933:34;8913:18;;;8906:62;-1:-1:-1;;;8984:18:1;;;8977:44;9038:19;;22330:56:0;8653:410:1;34266:606:0;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;34390:9:::1;;34375:11;34359:13;21321:7:::0;21348:12;;21268:100;34359:13:::1;:27;;;;:::i;:::-;:40;;34351:69;;;::::0;-1:-1:-1;;;34351:69:0;;9403:2:1;34351:69:0::1;::::0;::::1;9385:21:1::0;9442:2;9422:18;;;9415:30;-1:-1:-1;;;9461:18:1;;;9454:46;9517:18;;34351:69:0::1;9201:340:1::0;34351:69:0::1;34450:12;34435:11;:27;34431:108;;34479:27;34489:3;34494:11;34479:9;:27::i;:::-;34266:606:::0;;:::o;34431:108::-:1;34580:11:::0;34602:263:::1;34609:14:::0;;34602:263:::1;;34658:12;34644:10;:26;34640:118;;34691:26;34701:3;34706:10;34691:9;:26::i;34640:118::-;34772:28;34782:3;34787:12;34772:9;:28::i;:::-;34828:25;34841:12;34828:10:::0;:25:::1;:::i;:::-;34815:38;;34602:263;;35580:180:::0;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;35657:49:::1;::::0;35639:12:::1;::::0;35657:10:::1;::::0;35680:21:::1;::::0;35639:12;35657:49;35639:12;35657:49;35680:21;35657:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35638:68;;;35725:7;35717:35;;;::::0;-1:-1:-1;;;35717:35:0;;10088:2:1;35717:35:0::1;::::0;::::1;10070:21:1::0;10127:2;10107:18;;;10100:30;-1:-1:-1;;;10146:18:1;;;10139:45;10201:18;;35717:35:0::1;9886:339:1::0;25983:177:0;26113:39;26130:4;26136:2;26140:7;26113:39;;;;;;;;;;;;:16;:39::i;32784:86::-;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;32847:4:::1;:15:::0;32784:86::o;21376:187::-;21443:7;21348:12;;21471:5;:21;21463:69;;;;-1:-1:-1;;;21463:69:0;;10432:2:1;21463:69:0;;;10414:21:1;10471:2;10451:18;;;10444:30;10510:34;10490:18;;;10483:62;-1:-1:-1;;;10561:18:1;;;10554:33;10604:19;;21463:69:0;10230:399:1;21463:69:0;-1:-1:-1;21550:5:0;21376:187::o;35474:98::-;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;35547:17;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;23906:124::-:0;23970:7;23997:20;24009:7;23997:11;:20::i;:::-;:25;;23906:124;-1:-1:-1;;23906:124:0:o;31633:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22782:221::-;22846:7;-1:-1:-1;;;;;22874:19:0;;22866:75;;;;-1:-1:-1;;;22866:75:0;;10836:2:1;22866:75:0;;;10818:21:1;10875:2;10855:18;;;10848:30;10914:34;10894:18;;;10887:62;-1:-1:-1;;;10965:18:1;;;10958:41;11016:19;;22866:75:0;10634:407:1;22866:75:0;-1:-1:-1;;;;;;22967:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;22967:27:0;;22782:221::o;34880:194::-;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;34970:9:::1;34965:102;34981:21:::0;;::::1;34965:102;;;35051:4;35024:9;:24;35034:10;;35045:1;35034:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35024:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35024:24:0;:31;;-1:-1:-1;;35024:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35004:3;::::1;::::0;::::1;:::i;:::-;;;;34965:102;;33725:533:::0;32138:11;;-1:-1:-1;;;32138:11:0;;;;32130:40;;;;-1:-1:-1;;;32130:40:0;;11380:2:1;32130:40:0;;;11362:21:1;11419:2;11399:18;;;11392:30;-1:-1:-1;;;11438:18:1;;;11431:46;11494:18;;32130:40:0;11178:340:1;32130:40:0;33823:10:::1;33809:11;33861:14:::0;;;:9:::1;:14;::::0;;;;;;;;33894:9:::1;:14:::0;;;;;;;::::1;;33886:42;;;::::0;-1:-1:-1;;;33886:42:0;;11725:2:1;33886:42:0::1;::::0;::::1;11707:21:1::0;11764:2;11744:18;;;11737:30;-1:-1:-1;;;11783:18:1;;;11776:45;11838:18;;33886:42:0::1;11523:339:1::0;33886:42:0::1;33971:13;::::0;33947:20:::1;33956:11:::0;33947:6;:20:::1;:::i;:::-;:37;;33939:63;;;::::0;-1:-1:-1;;;33939:63:0;;12069:2:1;33939:63:0::1;::::0;::::1;12051:21:1::0;12108:2;12088:18;;;12081:30;-1:-1:-1;;;12127:18:1;;;12120:43;12180:18;;33939:63:0::1;11867:337:1::0;33939:63:0::1;34052:9;;34037:11;34021:13;21321:7:::0;21348:12;;21268:100;34021:13:::1;:27;;;;:::i;:::-;:40;;34013:69;;;::::0;-1:-1:-1;;;34013:69:0;;9403:2:1;34013:69:0::1;::::0;::::1;9385:21:1::0;9442:2;9422:18;;;9415:30;-1:-1:-1;;;9461:18:1;;;9454:46;9517:18;;34013:69:0::1;9201:340:1::0;34013:69:0::1;34121:11;34114:4;;:18;;;;:::i;:::-;34101:9;:31;;34093:62;;;::::0;-1:-1:-1;;;34093:62:0;;12584:2:1;34093:62:0::1;::::0;::::1;12566:21:1::0;12623:2;12603:18;;;12596:30;-1:-1:-1;;;12642:18:1;;;12635:48;12700:18;;34093:62:0::1;12382:342:1::0;34093:62:0::1;34185:20;34194:11:::0;34185:6;:20:::1;:::i;:::-;-1:-1:-1::0;;;;;34168:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;:37;34216:34:::1;34226:10;34238:11:::0;34216:9:::1;:34::i;33008:154::-:0;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;33105:21:::1;:49:::0;33008:154::o;32878:122::-;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;32959:13:::1;:33:::0;32878:122::o;35082:179::-;32033:5;;-1:-1:-1;;;;;32033:5:0;32042:10;32033:19;32025:41;;;;-1:-1:-1;;;32025:41:0;;;;;;;:::i;:::-;35145:11:::1;::::0;-1:-1:-1;;;35145:11:0;::::1;;;35141:84;;;35173:11;:19:::0;;-1:-1:-1;;;;35173:19:0::1;::::0;;35269:197::o;35141:84::-:1;35235:11;:18:::0;;-1:-1:-1;;;;35235:18:0::1;-1:-1:-1::0;;;35235:18:0::1;::::0;;35082:179::o;24146:104::-;24202:13;24235:7;24228:14;;;;;:::i;33170:547::-;32239:8;;-1:-1:-1;;;32239:8:0;;;;32231:34;;;;-1:-1:-1;;;32231:34:0;;12931:2:1;32231:34:0;;;12913:21:1;12970:2;12950:18;;;12943:30;-1:-1:-1;;;12989:18:1;;;12982:43;13042:18;;32231:34:0;12729:337:1;32231:34:0;33258:10:::1;33244:11;33296:14:::0;;;:9:::1;:14;::::0;;;;;33353:13:::1;::::0;33329:20:::1;33338:11:::0;33296:14;33329:20:::1;:::i;:::-;:37;;33321:63;;;::::0;-1:-1:-1;;;33321:63:0;;12069:2:1;33321:63:0::1;::::0;::::1;12051:21:1::0;12108:2;12088:18;;;12081:30;-1:-1:-1;;;12127:18:1;;;12120:43;12180:18;;33321:63:0::1;11867:337:1::0;33321:63:0::1;33418:21;;33403:11;:36;;33395:66;;;::::0;-1:-1:-1;;;33395:66:0;;13273:2:1;33395:66:0::1;::::0;::::1;13255:21:1::0;13312:2;13292:18;;;13285:30;-1:-1:-1;;;13331:18:1;;;13324:47;13388:18;;33395:66:0::1;13071:341:1::0;25345:288:0;-1:-1:-1;;;;;25440:24:0;;8373:10;25440:24;;25432:63;;;;-1:-1:-1;;;25432:63:0;;13619:2:1;25432:63:0;;;13601:21:1;13658:2;13638:18;;;13631:30;13697:28;13677:18;;;13670:56;13743:18;;25432:63:0;13417:350:1;25432:63:0;8373:10;25508:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25508:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25508:53:0;;;;;;;;;;25577:48;;722:41:1;;;25508:42:0;;8373:10;25577:48;;695:18:1;25577:48:0;;;;;;;25345:288;;:::o;26168:355::-;26327:28;26337:4;26343:2;26347:7;26327:9;:28::i;:::-;26388:48;26411:4;26417:2;26421:7;26430:5;26388:22;:48::i;:::-;26366:149;;;;-1:-1:-1;;;26366:149:0;;;;;;;:::i;:::-;26168:355;;;;:::o;35887:407::-;35961:13;35995:17;36003:8;26588:4;26622:12;-1:-1:-1;26612:22:0;26531:111;35995:17;35987:61;;;;-1:-1:-1;;;35987:61:0;;14394:2:1;35987:61:0;;;14376:21:1;14433:2;14413:18;;;14406:30;14472:33;14452:18;;;14445:61;14523:18;;35987:61:0;14192:355:1;35987:61:0;36061:26;36090:10;:8;:10::i;:::-;36111:28;;;;;;;;;;;;-1:-1:-1;;;36111:28:0;;;;36157:26;;36061:39;;-1:-1:-1;36111:28:0;36157:129;;;;;;;;;;;;;;;;;36227:12;36241:19;:8;:17;:19::i;:::-;36262:4;36210:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36157:129;36150:136;35887:407;-1:-1:-1;;;;35887:407:0:o;29348:196::-;29463:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;29463:29:0;-1:-1:-1;;;;;29463:29:0;;;;;;;;;29508:28;;29463:24;;29508:28;;;;;;;29348:196;;;:::o;28045:1295::-;28160:35;28198:20;28210:7;28198:11;:20::i;:::-;28273:18;;28160:58;;-1:-1:-1;28231:22:0;;-1:-1:-1;;;;;28257:34:0;8373:10;-1:-1:-1;;;;;28257:34:0;;:87;;;-1:-1:-1;8373:10:0;28308:20;28320:7;28308:11;:20::i;:::-;-1:-1:-1;;;;;28308:36:0;;28257:87;:154;;;-1:-1:-1;28378:18:0;;28361:50;;8373:10;25641:164;:::i;28361:50::-;28231:181;;28433:17;28425:80;;;;-1:-1:-1;;;28425:80:0;;15423:2:1;28425:80:0;;;15405:21:1;15462:2;15442:18;;;15435:30;15501:34;15481:18;;;15474:62;-1:-1:-1;;;15552:18:1;;;15545:48;15610:19;;28425:80:0;15221:414:1;28425:80:0;28548:4;-1:-1:-1;;;;;28526:26:0;:13;:18;;;-1:-1:-1;;;;;28526:26:0;;28518:77;;;;-1:-1:-1;;;28518:77:0;;15842:2:1;28518:77:0;;;15824:21:1;15881:2;15861:18;;;15854:30;15920:34;15900:18;;;15893:62;-1:-1:-1;;;15971:18:1;;;15964:36;16017:19;;28518:77:0;15640:402:1;28518:77:0;-1:-1:-1;;;;;28614:16:0;;28606:66;;;;-1:-1:-1;;;28606:66:0;;16249:2:1;28606:66:0;;;16231:21:1;16288:2;16268:18;;;16261:30;16327:34;16307:18;;;16300:62;-1:-1:-1;;;16378:18:1;;;16371:35;16423:19;;28606:66:0;16047:401:1;28606:66:0;28741:49;28758:1;28762:7;28771:13;:18;;;28741:8;:49::i;:::-;-1:-1:-1;;;;;28803:18:0;;;;;;:12;:18;;;;;:31;;28833:1;;28803:18;:31;;28833:1;;-1:-1:-1;;;;;28803:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;28803:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28845:16:0;;-1:-1:-1;28845:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;28845:16:0;;:29;;-1:-1:-1;;28845:29:0;;:::i;:::-;;;-1:-1:-1;;;;;28845:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28908:43:0;;;;;;;;-1:-1:-1;;;;;28908:43:0;;;;;;28934:15;28908:43;;;;;;;;;-1:-1:-1;28885:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;28885:66:0;-1:-1:-1;;;;;;28885:66:0;;;;;;;;;;;28986:11;28897:7;-1:-1:-1;28986:11:0;:::i;:::-;29053:1;29012:24;;;:11;:24;;;;;:29;28964:33;;-1:-1:-1;;;;;;29012:29:0;29008:227;;29076:20;29084:11;26588:4;26622:12;-1:-1:-1;26612:22:0;26531:111;29076:20;29072:152;;;29144:64;;;;;;;;29159:18;;-1:-1:-1;;;;;29144:64:0;;;;;;29179:28;;;;29144:64;;;;;;;;;;-1:-1:-1;29117:24:0;;;:11;:24;;;;;;;:91;;;;;;;;;-1:-1:-1;;;29117:91:0;-1:-1:-1;;;;;;29117:91:0;;;;;;;;;;;;29072:152;29271:7;29267:2;-1:-1:-1;;;;;29252:27:0;29261:4;-1:-1:-1;;;;;29252:27:0;;;;;;;;;;;29290:42;28149:1191;;;28045:1295;;;:::o;29604:780::-;29698:24;;29741:12;29733:49;;;;-1:-1:-1;;;29733:49:0;;17164:2:1;29733:49:0;;;17146:21:1;17203:2;17183:18;;;17176:30;17242:26;17222:18;;;17215:54;17286:18;;29733:49:0;16962:348:1;29733:49:0;29793:16;29843:1;29812:28;29832:8;29812:17;:28;:::i;:::-;:32;;;;:::i;:::-;29793:51;;29885:1;29870:12;;:16;;;;:::i;:::-;29859:8;:27;29855:87;;;29929:1;29914:12;;:16;;;;:::i;:::-;29903:27;;29855:87;29960:17;29968:8;26588:4;26622:12;-1:-1:-1;26612:22:0;26531:111;29960:17;29952:68;;;;-1:-1:-1;;;29952:68:0;;17517:2:1;29952:68:0;;;17499:21:1;17556:2;17536:18;;;17529:30;17595:34;17575:18;;;17568:62;-1:-1:-1;;;17646:18:1;;;17639:36;17692:19;;29952:68:0;17315:402:1;29952:68:0;30048:17;30031:296;30072:8;30067:1;:13;30031:296;;30137:1;30106:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;30106:19:0;30102:214;;30160:31;30194:14;30206:1;30194:11;:14::i;:::-;30244:56;;;;;;;;30259:14;;-1:-1:-1;;;;;30244:56:0;;;;;;30275:24;;;;30244:56;;;;;;;;;;-1:-1:-1;30227:14:0;;;:11;:14;;;;;;;:73;;;;;;;;;-1:-1:-1;;;30227:73:0;-1:-1:-1;;;;;;30227:73:0;;;;;;;;;;;;-1:-1:-1;30102:214:0;30082:3;;;;:::i;:::-;;;;30031:296;;;-1:-1:-1;30364:12:0;:8;30375:1;30364:12;:::i;:::-;30337:24;:39;-1:-1:-1;;;29604:780:0:o;26650:104::-;26719:27;26729:2;26733:8;26719:27;;;;;;;;;;;;:9;:27::i;23248:650::-;-1:-1:-1;;;;;;;;;;;;;;;;;23351:16:0;23359:7;26588:4;26622:12;-1:-1:-1;26612:22:0;26531:111;23351:16;23343:71;;;;-1:-1:-1;;;23343:71:0;;17924:2:1;23343:71:0;;;17906:21:1;17963:2;17943:18;;;17936:30;18002:34;17982:18;;;17975:62;-1:-1:-1;;;18053:18:1;;;18046:40;18103:19;;23343:71:0;17722:406:1;23343:71:0;23427:26;23479:12;23468:7;:23;23464:103;;23529:22;23539:12;23529:7;:22;:::i;:::-;:26;;23554:1;23529:26;:::i;:::-;23508:47;;23464:103;23599:7;23579:242;23616:18;23608:4;:26;23579:242;;23659:31;23693:17;;;:11;:17;;;;;;;;;23659:51;;;;;;;;;-1:-1:-1;;;;;23659:51:0;;;;;-1:-1:-1;;;23659:51:0;;;;;;;;;;;;23729:28;23725:85;;23785:9;23248:650;-1:-1:-1;;;;23248:650:0:o;23725:85::-;-1:-1:-1;23636:6:0;;;;:::i;:::-;;;;23579:242;;;-1:-1:-1;23833:57:0;;-1:-1:-1;;;23833:57:0;;18476:2:1;23833:57:0;;;18458:21:1;18515:2;18495:18;;;18488:30;18554:34;18534:18;;;18527:62;-1:-1:-1;;;18605:18:1;;;18598:45;18660:19;;23833:57:0;18274:411:1;30392:804:0;30547:4;-1:-1:-1;;;;;30568:13:0;;279:20;327:8;30564:625;;30604:72;;-1:-1:-1;;;30604:72:0;;-1:-1:-1;;;;;30604:36:0;;;;;:72;;8373:10;;30655:4;;30661:7;;30670:5;;30604:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30604:72:0;;;;;;;;-1:-1:-1;;30604:72:0;;;;;;;;;;;;:::i;:::-;;;30600:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30850:13:0;;30846:273;;30893:61;;-1:-1:-1;;;30893:61:0;;;;;;;:::i;30846:273::-;31069:6;31063:13;31054:6;31050:2;31046:15;31039:38;30600:534;-1:-1:-1;;;;;;30727:55:0;-1:-1:-1;;;30727:55:0;;-1:-1:-1;30720:62:0;;30564:625;-1:-1:-1;31173:4:0;30392:804;;;;;;:::o;36302:108::-;36362:13;36395:7;36388:14;;;;;:::i;3852:534::-;3908:13;3940:10;3936:53;;-1:-1:-1;;3967:10:0;;;;;;;;;;;;-1:-1:-1;;;3967:10:0;;;;;3852:534::o;3936:53::-;4014:5;3999:12;4055:78;4062:9;;4055:78;;4088:8;;;;:::i;:::-;;-1:-1:-1;4111:10:0;;-1:-1:-1;4119:2:0;4111:10;;:::i;:::-;;;4055:78;;;4143:19;4175:6;4165:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4165:17:0;;4143:39;;4193:154;4200:10;;4193:154;;4227:11;4237:1;4227:11;;:::i;:::-;;-1:-1:-1;4296:10:0;4304:2;4296:5;:10;:::i;:::-;4283:24;;:2;:24;:::i;:::-;4270:39;;4253:6;4260;4253:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4253:56:0;;;;;;;;-1:-1:-1;4324:11:0;4333:2;4324:11;;:::i;:::-;;;4193:154;;26762:1275;26885:20;26908:12;-1:-1:-1;;;;;26939:16:0;;26931:62;;;;-1:-1:-1;;;26931:62:0;;20014:2:1;26931:62:0;;;19996:21:1;20053:2;20033:18;;;20026:30;20092:34;20072:18;;;20065:62;-1:-1:-1;;;20143:18:1;;;20136:31;20184:19;;26931:62:0;19812:397:1;26931:62:0;27013:21;27021:12;26588:4;26622:12;-1:-1:-1;26612:22:0;26531:111;27013:21;27012:22;27004:64;;;;-1:-1:-1;;;27004:64:0;;20416:2:1;27004:64:0;;;20398:21:1;20455:2;20435:18;;;20428:30;20494:31;20474:18;;;20467:59;20543:18;;27004:64:0;20214:353:1;27004:64:0;27099:12;27087:8;:24;;27079:71;;;;-1:-1:-1;;;27079:71:0;;20774:2:1;27079:71:0;;;20756:21:1;20813:2;20793:18;;;20786:30;20852:34;20832:18;;;20825:62;-1:-1:-1;;;20903:18:1;;;20896:32;20945:19;;27079:71:0;20572:398:1;27079:71:0;-1:-1:-1;;;;;27270:16:0;;27237:30;27270:16;;;:12;:16;;;;;;;;;27237:49;;;;;;;;;-1:-1:-1;;;;;27237:49:0;;;;;-1:-1:-1;;;27237:49:0;;;;;;;;;;;27316:135;;;;;;;;27342:19;;27237:49;;27316:135;;;27342:39;;27372:8;;27342:39;:::i;:::-;-1:-1:-1;;;;;27316:135:0;;;;;27431:8;27396:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;27316:135:0;;;;;;-1:-1:-1;;;;;27297:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;27297:154:0;;;;;;;;;;;;27490:43;;;;;;;;;;;27516:15;27490:43;;;;;;;;27462:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;27462:71:0;-1:-1:-1;;;;;;27462:71:0;;;;;;;;;;;;;;;;;;27474:12;;27594:325;27618:8;27614:1;:12;27594:325;;;27653:38;;27678:12;;-1:-1:-1;;;;;27653:38:0;;;27670:1;;27653:38;;27670:1;;27653:38;27732:59;27763:1;27767:2;27771:12;27785:5;27732:22;:59::i;:::-;27706:172;;;;-1:-1:-1;;;27706:172:0;;;;;;;:::i;:::-;27893:14;;;;:::i;:::-;;;;27628:3;;;;;:::i;:::-;;;;27594:325;;;-1:-1:-1;27931:12:0;:27;;;27969:60;26168:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;:::-;566:5;332:245;-1:-1:-1;;;332:245:1:o;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:1;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:1:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:1;;1525:180;-1:-1:-1;1525:180:1:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:1;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;2879:127::-;2940:10;2935:3;2931:20;2928:1;2921:31;2971:4;2968:1;2961:15;2995:4;2992:1;2985:15;3011:632;3076:5;3106:18;3147:2;3139:6;3136:14;3133:40;;;3153:18;;:::i;:::-;3228:2;3222:9;3196:2;3282:15;;-1:-1:-1;;3278:24:1;;;3304:2;3274:33;3270:42;3258:55;;;3328:18;;;3348:22;;;3325:46;3322:72;;;3374:18;;:::i;:::-;3414:10;3410:2;3403:22;3443:6;3434:15;;3473:6;3465;3458:22;3513:3;3504:6;3499:3;3495:16;3492:25;3489:45;;;3530:1;3527;3520:12;3489:45;3580:6;3575:3;3568:4;3560:6;3556:17;3543:44;3635:1;3628:4;3619:6;3611;3607:19;3603:30;3596:41;;;;3011:632;;;;;:::o;3648:451::-;3717:6;3770:2;3758:9;3749:7;3745:23;3741:32;3738:52;;;3786:1;3783;3776:12;3738:52;3826:9;3813:23;3859:18;3851:6;3848:30;3845:50;;;3891:1;3888;3881:12;3845:50;3914:22;;3967:4;3959:13;;3955:27;-1:-1:-1;3945:55:1;;3996:1;3993;3986:12;3945:55;4019:74;4085:7;4080:2;4067:16;4062:2;4058;4054:11;4019:74;:::i;4104:615::-;4190:6;4198;4251:2;4239:9;4230:7;4226:23;4222:32;4219:52;;;4267:1;4264;4257:12;4219:52;4307:9;4294:23;4336:18;4377:2;4369:6;4366:14;4363:34;;;4393:1;4390;4383:12;4363:34;4431:6;4420:9;4416:22;4406:32;;4476:7;4469:4;4465:2;4461:13;4457:27;4447:55;;4498:1;4495;4488:12;4447:55;4538:2;4525:16;4564:2;4556:6;4553:14;4550:34;;;4580:1;4577;4570:12;4550:34;4633:7;4628:2;4618:6;4615:1;4611:14;4607:2;4603:23;4599:32;4596:45;4593:65;;;4654:1;4651;4644:12;4593:65;4685:2;4677:11;;;;;4707:6;;-1:-1:-1;4104:615:1;;-1:-1:-1;;;;4104:615:1:o;4724:347::-;4789:6;4797;4850:2;4838:9;4829:7;4825:23;4821:32;4818:52;;;4866:1;4863;4856:12;4818:52;4889:29;4908:9;4889:29;:::i;:::-;4879:39;;4968:2;4957:9;4953:18;4940:32;5015:5;5008:13;5001:21;4994:5;4991:32;4981:60;;5037:1;5034;5027:12;4981:60;5060:5;5050:15;;;4724:347;;;;;:::o;5076:667::-;5171:6;5179;5187;5195;5248:3;5236:9;5227:7;5223:23;5219:33;5216:53;;;5265:1;5262;5255:12;5216:53;5288:29;5307:9;5288:29;:::i;:::-;5278:39;;5336:38;5370:2;5359:9;5355:18;5336:38;:::i;:::-;5326:48;;5421:2;5410:9;5406:18;5393:32;5383:42;;5476:2;5465:9;5461:18;5448:32;5503:18;5495:6;5492:30;5489:50;;;5535:1;5532;5525:12;5489:50;5558:22;;5611:4;5603:13;;5599:27;-1:-1:-1;5589:55:1;;5640:1;5637;5630:12;5589:55;5663:74;5729:7;5724:2;5711:16;5706:2;5702;5698:11;5663:74;:::i;:::-;5653:84;;;5076:667;;;;;;;:::o;5748:260::-;5816:6;5824;5877:2;5865:9;5856:7;5852:23;5848:32;5845:52;;;5893:1;5890;5883:12;5845:52;5916:29;5935:9;5916:29;:::i;:::-;5906:39;;5964:38;5998:2;5987:9;5983:18;5964:38;:::i;:::-;5954:48;;5748:260;;;;;:::o;6013:380::-;6092:1;6088:12;;;;6135;;;6156:61;;6210:4;6202:6;6198:17;6188:27;;6156:61;6263:2;6255:6;6252:14;6232:18;6229:38;6226:161;;;6309:10;6304:3;6300:20;6297:1;6290:31;6344:4;6341:1;6334:15;6372:4;6369:1;6362:15;6226:161;;6013:380;;;:::o;7641:332::-;7843:2;7825:21;;;7882:1;7862:18;;;7855:29;-1:-1:-1;;;7915:2:1;7900:18;;7893:39;7964:2;7949:18;;7641:332::o;8381:127::-;8442:10;8437:3;8433:20;8430:1;8423:31;8473:4;8470:1;8463:15;8497:4;8494:1;8487:15;8513:135;8552:3;-1:-1:-1;;8573:17:1;;8570:43;;;8593:18;;:::i;:::-;-1:-1:-1;8640:1:1;8629:13;;8513:135::o;9068:128::-;9108:3;9139:1;9135:6;9132:1;9129:13;9126:39;;;9145:18;;:::i;:::-;-1:-1:-1;9181:9:1;;9068:128::o;9546:125::-;9586:4;9614:1;9611;9608:8;9605:34;;;9619:18;;:::i;:::-;-1:-1:-1;9656:9:1;;9546:125::o;11046:127::-;11107:10;11102:3;11098:20;11095:1;11088:31;11138:4;11135:1;11128:15;11162:4;11159:1;11152:15;12209:168;12249:7;12315:1;12311;12307:6;12303:14;12300:1;12297:21;12292:1;12285:9;12278:17;12274:45;12271:71;;;12322:18;;:::i;:::-;-1:-1:-1;12362:9:1;;12209:168::o;13772:415::-;13974:2;13956:21;;;14013:2;13993:18;;;13986:30;14052:34;14047:2;14032:18;;14025:62;-1:-1:-1;;;14118:2:1;14103:18;;14096:49;14177:3;14162:19;;13772:415::o;14552:664::-;14779:3;14817:6;14811:13;14833:53;14879:6;14874:3;14867:4;14859:6;14855:17;14833:53;:::i;:::-;14949:13;;14908:16;;;;14971:57;14949:13;14908:16;15005:4;14993:17;;14971:57;:::i;:::-;15095:13;;15050:20;;;15117:57;15095:13;15050:20;15151:4;15139:17;;15117:57;:::i;:::-;15190:20;;14552:664;-1:-1:-1;;;;;14552:664:1:o;16453:246::-;16493:4;-1:-1:-1;;;;;16606:10:1;;;;16576;;16628:12;;;16625:38;;;16643:18;;:::i;:::-;16680:13;;16453:246;-1:-1:-1;;;16453:246:1:o;16704:253::-;16744:3;-1:-1:-1;;;;;16833:2:1;16830:1;16826:10;16863:2;16860:1;16856:10;16894:3;16890:2;16886:12;16881:3;16878:21;16875:47;;;16902:18;;:::i;:::-;16938:13;;16704:253;-1:-1:-1;;;;16704:253:1:o;18133:136::-;18172:3;18200:5;18190:39;;18209:18;;:::i;:::-;-1:-1:-1;;;18245:18:1;;18133:136::o;18690:489::-;-1:-1:-1;;;;;18959:15:1;;;18941:34;;19011:15;;19006:2;18991:18;;18984:43;19058:2;19043:18;;19036:34;;;19106:3;19101:2;19086:18;;19079:31;;;18884:4;;19127:46;;19153:19;;19145:6;19127:46;:::i;:::-;19119:54;18690:489;-1:-1:-1;;;;;;18690:489:1:o;19184:249::-;19253:6;19306:2;19294:9;19285:7;19281:23;19277:32;19274:52;;;19322:1;19319;19312:12;19274:52;19354:9;19348:16;19373:30;19397:5;19373:30;:::i;19438:127::-;19499:10;19494:3;19490:20;19487:1;19480:31;19530:4;19527:1;19520:15;19554:4;19551:1;19544:15;19570:120;19610:1;19636;19626:35;;19641:18;;:::i;:::-;-1:-1:-1;19675:9:1;;19570:120::o;19695:112::-;19727:1;19753;19743:35;;19758:18;;:::i;:::-;-1:-1:-1;19792:9:1;;19695:112::o

Swarm Source

ipfs://fc4b297e55dccd2481a1748612d07bbf0c9013fa265499e66415103f14350b1e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.