ETH Price: $3,642.72 (-0.46%)
 

Overview

Max Total Supply

200 BSM

Holders

75

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BSM
0x7bfc21ad9155bcc661cbd5ebb57539c7b92620d6
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:
BlockSeedMunks

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 12 : BlockSeedMunks.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

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

contract BlockSeedMunks is ERC721A, Ownable{
    using Strings for uint256;

    uint256 public constant MaxSupply = 3000;
    uint256 public  QtyPerPublicMint = 10;
    uint256 public  QtyPerWhitelistMint = 10;
    uint256 public  MaxPerPublicWallet = 3000;
    uint256 public  MaxPerWhiteListWallet = 3000;
    uint256 public  PublicSalePrice = 0.1 ether;
    uint256 public  WhitelistSalePrice = 0.067 ether;

    uint256 public MaxMintPhase1 = 200;
    uint256 public MaxMintPhase2 = 1000;
    uint256 public MaxMintPhase3 = 2000;
    uint256 public MaxMintPhase4 = MaxSupply;

    string private  baseTokenUri;
    string public   placeholderTokenUri;

    bool public isRevealed;
    bool public publicSale;
    bool public whiteListSale;
    bool public pause = true;
    bool public teamMinted;
    bool public Phase1;
    bool public Phase2;
    bool public Phase3;
    bool public Phase4;

    mapping(address=>bool) public whiteListedAddress;

    mapping(address => uint256) public totalPublicMint;
    mapping(address => uint256) public totalWhitelistMint;

    constructor() ERC721A("BLOCKSEED MUNKS", "BSM"){

    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "BlockSeedMunks :: Cannot be called by a contract");
        _;
    }

    function mint(uint256 _quantity) external payable callerIsUser{
        if(whiteListSale || publicSale && Phase1){
            
            if (!whiteListedAddress[msg.sender] && publicSale){
                require(publicSale, "BlockSeedMunks :: Minting is on Pause.");
                require((totalSupply() + _quantity) <= MaxMintPhase1, "BlockSeedMunks :: Cannot mint beyond phase 1 supply");
                require((totalPublicMint[msg.sender]  +_quantity) <= QtyPerPublicMint, "BlockSeedMunks :: Cannot mint beyond public max mint!");
                require(msg.value >= (PublicSalePrice * _quantity), "BlockSeedMunks :: Payment is below the price ");
                require(_quantity + balanceOf(msg.sender) <= MaxPerPublicWallet , "BlockSeedMunks :: You can not mint more than the maximum allowed per user.");


                totalPublicMint[msg.sender] += _quantity;
                _safeMint(msg.sender, _quantity);
            }
            else if (whiteListedAddress[msg.sender] && whiteListSale){
                require(whiteListSale, "BlockSeedMunks :: Minting is on Pause");
                require((totalSupply() + _quantity) <= MaxMintPhase1, "BlockSeedMunks :: Cannot mint beyond phase 1 supply");
                require((totalWhitelistMint[msg.sender] + _quantity)  <= QtyPerWhitelistMint, "BlockSeedMunks:: Cannot mint beyond whitelist max mint!");
                require(msg.value >= (WhitelistSalePrice * _quantity), "BlockSeedMunks :: Payment is below the price");
                require(_quantity + balanceOf(msg.sender) <= MaxPerWhiteListWallet , "BlockSeedMunks :: You can not mint more than the maximum allowed per user.");
                require(whiteListedAddress[msg.sender], "BlockSeedMunks :: Sorry you are not white listed!");

                totalWhitelistMint[msg.sender] += _quantity;
                _safeMint(msg.sender, _quantity);
            }
        }
        else if (publicSale || whiteListSale && Phase2){

            if (!whiteListedAddress[msg.sender] && publicSale){
                require(publicSale, "BlockSeedMunks :: Minting is on Pause.");
                require((totalSupply() + _quantity) <= MaxMintPhase2, "BlockSeedMunks :: Cannot mint beyond phase 2 supply");
                require((totalPublicMint[msg.sender]  +_quantity) <= QtyPerPublicMint, "BlockSeedMunks :: Cannot mint beyond public max mint!");
                require(msg.value >= (PublicSalePrice * _quantity), "BlockSeedMunks :: Payment is below the price ");
                require(_quantity + balanceOf(msg.sender) <= MaxPerPublicWallet , "BlockSeedMunks :: You can not mint more than the maximum allowed per user.");


                totalPublicMint[msg.sender] += _quantity;
                _safeMint(msg.sender, _quantity);
            }
            else if (whiteListedAddress[msg.sender] && whiteListSale){
                require(whiteListSale, "BlockSeedMunks :: Minting is on Pause");
                require((totalSupply() + _quantity) <= MaxMintPhase2, "BlockSeedMunks :: Cannot mint beyond phase 2 supply");
                require((totalWhitelistMint[msg.sender] + _quantity)  <= QtyPerWhitelistMint, "BlockSeedMunks:: Cannot mint beyond whitelist max mint!");
                require(msg.value >= (WhitelistSalePrice * _quantity), "BlockSeedMunks :: Payment is below the price");
                require(_quantity + balanceOf(msg.sender) <= MaxPerWhiteListWallet , "BlockSeedMunks :: You can not mint more than the maximum allowed per user.");
                require(whiteListedAddress[msg.sender], "BlockSeedMunks :: Sorry you are not white listed!");

                totalWhitelistMint[msg.sender] += _quantity;
                _safeMint(msg.sender, _quantity);
            }
            
        }
        else if (publicSale || whiteListSale && Phase3){

            if (!whiteListedAddress[msg.sender] && publicSale){
                require(publicSale, "BlockSeedMunks :: Minting is on Pause.");
                require((totalSupply() + _quantity) <= MaxMintPhase3, "BlockSeedMunks :: Beyond phase 3 Supply");
                require((totalPublicMint[msg.sender] +_quantity) <= QtyPerPublicMint, "BlockSeedMunks :: Cannot mint beyond public max mint!");
                require(msg.value >= (PublicSalePrice * _quantity), "BlockSeedMunks :: Payment is below the price ");
                require(_quantity + balanceOf(msg.sender) <= MaxPerPublicWallet , "BlockSeedMunks :: You can not mint more than the maximum allowed per user.");


                totalPublicMint[msg.sender] += _quantity;
                _safeMint(msg.sender, _quantity);
            }  
            else if (whiteListedAddress[msg.sender] && whiteListSale){
                require(whiteListSale, "BlockSeedMunks :: Minting is on Pause");
                require((totalSupply() + _quantity) <= MaxMintPhase3, "BlockSeedMunks :: Cannot mint beyond phase 3 supply");
                require((totalWhitelistMint[msg.sender] + _quantity)  <= QtyPerWhitelistMint, "BlockSeedMunks:: Cannot mint beyond whitelist max mint!");
                require(msg.value >= (WhitelistSalePrice * _quantity), "BlockSeedMunks :: Payment is below the price");
                require(_quantity + balanceOf(msg.sender) <= MaxPerWhiteListWallet , "BlockSeedMunks :: You can not mint more than the maximum allowed per user.");
                require(whiteListedAddress[msg.sender], "BlockSeedMunks :: Sorry you are not white listed!");

                totalWhitelistMint[msg.sender] += _quantity;
                _safeMint(msg.sender, _quantity);
            }
        }
        else if (publicSale || whiteListSale && Phase4){

            if (!whiteListedAddress[msg.sender] && publicSale){
                require(publicSale, "BlockSeedMunks :: Minting is on Pause.");
                require((totalSupply() + _quantity) <= MaxSupply, "BlockSeedMunks :: Cannot mint beyond total Supply");
                require((totalPublicMint[msg.sender] +_quantity) <= QtyPerPublicMint, "BlockSeedMunks :: Cannot mint beyond public max mint!");
                require(msg.value >= (PublicSalePrice * _quantity), "BlockSeedMunks :: Payment is below the price ");
                require(_quantity + balanceOf(msg.sender) <= MaxPerPublicWallet , "BlockSeedMunks :: You can not mint more than the maximum allowed per user.");


                totalPublicMint[msg.sender] += _quantity;
                _safeMint(msg.sender, _quantity);
            }            
            else if (whiteListedAddress[msg.sender] && whiteListSale){
                require(whiteListSale, "BlockSeedMunks :: Minting is on Pause");
                require((totalSupply() + _quantity) <= MaxSupply, "BlockSeedMunks :: Cannot mint beyond phase total Supply");
                require((totalWhitelistMint[msg.sender] + _quantity)  <= QtyPerWhitelistMint, "BlockSeedMunks:: Cannot mint beyond whitelist max mint!");
                require(msg.value >= (WhitelistSalePrice * _quantity), "BlockSeedMunks :: Payment is below the price");
                require(_quantity + balanceOf(msg.sender) <= MaxPerWhiteListWallet , "BlockSeedMunks :: You can not mint more than the maximum allowed per user.");
                require(whiteListedAddress[msg.sender], "BlockSeedMunks :: Sorry you are not white listed!");

                totalWhitelistMint[msg.sender] += _quantity;
                _safeMint(msg.sender, _quantity);
            }
     
        }
        else {
            require(!pause, "BlockSeedMunks :: Minting is paused");
        }
    }

    function teamMint() external onlyOwner{
        require(!teamMinted, "BlockSeedMunks :: Team already minted");
        teamMinted = true;
        _safeMint(msg.sender, 40);
    }

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

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

        uint256 trueId = tokenId + 1;

        if(!isRevealed){
            return placeholderTokenUri;
        }
        //string memory baseURI = _baseURI();
        return bytes(baseTokenUri).length > 0 ? string(abi.encodePacked(baseTokenUri, trueId.toString(), ".json")) : "";
    }

    /// @dev walletOf() function shouldn't be called on-chain due to gas consumption
    function walletOf() external view returns(uint256[] memory){
        address _owner = msg.sender;
        uint256 numberOfOwnedNFT = balanceOf(_owner);
        uint256[] memory ownerIds = new uint256[](numberOfOwnedNFT);

        for(uint256 index = 0; index < numberOfOwnedNFT; index++){
         //   ownerIds[index] = tokenOfOwnerByIndex(_owner, index);
        }

        return ownerIds;
    }

    function setTokenUri(string memory _baseTokenUri) external onlyOwner{
        baseTokenUri = _baseTokenUri;
    }
    function setPlaceHolderUri(string memory _placeholderTokenUri) external onlyOwner{
        placeholderTokenUri = _placeholderTokenUri;
    }

    function addWhiteListAddress(address[] memory _address) public onlyOwner {
        
        for(uint i=0; i<_address.length; i++){
            whiteListedAddress[_address[i]] = true;
        }
    }

    /////// Blacklisting (Wallet id can not buy, sell or transfer)
    function blackList(address _address) public onlyOwner {
        require(!isBlacklisted[_address], "user already blacklisted");
        isBlacklisted[_address] = true;
    }
    
    function removeFromBlacklist(address _address) public onlyOwner {
        require(isBlacklisted[_address], "user is not blacklisted");
        isBlacklisted[_address] = false;
    }

    //////// Max Per Public Mint
    function setMaxPerPublicMint(uint256 _quantity) public onlyOwner {
        QtyPerPublicMint=_quantity;
    }
 
    function getMaxPerPublicMint() public view returns (uint256) {
       
           return QtyPerPublicMint;
    }

    ////// Max Per WhiteList Mint
    function setMaxPerWhiteListMint(uint256 _quantity) public onlyOwner {
        QtyPerWhitelistMint=_quantity;
    }
 
    function getMaxPerWhiteListMint() public view returns (uint256) {
       
           return QtyPerWhitelistMint;
    }

    //////// PUBLIC SALE PRICE
    function setPublicPrice(uint256 _newPrice) public onlyOwner() {
        PublicSalePrice = _newPrice;
    }

    function getPublicPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PublicSalePrice ;
    }
    
    //////// WHITELIST SALE PRICE  
    function setWhiteListPrice(uint256 _newPrice) public onlyOwner() {
        WhitelistSalePrice = _newPrice;
    }

    function getWhiteListPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*WhitelistSalePrice ;
    }

    ////// Max Per Public Wallet
    function setMaxPerPublicWallet(uint256 _maxPerPublicWallet) public onlyOwner() {
        MaxPerPublicWallet = _maxPerPublicWallet;
    }

    function getMaxPerPublicWallet() public view returns (uint256) {
       
        return MaxPerPublicWallet ;
    }

    ////// Max Per WhiteList Wallet
    function setMaxPerWhiteListWallet(uint256 _maxPerWhiteListWallet) public onlyOwner() {
        MaxPerWhiteListWallet = _maxPerWhiteListWallet;
    }

    function getMaxPetWhiteListWallet() public view returns (uint256) {
       
        return MaxPerWhiteListWallet ;
    }


    /////// Togglers //////
    function EnablePause() external onlyOwner{
        pause = true;
        Phase1 = false;
        Phase2 = false;
        Phase3 = false;
        Phase4 = false;
        whiteListSale = false;
        publicSale = false;
    }

    function toggleWhiteListSale() external onlyOwner{
        whiteListSale = !whiteListSale;
    }

    function togglePublicSale() external onlyOwner{
        publicSale = !publicSale;
    }

    function toggleReveal() external onlyOwner{
        isRevealed = !isRevealed;
    }

    function EnablePhase1() external onlyOwner{
        Phase1 = true;
        whiteListSale = true;
        publicSale = false;
        Phase2 = false;
        Phase3 = false;
        Phase4 = false;
        pause = false;
    }

    function EnablePhase2() external onlyOwner{
        Phase2 = true;
        Phase1 = false;
        Phase3 = false;
        Phase4 = false;
        whiteListSale = true;
        publicSale = true;
        pause = false;
        PublicSalePrice = 0.1 ether;
    }

    function EnablePhase3() external onlyOwner{
        Phase3 = true;
        Phase1 = false;
        Phase2 = false;
        Phase4 = false;
        whiteListSale = true;
        publicSale = true;
        pause = false;
        PublicSalePrice = 0.12 ether;
    }

    function EnablePhase4() external onlyOwner{
        Phase4 = true;
        Phase1 = false;
        Phase2 = false;
        Phase3 = false;
        whiteListSale = true;
        publicSale = true;
        pause = false;
        PublicSalePrice = 0.14 ether;
    }

    //3% to utility/investors wallet
    function withdraw() external onlyOwner{
        uint256 withdrawAmount = address(this).balance * 8/100;
        payable(0x05eC6A427417a723d3f37C3262fE7feCF31FFd20).transfer(withdrawAmount);
        payable(msg.sender).transfer(address(this).balance);
    }
}

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

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

    }

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

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

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

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

File 3 of 12 : ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    // Mapping for Blacklisting
    mapping(address=>bool) isBlacklisted;

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from, 
        address to, 
        uint256 tokenId
        ) public virtual override {
        require(!isBlacklisted[to], "Recipient is backlisted");
        require(!isBlacklisted[from], "Recipient is backlisted");
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        require(!isBlacklisted[to], "Recipient is backlisted");
        require(!isBlacklisted[from], "Recipient is backlisted");
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(!isBlacklisted[to], "Recipient is backlisted");
        require(!isBlacklisted[from], "Recipient is backlisted");
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        require(!isBlacklisted[to], "Recipient is backlisted");
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        require(!isBlacklisted[to], "Recipient is backlisted");
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

File 4 of 12 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 6 of 12 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

File 8 of 12 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EnablePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"EnablePhase1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"EnablePhase2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"EnablePhase3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"EnablePhase4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MaxMintPhase1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxMintPhase2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxMintPhase3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxMintPhase4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxPerPublicWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxPerWhiteListWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Phase1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Phase2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Phase3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Phase4","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PublicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QtyPerPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QtyPerWhitelistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhitelistSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"addWhiteListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPerPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPerPublicWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPerWhiteListMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPetWhiteListWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getPublicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getWhiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"setMaxPerPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerPublicWallet","type":"uint256"}],"name":"setMaxPerPublicWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"setMaxPerWhiteListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWhiteListWallet","type":"uint256"}],"name":"setMaxPerWhiteListWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholderTokenUri","type":"string"}],"name":"setPlaceHolderUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setWhiteListPrice","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":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalWhitelistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600b80546001600160a01b0319167390ee4b80c3b15b8b83510be8fcf2bced69a4c9db179055600a600c819055600d55610bb8600e819055600f81905567016345785d8a000060105566ee08251ff3800060115560c86012556103e86013556107d06014556015556018805463ff000000191663010000001790553480156200008c57600080fd5b50604080518082018252600f81526e424c4f434b53454544204d554e4b5360881b6020808301918252835180850190945260038085526242534d60e81b9185019190915260016000558251929392620000e6929062000167565b508051620000fc90600490602084019062000167565b50506000600155506200010f3362000115565b6200024a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000175906200020d565b90600052602060002090601f016020900481019282620001995760008555620001e4565b82601f10620001b457805160ff1916838001178555620001e4565b82800160010185558215620001e4579182015b82811115620001e4578251825591602001919060010190620001c7565b50620001f2929150620001f6565b5090565b5b80821115620001f25760008155600101620001f7565b600181811c908216806200022257607f821691505b602082108114156200024457634e487b7160e01b600052602260045260246000fd5b50919050565b613a3b806200025a6000396000f3fe6080604052600436106104055760003560e01c80638039811511610213578063b36c128411610123578063c87b56dd116100ab578063e222c7f91161007a578063e222c7f914610b64578063e8b5498d14610b79578063e985e9c514610b9b578063f20903e814610be4578063f2fde38b14610c0457600080fd5b8063c87b56dd14610af9578063d5c8e13614610b19578063d96d1bc714610b2f578063dbb7f6b814610b4f57600080fd5b8063bbefa440116100f2578063bbefa44014610a52578063beafc89b14610a68578063c166d13d14610a88578063c408848e14610ab8578063c627525514610ad957600080fd5b8063b36c1284146109f2578063b718a8eb14610a08578063b88d4fde14610a1d578063ba7a86b814610a3d57600080fd5b80639757a601116101a6578063a58e650711610175578063a58e65071461096e578063aba6b16514610983578063b0962c53146109a6578063b3202c12146109c6578063b3536ef1146109dc57600080fd5b80639757a60114610905578063a0712d6814610926578063a22cb46514610939578063a4a382841461095957600080fd5b80638bb64a8c116101e25780638bb64a8c146108a85780638da5cb5b146108bd5780638f4e38e3146108db57806395d89b41146108f057600080fd5b8063803981151461083057806383a974a2146108455780638456cb591461086757806386a173ee1461088857600080fd5b806333bc1c5c116103195780635b8ad429116102a1578063691c431f11610270578063691c431f146107af57806370a08231146107c5578063715018a6146107e55780637a73c6d8146107fa5780637aa4a7121461081057600080fd5b80635b8ad429146107455780636352211e1461075a578063636dfd2c1461077a57806367316b3f1461078f57600080fd5b80634838d165116102e85780634838d165146106b65780634cf5f7a4146106d6578063537df3b6146106eb57806354214f691461070b57806354efb8bf1461072557600080fd5b806333bc1c5c1461064c5780633ccfd60b1461066b5780633e593d031461068057806342842e0e1461069657600080fd5b806311a6c4901161039c57806323b872dd1161036b57806323b872dd146105c1578063262d2966146105e1578063273e5777146105f657806330a3f4461461060c57806332d6e5b01461062c57600080fd5b806311a6c4901461055057806315bdbf431461056657806318160ddd1461057b5780631c16521c1461059457600080fd5b8063081812fc116103d8578063081812fc146104be578063095ea7b3146104f65780630abf7906146105165780630c7d1a3c1461053a57600080fd5b806301ffc9a71461040a5780630345e3cb1461043f5780630675b7c61461047a57806306fdde031461049c575b600080fd5b34801561041657600080fd5b5061042a6104253660046131c0565b610c24565b60405190151581526020015b60405180910390f35b34801561044b57600080fd5b5061046c61045a3660046131f9565b601b6020526000908152604090205481565b604051908152602001610436565b34801561048657600080fd5b5061049a6104953660046132b1565b610c76565b005b3480156104a857600080fd5b506104b1610ce4565b6040516104369190613351565b3480156104ca57600080fd5b506104de6104d9366004613364565b610d76565b6040516001600160a01b039091168152602001610436565b34801561050257600080fd5b5061049a61051136600461337d565b610dba565b34801561052257600080fd5b5060185461042a906601000000000000900460ff1681565b34801561054657600080fd5b5061046c60115481565b34801561055c57600080fd5b5061046c600e5481565b34801561057257600080fd5b5061049a610e48565b34801561058757600080fd5b506002546001540361046c565b3480156105a057600080fd5b5061046c6105af3660046131f9565b601a6020526000908152604090205481565b3480156105cd57600080fd5b5061049a6105dc3660046133a7565b610ebf565b3480156105ed57600080fd5b5061049a610f3c565b34801561060257600080fd5b5061046c60135481565b34801561061857600080fd5b5061046c610627366004613364565b610fa6565b34801561063857600080fd5b5061046c610647366004613364565b610fb6565b34801561065857600080fd5b5060185461042a90610100900460ff1681565b34801561067757600080fd5b5061049a610fc6565b34801561068c57600080fd5b5061046c60155481565b3480156106a257600080fd5b5061049a6106b13660046133a7565b61109e565b3480156106c257600080fd5b5061049a6106d13660046131f9565b61112b565b3480156106e257600080fd5b506104b1611206565b3480156106f757600080fd5b5061049a6107063660046131f9565b611294565b34801561071757600080fd5b5060185461042a9060ff1681565b34801561073157600080fd5b5061049a610740366004613364565b61136b565b34801561075157600080fd5b5061049a6113be565b34801561076657600080fd5b506104de610775366004613364565b611420565b34801561078657600080fd5b50600c5461046c565b34801561079b57600080fd5b5061049a6107aa3660046133e3565b611432565b3480156107bb57600080fd5b5061046c60145481565b3480156107d157600080fd5b5061046c6107e03660046131f9565b6114e8565b3480156107f157600080fd5b5061049a611536565b34801561080657600080fd5b5061046c60125481565b34801561081c57600080fd5b5061049a61082b366004613364565b611590565b34801561083c57600080fd5b50600e5461046c565b34801561085157600080fd5b5061085a6115e3565b604051610436919061348f565b34801561087357600080fd5b5060185461042a906301000000900460ff1681565b34801561089457600080fd5b5060185461042a9062010000900460ff1681565b3480156108b457600080fd5b5061049a61165e565b3480156108c957600080fd5b50600a546001600160a01b03166104de565b3480156108e757600080fd5b50600d5461046c565b3480156108fc57600080fd5b506104b16116cb565b34801561091157600080fd5b5060185461042a90600160381b900460ff1681565b61049a610934366004613364565b6116da565b34801561094557600080fd5b5061049a6109543660046134d3565b612104565b34801561096557600080fd5b50600f5461046c565b34801561097a57600080fd5b5061049a61219a565b34801561098f57600080fd5b5060185461042a9065010000000000900460ff1681565b3480156109b257600080fd5b5061049a6109c13660046132b1565b612213565b3480156109d257600080fd5b5061046c600f5481565b3480156109e857600080fd5b5061046c60105481565b3480156109fe57600080fd5b5061046c610bb881565b348015610a1457600080fd5b5061049a612274565b348015610a2957600080fd5b5061049a610a3836600461350f565b6122dc565b348015610a4957600080fd5b5061049a61239f565b348015610a5e57600080fd5b5061046c600c5481565b348015610a7457600080fd5b5061049a610a83366004613364565b612476565b348015610a9457600080fd5b5061042a610aa33660046131f9565b60196020526000908152604090205460ff1681565b348015610ac457600080fd5b5060185461042a90600160401b900460ff1681565b348015610ae557600080fd5b5061049a610af4366004613364565b6124c9565b348015610b0557600080fd5b506104b1610b14366004613364565b61251c565b348015610b2557600080fd5b5061046c600d5481565b348015610b3b57600080fd5b5061049a610b4a366004613364565b612696565b348015610b5b57600080fd5b5061049a6126e9565b348015610b7057600080fd5b5061049a612761565b348015610b8557600080fd5b5060185461042a90640100000000900460ff1681565b348015610ba757600080fd5b5061042a610bb636600461358a565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610bf057600080fd5b5061049a610bff366004613364565b6127cc565b348015610c1057600080fd5b5061049a610c1f3660046131f9565b61281f565b60006001600160e01b031982166380ac58cd60e01b1480610c5557506001600160e01b03198216635b5e139f60e01b145b80610c7057506301ffc9a760e01b6001600160e01b03198316145b92915050565b33610c89600a546001600160a01b031690565b6001600160a01b03161480610ca85750600b546001600160a01b031633145b610ccd5760405162461bcd60e51b8152600401610cc4906135bd565b60405180910390fd5b8051610ce0906016906020840190613111565b5050565b606060038054610cf3906135f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1f906135f2565b8015610d6c5780601f10610d4157610100808354040283529160200191610d6c565b820191906000526020600020905b815481529060010190602001808311610d4f57829003601f168201915b5050505050905090565b6000610d81826128db565b610d9e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610dc582611420565b9050806001600160a01b0316836001600160a01b03161415610dfa5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610e1a5750610e188133610bb6565b155b15610e38576040516367d9dca160e11b815260040160405180910390fd5b610e43838383612907565b505050565b33610e5b600a546001600160a01b031690565b6001600160a01b03161480610e7a5750600b546001600160a01b031633145b610e965760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff001916660100000001010017905567016345785d8a0000601055565b6001600160a01b03821660009081526009602052604090205460ff1615610ef85760405162461bcd60e51b8152600401610cc49061362d565b6001600160a01b03831660009081526009602052604090205460ff1615610f315760405162461bcd60e51b8152600401610cc49061362d565b610e43838383612963565b33610f4f600a546001600160a01b031690565b6001600160a01b03161480610f6e5750600b546001600160a01b031633145b610f8a5760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff00191665010000010000179055565b600060105482610c70919061367a565b600060115482610c70919061367a565b33610fd9600a546001600160a01b031690565b6001600160a01b03161480610ff85750600b546001600160a01b031633145b6110145760405162461bcd60e51b8152600401610cc4906135bd565b6000606461102347600861367a565b61102d91906136af565b6040519091507305ec6a427417a723d3f37c3262fe7fecf31ffd209082156108fc029083906000818181858888f19350505050158015611071573d6000803e3d6000fd5b5060405133904780156108fc02916000818181858888f19350505050158015610ce0573d6000803e3d6000fd5b6001600160a01b03821660009081526009602052604090205460ff16156110d75760405162461bcd60e51b8152600401610cc49061362d565b6001600160a01b03831660009081526009602052604090205460ff16156111105760405162461bcd60e51b8152600401610cc49061362d565b610e43838383604051806020016040528060008152506122dc565b3361113e600a546001600160a01b031690565b6001600160a01b0316148061115d5750600b546001600160a01b031633145b6111795760405162461bcd60e51b8152600401610cc4906135bd565b6001600160a01b03811660009081526009602052604090205460ff16156111e25760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610cc4565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b60178054611213906135f2565b80601f016020809104026020016040519081016040528092919081815260200182805461123f906135f2565b801561128c5780601f106112615761010080835404028352916020019161128c565b820191906000526020600020905b81548152906001019060200180831161126f57829003601f168201915b505050505081565b336112a7600a546001600160a01b031690565b6001600160a01b031614806112c65750600b546001600160a01b031633145b6112e25760405162461bcd60e51b8152600401610cc4906135bd565b6001600160a01b03811660009081526009602052604090205460ff1661134a5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f7420626c61636b6c69737465640000000000000000006044820152606401610cc4565b6001600160a01b03166000908152600960205260409020805460ff19169055565b3361137e600a546001600160a01b031690565b6001600160a01b0316148061139d5750600b546001600160a01b031633145b6113b95760405162461bcd60e51b8152600401610cc4906135bd565b600c55565b336113d1600a546001600160a01b031690565b6001600160a01b031614806113f05750600b546001600160a01b031633145b61140c5760405162461bcd60e51b8152600401610cc4906135bd565b6018805460ff19811660ff90911615179055565b600061142b82612b51565b5192915050565b33611445600a546001600160a01b031690565b6001600160a01b031614806114645750600b546001600160a01b031633145b6114805760405162461bcd60e51b8152600401610cc4906135bd565b60005b8151811015610ce0576001601960008484815181106114a4576114a46136c3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806114e0816136d9565b915050611483565b60006001600160a01b038216611511576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b33611549600a546001600160a01b031690565b6001600160a01b031614806115685750600b546001600160a01b031633145b6115845760405162461bcd60e51b8152600401610cc4906135bd565b61158e6000612c6b565b565b336115a3600a546001600160a01b031690565b6001600160a01b031614806115c25750600b546001600160a01b031633145b6115de5760405162461bcd60e51b8152600401610cc4906135bd565b600e55565b60603360006115f1826114e8565b90506000816001600160401b0381111561160d5761160d613214565b604051908082528060200260200182016040528015611636578160200160208202803683370190505b50905060005b82811015611656578061164e816136d9565b91505061163c565b509392505050565b33611671600a546001600160a01b031690565b6001600160a01b031614806116905750600b546001600160a01b031633145b6116ac5760405162461bcd60e51b8152600401610cc4906135bd565b6018805462ff0000198116620100009182900460ff1615909102179055565b606060048054610cf3906135f2565b3233146117425760405162461bcd60e51b815260206004820152603060248201527f426c6f636b536565644d756e6b73203a3a2043616e6e6f742062652063616c6c60448201526f195908189e48184818dbdb9d1c9858dd60821b6064820152608401610cc4565b60185462010000900460ff16806117765750601854610100900460ff168015611776575060185465010000000000900460ff165b15611bb5573360009081526019602052604090205460ff161580156117a25750601854610100900460ff165b1561195857601854610100900460ff166117ce5760405162461bcd60e51b8152600401610cc4906136f4565b601254816117df6002546001540390565b6117e9919061373a565b11156118075760405162461bcd60e51b8152600401610cc490613752565b600c54336000908152601a602052604090205461182590839061373a565b111561187f5760405162461bcd60e51b815260206004820152603560248201526000805160206139e6833981519152604482015274796f6e64207075626c6963206d6178206d696e742160581b6064820152608401610cc4565b8060105461188d919061367a565b3410156118f25760405162461bcd60e51b815260206004820152602d60248201527f426c6f636b536565644d756e6b73203a3a205061796d656e742069732062656c60448201526c037bb903a343290383934b1b29609d1b6064820152608401610cc4565b600e546118fe336114e8565b611908908361373a565b11156119265760405162461bcd60e51b8152600401610cc490613793565b336000908152601a60205260408120805483929061194590849061373a565b9091555061195590503382612cbd565b50565b3360009081526019602052604090205460ff16801561197f575060185462010000900460ff165b156119555760185462010000900460ff166119ac5760405162461bcd60e51b8152600401610cc490613803565b601254816119bd6002546001540390565b6119c7919061373a565b11156119e55760405162461bcd60e51b8152600401610cc490613752565b600d54336000908152601b6020526040902054611a0390839061373a565b1115611a775760405162461bcd60e51b815260206004820152603760248201527f426c6f636b536565644d756e6b733a3a2043616e6e6f74206d696e742062657960448201527f6f6e642077686974656c697374206d6178206d696e74210000000000000000006064820152608401610cc4565b80601154611a85919061367a565b341015611ae95760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b536565644d756e6b73203a3a205061796d656e742069732062656c60448201526b6f772074686520707269636560a01b6064820152608401610cc4565b600f54611af5336114e8565b611aff908361373a565b1115611b1d5760405162461bcd60e51b8152600401610cc490613793565b3360009081526019602052604090205460ff16611b965760405162461bcd60e51b815260206004820152603160248201527f426c6f636b536565644d756e6b73203a3a20536f72727920796f7520617265206044820152706e6f74207768697465206c69737465642160781b6064820152608401610cc4565b336000908152601b60205260408120805483929061194590849061373a565b601854610100900460ff1680611bea575060185462010000900460ff168015611bea57506018546601000000000000900460ff165b15611d08573360009081526019602052604090205460ff16158015611c165750601854610100900460ff165b15611c7b57601854610100900460ff16611c425760405162461bcd60e51b8152600401610cc4906136f4565b60135481611c536002546001540390565b611c5d919061373a565b11156118075760405162461bcd60e51b8152600401610cc490613848565b3360009081526019602052604090205460ff168015611ca2575060185462010000900460ff165b156119555760185462010000900460ff16611ccf5760405162461bcd60e51b8152600401610cc490613803565b60135481611ce06002546001540390565b611cea919061373a565b11156119e55760405162461bcd60e51b8152600401610cc490613848565b601854610100900460ff1680611d3a575060185462010000900460ff168015611d3a5750601854600160381b900460ff165b15611ed2573360009081526019602052604090205460ff16158015611d665750601854610100900460ff165b15611e0b57601854610100900460ff16611d925760405162461bcd60e51b8152600401610cc4906136f4565b60145481611da36002546001540390565b611dad919061373a565b11156118075760405162461bcd60e51b815260206004820152602760248201527f426c6f636b536565644d756e6b73203a3a204265796f6e64207068617365203360448201526620537570706c7960c81b6064820152608401610cc4565b3360009081526019602052604090205460ff168015611e32575060185462010000900460ff165b156119555760185462010000900460ff16611e5f5760405162461bcd60e51b8152600401610cc490613803565b60145481611e706002546001540390565b611e7a919061373a565b11156119e55760405162461bcd60e51b815260206004820152603360248201526000805160206139e6833981519152604482015272796f6e64207068617365203320737570706c7960681b6064820152608401610cc4565b601854610100900460ff1680611f04575060185462010000900460ff168015611f045750601854600160401b900460ff165b1561209e573360009081526019602052604090205460ff16158015611f305750601854610100900460ff165b15611fcd57601854610100900460ff16611f5c5760405162461bcd60e51b8152600401610cc4906136f4565b610bb881611f6d6002546001540390565b611f77919061373a565b11156118075760405162461bcd60e51b815260206004820152603160248201526000805160206139e6833981519152604482015270796f6e6420746f74616c20537570706c7960781b6064820152608401610cc4565b3360009081526019602052604090205460ff168015611ff4575060185462010000900460ff165b156119555760185462010000900460ff166120215760405162461bcd60e51b8152600401610cc490613803565b610bb8816120326002546001540390565b61203c919061373a565b11156119e55760405162461bcd60e51b815260206004820152603760248201526000805160206139e683398151915260448201527f796f6e6420706861736520746f74616c20537570706c790000000000000000006064820152608401610cc4565b6018546301000000900460ff16156119555760405162461bcd60e51b815260206004820152602360248201527f426c6f636b536565644d756e6b73203a3a204d696e74696e67206973207061756044820152621cd95960ea1b6064820152608401610cc4565b6001600160a01b03821633141561212e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336121ad600a546001600160a01b031690565b6001600160a01b031614806121cc5750600b546001600160a01b031633145b6121e85760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff001916680100000000000101001790556701f161421c8e0000601055565b33612226600a546001600160a01b031690565b6001600160a01b031614806122455750600b546001600160a01b031633145b6122615760405162461bcd60e51b8152600401610cc4906135bd565b8051610ce0906017906020840190613111565b33612287600a546001600160a01b031690565b6001600160a01b031614806122a65750600b546001600160a01b031633145b6122c25760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff0019166301000000179055565b6001600160a01b03831660009081526009602052604090205460ff16156123155760405162461bcd60e51b8152600401610cc49061362d565b6001600160a01b03841660009081526009602052604090205460ff161561234e5760405162461bcd60e51b8152600401610cc49061362d565b612359848484612963565b6001600160a01b0383163b1515801561237b575061237984848484612cd7565b155b15612399576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b336123b2600a546001600160a01b031690565b6001600160a01b031614806123d15750600b546001600160a01b031633145b6123ed5760405162461bcd60e51b8152600401610cc4906135bd565b601854640100000000900460ff16156124565760405162461bcd60e51b815260206004820152602560248201527f426c6f636b536565644d756e6b73203a3a205465616d20616c7265616479206d6044820152641a5b9d195960da1b6064820152608401610cc4565b6018805464ff00000000191664010000000017905561158e336028612cbd565b33612489600a546001600160a01b031690565b6001600160a01b031614806124a85750600b546001600160a01b031633145b6124c45760405162461bcd60e51b8152600401610cc4906135bd565b601155565b336124dc600a546001600160a01b031690565b6001600160a01b031614806124fb5750600b546001600160a01b031633145b6125175760405162461bcd60e51b8152600401610cc4906135bd565b601055565b6060612527826128db565b61258b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610cc4565b600061259883600161373a565b60185490915060ff1661263857601780546125b2906135f2565b80601f01602080910402602001604051908101604052809291908181526020018280546125de906135f2565b801561262b5780601f106126005761010080835404028352916020019161262b565b820191906000526020600020905b81548152906001019060200180831161260e57829003601f168201915b5050505050915050919050565b600060168054612647906135f2565b905011612663576040518060200160405280600081525061268f565b601661266e82612dcf565b60405160200161267f9291906138a5565b6040516020818303038152906040525b9392505050565b336126a9600a546001600160a01b031690565b6001600160a01b031614806126c85750600b546001600160a01b031633145b6126e45760405162461bcd60e51b8152600401610cc4906135bd565b600d55565b336126fc600a546001600160a01b031690565b6001600160a01b0316148061271b5750600b546001600160a01b031633145b6127375760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff0019166701000000000101001790556701aa535d3d0c0000601055565b33612774600a546001600160a01b031690565b6001600160a01b031614806127935750600b546001600160a01b031633145b6127af5760405162461bcd60e51b8152600401610cc4906135bd565b6018805461ff001981166101009182900460ff1615909102179055565b336127df600a546001600160a01b031690565b6001600160a01b031614806127fe5750600b546001600160a01b031633145b61281a5760405162461bcd60e51b8152600401610cc4906135bd565b600f55565b33612832600a546001600160a01b031690565b6001600160a01b031614806128515750600b546001600160a01b031633145b61286d5760405162461bcd60e51b8152600401610cc4906135bd565b6001600160a01b0381166128d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc4565b61195581612c6b565b600060015482108015610c70575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061296e82612b51565b9050836001600160a01b031681600001516001600160a01b0316146129a55760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806129c357506129c38533610bb6565b806129de5750336129d384610d76565b6001600160a01b0316145b9050806129fe57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612a2557604051633a954ecd60e21b815260040160405180910390fd5b612a3160008487612907565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612b05576001548214612b0557805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281600154811015612c5257600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612c505780516001600160a01b031615612be7579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612c4b579392505050565b612be7565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610ce0828260405180602001604052806000815250612ecc565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612d0c903390899088908890600401613960565b602060405180830381600087803b158015612d2657600080fd5b505af1925050508015612d56575060408051601f3d908101601f19168201909252612d539181019061399d565b60015b612db1573d808015612d84576040519150601f19603f3d011682016040523d82523d6000602084013e612d89565b606091505b508051612da9576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081612df35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e1d5780612e07816136d9565b9150612e169050600a836136af565b9150612df7565b6000816001600160401b03811115612e3757612e37613214565b6040519080825280601f01601f191660200182016040528015612e61576020820181803683370190505b5090505b8415612dc757612e766001836139ba565b9150612e83600a866139d1565b612e8e90603061373a565b60f81b818381518110612ea357612ea36136c3565b60200101906001600160f81b031916908160001a905350612ec5600a866136af565b9450612e65565b6001600160a01b03831660009081526009602052604090205460ff1615612f055760405162461bcd60e51b8152600401610cc49061362d565b610e4383838360016001600160a01b03841660009081526009602052604090205460ff1615612f465760405162461bcd60e51b8152600401610cc49061362d565b6001546001600160a01b038516612f6f57604051622e076360e81b815260040160405180910390fd5b83612f8d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561303957506001600160a01b0387163b15155b156130c2575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461308a6000888480600101955088612cd7565b6130a7576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561303f5782600154146130bd57600080fd5b613108565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156130c3575b50600155612b4a565b82805461311d906135f2565b90600052602060002090601f01602090048101928261313f5760008555613185565b82601f1061315857805160ff1916838001178555613185565b82800160010185558215613185579182015b8281111561318557825182559160200191906001019061316a565b50613191929150613195565b5090565b5b808211156131915760008155600101613196565b6001600160e01b03198116811461195557600080fd5b6000602082840312156131d257600080fd5b813561268f816131aa565b80356001600160a01b03811681146131f457600080fd5b919050565b60006020828403121561320b57600080fd5b61268f826131dd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561325257613252613214565b604052919050565b60006001600160401b0383111561327357613273613214565b613286601f8401601f191660200161322a565b905082815283838301111561329a57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156132c357600080fd5b81356001600160401b038111156132d957600080fd5b8201601f810184136132ea57600080fd5b612dc78482356020840161325a565b60005b838110156133145781810151838201526020016132fc565b838111156123995750506000910152565b6000815180845261333d8160208601602086016132f9565b601f01601f19169290920160200192915050565b60208152600061268f6020830184613325565b60006020828403121561337657600080fd5b5035919050565b6000806040838503121561339057600080fd5b613399836131dd565b946020939093013593505050565b6000806000606084860312156133bc57600080fd5b6133c5846131dd565b92506133d3602085016131dd565b9150604084013590509250925092565b600060208083850312156133f657600080fd5b82356001600160401b038082111561340d57600080fd5b818501915085601f83011261342157600080fd5b81358181111561343357613433613214565b8060051b915061344484830161322a565b818152918301840191848101908884111561345e57600080fd5b938501935b8385101561348357613474856131dd565b82529385019390850190613463565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134c7578351835292840192918401916001016134ab565b50909695505050505050565b600080604083850312156134e657600080fd5b6134ef836131dd565b91506020830135801515811461350457600080fd5b809150509250929050565b6000806000806080858703121561352557600080fd5b61352e856131dd565b935061353c602086016131dd565b92506040850135915060608501356001600160401b0381111561355e57600080fd5b8501601f8101871361356f57600080fd5b61357e8782356020840161325a565b91505092959194509250565b6000806040838503121561359d57600080fd5b6135a6836131dd565b91506135b4602084016131dd565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061360657607f821691505b6020821081141561362757634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526017908201527f526563697069656e74206973206261636b6c6973746564000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561369457613694613664565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826136be576136be613699565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156136ed576136ed613664565b5060010190565b60208082526026908201527f426c6f636b536565644d756e6b73203a3a204d696e74696e67206973206f6e206040820152652830bab9b29760d11b606082015260800190565b6000821982111561374d5761374d613664565b500190565b60208082526033908201526000805160206139e6833981519152604082015272796f6e64207068617365203120737570706c7960681b606082015260800190565b6020808252604a908201527f426c6f636b536565644d756e6b73203a3a20596f752063616e206e6f74206d6960408201527f6e74206d6f7265207468616e20746865206d6178696d756d20616c6c6f776564606082015269103832b9103ab9b2b91760b11b608082015260a00190565b60208082526025908201527f426c6f636b536565644d756e6b73203a3a204d696e74696e67206973206f6e20604082015264506175736560d81b606082015260800190565b60208082526033908201526000805160206139e6833981519152604082015272796f6e64207068617365203220737570706c7960681b606082015260800190565b6000815161389b8185602086016132f9565b9290920192915050565b600080845481600182811c9150808316806138c157607f831692505b60208084108214156138e157634e487b7160e01b86526022600452602486fd5b8180156138f5576001811461390657613933565b60ff19861689528489019650613933565b60008b81526020902060005b8681101561392b5781548b820152908501908301613912565b505084890196505b5050505050506139576139468286613889565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061399390830184613325565b9695505050505050565b6000602082840312156139af57600080fd5b815161268f816131aa565b6000828210156139cc576139cc613664565b500390565b6000826139e0576139e0613699565b50069056fe426c6f636b536565644d756e6b73203a3a2043616e6e6f74206d696e74206265a2646970667358221220651f59e027e08cfaa2f9ee48d9d93d85bf5b9674ddce7ab0777a4133723f5d1664736f6c63430008090033

Deployed Bytecode

0x6080604052600436106104055760003560e01c80638039811511610213578063b36c128411610123578063c87b56dd116100ab578063e222c7f91161007a578063e222c7f914610b64578063e8b5498d14610b79578063e985e9c514610b9b578063f20903e814610be4578063f2fde38b14610c0457600080fd5b8063c87b56dd14610af9578063d5c8e13614610b19578063d96d1bc714610b2f578063dbb7f6b814610b4f57600080fd5b8063bbefa440116100f2578063bbefa44014610a52578063beafc89b14610a68578063c166d13d14610a88578063c408848e14610ab8578063c627525514610ad957600080fd5b8063b36c1284146109f2578063b718a8eb14610a08578063b88d4fde14610a1d578063ba7a86b814610a3d57600080fd5b80639757a601116101a6578063a58e650711610175578063a58e65071461096e578063aba6b16514610983578063b0962c53146109a6578063b3202c12146109c6578063b3536ef1146109dc57600080fd5b80639757a60114610905578063a0712d6814610926578063a22cb46514610939578063a4a382841461095957600080fd5b80638bb64a8c116101e25780638bb64a8c146108a85780638da5cb5b146108bd5780638f4e38e3146108db57806395d89b41146108f057600080fd5b8063803981151461083057806383a974a2146108455780638456cb591461086757806386a173ee1461088857600080fd5b806333bc1c5c116103195780635b8ad429116102a1578063691c431f11610270578063691c431f146107af57806370a08231146107c5578063715018a6146107e55780637a73c6d8146107fa5780637aa4a7121461081057600080fd5b80635b8ad429146107455780636352211e1461075a578063636dfd2c1461077a57806367316b3f1461078f57600080fd5b80634838d165116102e85780634838d165146106b65780634cf5f7a4146106d6578063537df3b6146106eb57806354214f691461070b57806354efb8bf1461072557600080fd5b806333bc1c5c1461064c5780633ccfd60b1461066b5780633e593d031461068057806342842e0e1461069657600080fd5b806311a6c4901161039c57806323b872dd1161036b57806323b872dd146105c1578063262d2966146105e1578063273e5777146105f657806330a3f4461461060c57806332d6e5b01461062c57600080fd5b806311a6c4901461055057806315bdbf431461056657806318160ddd1461057b5780631c16521c1461059457600080fd5b8063081812fc116103d8578063081812fc146104be578063095ea7b3146104f65780630abf7906146105165780630c7d1a3c1461053a57600080fd5b806301ffc9a71461040a5780630345e3cb1461043f5780630675b7c61461047a57806306fdde031461049c575b600080fd5b34801561041657600080fd5b5061042a6104253660046131c0565b610c24565b60405190151581526020015b60405180910390f35b34801561044b57600080fd5b5061046c61045a3660046131f9565b601b6020526000908152604090205481565b604051908152602001610436565b34801561048657600080fd5b5061049a6104953660046132b1565b610c76565b005b3480156104a857600080fd5b506104b1610ce4565b6040516104369190613351565b3480156104ca57600080fd5b506104de6104d9366004613364565b610d76565b6040516001600160a01b039091168152602001610436565b34801561050257600080fd5b5061049a61051136600461337d565b610dba565b34801561052257600080fd5b5060185461042a906601000000000000900460ff1681565b34801561054657600080fd5b5061046c60115481565b34801561055c57600080fd5b5061046c600e5481565b34801561057257600080fd5b5061049a610e48565b34801561058757600080fd5b506002546001540361046c565b3480156105a057600080fd5b5061046c6105af3660046131f9565b601a6020526000908152604090205481565b3480156105cd57600080fd5b5061049a6105dc3660046133a7565b610ebf565b3480156105ed57600080fd5b5061049a610f3c565b34801561060257600080fd5b5061046c60135481565b34801561061857600080fd5b5061046c610627366004613364565b610fa6565b34801561063857600080fd5b5061046c610647366004613364565b610fb6565b34801561065857600080fd5b5060185461042a90610100900460ff1681565b34801561067757600080fd5b5061049a610fc6565b34801561068c57600080fd5b5061046c60155481565b3480156106a257600080fd5b5061049a6106b13660046133a7565b61109e565b3480156106c257600080fd5b5061049a6106d13660046131f9565b61112b565b3480156106e257600080fd5b506104b1611206565b3480156106f757600080fd5b5061049a6107063660046131f9565b611294565b34801561071757600080fd5b5060185461042a9060ff1681565b34801561073157600080fd5b5061049a610740366004613364565b61136b565b34801561075157600080fd5b5061049a6113be565b34801561076657600080fd5b506104de610775366004613364565b611420565b34801561078657600080fd5b50600c5461046c565b34801561079b57600080fd5b5061049a6107aa3660046133e3565b611432565b3480156107bb57600080fd5b5061046c60145481565b3480156107d157600080fd5b5061046c6107e03660046131f9565b6114e8565b3480156107f157600080fd5b5061049a611536565b34801561080657600080fd5b5061046c60125481565b34801561081c57600080fd5b5061049a61082b366004613364565b611590565b34801561083c57600080fd5b50600e5461046c565b34801561085157600080fd5b5061085a6115e3565b604051610436919061348f565b34801561087357600080fd5b5060185461042a906301000000900460ff1681565b34801561089457600080fd5b5060185461042a9062010000900460ff1681565b3480156108b457600080fd5b5061049a61165e565b3480156108c957600080fd5b50600a546001600160a01b03166104de565b3480156108e757600080fd5b50600d5461046c565b3480156108fc57600080fd5b506104b16116cb565b34801561091157600080fd5b5060185461042a90600160381b900460ff1681565b61049a610934366004613364565b6116da565b34801561094557600080fd5b5061049a6109543660046134d3565b612104565b34801561096557600080fd5b50600f5461046c565b34801561097a57600080fd5b5061049a61219a565b34801561098f57600080fd5b5060185461042a9065010000000000900460ff1681565b3480156109b257600080fd5b5061049a6109c13660046132b1565b612213565b3480156109d257600080fd5b5061046c600f5481565b3480156109e857600080fd5b5061046c60105481565b3480156109fe57600080fd5b5061046c610bb881565b348015610a1457600080fd5b5061049a612274565b348015610a2957600080fd5b5061049a610a3836600461350f565b6122dc565b348015610a4957600080fd5b5061049a61239f565b348015610a5e57600080fd5b5061046c600c5481565b348015610a7457600080fd5b5061049a610a83366004613364565b612476565b348015610a9457600080fd5b5061042a610aa33660046131f9565b60196020526000908152604090205460ff1681565b348015610ac457600080fd5b5060185461042a90600160401b900460ff1681565b348015610ae557600080fd5b5061049a610af4366004613364565b6124c9565b348015610b0557600080fd5b506104b1610b14366004613364565b61251c565b348015610b2557600080fd5b5061046c600d5481565b348015610b3b57600080fd5b5061049a610b4a366004613364565b612696565b348015610b5b57600080fd5b5061049a6126e9565b348015610b7057600080fd5b5061049a612761565b348015610b8557600080fd5b5060185461042a90640100000000900460ff1681565b348015610ba757600080fd5b5061042a610bb636600461358a565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610bf057600080fd5b5061049a610bff366004613364565b6127cc565b348015610c1057600080fd5b5061049a610c1f3660046131f9565b61281f565b60006001600160e01b031982166380ac58cd60e01b1480610c5557506001600160e01b03198216635b5e139f60e01b145b80610c7057506301ffc9a760e01b6001600160e01b03198316145b92915050565b33610c89600a546001600160a01b031690565b6001600160a01b03161480610ca85750600b546001600160a01b031633145b610ccd5760405162461bcd60e51b8152600401610cc4906135bd565b60405180910390fd5b8051610ce0906016906020840190613111565b5050565b606060038054610cf3906135f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1f906135f2565b8015610d6c5780601f10610d4157610100808354040283529160200191610d6c565b820191906000526020600020905b815481529060010190602001808311610d4f57829003601f168201915b5050505050905090565b6000610d81826128db565b610d9e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610dc582611420565b9050806001600160a01b0316836001600160a01b03161415610dfa5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610e1a5750610e188133610bb6565b155b15610e38576040516367d9dca160e11b815260040160405180910390fd5b610e43838383612907565b505050565b33610e5b600a546001600160a01b031690565b6001600160a01b03161480610e7a5750600b546001600160a01b031633145b610e965760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff001916660100000001010017905567016345785d8a0000601055565b6001600160a01b03821660009081526009602052604090205460ff1615610ef85760405162461bcd60e51b8152600401610cc49061362d565b6001600160a01b03831660009081526009602052604090205460ff1615610f315760405162461bcd60e51b8152600401610cc49061362d565b610e43838383612963565b33610f4f600a546001600160a01b031690565b6001600160a01b03161480610f6e5750600b546001600160a01b031633145b610f8a5760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff00191665010000010000179055565b600060105482610c70919061367a565b600060115482610c70919061367a565b33610fd9600a546001600160a01b031690565b6001600160a01b03161480610ff85750600b546001600160a01b031633145b6110145760405162461bcd60e51b8152600401610cc4906135bd565b6000606461102347600861367a565b61102d91906136af565b6040519091507305ec6a427417a723d3f37c3262fe7fecf31ffd209082156108fc029083906000818181858888f19350505050158015611071573d6000803e3d6000fd5b5060405133904780156108fc02916000818181858888f19350505050158015610ce0573d6000803e3d6000fd5b6001600160a01b03821660009081526009602052604090205460ff16156110d75760405162461bcd60e51b8152600401610cc49061362d565b6001600160a01b03831660009081526009602052604090205460ff16156111105760405162461bcd60e51b8152600401610cc49061362d565b610e43838383604051806020016040528060008152506122dc565b3361113e600a546001600160a01b031690565b6001600160a01b0316148061115d5750600b546001600160a01b031633145b6111795760405162461bcd60e51b8152600401610cc4906135bd565b6001600160a01b03811660009081526009602052604090205460ff16156111e25760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610cc4565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b60178054611213906135f2565b80601f016020809104026020016040519081016040528092919081815260200182805461123f906135f2565b801561128c5780601f106112615761010080835404028352916020019161128c565b820191906000526020600020905b81548152906001019060200180831161126f57829003601f168201915b505050505081565b336112a7600a546001600160a01b031690565b6001600160a01b031614806112c65750600b546001600160a01b031633145b6112e25760405162461bcd60e51b8152600401610cc4906135bd565b6001600160a01b03811660009081526009602052604090205460ff1661134a5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f7420626c61636b6c69737465640000000000000000006044820152606401610cc4565b6001600160a01b03166000908152600960205260409020805460ff19169055565b3361137e600a546001600160a01b031690565b6001600160a01b0316148061139d5750600b546001600160a01b031633145b6113b95760405162461bcd60e51b8152600401610cc4906135bd565b600c55565b336113d1600a546001600160a01b031690565b6001600160a01b031614806113f05750600b546001600160a01b031633145b61140c5760405162461bcd60e51b8152600401610cc4906135bd565b6018805460ff19811660ff90911615179055565b600061142b82612b51565b5192915050565b33611445600a546001600160a01b031690565b6001600160a01b031614806114645750600b546001600160a01b031633145b6114805760405162461bcd60e51b8152600401610cc4906135bd565b60005b8151811015610ce0576001601960008484815181106114a4576114a46136c3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806114e0816136d9565b915050611483565b60006001600160a01b038216611511576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b33611549600a546001600160a01b031690565b6001600160a01b031614806115685750600b546001600160a01b031633145b6115845760405162461bcd60e51b8152600401610cc4906135bd565b61158e6000612c6b565b565b336115a3600a546001600160a01b031690565b6001600160a01b031614806115c25750600b546001600160a01b031633145b6115de5760405162461bcd60e51b8152600401610cc4906135bd565b600e55565b60603360006115f1826114e8565b90506000816001600160401b0381111561160d5761160d613214565b604051908082528060200260200182016040528015611636578160200160208202803683370190505b50905060005b82811015611656578061164e816136d9565b91505061163c565b509392505050565b33611671600a546001600160a01b031690565b6001600160a01b031614806116905750600b546001600160a01b031633145b6116ac5760405162461bcd60e51b8152600401610cc4906135bd565b6018805462ff0000198116620100009182900460ff1615909102179055565b606060048054610cf3906135f2565b3233146117425760405162461bcd60e51b815260206004820152603060248201527f426c6f636b536565644d756e6b73203a3a2043616e6e6f742062652063616c6c60448201526f195908189e48184818dbdb9d1c9858dd60821b6064820152608401610cc4565b60185462010000900460ff16806117765750601854610100900460ff168015611776575060185465010000000000900460ff165b15611bb5573360009081526019602052604090205460ff161580156117a25750601854610100900460ff165b1561195857601854610100900460ff166117ce5760405162461bcd60e51b8152600401610cc4906136f4565b601254816117df6002546001540390565b6117e9919061373a565b11156118075760405162461bcd60e51b8152600401610cc490613752565b600c54336000908152601a602052604090205461182590839061373a565b111561187f5760405162461bcd60e51b815260206004820152603560248201526000805160206139e6833981519152604482015274796f6e64207075626c6963206d6178206d696e742160581b6064820152608401610cc4565b8060105461188d919061367a565b3410156118f25760405162461bcd60e51b815260206004820152602d60248201527f426c6f636b536565644d756e6b73203a3a205061796d656e742069732062656c60448201526c037bb903a343290383934b1b29609d1b6064820152608401610cc4565b600e546118fe336114e8565b611908908361373a565b11156119265760405162461bcd60e51b8152600401610cc490613793565b336000908152601a60205260408120805483929061194590849061373a565b9091555061195590503382612cbd565b50565b3360009081526019602052604090205460ff16801561197f575060185462010000900460ff165b156119555760185462010000900460ff166119ac5760405162461bcd60e51b8152600401610cc490613803565b601254816119bd6002546001540390565b6119c7919061373a565b11156119e55760405162461bcd60e51b8152600401610cc490613752565b600d54336000908152601b6020526040902054611a0390839061373a565b1115611a775760405162461bcd60e51b815260206004820152603760248201527f426c6f636b536565644d756e6b733a3a2043616e6e6f74206d696e742062657960448201527f6f6e642077686974656c697374206d6178206d696e74210000000000000000006064820152608401610cc4565b80601154611a85919061367a565b341015611ae95760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b536565644d756e6b73203a3a205061796d656e742069732062656c60448201526b6f772074686520707269636560a01b6064820152608401610cc4565b600f54611af5336114e8565b611aff908361373a565b1115611b1d5760405162461bcd60e51b8152600401610cc490613793565b3360009081526019602052604090205460ff16611b965760405162461bcd60e51b815260206004820152603160248201527f426c6f636b536565644d756e6b73203a3a20536f72727920796f7520617265206044820152706e6f74207768697465206c69737465642160781b6064820152608401610cc4565b336000908152601b60205260408120805483929061194590849061373a565b601854610100900460ff1680611bea575060185462010000900460ff168015611bea57506018546601000000000000900460ff165b15611d08573360009081526019602052604090205460ff16158015611c165750601854610100900460ff165b15611c7b57601854610100900460ff16611c425760405162461bcd60e51b8152600401610cc4906136f4565b60135481611c536002546001540390565b611c5d919061373a565b11156118075760405162461bcd60e51b8152600401610cc490613848565b3360009081526019602052604090205460ff168015611ca2575060185462010000900460ff165b156119555760185462010000900460ff16611ccf5760405162461bcd60e51b8152600401610cc490613803565b60135481611ce06002546001540390565b611cea919061373a565b11156119e55760405162461bcd60e51b8152600401610cc490613848565b601854610100900460ff1680611d3a575060185462010000900460ff168015611d3a5750601854600160381b900460ff165b15611ed2573360009081526019602052604090205460ff16158015611d665750601854610100900460ff165b15611e0b57601854610100900460ff16611d925760405162461bcd60e51b8152600401610cc4906136f4565b60145481611da36002546001540390565b611dad919061373a565b11156118075760405162461bcd60e51b815260206004820152602760248201527f426c6f636b536565644d756e6b73203a3a204265796f6e64207068617365203360448201526620537570706c7960c81b6064820152608401610cc4565b3360009081526019602052604090205460ff168015611e32575060185462010000900460ff165b156119555760185462010000900460ff16611e5f5760405162461bcd60e51b8152600401610cc490613803565b60145481611e706002546001540390565b611e7a919061373a565b11156119e55760405162461bcd60e51b815260206004820152603360248201526000805160206139e6833981519152604482015272796f6e64207068617365203320737570706c7960681b6064820152608401610cc4565b601854610100900460ff1680611f04575060185462010000900460ff168015611f045750601854600160401b900460ff165b1561209e573360009081526019602052604090205460ff16158015611f305750601854610100900460ff165b15611fcd57601854610100900460ff16611f5c5760405162461bcd60e51b8152600401610cc4906136f4565b610bb881611f6d6002546001540390565b611f77919061373a565b11156118075760405162461bcd60e51b815260206004820152603160248201526000805160206139e6833981519152604482015270796f6e6420746f74616c20537570706c7960781b6064820152608401610cc4565b3360009081526019602052604090205460ff168015611ff4575060185462010000900460ff165b156119555760185462010000900460ff166120215760405162461bcd60e51b8152600401610cc490613803565b610bb8816120326002546001540390565b61203c919061373a565b11156119e55760405162461bcd60e51b815260206004820152603760248201526000805160206139e683398151915260448201527f796f6e6420706861736520746f74616c20537570706c790000000000000000006064820152608401610cc4565b6018546301000000900460ff16156119555760405162461bcd60e51b815260206004820152602360248201527f426c6f636b536565644d756e6b73203a3a204d696e74696e67206973207061756044820152621cd95960ea1b6064820152608401610cc4565b6001600160a01b03821633141561212e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336121ad600a546001600160a01b031690565b6001600160a01b031614806121cc5750600b546001600160a01b031633145b6121e85760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff001916680100000000000101001790556701f161421c8e0000601055565b33612226600a546001600160a01b031690565b6001600160a01b031614806122455750600b546001600160a01b031633145b6122615760405162461bcd60e51b8152600401610cc4906135bd565b8051610ce0906017906020840190613111565b33612287600a546001600160a01b031690565b6001600160a01b031614806122a65750600b546001600160a01b031633145b6122c25760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff0019166301000000179055565b6001600160a01b03831660009081526009602052604090205460ff16156123155760405162461bcd60e51b8152600401610cc49061362d565b6001600160a01b03841660009081526009602052604090205460ff161561234e5760405162461bcd60e51b8152600401610cc49061362d565b612359848484612963565b6001600160a01b0383163b1515801561237b575061237984848484612cd7565b155b15612399576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b336123b2600a546001600160a01b031690565b6001600160a01b031614806123d15750600b546001600160a01b031633145b6123ed5760405162461bcd60e51b8152600401610cc4906135bd565b601854640100000000900460ff16156124565760405162461bcd60e51b815260206004820152602560248201527f426c6f636b536565644d756e6b73203a3a205465616d20616c7265616479206d6044820152641a5b9d195960da1b6064820152608401610cc4565b6018805464ff00000000191664010000000017905561158e336028612cbd565b33612489600a546001600160a01b031690565b6001600160a01b031614806124a85750600b546001600160a01b031633145b6124c45760405162461bcd60e51b8152600401610cc4906135bd565b601155565b336124dc600a546001600160a01b031690565b6001600160a01b031614806124fb5750600b546001600160a01b031633145b6125175760405162461bcd60e51b8152600401610cc4906135bd565b601055565b6060612527826128db565b61258b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610cc4565b600061259883600161373a565b60185490915060ff1661263857601780546125b2906135f2565b80601f01602080910402602001604051908101604052809291908181526020018280546125de906135f2565b801561262b5780601f106126005761010080835404028352916020019161262b565b820191906000526020600020905b81548152906001019060200180831161260e57829003601f168201915b5050505050915050919050565b600060168054612647906135f2565b905011612663576040518060200160405280600081525061268f565b601661266e82612dcf565b60405160200161267f9291906138a5565b6040516020818303038152906040525b9392505050565b336126a9600a546001600160a01b031690565b6001600160a01b031614806126c85750600b546001600160a01b031633145b6126e45760405162461bcd60e51b8152600401610cc4906135bd565b600d55565b336126fc600a546001600160a01b031690565b6001600160a01b0316148061271b5750600b546001600160a01b031633145b6127375760405162461bcd60e51b8152600401610cc4906135bd565b6018805468ffffffff00ffffff0019166701000000000101001790556701aa535d3d0c0000601055565b33612774600a546001600160a01b031690565b6001600160a01b031614806127935750600b546001600160a01b031633145b6127af5760405162461bcd60e51b8152600401610cc4906135bd565b6018805461ff001981166101009182900460ff1615909102179055565b336127df600a546001600160a01b031690565b6001600160a01b031614806127fe5750600b546001600160a01b031633145b61281a5760405162461bcd60e51b8152600401610cc4906135bd565b600f55565b33612832600a546001600160a01b031690565b6001600160a01b031614806128515750600b546001600160a01b031633145b61286d5760405162461bcd60e51b8152600401610cc4906135bd565b6001600160a01b0381166128d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc4565b61195581612c6b565b600060015482108015610c70575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061296e82612b51565b9050836001600160a01b031681600001516001600160a01b0316146129a55760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806129c357506129c38533610bb6565b806129de5750336129d384610d76565b6001600160a01b0316145b9050806129fe57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612a2557604051633a954ecd60e21b815260040160405180910390fd5b612a3160008487612907565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612b05576001548214612b0557805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281600154811015612c5257600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612c505780516001600160a01b031615612be7579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612c4b579392505050565b612be7565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610ce0828260405180602001604052806000815250612ecc565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612d0c903390899088908890600401613960565b602060405180830381600087803b158015612d2657600080fd5b505af1925050508015612d56575060408051601f3d908101601f19168201909252612d539181019061399d565b60015b612db1573d808015612d84576040519150601f19603f3d011682016040523d82523d6000602084013e612d89565b606091505b508051612da9576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081612df35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e1d5780612e07816136d9565b9150612e169050600a836136af565b9150612df7565b6000816001600160401b03811115612e3757612e37613214565b6040519080825280601f01601f191660200182016040528015612e61576020820181803683370190505b5090505b8415612dc757612e766001836139ba565b9150612e83600a866139d1565b612e8e90603061373a565b60f81b818381518110612ea357612ea36136c3565b60200101906001600160f81b031916908160001a905350612ec5600a866136af565b9450612e65565b6001600160a01b03831660009081526009602052604090205460ff1615612f055760405162461bcd60e51b8152600401610cc49061362d565b610e4383838360016001600160a01b03841660009081526009602052604090205460ff1615612f465760405162461bcd60e51b8152600401610cc49061362d565b6001546001600160a01b038516612f6f57604051622e076360e81b815260040160405180910390fd5b83612f8d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561303957506001600160a01b0387163b15155b156130c2575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461308a6000888480600101955088612cd7565b6130a7576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561303f5782600154146130bd57600080fd5b613108565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156130c3575b50600155612b4a565b82805461311d906135f2565b90600052602060002090601f01602090048101928261313f5760008555613185565b82601f1061315857805160ff1916838001178555613185565b82800160010185558215613185579182015b8281111561318557825182559160200191906001019061316a565b50613191929150613195565b5090565b5b808211156131915760008155600101613196565b6001600160e01b03198116811461195557600080fd5b6000602082840312156131d257600080fd5b813561268f816131aa565b80356001600160a01b03811681146131f457600080fd5b919050565b60006020828403121561320b57600080fd5b61268f826131dd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561325257613252613214565b604052919050565b60006001600160401b0383111561327357613273613214565b613286601f8401601f191660200161322a565b905082815283838301111561329a57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156132c357600080fd5b81356001600160401b038111156132d957600080fd5b8201601f810184136132ea57600080fd5b612dc78482356020840161325a565b60005b838110156133145781810151838201526020016132fc565b838111156123995750506000910152565b6000815180845261333d8160208601602086016132f9565b601f01601f19169290920160200192915050565b60208152600061268f6020830184613325565b60006020828403121561337657600080fd5b5035919050565b6000806040838503121561339057600080fd5b613399836131dd565b946020939093013593505050565b6000806000606084860312156133bc57600080fd5b6133c5846131dd565b92506133d3602085016131dd565b9150604084013590509250925092565b600060208083850312156133f657600080fd5b82356001600160401b038082111561340d57600080fd5b818501915085601f83011261342157600080fd5b81358181111561343357613433613214565b8060051b915061344484830161322a565b818152918301840191848101908884111561345e57600080fd5b938501935b8385101561348357613474856131dd565b82529385019390850190613463565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134c7578351835292840192918401916001016134ab565b50909695505050505050565b600080604083850312156134e657600080fd5b6134ef836131dd565b91506020830135801515811461350457600080fd5b809150509250929050565b6000806000806080858703121561352557600080fd5b61352e856131dd565b935061353c602086016131dd565b92506040850135915060608501356001600160401b0381111561355e57600080fd5b8501601f8101871361356f57600080fd5b61357e8782356020840161325a565b91505092959194509250565b6000806040838503121561359d57600080fd5b6135a6836131dd565b91506135b4602084016131dd565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061360657607f821691505b6020821081141561362757634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526017908201527f526563697069656e74206973206261636b6c6973746564000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561369457613694613664565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826136be576136be613699565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156136ed576136ed613664565b5060010190565b60208082526026908201527f426c6f636b536565644d756e6b73203a3a204d696e74696e67206973206f6e206040820152652830bab9b29760d11b606082015260800190565b6000821982111561374d5761374d613664565b500190565b60208082526033908201526000805160206139e6833981519152604082015272796f6e64207068617365203120737570706c7960681b606082015260800190565b6020808252604a908201527f426c6f636b536565644d756e6b73203a3a20596f752063616e206e6f74206d6960408201527f6e74206d6f7265207468616e20746865206d6178696d756d20616c6c6f776564606082015269103832b9103ab9b2b91760b11b608082015260a00190565b60208082526025908201527f426c6f636b536565644d756e6b73203a3a204d696e74696e67206973206f6e20604082015264506175736560d81b606082015260800190565b60208082526033908201526000805160206139e6833981519152604082015272796f6e64207068617365203220737570706c7960681b606082015260800190565b6000815161389b8185602086016132f9565b9290920192915050565b600080845481600182811c9150808316806138c157607f831692505b60208084108214156138e157634e487b7160e01b86526022600452602486fd5b8180156138f5576001811461390657613933565b60ff19861689528489019650613933565b60008b81526020902060005b8681101561392b5781548b820152908501908301613912565b505084890196505b5050505050506139576139468286613889565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061399390830184613325565b9695505050505050565b6000602082840312156139af57600080fd5b815161268f816131aa565b6000828210156139cc576139cc613664565b500390565b6000826139e0576139e0613699565b50069056fe426c6f636b536565644d756e6b73203a3a2043616e6e6f74206d696e74206265a2646970667358221220651f59e027e08cfaa2f9ee48d9d93d85bf5b9674ddce7ab0777a4133723f5d1664736f6c63430008090033

Deployed Bytecode Sourcemap

157:14966:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4706:300:11;;;;;;;;;;-1:-1:-1;4706:300:11;;;;;:::i;:::-;;:::i;:::-;;;565:14:12;;558:22;540:41;;528:2;513:18;4706:300:11;;;;;;;;1204:53:10;;;;;;;;;;-1:-1:-1;1204:53:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1107:25:12;;;1095:2;1080:18;1204:53:10;961:177:12;10451:115:10;;;;;;;;;;-1:-1:-1;10451:115:10;;;;;:::i;:::-;;:::i;:::-;;7734:98:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9190:200::-;;;;;;;;;;-1:-1:-1;9190:200:11;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3545:32:12;;;3527:51;;3515:2;3500:18;9190:200:11;3381:203:12;8767:362:11;;;;;;;;;;-1:-1:-1;8767:362:11;;;;;:::i;:::-;;:::i;1013:18:10:-;;;;;;;;;;-1:-1:-1;1013:18:10;;;;;;;;;;;528:48;;;;;;;;;;;;;;;;379:41;;;;;;;;;;;;;;;;13986:270;;;;;;;;;;;;;:::i;3977:297:11:-;;;;;;;;;;-1:-1:-1;4227:12:11;;4211:13;;:28;3977:297;;1147:50:10;;;;;;;;;;-1:-1:-1;1147:50:10;;;;;:::i;:::-;;;;;;;;;;;;;;10029:300:11;;;;;;;;;;-1:-1:-1;10029:300:11;;;;;:::i;:::-;;:::i;13745:233:10:-;;;;;;;;;;;;;:::i;626:35::-;;;;;;;;;;;;;;;;12093:134;;;;;;;;;;-1:-1:-1;12093:134:10;;;;;:::i;:::-;;:::i;12398:140::-;;;;;;;;;;-1:-1:-1;12398:140:10;;;;;:::i;:::-;;:::i;867:22::-;;;;;;;;;;-1:-1:-1;867:22:10;;;;;;;;;;;14860:260;;;;;;;;;;;;;:::i;710:40::-;;;;;;;;;;;;;;;;10395:309:11;;;;;;;;;;-1:-1:-1;10395:309:11;;;;;:::i;:::-;;:::i;11001:175:10:-;;;;;;;;;;-1:-1:-1;11001:175:10;;;;;:::i;:::-;;:::i;794:35::-;;;;;;;;;;;;;:::i;11188:184::-;;;;;;;;;;-1:-1:-1;11188:184:10;;;;;:::i;:::-;;:::i;838:22::-;;;;;;;;;;-1:-1:-1;838:22:10;;;;;;;;11414:110;;;;;;;;;;-1:-1:-1;11414:110:10;;;;;:::i;:::-;;:::i;13652:85::-;;;;;;;;;;;;;:::i;7549:123:11:-;;;;;;;;;;-1:-1:-1;7549:123:11;;;;;:::i;:::-;;:::i;11533:115:10:-;;;;;;;;;;-1:-1:-1;11624:16:10;;11533:115;;10722:203;;;;;;;;;;-1:-1:-1;10722:203:10;;;;;:::i;:::-;;:::i;668:35::-;;;;;;;;;;;;;;;;5065:203:11;;;;;;;;;;-1:-1:-1;5065:203:11;;;;;:::i;:::-;;:::i;1777:101:0:-;;;;;;;;;;;;;:::i;585:34:10:-;;;;;;;;;;;;;;;;12580:138;;;;;;;;;;-1:-1:-1;12580:138:10;;;;;:::i;:::-;;:::i;12726:117::-;;;;;;;;;;-1:-1:-1;12816:18:10;;12726:117;;10035:408;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;928:24::-;;;;;;;;;;-1:-1:-1;928:24:10;;;;;;;;;;;896:25;;;;;;;;;;-1:-1:-1;896:25:10;;;;;;;;;;;13449:98;;;;;;;;;;;;;:::i;1041:86:0:-;;;;;;;;;;-1:-1:-1;1113:6:0;;-1:-1:-1;;;;;1113:6:0;1041:86;;11816:121:10;;;;;;;;;;-1:-1:-1;11910:19:10;;11816:121;;7896:102:11;;;;;;;;;;;;;:::i;1038:18:10:-;;;;;;;;;;-1:-1:-1;1038:18:10;;;;-1:-1:-1;;;1038:18:10;;;;;;1478:7635;;;;;;:::i;:::-;;:::i;9457:282:11:-;;;;;;;;;;-1:-1:-1;9457:282:11;;;;;:::i;:::-;;:::i;13046:123:10:-;;;;;;;;;;-1:-1:-1;13139:21:10;;13046:123;;14543:271;;;;;;;;;;;;;:::i;988:18::-;;;;;;;;;;-1:-1:-1;988:18:10;;;;;;;;;;;10572:142;;;;;;;;;;-1:-1:-1;10572:142:10;;;;;:::i;:::-;;:::i;427:44::-;;;;;;;;;;;;;;;;478:43;;;;;;;;;;;;;;;;241:40;;;;;;;;;;;;277:4;241:40;;13208:233;;;;;;;;;;;;;:::i;10770:489:11:-;;;;;;;;;;-1:-1:-1;10770:489:11;;;;;:::i;:::-;;:::i;9121:182:10:-;;;;;;;;;;;;;:::i;288:37::-;;;;;;;;;;;;;;;;12276:114;;;;;;;;;;-1:-1:-1;12276:114:10;;;;;:::i;:::-;;:::i;1090:48::-;;;;;;;;;;-1:-1:-1;1090:48:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;1063:18;;;;;;;;;;-1:-1:-1;1063:18:10;;;;-1:-1:-1;;;1063:18:10;;;;;;11977:108;;;;;;;;;;-1:-1:-1;11977:108:10;;;;;:::i;:::-;;:::i;9468:473::-;;;;;;;;;;-1:-1:-1;9468:473:10;;;;;:::i;:::-;;:::i;332:40::-;;;;;;;;;;;;;;;;11691:116;;;;;;;;;;-1:-1:-1;11691:116:10;;;;;:::i;:::-;;:::i;14264:271::-;;;;;;;;;;;;;:::i;13555:89::-;;;;;;;;;;;;;:::i;959:22::-;;;;;;;;;;-1:-1:-1;959:22:10;;;;;;;;;;;9805:162:11;;;;;;;;;;-1:-1:-1;9805:162:11;;;;;:::i;:::-;-1:-1:-1;;;;;9925:25:11;;;9902:4;9925:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9805:162;12888:150:10;;;;;;;;;;-1:-1:-1;12888:150:10;;;;;:::i;:::-;;:::i;2027:198:0:-;;;;;;;;;;-1:-1:-1;2027:198:0;;;;;:::i;:::-;;:::i;4706:300:11:-;4808:4;-1:-1:-1;;;;;;4843:40:11;;-1:-1:-1;;;4843:40:11;;:104;;-1:-1:-1;;;;;;;4899:48:11;;-1:-1:-1;;;4899:48:11;4843:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:8;;;4963:36:11;4824:175;4706:300;-1:-1:-1;;4706:300:11:o;10451:115:10:-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;;;;;;;;;10530:28:10;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;10451:115:::0;:::o;7734:98:11:-;7788:13;7820:5;7813:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7734:98;:::o;9190:200::-;9258:7;9282:16;9290:7;9282;:16::i;:::-;9277:64;;9307:34;;-1:-1:-1;;;9307:34:11;;;;;;;;;;;9277:64;-1:-1:-1;9359:24:11;;;;:15;:24;;;;;;-1:-1:-1;;;;;9359:24:11;;9190:200::o;8767:362::-;8839:13;8855:24;8871:7;8855:15;:24::i;:::-;8839:40;;8899:5;-1:-1:-1;;;;;8893:11:11;:2;-1:-1:-1;;;;;8893:11:11;;8889:48;;;8913:24;;-1:-1:-1;;;8913:24:11;;;;;;;;;;;8889:48;719:10:6;-1:-1:-1;;;;;8952:21:11;;;;;;:63;;-1:-1:-1;8978:37:11;8995:5;719:10:6;9805:162:11;:::i;8978:37::-;8977:38;8952:63;8948:136;;;9038:35;;-1:-1:-1;;;9038:35:11;;;;;;;;;;;8948:136;9094:28;9103:2;9107:7;9116:5;9094:8;:28::i;:::-;8829:300;8767:362;;:::o;13986:270:10:-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;14039:6:10::1;:13:::0;;-1:-1:-1;;14197:13:10;14169:17;14197:13;;;14239:9:::1;14221:15;:27:::0;13986:270::o;10029:300:11:-;-1:-1:-1;;;;;10173:17:11;;;;;;:13;:17;;;;;;;;10172:18;10164:54;;;;-1:-1:-1;;;10164:54:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;10237:19:11;;;;;;:13;:19;;;;;;;;10236:20;10228:56;;;;-1:-1:-1;;;10228:56:11;;;;;;;:::i;:::-;10294:28;10304:4;10310:2;10314:7;10294:9;:28::i;13745:233:10:-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;13798:6:10::1;:13:::0;;-1:-1:-1;;13957:13:10;13822:20;13957:13;;;13745:233::o;12093:134::-;12157:7;12203:15;;12193:9;:25;;;;:::i;12398:140::-;12465:7;12511:18;;12501:9;:28;;;;:::i;14860:260::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;14909:22:10::1;14960:3;14934:25;:21;14958:1;14934:25;:::i;:::-;:29;;;;:::i;:::-;14974:76;::::0;14909:54;;-1:-1:-1;14982:42:10::1;::::0;14974:76;::::1;;;::::0;14909:54;;14974:76:::1;::::0;;;14909:54;14982:42;14974:76;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;15061:51:10::1;::::0;15069:10:::1;::::0;15090:21:::1;15061:51:::0;::::1;;;::::0;::::1;::::0;;;15090:21;15069:10;15061:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;10395:309:11::0;-1:-1:-1;;;;;10537:17:11;;;;;;:13;:17;;;;;;;;10536:18;10528:54;;;;-1:-1:-1;;;10528:54:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;10601:19:11;;;;;;:13;:19;;;;;;;;10600:20;10592:56;;;;-1:-1:-1;;;10592:56:11;;;;;;;:::i;:::-;10658:39;10675:4;10681:2;10685:7;10658:39;;;;;;;;;;;;:16;:39::i;11001:175:10:-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11075:23:10;::::1;;::::0;;;:13:::1;:23;::::0;;;;;::::1;;11074:24;11066:61;;;::::0;-1:-1:-1;;;11066:61:10;;8926:2:12;11066:61:10::1;::::0;::::1;8908:21:12::0;8965:2;8945:18;;;8938:30;9004:26;8984:18;;;8977:54;9048:18;;11066:61:10::1;8724:348:12::0;11066:61:10::1;-1:-1:-1::0;;;;;11138:23:10::1;;::::0;;;:13:::1;:23;::::0;;;;:30;;-1:-1:-1;;11138:30:10::1;11164:4;11138:30;::::0;;11001:175::o;794:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11188:184::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11271:23:10;::::1;;::::0;;;:13:::1;:23;::::0;;;;;::::1;;11263:59;;;::::0;-1:-1:-1;;;11263:59:10;;9279:2:12;11263:59:10::1;::::0;::::1;9261:21:12::0;9318:2;9298:18;;;9291:30;9357:25;9337:18;;;9330:53;9400:18;;11263:59:10::1;9077:347:12::0;11263:59:10::1;-1:-1:-1::0;;;;;11333:23:10::1;11359:5;11333:23:::0;;;:13:::1;:23;::::0;;;;:31;;-1:-1:-1;;11333:31:10::1;::::0;;11188:184::o;11414:110::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;11490:16:10::1;:26:::0;11414:110::o;13652:85::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;13719:10:10::1;::::0;;-1:-1:-1;;13705:24:10;::::1;13719:10;::::0;;::::1;13718:11;13705:24;::::0;;13652:85::o;7549:123:11:-;7613:7;7639:21;7652:7;7639:12;:21::i;:::-;:26;;7549:123;-1:-1:-1;;7549:123:11:o;10722:203:10:-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;10820:6:10::1;10816:102;10832:8;:15;10830:1;:17;10816:102;;;10902:4;10868:18;:31;10887:8;10896:1;10887:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;10868:31:10::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;10868:31:10;:38;;-1:-1:-1;;10868:38:10::1;::::0;::::1;;::::0;;;::::1;::::0;;10849:3;::::1;::::0;::::1;:::i;:::-;;;;10816:102;;5065:203:11::0;5129:7;-1:-1:-1;;;;;5152:19:11;;5148:60;;5180:28;;-1:-1:-1;;;5180:28:11;;;;;;;;;;;5148:60;-1:-1:-1;;;;;;5233:19:11;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;5233:27:11;;5065:203::o;1777:101:0:-;1345:10;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;1841:30:::1;1868:1;1841:18;:30::i;:::-;1777:101::o:0;12580:138:10:-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;12670:18:10::1;:40:::0;12580:138::o;10035:408::-;10077:16;10122:10;10105:14;10170:17;10122:10;10170:9;:17::i;:::-;10143:44;;10198:25;10240:16;-1:-1:-1;;;;;10226:31:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10226:31:10;;10198:59;;10274:13;10270:138;10301:16;10293:5;:24;10270:138;;;10319:7;;;;:::i;:::-;;;;10270:138;;;-1:-1:-1;10427:8:10;10035:408;-1:-1:-1;;;10035:408:10:o;13449:98::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;13526:13:10::1;::::0;;-1:-1:-1;;13509:30:10;::::1;13526:13:::0;;;;::::1;;;13525:14;13509:30:::0;;::::1;;::::0;;13449:98::o;7896:102:11:-;7952:13;7984:7;7977:14;;;;;:::i;1478:7635:10:-;1374:9;1387:10;1374:23;1366:84;;;;-1:-1:-1;;;1366:84:10;;9903:2:12;1366:84:10;;;9885:21:12;9942:2;9922:18;;;9915:30;9981:34;9961:18;;;9954:62;-1:-1:-1;;;10032:18:12;;;10025:46;10088:19;;1366:84:10;9701:412:12;1366:84:10;1554:13:::1;::::0;;;::::1;;;::::0;:37:::1;;-1:-1:-1::0;1571:10:10::1;::::0;::::1;::::0;::::1;;;:20:::0;::::1;;;-1:-1:-1::0;1585:6:10::1;::::0;;;::::1;;;1571:20;1551:7555;;;1645:10;1626:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;1625:31;:45:::0;::::1;;;-1:-1:-1::0;1660:10:10::1;::::0;::::1;::::0;::::1;;;1625:45;1621:1777;;;1698:10;::::0;::::1;::::0;::::1;;;1690:61;;;;-1:-1:-1::0;;;1690:61:10::1;;;;;;;:::i;:::-;1809:13;;1795:9;1779:13;4227:12:11::0;;4211:13;;:28;;3977:297;1779:13:10::1;:25;;;;:::i;:::-;1778:44;;1770:108;;;;-1:-1:-1::0;;;1770:108:10::1;;;;;;;:::i;:::-;1950:16;::::0;1922:10:::1;1906:27;::::0;;;:15:::1;:27;::::0;;;;;:39:::1;::::0;1936:9;;1906:39:::1;:::i;:::-;1905:61;;1897:127;;;::::0;-1:-1:-1;;;1897:127:10;;11280:2:12;1897:127:10::1;::::0;::::1;11262:21:12::0;11319:2;11299:18;;;11292:30;-1:-1:-1;;;;;;;;;;;11338:18:12;;;11331:62;-1:-1:-1;;;11409:18:12;;;11402:51;11470:19;;1897:127:10::1;11078:417:12::0;1897:127:10::1;2083:9;2065:15;;:27;;;;:::i;:::-;2051:9;:42;;2043:100;;;::::0;-1:-1:-1;;;2043:100:10;;11702:2:12;2043:100:10::1;::::0;::::1;11684:21:12::0;11741:2;11721:18;;;11714:30;11780:34;11760:18;;;11753:62;-1:-1:-1;;;11831:18:12;;;11824:43;11884:19;;2043:100:10::1;11500:409:12::0;2043:100:10::1;2207:18;;2182:21;2192:10;2182:9;:21::i;:::-;2170:33;::::0;:9;:33:::1;:::i;:::-;:55;;2162:143;;;;-1:-1:-1::0;;;2162:143:10::1;;;;;;;:::i;:::-;2344:10;2328:27;::::0;;;:15:::1;:27;::::0;;;;:40;;2359:9;;2328:27;:40:::1;::::0;2359:9;;2328:40:::1;:::i;:::-;::::0;;;-1:-1:-1;2387:32:10::1;::::0;-1:-1:-1;2397:10:10::1;2409:9:::0;2387::::1;:32::i;:::-;1478:7635:::0;:::o;1621:1777::-:1;2477:10;2458:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;:47:::0;::::1;;;-1:-1:-1::0;2492:13:10::1;::::0;;;::::1;;;2458:47;2454:944;;;2533:13;::::0;;;::::1;;;2525:63;;;;-1:-1:-1::0;;;2525:63:10::1;;;;;;;:::i;:::-;2646:13;;2632:9;2616:13;4227:12:11::0;;4211:13;;:28;;3977:297;2616:13:10::1;:25;;;;:::i;:::-;2615:44;;2607:108;;;;-1:-1:-1::0;;;2607:108:10::1;;;;;;;:::i;:::-;2791:19;::::0;2762:10:::1;2743:30;::::0;;;:18:::1;:30;::::0;;;;;:42:::1;::::0;2776:9;;2743:42:::1;:::i;:::-;2742:68;;2734:136;;;::::0;-1:-1:-1;;;2734:136:10;;13005:2:12;2734:136:10::1;::::0;::::1;12987:21:12::0;13044:2;13024:18;;;13017:30;13083:34;13063:18;;;13056:62;13154:25;13134:18;;;13127:53;13197:19;;2734:136:10::1;12803:419:12::0;2734:136:10::1;2932:9;2911:18;;:30;;;;:::i;:::-;2897:9;:45;;2889:102;;;::::0;-1:-1:-1;;;2889:102:10;;13429:2:12;2889:102:10::1;::::0;::::1;13411:21:12::0;13468:2;13448:18;;;13441:30;13507:34;13487:18;;;13480:62;-1:-1:-1;;;13558:18:12;;;13551:42;13610:19;;2889:102:10::1;13227:408:12::0;2889:102:10::1;3055:21;;3030;3040:10;3030:9;:21::i;:::-;3018:33;::::0;:9;:33:::1;:::i;:::-;:58;;3010:146;;;;-1:-1:-1::0;;;3010:146:10::1;;;;;;;:::i;:::-;3202:10;3183:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;3175:92;;;::::0;-1:-1:-1;;;3175:92:10;;13842:2:12;3175:92:10::1;::::0;::::1;13824:21:12::0;13881:2;13861:18;;;13854:30;13920:34;13900:18;;;13893:62;-1:-1:-1;;;13971:18:12;;;13964:47;14028:19;;3175:92:10::1;13640:413:12::0;3175:92:10::1;3307:10;3288:30;::::0;;;:18:::1;:30;::::0;;;;:43;;3322:9;;3288:30;:43:::1;::::0;3322:9;;3288:43:::1;:::i;1551:7555::-;3428:10;::::0;::::1;::::0;::::1;;;::::0;:37:::1;;-1:-1:-1::0;3442:13:10::1;::::0;;;::::1;;;:23:::0;::::1;;;-1:-1:-1::0;3459:6:10::1;::::0;;;::::1;;;3442:23;3424:5682;;;3507:10;3488:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;3487:31;:45:::0;::::1;;;-1:-1:-1::0;3522:10:10::1;::::0;::::1;::::0;::::1;;;3487:45;3483:1777;;;3560:10;::::0;::::1;::::0;::::1;;;3552:61;;;;-1:-1:-1::0;;;3552:61:10::1;;;;;;;:::i;:::-;3671:13;;3657:9;3641:13;4227:12:11::0;;4211:13;;:28;;3977:297;3641:13:10::1;:25;;;;:::i;:::-;3640:44;;3632:108;;;;-1:-1:-1::0;;;3632:108:10::1;;;;;;;:::i;3483:1777::-;4339:10;4320:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;:47:::0;::::1;;;-1:-1:-1::0;4354:13:10::1;::::0;;;::::1;;;4320:47;4316:944;;;4395:13;::::0;;;::::1;;;4387:63;;;;-1:-1:-1::0;;;4387:63:10::1;;;;;;;:::i;:::-;4508:13;;4494:9;4478:13;4227:12:11::0;;4211:13;;:28;;3977:297;4478:13:10::1;:25;;;;:::i;:::-;4477:44;;4469:108;;;;-1:-1:-1::0;;;4469:108:10::1;;;;;;;:::i;3424:5682::-;5304:10;::::0;::::1;::::0;::::1;;;::::0;:37:::1;;-1:-1:-1::0;5318:13:10::1;::::0;;;::::1;;;:23:::0;::::1;;;-1:-1:-1::0;5335:6:10::1;::::0;-1:-1:-1;;;5335:6:10;::::1;;;5318:23;5300:3806;;;5383:10;5364:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;5363:31;:45:::0;::::1;;;-1:-1:-1::0;5398:10:10::1;::::0;::::1;::::0;::::1;;;5363:45;5359:1766;;;5436:10;::::0;::::1;::::0;::::1;;;5428:61;;;;-1:-1:-1::0;;;5428:61:10::1;;;;;;;:::i;:::-;5547:13;;5533:9;5517:13;4227:12:11::0;;4211:13;;:28;;3977:297;5517:13:10::1;:25;;;;:::i;:::-;5516:44;;5508:96;;;::::0;-1:-1:-1;;;5508:96:10;;14680:2:12;5508:96:10::1;::::0;::::1;14662:21:12::0;14719:2;14699:18;;;14692:30;14758:34;14738:18;;;14731:62;-1:-1:-1;;;14809:18:12;;;14802:37;14856:19;;5508:96:10::1;14478:403:12::0;5359:1766:10::1;6204:10;6185:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;:47:::0;::::1;;;-1:-1:-1::0;6219:13:10::1;::::0;;;::::1;;;6185:47;6181:944;;;6260:13;::::0;;;::::1;;;6252:63;;;;-1:-1:-1::0;;;6252:63:10::1;;;;;;;:::i;:::-;6373:13;;6359:9;6343:13;4227:12:11::0;;4211:13;;:28;;3977:297;6343:13:10::1;:25;;;;:::i;:::-;6342:44;;6334:108;;;::::0;-1:-1:-1;;;6334:108:10;;15088:2:12;6334:108:10::1;::::0;::::1;15070:21:12::0;15127:2;15107:18;;;15100:30;-1:-1:-1;;;;;;;;;;;15146:18:12;;;15139:62;-1:-1:-1;;;15217:18:12;;;15210:49;15276:19;;6334:108:10::1;14886:415:12::0;5300:3806:10::1;7155:10;::::0;::::1;::::0;::::1;;;::::0;:37:::1;;-1:-1:-1::0;7169:13:10::1;::::0;;;::::1;;;:23:::0;::::1;;;-1:-1:-1::0;7186:6:10::1;::::0;-1:-1:-1;;;7186:6:10;::::1;;;7169:23;7151:1955;;;7234:10;7215:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;7214:31;:45:::0;::::1;;;-1:-1:-1::0;7249:10:10::1;::::0;::::1;::::0;::::1;;;7214:45;7210:1782;;;7287:10;::::0;::::1;::::0;::::1;;;7279:61;;;;-1:-1:-1::0;;;7279:61:10::1;;;;;;;:::i;:::-;277:4;7384:9;7368:13;4227:12:11::0;;4211:13;;:28;;3977:297;7368:13:10::1;:25;;;;:::i;:::-;7367:40;;7359:102;;;::::0;-1:-1:-1;;;7359:102:10;;15508:2:12;7359:102:10::1;::::0;::::1;15490:21:12::0;15547:2;15527:18;;;15520:30;-1:-1:-1;;;;;;;;;;;15566:18:12;;;15559:62;-1:-1:-1;;;15637:18:12;;;15630:47;15694:19;;7359:102:10::1;15306:413:12::0;7210:1782:10::1;8071:10;8052:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;:47:::0;::::1;;;-1:-1:-1::0;8086:13:10::1;::::0;;;::::1;;;8052:47;8048:944;;;8127:13;::::0;;;::::1;;;8119:63;;;;-1:-1:-1::0;;;8119:63:10::1;;;;;;;:::i;:::-;277:4;8226:9;8210:13;4227:12:11::0;;4211:13;;:28;;3977:297;8210:13:10::1;:25;;;;:::i;:::-;8209:40;;8201:108;;;::::0;-1:-1:-1;;;8201:108:10;;15926:2:12;8201:108:10::1;::::0;::::1;15908:21:12::0;15965:2;15945:18;;;15938:30;-1:-1:-1;;;;;;;;;;;15984:18:12;;;15977:62;16075:25;16055:18;;;16048:53;16118:19;;8201:108:10::1;15724:419:12::0;7151:1955:10::1;9049:5;::::0;;;::::1;;;9048:6;9040:54;;;::::0;-1:-1:-1;;;9040:54:10;;16350:2:12;9040:54:10::1;::::0;::::1;16332:21:12::0;16389:2;16369:18;;;16362:30;16428:34;16408:18;;;16401:62;-1:-1:-1;;;16479:18:12;;;16472:33;16522:19;;9040:54:10::1;16148:399:12::0;9457:282:11;-1:-1:-1;;;;;9555:24:11;;719:10:6;9555:24:11;9551:54;;;9588:17;;-1:-1:-1;;;9588:17:11;;;;;;;;;;;9551:54;719:10:6;9616:32:11;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9616:42:11;;;;;;;;;;;;:53;;-1:-1:-1;;9616:53:11;;;;;;;;;;9684:48;;540:41:12;;;9616:42:11;;719:10:6;9684:48:11;;513:18:12;9684:48:11;;;;;;;9457:282;;:::o;14543:271:10:-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;14596:6:10::1;:13:::0;;-1:-1:-1;;14754:13:10;14726:17;14754:13;;;14796:10:::1;14778:15;:28:::0;14543:271::o;10572:142::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;10664:42:10;;::::1;::::0;:19:::1;::::0;:42:::1;::::0;::::1;::::0;::::1;:::i;13208:233::-:0;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;13260:5:10::1;:12:::0;;-1:-1:-1;;13415:18:10;13260:12;13415:18;;;13208:233::o;10770:489:11:-;-1:-1:-1;;;;;10940:17:11;;;;;;:13;:17;;;;;;;;10939:18;10931:54;;;;-1:-1:-1;;;10931:54:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;11004:19:11;;;;;;:13;:19;;;;;;;;11003:20;10995:56;;;;-1:-1:-1;;;10995:56:11;;;;;;;:::i;:::-;11061:28;11071:4;11077:2;11081:7;11061:9;:28::i;:::-;-1:-1:-1;;;;;11103:13:11;;1465:19:5;:23;;11103:76:11;;;;;11123:56;11154:4;11160:2;11164:7;11173:5;11123:30;:56::i;:::-;11122:57;11103:76;11099:154;;;11202:40;;-1:-1:-1;;;11202:40:11;;;;;;;;;;;11099:154;10770:489;;;;:::o;9121:182:10:-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;9179:10:10::1;::::0;;;::::1;;;9178:11;9170:61;;;::::0;-1:-1:-1;;;9170:61:10;;16754:2:12;9170:61:10::1;::::0;::::1;16736:21:12::0;16793:2;16773:18;;;16766:30;16832:34;16812:18;;;16805:62;-1:-1:-1;;;16883:18:12;;;16876:35;16928:19;;9170:61:10::1;16552:401:12::0;9170:61:10::1;9242:10;:17:::0;;-1:-1:-1;;9242:17:10::1;::::0;::::1;::::0;;9270:25:::1;9280:10;9292:2;9270:9;:25::i;12276:114::-:0;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;12352:18:10::1;:30:::0;12276:114::o;11977:108::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;12050:15:10::1;:27:::0;11977:108::o;9468:473::-;9541:13;9575:16;9583:7;9575;:16::i;:::-;9567:76;;;;-1:-1:-1;;;9567:76:10;;17160:2:12;9567:76:10;;;17142:21:12;17199:2;17179:18;;;17172:30;17238:34;17218:18;;;17211:62;-1:-1:-1;;;17289:18:12;;;17282:45;17344:19;;9567:76:10;16958:411:12;9567:76:10;9656:14;9673:11;:7;9683:1;9673:11;:::i;:::-;9701:10;;9656:28;;-1:-1:-1;9701:10:10;;9697:68;;9734:19;9727:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9468:473;;;:::o;9697:68::-;9858:1;9835:12;9829:26;;;;;:::i;:::-;;;:30;:104;;;;;;;;;;;;;;;;;9886:12;9900:17;:6;:15;:17::i;:::-;9869:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9829:104;9822:111;9468:473;-1:-1:-1;;;9468:473:10:o;11691:116::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;11770:19:10::1;:29:::0;11691:116::o;14264:271::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;14317:6:10::1;:13:::0;;-1:-1:-1;;14475:13:10;14447:17;14475:13;;;14517:10:::1;14499:15;:28:::0;14264:271::o;13555:89::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;13626:10:10::1;::::0;;-1:-1:-1;;13612:24:10;::::1;13626:10;::::0;;;::::1;;;13625:11;13612:24:::0;;::::1;;::::0;;13555:89::o;12888:150::-;1345:10:0;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;12984:21:10::1;:46:::0;12888:150::o;2027:198:0:-;1345:10;1334:7;1113:6;;-1:-1:-1;;;;;1113:6:0;;1041:86;1334:7;-1:-1:-1;;;;;1334:21:0;;:46;;;-1:-1:-1;1359:7:0;;-1:-1:-1;;;;;1359:7:0;1370:10;1359:21;1334:46;1326:91;;;;-1:-1:-1;;;1326:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2115:22:0;::::1;2107:73;;;::::0;-1:-1:-1;;;2107:73:0;;19316:2:12;2107:73:0::1;::::0;::::1;19298:21:12::0;19355:2;19335:18;;;19328:30;19394:34;19374:18;;;19367:62;-1:-1:-1;;;19445:18:12;;;19438:36;19491:19;;2107:73:0::1;19114:402:12::0;2107:73:0::1;2190:28;2209:8;2190:18;:28::i;11505:172:11:-:0;11562:4;11625:13;;11615:7;:23;11585:85;;;;-1:-1:-1;;11643:20:11;;;;:11;:20;;;;;:27;-1:-1:-1;;;11643:27:11;;;;11642:28;;11505:172::o;19573:189::-;19683:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19683:29:11;-1:-1:-1;;;;;19683:29:11;;;;;;;;;19727:28;;19683:24;;19727:28;;;;;;;19573:189;;;:::o;14643:2082::-;14753:35;14791:21;14804:7;14791:12;:21::i;:::-;14753:59;;14849:4;-1:-1:-1;;;;;14827:26:11;:13;:18;;;-1:-1:-1;;;;;14827:26:11;;14823:67;;14862:28;;-1:-1:-1;;;14862:28:11;;;;;;;;;;;14823:67;14901:22;719:10:6;-1:-1:-1;;;;;14927:20:11;;;;:72;;-1:-1:-1;14963:36:11;14980:4;719:10:6;9805:162:11;:::i;14963:36::-;14927:124;;;-1:-1:-1;719:10:6;15015:20:11;15027:7;15015:11;:20::i;:::-;-1:-1:-1;;;;;15015:36:11;;14927:124;14901:151;;15068:17;15063:66;;15094:35;;-1:-1:-1;;;15094:35:11;;;;;;;;;;;15063:66;-1:-1:-1;;;;;15143:16:11;;15139:52;;15168:23;;-1:-1:-1;;;15168:23:11;;;;;;;;;;;15139:52;15307:35;15324:1;15328:7;15337:4;15307:8;:35::i;:::-;-1:-1:-1;;;;;15632:18:11;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15632:31:11;;;-1:-1:-1;;;;;15632:31:11;;;-1:-1:-1;;15632:31:11;;;;;;;15677:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15677:29:11;;;;;;;;;;;15755:20;;;:11;:20;;;;;;15789:18;;-1:-1:-1;;;;;;15821:49:11;;;;-1:-1:-1;;;15854:15:11;15821:49;;;;;;;;;;16140:11;;16199:24;;;;;16241:13;;15755:20;;16199:24;;16241:13;16237:377;;16448:13;;16433:11;:28;16429:171;;16485:20;;16553:28;;;;-1:-1:-1;;;;;16527:54:11;-1:-1:-1;;;16527:54:11;-1:-1:-1;;;;;;16527:54:11;;;-1:-1:-1;;;;;16485:20:11;;16527:54;;;;16429:171;15608:1016;;;16658:7;16654:2;-1:-1:-1;;;;;16639:27:11;16648:4;-1:-1:-1;;;;;16639:27:11;;;;;;;;;;;16676:42;14743:1982;;14643:2082;;;:::o;6408:1084::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6518:7:11;6598:13;;6591:4;:20;6560:868;;;6631:31;6665:17;;;:11;:17;;;;;;;;;6631:51;;;;;;;;;-1:-1:-1;;;;;6631:51:11;;;;-1:-1:-1;;;6631:51:11;;-1:-1:-1;;;;;6631:51:11;;;;;;;;-1:-1:-1;;;6631:51:11;;;;;;;;;;;;;;6700:714;;6749:14;;-1:-1:-1;;;;;6749:28:11;;6745:99;;6812:9;6408:1084;-1:-1:-1;;;6408:1084:11:o;6745:99::-;-1:-1:-1;;;7180:6:11;7224:17;;;;:11;:17;;;;;;;;;7212:29;;;;;;;;;-1:-1:-1;;;;;7212:29:11;;;;;-1:-1:-1;;;7212:29:11;;-1:-1:-1;;;;;7212:29:11;;;;;;;;-1:-1:-1;;;7212:29:11;;;;;;;;;;;;;7271:28;7267:107;;7338:9;6408:1084;-1:-1:-1;;;6408:1084:11:o;7267:107::-;7141:255;;;6613:815;6560:868;7454:31;;-1:-1:-1;;;7454:31:11;;;;;;;;;;;2379:187:0;2471:6;;;-1:-1:-1;;;;;2487:17:0;;;-1:-1:-1;;;;;;2487:17:0;;;;;;;2519:40;;2471:6;;;2487:17;2471:6;;2519:40;;2452:16;;2519:40;2442:124;2379:187;:::o;11683:102:11:-;11751:27;11761:2;11765:8;11751:27;;;;;;;;;;;;:9;:27::i;20243:650::-;20421:72;;-1:-1:-1;;;20421:72:11;;20401:4;;-1:-1:-1;;;;;20421:36:11;;;;;:72;;719:10:6;;20472:4:11;;20478:7;;20487:5;;20421:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20421:72:11;;;;;;;;-1:-1:-1;;20421:72:11;;;;;;;;;;;;:::i;:::-;;;20417:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20652:13:11;;20648:229;;20697:40;;-1:-1:-1;;;20697:40:11;;;;;;;;;;;20648:229;20837:6;20831:13;20822:6;20818:2;20814:15;20807:38;20417:470;-1:-1:-1;;;;;;20539:55:11;-1:-1:-1;;;20539:55:11;;-1:-1:-1;20417:470:11;20243:650;;;;;;:::o;328:703:7:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:7;;;;;;;;;;;;-1:-1:-1;;;627:10:7;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:7;;-1:-1:-1;773:2:7;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:7;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:7;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:7;;;;;;;;-1:-1:-1;972:11:7;981:2;972:11;;:::i;:::-;;;844:150;;12136:221:11;-1:-1:-1;;;;;12263:17:11;;;;;;:13;:17;;;;;;;;12262:18;12254:54;;;;-1:-1:-1;;;12254:54:11;;;;;;;:::i;:::-;12318:32;12324:2;12328:8;12338:5;12345:4;-1:-1:-1;;;;;12746:17:11;;;;;;:13;:17;;;;;;;;12745:18;12737:54;;;;-1:-1:-1;;;12737:54:11;;;;;;;:::i;:::-;12824:13;;-1:-1:-1;;;;;12851:16:11;;12847:48;;12876:19;;-1:-1:-1;;;12876:19:11;;;;;;;;;;;12847:48;12909:13;12905:44;;12931:18;;-1:-1:-1;;;12931:18:11;;;;;;;;;;;12905:44;-1:-1:-1;;;;;13292:16:11;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;13350:49:11;;-1:-1:-1;;;;;13292:44:11;;;;;;;13350:49;;;-1:-1:-1;;;;;13292:44:11;;;;;;13350:49;;;;;;;;;;;;;;;;13414:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;13463:66:11;;;;-1:-1:-1;;;13513:15:11;13463:66;;;;;;;;;;13414:25;13607:23;;;13649:4;:23;;;;-1:-1:-1;;;;;;13657:13:11;;1465:19:5;:23;;13657:15:11;13645:628;;;13692:309;13722:38;;13747:12;;-1:-1:-1;;;;;13722:38:11;;;13739:1;;13722:38;;13739:1;;13722:38;13787:69;13826:1;13830:2;13834:14;;;;;;13850:5;13787:30;:69::i;:::-;13782:172;;13891:40;;-1:-1:-1;;;13891:40:11;;;;;;;;;;;13782:172;13996:3;13980:12;:19;;13692:309;;14080:12;14063:13;;:29;14059:43;;14094:8;;;14059:43;13645:628;;;14141:118;14171:40;;14196:14;;;;;-1:-1:-1;;;;;14171:40:11;;;14188:1;;14171:40;;14188:1;;14171:40;14254:3;14238:12;:19;;14141:118;;13645:628;-1:-1:-1;14286:13:11;:28;14334:60;10770:489;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:12;-1:-1:-1;;;;;;88:32:12;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:12;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;1143:127::-;1204:10;1199:3;1195:20;1192:1;1185:31;1235:4;1232:1;1225:15;1259:4;1256:1;1249:15;1275:275;1346:2;1340:9;1411:2;1392:13;;-1:-1:-1;;1388:27:12;1376:40;;-1:-1:-1;;;;;1431:34:12;;1467:22;;;1428:62;1425:88;;;1493:18;;:::i;:::-;1529:2;1522:22;1275:275;;-1:-1:-1;1275:275:12:o;1555:407::-;1620:5;-1:-1:-1;;;;;1646:6:12;1643:30;1640:56;;;1676:18;;:::i;:::-;1714:57;1759:2;1738:15;;-1:-1:-1;;1734:29:12;1765:4;1730:40;1714:57;:::i;:::-;1705:66;;1794:6;1787:5;1780:21;1834:3;1825:6;1820:3;1816:16;1813:25;1810:45;;;1851:1;1848;1841:12;1810:45;1900:6;1895:3;1888:4;1881:5;1877:16;1864:43;1954:1;1947:4;1938:6;1931:5;1927:18;1923:29;1916:40;1555:407;;;;;:::o;1967:451::-;2036:6;2089:2;2077:9;2068:7;2064:23;2060:32;2057:52;;;2105:1;2102;2095:12;2057:52;2145:9;2132:23;-1:-1:-1;;;;;2170:6:12;2167:30;2164:50;;;2210:1;2207;2200:12;2164:50;2233:22;;2286:4;2278:13;;2274:27;-1:-1:-1;2264:55:12;;2315:1;2312;2305:12;2264:55;2338:74;2404:7;2399:2;2386:16;2381:2;2377;2373:11;2338:74;:::i;2423:258::-;2495:1;2505:113;2519:6;2516:1;2513:13;2505:113;;;2595:11;;;2589:18;2576:11;;;2569:39;2541:2;2534:10;2505:113;;;2636:6;2633:1;2630:13;2627:48;;;-1:-1:-1;;2671:1:12;2653:16;;2646:27;2423:258::o;2686:269::-;2739:3;2777:5;2771:12;2804:6;2799:3;2792:19;2820:63;2876:6;2869:4;2864:3;2860:14;2853:4;2846:5;2842:16;2820:63;:::i;:::-;2937:2;2916:15;-1:-1:-1;;2912:29:12;2903:39;;;;2944:4;2899:50;;2686:269;-1:-1:-1;;2686:269:12:o;2960:231::-;3109:2;3098:9;3091:21;3072:4;3129:56;3181:2;3170:9;3166:18;3158:6;3129:56;:::i;3196:180::-;3255:6;3308:2;3296:9;3287:7;3283:23;3279:32;3276:52;;;3324:1;3321;3314:12;3276:52;-1:-1:-1;3347:23:12;;3196:180;-1:-1:-1;3196:180:12:o;3589:254::-;3657:6;3665;3718:2;3706:9;3697:7;3693:23;3689:32;3686:52;;;3734:1;3731;3724:12;3686:52;3757:29;3776:9;3757:29;:::i;:::-;3747:39;3833:2;3818:18;;;;3805:32;;-1:-1:-1;;;3589:254:12:o;3848:328::-;3925:6;3933;3941;3994:2;3982:9;3973:7;3969:23;3965:32;3962:52;;;4010:1;4007;4000:12;3962:52;4033:29;4052:9;4033:29;:::i;:::-;4023:39;;4081:38;4115:2;4104:9;4100:18;4081:38;:::i;:::-;4071:48;;4166:2;4155:9;4151:18;4138:32;4128:42;;3848:328;;;;;:::o;4181:952::-;4265:6;4296:2;4339;4327:9;4318:7;4314:23;4310:32;4307:52;;;4355:1;4352;4345:12;4307:52;4395:9;4382:23;-1:-1:-1;;;;;4465:2:12;4457:6;4454:14;4451:34;;;4481:1;4478;4471:12;4451:34;4519:6;4508:9;4504:22;4494:32;;4564:7;4557:4;4553:2;4549:13;4545:27;4535:55;;4586:1;4583;4576:12;4535:55;4622:2;4609:16;4644:2;4640;4637:10;4634:36;;;4650:18;;:::i;:::-;4696:2;4693:1;4689:10;4679:20;;4719:28;4743:2;4739;4735:11;4719:28;:::i;:::-;4781:15;;;4851:11;;;4847:20;;;4812:12;;;;4879:19;;;4876:39;;;4911:1;4908;4901:12;4876:39;4935:11;;;;4955:148;4971:6;4966:3;4963:15;4955:148;;;5037:23;5056:3;5037:23;:::i;:::-;5025:36;;4988:12;;;;5081;;;;4955:148;;;5122:5;4181:952;-1:-1:-1;;;;;;;;4181:952:12:o;5138:632::-;5309:2;5361:21;;;5431:13;;5334:18;;;5453:22;;;5280:4;;5309:2;5532:15;;;;5506:2;5491:18;;;5280:4;5575:169;5589:6;5586:1;5583:13;5575:169;;;5650:13;;5638:26;;5719:15;;;;5684:12;;;;5611:1;5604:9;5575:169;;;-1:-1:-1;5761:3:12;;5138:632;-1:-1:-1;;;;;;5138:632:12:o;5775:347::-;5840:6;5848;5901:2;5889:9;5880:7;5876:23;5872:32;5869:52;;;5917:1;5914;5907:12;5869:52;5940:29;5959:9;5940:29;:::i;:::-;5930:39;;6019:2;6008:9;6004:18;5991:32;6066:5;6059:13;6052:21;6045:5;6042:32;6032:60;;6088:1;6085;6078:12;6032:60;6111:5;6101:15;;;5775:347;;;;;:::o;6127:667::-;6222:6;6230;6238;6246;6299:3;6287:9;6278:7;6274:23;6270:33;6267:53;;;6316:1;6313;6306:12;6267:53;6339:29;6358:9;6339:29;:::i;:::-;6329:39;;6387:38;6421:2;6410:9;6406:18;6387:38;:::i;:::-;6377:48;;6472:2;6461:9;6457:18;6444:32;6434:42;;6527:2;6516:9;6512:18;6499:32;-1:-1:-1;;;;;6546:6:12;6543:30;6540:50;;;6586:1;6583;6576:12;6540:50;6609:22;;6662:4;6654:13;;6650:27;-1:-1:-1;6640:55:12;;6691:1;6688;6681:12;6640:55;6714:74;6780:7;6775:2;6762:16;6757:2;6753;6749:11;6714:74;:::i;:::-;6704:84;;;6127:667;;;;;;;:::o;6799:260::-;6867:6;6875;6928:2;6916:9;6907:7;6903:23;6899:32;6896:52;;;6944:1;6941;6934:12;6896:52;6967:29;6986:9;6967:29;:::i;:::-;6957:39;;7015:38;7049:2;7038:9;7034:18;7015:38;:::i;:::-;7005:48;;6799:260;;;;;:::o;7064:356::-;7266:2;7248:21;;;7285:18;;;7278:30;7344:34;7339:2;7324:18;;7317:62;7411:2;7396:18;;7064:356::o;7425:380::-;7504:1;7500:12;;;;7547;;;7568:61;;7622:4;7614:6;7610:17;7600:27;;7568:61;7675:2;7667:6;7664:14;7644:18;7641:38;7638:161;;;7721:10;7716:3;7712:20;7709:1;7702:31;7756:4;7753:1;7746:15;7784:4;7781:1;7774:15;7638:161;;7425:380;;;:::o;7810:347::-;8012:2;7994:21;;;8051:2;8031:18;;;8024:30;8090:25;8085:2;8070:18;;8063:53;8148:2;8133:18;;7810:347::o;8162:127::-;8223:10;8218:3;8214:20;8211:1;8204:31;8254:4;8251:1;8244:15;8278:4;8275:1;8268:15;8294:168;8334:7;8400:1;8396;8392:6;8388:14;8385:1;8382:21;8377:1;8370:9;8363:17;8359:45;8356:71;;;8407:18;;:::i;:::-;-1:-1:-1;8447:9:12;;8294:168::o;8467:127::-;8528:10;8523:3;8519:20;8516:1;8509:31;8559:4;8556:1;8549:15;8583:4;8580:1;8573:15;8599:120;8639:1;8665;8655:35;;8670:18;;:::i;:::-;-1:-1:-1;8704:9:12;;8599:120::o;9429:127::-;9490:10;9485:3;9481:20;9478:1;9471:31;9521:4;9518:1;9511:15;9545:4;9542:1;9535:15;9561:135;9600:3;-1:-1:-1;;9621:17:12;;9618:43;;;9641:18;;:::i;:::-;-1:-1:-1;9688:1:12;9677:13;;9561:135::o;10118:402::-;10320:2;10302:21;;;10359:2;10339:18;;;10332:30;10398:34;10393:2;10378:18;;10371:62;-1:-1:-1;;;10464:2:12;10449:18;;10442:36;10510:3;10495:19;;10118:402::o;10525:128::-;10565:3;10596:1;10592:6;10589:1;10586:13;10583:39;;;10602:18;;:::i;:::-;-1:-1:-1;10638:9:12;;10525:128::o;10658:415::-;10860:2;10842:21;;;10899:2;10879:18;;;10872:30;-1:-1:-1;;;;;;;;;;;10933:2:12;10918:18;;10911:62;-1:-1:-1;;;11004:2:12;10989:18;;10982:49;11063:3;11048:19;;10658:415::o;11914:478::-;12116:2;12098:21;;;12155:2;12135:18;;;12128:30;12194:34;12189:2;12174:18;;12167:62;12265:34;12260:2;12245:18;;12238:62;-1:-1:-1;;;12331:3:12;12316:19;;12309:41;12382:3;12367:19;;11914:478::o;12397:401::-;12599:2;12581:21;;;12638:2;12618:18;;;12611:30;12677:34;12672:2;12657:18;;12650:62;-1:-1:-1;;;12743:2:12;12728:18;;12721:35;12788:3;12773:19;;12397:401::o;14058:415::-;14260:2;14242:21;;;14299:2;14279:18;;;14272:30;-1:-1:-1;;;;;;;;;;;14333:2:12;14318:18;;14311:62;-1:-1:-1;;;14404:2:12;14389:18;;14382:49;14463:3;14448:19;;14058:415::o;17500:185::-;17542:3;17580:5;17574:12;17595:52;17640:6;17635:3;17628:4;17621:5;17617:16;17595:52;:::i;:::-;17663:16;;;;;17500:185;-1:-1:-1;;17500:185:12:o;17808:1301::-;18085:3;18114:1;18147:6;18141:13;18177:3;18199:1;18227:9;18223:2;18219:18;18209:28;;18287:2;18276:9;18272:18;18309;18299:61;;18353:4;18345:6;18341:17;18331:27;;18299:61;18379:2;18427;18419:6;18416:14;18396:18;18393:38;18390:165;;;-1:-1:-1;;;18454:33:12;;18510:4;18507:1;18500:15;18540:4;18461:3;18528:17;18390:165;18571:18;18598:104;;;;18716:1;18711:320;;;;18564:467;;18598:104;-1:-1:-1;;18631:24:12;;18619:37;;18676:16;;;;-1:-1:-1;18598:104:12;;18711:320;17447:1;17440:14;;;17484:4;17471:18;;18806:1;18820:165;18834:6;18831:1;18828:13;18820:165;;;18912:14;;18899:11;;;18892:35;18955:16;;;;18849:10;;18820:165;;;18824:3;;19014:6;19009:3;19005:16;18998:23;;18564:467;;;;;;;19047:56;19072:30;19098:3;19090:6;19072:30;:::i;:::-;-1:-1:-1;;;17750:20:12;;17795:1;17786:11;;17690:113;19047:56;19040:63;17808:1301;-1:-1:-1;;;;;17808:1301:12:o;19521:500::-;-1:-1:-1;;;;;19790:15:12;;;19772:34;;19842:15;;19837:2;19822:18;;19815:43;19889:2;19874:18;;19867:34;;;19937:3;19932:2;19917:18;;19910:31;;;19715:4;;19958:57;;19995:19;;19987:6;19958:57;:::i;:::-;19950:65;19521:500;-1:-1:-1;;;;;;19521:500:12:o;20026:249::-;20095:6;20148:2;20136:9;20127:7;20123:23;20119:32;20116:52;;;20164:1;20161;20154:12;20116:52;20196:9;20190:16;20215:30;20239:5;20215:30;:::i;20280:125::-;20320:4;20348:1;20345;20342:8;20339:34;;;20353:18;;:::i;:::-;-1:-1:-1;20390:9:12;;20280:125::o;20410:112::-;20442:1;20468;20458:35;;20473:18;;:::i;:::-;-1:-1:-1;20507:9:12;;20410:112::o

Swarm Source

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