ETH Price: $3,126.54 (-0.23%)

Token

E741 Dystopian Maidens (MAIDENS741)
 

Overview

Max Total Supply

7,777 MAIDENS741

Holders

82

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
0.00000001 MAIDENS741

Value
$0.00
0xed5511f763f66db7861f98b9f7df873db6b89fe9
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:
E741V1Token

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-22
*/

//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣷⣾⣿⣿⣿⣿⣶⣾⣿⣿⣶⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠉⢉⡽⢋⣙⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢰⣿⣦⣀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⣛⣓⣒⠶⢤⣾⠀⠀⠸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢸⣿⠳⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⡄⠀⠀⢳⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⡦⠀⠀⠻⠿⣦⣀⡀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢿⡏⠀⠜⡴⠁⠀⠀⠀⡀⠀⠀⠉⠉⠲⢦⡀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢠⣿⣷⡾⢿⣿⣿⣿⣿⣿⠿⢿⣿⣿⣿⣿⣿⡿⠛⠉⠁⠀⠀⣸⠀⠀⠀⢧⠀⠀⠀⠀⠹⠒⢤⣀⠀⠀⠁⠈⢢⠀
//⠀⠀⠀⠀⠀⠀⠀⠈⣿⣟⠀⠀⠈⠻⣿⠏⢨⠔⢦⠈⢻⣿⡼⠋⢀⣤⣶⣶⣿⣿⣿⣄⢠⣀⡜⠆⠀⢀⡠⠴⠒⠂⠈⢻⢦⡀⠀⠈⡇
//⠀⠀⢀⣶⣿⣷⠀⠀⠘⣿⡄⠀⠐⣶⢬⣇⠉⢣⡸⠀⣰⣿⣁⣴⣿⣿⣿⣿⣿⣿⣟⢿⣽⡛⣧⠔⠒⡏⣀⠀⠀⣀⣀⣾⠀⠑⠢⠤⠃
//⠀⣴⡟⣾⡟⣿⡇⣀⣼⣿⣿⣦⡀⠀⠙⠻⡆⠀⠇⢰⠟⠻⣿⣿⣿⣿⣿⡿⣿⣿⣿⣷⡿⠟⣇⠀⠀⢙⣰⣺⣽⣿⣿⣿⠀⠀⠀⠀⠀
//⢸⡿⢸⡿⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡴⠃⠀⠀⢸⡀⠀⢹⣿⣿⣿⣿⣿⢹⣿⣿⣯⣀⣀⣀⣭⣏⠁⠀⠀⠈⠻⣿⣿⠀⠀⠀⠀⠀
//⣿⡇⢸⡗⢸⠛⣿⡍⠉⠙⠛⠻⢭⣻⣿⣧⠀⠀⢀⣴⠷⣄⡀⠻⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⡻⡆⠀⠀⠀⠀⠙⠇⠀⠀⠀⠀⠀
//⣿⡇⢸⣷⣽⠶⠛⢷⡀⣠⠤⢤⣾⣿⣿⣽⣞⣿⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡙⢿⣿⠉⠛⢿⣿⣷⡇⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀
//⣿⣇⣼⢿⠁⠀⠀⢠⡷⡇⢠⣶⡽⣿⠋⠉⢻⠿⠛⠋⠉⠉⢹⠉⢻⢻⣿⣿⣿⣿⣿⣷⡶⢏⡠⠿⣿⣷⡞⠛⠙⢳⣦⡀⠀⠀⠀⠀⠀
//⣿⡏⢠⡋⣆⠀⠀⡞⠀⠇⠈⢿⣿⣏⠀⠀⠸⡀⠀⠀⠀⢀⡞⠀⢸⢸⣿⡏⠛⠛⠛⠉⣠⠋⣠⠀⠸⠧⢻⡝⢷⡄⢿⣷⠀⠀⠀⠀⠀
//⢸⣧⠸⡹⡌⢆⣴⣿⡀⠀⠀⠈⠻⠿⣆⠀⠀⠳⣄⣰⣚⠉⠉⠉⠻⣾⣿⡻⣦⣀⣠⣴⠷⠟⣻⠀⠀⠀⢸⡇⢸⣧⢨⣿⠀⠀⠀⠀⠀
//⠀⢿⣇⠓⠃⣼⣇⡈⠻⣄⠀⠰⢦⣀⢀⣷⡄⠀⠀⠀⠈⠉⠓⡤⣄⡈⡿⣿⣷⣶⣶⣶⣾⣿⠟⢀⠆⠀⡾⢷⣾⡇⣼⡟⠀⠀⠀⠀⠀
//⠀⠈⢿⢷⣞⠛⣿⣿⣤⡍⠳⣤⣤⣤⡿⠗⠁⠀⠀⠀⠀⠀⠀⠙⠀⠹⡅⠀⠈⠉⠉⠉⠻⣤⠔⠚⠒⠊⠀⠀⠈⣿⡿⠃⠀⠀⠀⠀⠀
// ███████ █████ ██   ██  ██⣤⣔⡊⣀⠀⠀⡷⠀⠀⠀⢀⣴⠞⠓⠲⠦⣤⡀⠀⠀⣠⡿⠁⠀⠀⠀⠀⠀⠀
// ██         ██ ██   ██ ███⠀⢹⠀⠙⣤⣃⣤⠶⠞⣫⣤⣟⣛⣷⣶⣿⢟⡦⣾⠟⠀⠀⠀⠀⠀⠀⠀⠀
// █████     ██  ███████  ██ ⢸⠀⠀⣿⡏⠾⠿⣶⣿⣿⣿⠿⣛⣽⣾⡿⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ██       ██        ██  ██ ⡇⠀⣠⠏⠉⠛⠳⠶⢶⣶⡿⠿⠟⠊⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ███████  ██        ██  ██⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

// A public demonstration in single-contract dual-token implementations
// with zero-conflict events, and function overloading.
// https://github.com/SJ741/E741-Platform
// https://741.gg   (Get the token telegram link from 'telegram' variable)
// Emerald Token Standard

// WARNING - Fungible NFT specs are universally new, and inherently DANGEROUS
// no systems have been built with these usecases in mind, and there are a number of 
// ways that experimental, complex contracts can lead to unforseen consequences.
// INTERACT WITH EXPERIMENTAL SMART CONTRACTS AT YOUR OWN RISK

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

// libraries to separate ERC20 and ERC721 events, and certain signature-specific functions
// ERC20 events
library libES20 {
    event Transfer(address indexed from, address indexed to, uint amount);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function emitTransfer(address _from, address _to, uint _amount) internal { emit Transfer(_from, _to, _amount); }
    function emitApproval(address _owner, address _spender, uint _value) internal { emit Approval(_owner, _spender, _value); }
}

// ERC721 events
library libES721 {
    event Transfer(address indexed _from, address indexed _to, uint indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function emitTransfer(address _from, address _to, uint _tokenId) internal { emit Transfer(_from, _to, _tokenId); }
    function emitApproval(address _owner, address _approve, uint _tokenId) internal { emit Approval(_owner, _approve, _tokenId); }
    function emitApprovalForAll(address _owner, address _operator, bool _approved) internal { emit ApprovalForAll(_owner, _operator, _approved); }
}

// ERC165 https://eips.ethereum.org/EIPS/eip-721
interface IERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// ERC20 https://eips.ethereum.org/EIPS/eip-20
interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// ERC721 https://eips.ethereum.org/EIPS/eip-721
interface IERC721 is IERC165 {
    function balanceOf(address account) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
    // payable removed for erc20 etherscan compatibility
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

interface IE741 is IERC20, IERC721 {
    // supportsInterface 0x5a46575f
    // library transfers can not be included in the interface
    // incorporate them directly with library
    // libES20.Transfer
    // libES20.Approval
    // libES721.Transfer
    // libES721.Approval
    // libES721.ApprovalForAll
    function balanceOf(address account) external override(IERC20, IERC721) view returns (uint256);
    function approve(address spender, uint256 value) external override(IERC20, IERC721) returns (bool);
    function transferFrom(address from, address to, uint256 value) external override(IERC20, IERC721) returns (bool);
}

interface IERC721Metadata {
    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
    function contractURI() external view returns (string memory);
}

interface IERC20Metadata {
    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

interface IDevable {
    function dev() external returns (address dev);
    function setContractURI(string memory newContractURI) external;
    function setBaseURI(string memory newBaseURI) external;
    function changeDev(address newDev) external;
    function toggelNFTinterface() external;
    function withdraw() external;
}

// ERC721 Token Receiver https://eips.ethereum.org/EIPS/eip-721
interface IERC721TokenReceiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4);
}

contract ERC721TokenReceiver is IERC721TokenReceiver {
    function onERC721Received(address, address, uint256, bytes memory) external virtual returns(bytes4) {
        return IERC721TokenReceiver.onERC721Received.selector;
    }
}

abstract contract E741V1Base is IDevable, ERC721TokenReceiver, IE741  {

    string public baseURI;
    string internal _contractURI;
    string public extension;
    string public telegram;
    string internal _name;
    string internal _symbol;
    uint internal _decimals;
    uint internal _totalIds;
    uint internal ONE; // 1.0 token(s)
    uint internal MAXID; // e.g. 1.00000001 : 1.00007777 is the range for NFT IDs

    uint64 public minted; // number of unique ID mints + ONE
    uint64[] internal broken; // broken NFTs stored in limbo list 

    address public dev;
    bool public supportsNFTinterface;

    mapping(address => mapping(address => bool)) private _operatorApprovals;
    mapping(address => mapping(address => uint)) internal _allowance;
    mapping(uint256 tokenId => address) public ownerOf;
    mapping(uint256 => address) private _nftApprovals;
    mapping(address => uint) internal _balanceOf;
    mapping(address => uint64[]) public ownedNFTs;
    mapping(uint64 => uint256) internal idToIndex; 

    error UnsupportedReceiver();

    modifier onlyDev() {
        require(msg.sender == dev, "Not the developer");
        _;
    }

    constructor() {
        dev = msg.sender;
    }

    function initialze(bytes memory encodedParameters) public virtual;
    //function deposit(uint amount) public virtual;
    //function withdraw(uint amount) public virtual;
    function deposit(uint[] memory amounts) public virtual;
    function withdraw(uint[] memory amounts) public payable virtual;

    function name() public view virtual returns (string memory) { return _name; }
    function symbol() public view virtual returns (string memory) { return _symbol; }
    function decimals() public view virtual returns (uint) { return _decimals; }
    function totalSupply() public view virtual returns (uint) { return _totalIds * ONE; }
    function balanceOf( address account) public view override returns (uint) { return _balanceOf[account]; }
    function allowance(address owner, address spender) public view override returns (uint) { return _allowance[owner][spender]; }
    function setBaseURI(string memory newBaseURI) public onlyDev override {baseURI = newBaseURI;}
    function setContractURI(string memory newContractURI) public onlyDev override {_contractURI = newContractURI;}
    function setExtension(string memory newExtension) public onlyDev virtual {extension = newExtension;}
    function setTelegram(string memory newTelegram) public onlyDev virtual {telegram = newTelegram;}
    function changeDev(address newDev) public onlyDev override  {dev = newDev;}//simple function to change developer address, or revoke ownership (with address(0))
    // @DEV toggleNFTinterface is for the small possibility of frontend system changes leading the contract to favor enabling the disabled supportsNFTinterface flag
    // don't waste it, as frontends don't typically change classification of contracts
    // probably never to be used.
    function toggelNFTinterface() public onlyDev override {supportsNFTinterface = !supportsNFTinterface;}
    function tokensOfOwner(address owner) public view returns (uint64[] memory){return ownedNFTs[owner];}
    function nftBalanceOf(address account) public view returns (uint) {return ownedNFTs[account].length;}
    function contractURI() public view virtual returns (string memory) {return _contractURI;}


    function approve(address spender, uint amount) public override returns (bool) {

        // if the amount is greater than one token, and within range of IDs for NFTs 
        // then set NFT approval for the given ID
        if(amount >= ONE && amount <= MAXID) {
            address owner = ownerOf[amount]; // getting the owner of token ID via the `amount` input
            if (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) revert("E741: You are not approved");
            _nftApprovals[amount] = spender; // calling nft approval for the token and spender
            libES721.emitApproval(owner, spender, amount);
            return true;
        }
        
        // else set the ERC20 allowance
        // the NFT ID range being set within a limited subset of ONE token(s)
        // allows for non-clashing interactions
        _allowance[msg.sender][spender] = amount;
        libES20.emitApproval(msg.sender, spender, amount);
        return true;
    }

    function _transfer741(address from, address to, uint amount) internal virtual {
        
        require(_balanceOf[from] >= amount, "E741: transfer amount exceeds balance");
        
        // checking the decimal amount of tokens owned before transaction for both participants
        uint256 fromDecimalsPre = _balanceOf[from] % ONE;
        uint256 toDecimalsPre = _balanceOf[to] % ONE;
        
        // simple erc20 balance operations
        _transfer20(from, to, amount);

        // checking the decimal amount of tokens after transaction for both partcipants
        uint256 fromDecimalsPost = _balanceOf[from] % ONE;
        uint256 toDecimalsPost = _balanceOf[to] % ONE;

        // stores the NFT IDs owned by `from`, enabling NFT management for that address.
        uint64[] storage ownedNFTsArray = ownedNFTs[from];

        // references NFTs marked as "broken", tracking these special state NFTs.
        uint64[] storage brokenIDsArray = broken;

        // if sender has higher decimal count after transaction, then they "roll under" and break an NFT
        if (fromDecimalsPre < fromDecimalsPost) {

            if(ownedNFTsArray.length > 0) { // if the sender has an nft to send

                uint64 tokenId = ownedNFTsArray[0];//selects the user's first NFT from the list

                brokenIDsArray.push(tokenId);//pushes the nft into the "broken list" for limbo NFTs
                _transfer721(from, address(0), tokenId);//transfers the NFT ID ownership to (0) address for stewardship
            }
        }

        // if receiver has lower decimal count after transaction then they "roll over" and will "remake" an nft 
        if (toDecimalsPre > toDecimalsPost) {

            if(brokenIDsArray.length > 0) { // recover an id from broken list

                _transfer721(address(0), to, brokenIDsArray[brokenIDsArray.length - 1]);
                brokenIDsArray.pop();
            }
            else { // mint new id
                _mint(to);
            }
            
        }
        
        // amount of tokens - amount of whole tokens being processed in int
        uint amountInTokens = amount / ONE;

        uint len = ownedNFTsArray.length; //len is the length, or number of NFTs in the addresses's owned array

        // ignore minting nfts from dev when they call -- this allows for gas-efficient team operations
        // @DEV if dev gathers NFTs, use the ERC721 transferFrom method to extract
        // @DEV be careful, don't let the wallet fall to some convoluted transferFrom scam to do something unexpected
        if(from == dev) {
            //  The dev can only send out the nfts they hold
            amountInTokens = amountInTokens < len ? amountInTokens : len;
        }

        if(amountInTokens > 0) {

            len = amountInTokens < len ? amountInTokens : len;
            // transfers owned NFTs from `from` to `to` until either all are transferred or the desired amount is reached
            // Subtracts transferred NFT count from `amountInTokens` to update remaining transfers
            for (uint i = 0; i < len; i++) {
                _transfer721(from, to, ownedNFTsArray[0]); 
            }
            amountInTokens -= len;
            len = brokenIDsArray.length;
            len = amountInTokens < len ? amountInTokens : len;
            
            // recovers NFTs from the broken state to `to`, or mints new ones if not enough broken NFTs are available
            // if any tokens remain to be allocated, it mints new NFTs to `to` for the remaining balance
            for (uint i = 0; i < len; i++) {        
                _transfer721(address(0), to, brokenIDsArray[brokenIDsArray.length - 1]);
                brokenIDsArray.pop();
            }

            _mintBatch(to, amountInTokens - len);

        }
    }

    function _mintBatch(address to, uint256 amount) internal virtual {
        if(amount == 0) return; // Exit if no NFTs to mint

        if(amount == 1) { // Optimize single mint process
            _mint(to);
            return;
        }
        uint64 id = minted; // Start ID from last minted value
        uint256 ownedLen = ownedNFTs[to].length; // Current number of NFTs owned by 'to'
        for(uint i = 0; i < amount;) {
            unchecked {
                id++; // Increment ID for each new NFT
            }
            ownerOf[id] = to; // Assign new NFT to owner.
            idToIndex[id] = ownedLen; // Map NFT ID to its index in owner's array
            ownedNFTs[to].push(id); // Add new NFT ID to owner's list

            libES721.emitTransfer(address(0), to, id); // Emit NFT transfer event

            unchecked {
                ownedLen++; // Increment count of owned NFTs
                i++; // Move to next NFT
            }
        }
        unchecked {
            minted += uint64(amount); // Update total minted count
        }
    }


    function _mint(address to) internal virtual returns(uint64 tokenId){
        unchecked {
            minted++; // Increment the total number of minted tokens
        }
        tokenId = minted; // Assign the newly minted token ID

        ownerOf[tokenId] = to; // Set ownership of the new token to 'to'
        idToIndex[tokenId] = ownedNFTs[to].length; // Map the new token ID to its index in the owner's list
        ownedNFTs[to].push(tokenId); // Add the new token ID to the owner's list of owned tokens
        
        libES721.emitTransfer(address(0), to, tokenId); // Emit an event for the token transfer
    }


    // Updates the mappings and arrays managing ownership and index of NFTs after a transfer
    function _updateOwnedNFTs(address from, address to, uint64 tokenId) internal { 
        uint256 index = idToIndex[tokenId]; // Get current index of the token in the owner's list
        uint64[] storage nftArray = ownedNFTs[from]; // Reference to the list of NFTs owned by 'from'
        uint256 len = nftArray.length; // Current number of NFTs owned by 'from'
        uint64 lastTokenId = nftArray[len - 1]; // Last token in the 'from' array to swap with transferred token
        
        nftArray[index] = lastTokenId; // Replace the transferred token with the last token in the array
        nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from'
        
        if(len - 1 != 0){ 
            idToIndex[lastTokenId] = index; // Update the index of the swapped token
        } 
    
        ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array
        idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token
    }

    // Executes a simple ERC20 token transfer.
    function _transfer20(address from, address to, uint256 amount) internal {
        _balanceOf[from] -= amount; // Deduct the amount from the sender's balance
        unchecked {
            _balanceOf[to] += amount; // Add the amount to the recipient's balance
        }
        libES20.emitTransfer(from, to, amount); // Emit an ERC20 transfer event
    }

    // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission
    function _transfer721(address from, address to, uint64 tokenId) internal virtual {
        require(from == ownerOf[tokenId], "E741: Incorrect owner"); // Ensure 'from' is the current owner
        
        delete _nftApprovals[tokenId]; // Clear any approvals for this token
        ownerOf[tokenId] = to; // Transfer ownership of the token to 'to'
        _updateOwnedNFTs(from, to, tokenId); // Update ownership tracking structures
        libES721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event
    }


    // only erc20 calls this
    // if amount is a token id owned my the caller send as an NFT
    // else transfer741
    function transfer(address to, uint amount) public override returns (bool) {
        if(ownerOf[amount] == msg.sender) {
            _transfer721(msg.sender, to, uint64(amount));
            _transfer20(msg.sender, to, ONE);
            return true;
        }
        _transfer741(msg.sender, to, amount);
        return true;
    }

    // erc20 and erc721 call this
    function transferFrom(address from, address to, uint amount) public override returns (bool) {

        //if amount is within the NFT id range, then a simple NFT transfer + token amount (ONE)
        if(amount >= ONE && amount <= MAXID) {
            require(
                //require from is the msg caller, or that caller is approved for that specific NFT, or all NFTs 
                msg.sender == from || msg.sender == getApproved(amount) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
                );

            _transfer721(from, to, uint64(amount));
            _transfer20(from, to, ONE);
            return true;
        }

        _spendAllowance(from, msg.sender, amount);
        _transfer741(from, to, amount);
        return true;

    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
            );
        _transfer721(from, to, uint64(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, "") !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
            );
        _transfer721(from, to, uint64(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    function _spendAllowance(address owner, address spender, uint amount) internal virtual {
        require(_allowance[owner][spender] >= amount, "E741: insufficient allowance");
        _allowance[owner][spender] -= amount;
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        if (ownerOf[tokenId] == address(0)) revert();
        return _nftApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        _operatorApprovals[msg.sender][operator] = approved;
        libES721.emitApprovalForAll(msg.sender, operator, approved);
    }

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

    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        require(tokenId <= MAXID, "E741: invalid id");
        if (bytes(baseURI).length == 0) {return "";}
        return string(abi.encodePacked(baseURI, toString(tokenId - ONE), extension));
    }

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

    function withdraw() external onlyDev override {
        (bool success,) = payable(dev).call{value: address(this).balance}("");
        require(success);
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return
            // Even though we support ERC721 and should return true, etherscan wants to treat us as ERC721 instead of ERC20
            // @DEV ERC165 for ERC721 can be toggled on for reasons of frontend/dapp/script implementations, but is very specific
            (supportsNFTinterface && interfaceId == 0x80ac58cd) || // ERC165 interface ID for ERC721
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165
            interfaceId == 0x36372b07 || // ERC165 interface ID for ERC20
            interfaceId == 0x150b7a02 || // ERC165 interface ID for IERC721TokenReceiver
            interfaceId == 0x5a46575f;   // ERC165 interface ID for IE741
            
    }
}

contract E741V1Token is E741V1Base {

    constructor() {}

    function initialze(bytes memory encodedParameters) public override {
        require(_decimals == 0, "Already initialized");
        (_name, _symbol, _decimals, baseURI, _contractURI, _totalIds) = abi.decode(encodedParameters, (string,string,uint,string,string,uint));
        
        ONE = 10 ** _decimals;
        MAXID = ONE + _totalIds - 1;
        minted = uint64(ONE) - 1; // start minting from ID ONE-1 so you can get id 0

        _balanceOf[msg.sender] = totalSupply();

        require(ONE > _totalIds, "Not enough decimals for NFT count");
    }

    function deposit(uint[] memory /*amountsArray20*/) public pure override {
        revert("Unsupported");
    }

    function withdraw(uint256[] memory /*_amounts741*/) public override payable {
        revert("Unsupported");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"UnsupportedReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDev","type":"address"}],"name":"changeDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedParameters","type":"bytes"}],"name":"initialze","outputs":[],"stateMutability":"nonpayable","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":"minted","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"nftBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedNFTs","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newTelegram","type":"string"}],"name":"setTelegram","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":"supportsNFTinterface","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":"telegram","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggelNFTinterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405234801561000f575f80fd5b50600c80546001600160a01b031916331790556128af8061002f5f395ff3fe60806040526004361061021d575f3560e01c80636c0360eb1161011e578063a22cb465116100a8578063dd62ed3e1161006d578063dd62ed3e14610667578063e8a3d485146106ab578063e8e81fe4146106bf578063e985e9c5146106de578063ff54d6f0146106fd575f80fd5b8063a22cb465146105d7578063a563833b146105f6578063a9059cbb14610616578063b88d4fde14610635578063c87b56dd14610648575f80fd5b806388a8c95c116100ee57806388a8c95c1461055857806391cca3db14610577578063938e3d7b1461059657806395d89b41146105b5578063983d95ce146105c9575f80fd5b80636c0360eb146104c557806370a08231146104d95780637e2285aa1461050d5780638462151c1461052c575f80fd5b80632d5537b0116101aa5780634f02c4201161016f5780634f02c4201461042057806355f804b31461043f578063598b8e711461045e5780636352211e1461047d5780636bcef9a6146104b1575f80fd5b80632d5537b0146103bb578063313ce567146103cf5780633ccfd60b146103e357806342842e0e146103f957806347ecb6651461040c575f80fd5b80630e313e98116101f05780630e313e98146102cc578063150b7a021461030e57806318160ddd146103515780631a72b87d1461036557806323b872dd1461039c575f80fd5b806301ffc9a71461022157806306fdde0314610255578063081812fc14610276578063095ea7b3146102ad575b5f80fd5b34801561022c575f80fd5b5061024061023b366004611eec565b61071c565b60405190151581526020015b60405180910390f35b348015610260575f80fd5b506102696107b9565b60405161024c9190611f54565b348015610281575f80fd5b50610295610290366004611f66565b610849565b6040516001600160a01b03909116815260200161024c565b3480156102b8575f80fd5b506102406102c7366004611f93565b610883565b3480156102d7575f80fd5b506103006102e6366004611fbb565b6001600160a01b03165f9081526012602052604090205490565b60405190815260200161024c565b348015610319575f80fd5b50610338610328366004612097565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161024c565b34801561035c575f80fd5b50610300610991565b348015610370575f80fd5b5061038461037f366004611f93565b6109a7565b6040516001600160401b03909116815260200161024c565b3480156103a7575f80fd5b506102406103b63660046120fa565b6109ee565b3480156103c6575f80fd5b50610269610aa5565b3480156103da575f80fd5b50600654610300565b3480156103ee575f80fd5b506103f7610b31565b005b6103f76104073660046120fa565b610bba565b348015610417575f80fd5b50610269610cf9565b34801561042b575f80fd5b50600a54610384906001600160401b031681565b34801561044a575f80fd5b506103f7610459366004612133565b610d06565b348015610469575f80fd5b506103f7610478366004612177565b610d3f565b348015610488575f80fd5b50610295610497366004611f66565b600f6020525f90815260409020546001600160a01b031681565b3480156104bc575f80fd5b506103f7610d75565b3480156104d0575f80fd5b50610269610dc0565b3480156104e4575f80fd5b506103006104f3366004611fbb565b6001600160a01b03165f9081526011602052604090205490565b348015610518575f80fd5b506103f7610527366004612133565b610dcc565b348015610537575f80fd5b5061054b610546366004611fbb565b610e02565b60405161024c9190612217565b348015610563575f80fd5b506103f7610572366004611fbb565b610e9c565b348015610582575f80fd5b50600c54610295906001600160a01b031681565b3480156105a1575f80fd5b506103f76105b0366004612133565b610ee8565b3480156105c0575f80fd5b50610269610f1e565b6103f7610478366004612177565b3480156105e2575f80fd5b506103f76105f1366004612263565b610f2d565b348015610601575f80fd5b50600c5461024090600160a01b900460ff1681565b348015610621575f80fd5b50610240610630366004611f93565b610f66565b6103f7610643366004612097565b610fb0565b348015610653575f80fd5b50610269610662366004611f66565b6110dd565b348015610672575f80fd5b5061030061068136600461229c565b6001600160a01b039182165f908152600e6020908152604080832093909416825291909152205490565b3480156106b6575f80fd5b5061026961118c565b3480156106ca575f80fd5b506103f76106d9366004612133565b61119b565b3480156106e9575f80fd5b506102406106f836600461229c565b6111d1565b348015610708575f80fd5b506103f76107173660046122cd565b6111fe565b600c545f90600160a01b900460ff16801561074757506380ac58cd60e01b6001600160e01b03198316145b8061076257506301ffc9a760e01b6001600160e01b03198316145b8061077d57506336372b0760e01b6001600160e01b03198316145b806107985750630a85bd0160e11b6001600160e01b03198316145b806107b35750635a46575f60e01b6001600160e01b03198316145b92915050565b6060600480546107c8906122fe565b80601f01602080910402602001604051908101604052809291908181526020018280546107f4906122fe565b801561083f5780601f106108165761010080835404028352916020019161083f565b820191905f5260205f20905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b5f818152600f60205260408120546001600160a01b0316610868575f80fd5b505f908152601060205260409020546001600160a01b031690565b5f600854821015801561089857506009548211155b15610958575f828152600f60205260409020546001600160a01b03163381148015906108cb57506108c981336111d1565b155b1561091d5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f83815260106020526040902080546001600160a01b0319166001600160a01b03861617905561094e81858561137a565b60019150506107b3565b335f818152600e602090815260408083206001600160a01b038816845290915290208390556109889084846113c0565b50600192915050565b5f6008546007546109a2919061234a565b905090565b6012602052815f5260405f2081815481106109c0575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f6008548210158015610a0357506009548211155b15610a8457336001600160a01b0385161480610a385750610a2382610849565b6001600160a01b0316336001600160a01b0316145b80610a485750610a4884336111d1565b610a645760405162461bcd60e51b815260040161091490612361565b610a6f848484611412565b610a7c84846008546114e0565b506001610a9e565b610a8f843384611534565b610a9a8484846115e8565b5060015b9392505050565b60028054610ab2906122fe565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade906122fe565b8015610b295780601f10610b0057610100808354040283529160200191610b29565b820191905f5260205f20905b815481529060010190602001808311610b0c57829003601f168201915b505050505081565b600c546001600160a01b03163314610b5b5760405162461bcd60e51b815260040161091490612398565b600c546040515f916001600160a01b03169047908381818185875af1925050503d805f8114610ba5576040519150601f19603f3d011682016040523d82523d5f602084013e610baa565b606091505b5050905080610bb7575f80fd5b50565b336001600160a01b0384161480610bea5750610bd581610849565b6001600160a01b0316336001600160a01b0316145b80610bfa5750610bfa83336111d1565b610c165760405162461bcd60e51b815260040161091490612361565b610c21838383611412565b610c2e83836008546114e0565b6001600160a01b0382163b15801590610cd65750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610ca5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc991906123c3565b6001600160e01b03191614155b15610cf4576040516301d6c93560e61b815260040160405180910390fd5b505050565b60038054610ab2906122fe565b600c546001600160a01b03163314610d305760405162461bcd60e51b815260040161091490612398565b5f610d3b8282612429565b5050565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606401610914565b600c546001600160a01b03163314610d9f5760405162461bcd60e51b815260040161091490612398565b600c805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f8054610ab2906122fe565b600c546001600160a01b03163314610df65760405162461bcd60e51b815260040161091490612398565b6002610d3b8282612429565b6001600160a01b0381165f90815260126020908152604091829020805483518184028101840190945280845260609392830182828015610e9057602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b031681526020019060080190602082600701049283019260010382029150808411610e4d5790505b50505050509050919050565b600c546001600160a01b03163314610ec65760405162461bcd60e51b815260040161091490612398565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314610f125760405162461bcd60e51b815260040161091490612398565b6001610d3b8282612429565b6060600580546107c8906122fe565b335f818152600d602090815260408083206001600160a01b03871684529091529020805460ff1916831515179055610d3b90838361198d565b5f818152600f6020526040812054336001600160a01b0390911603610fa557610f90338484611412565b610f9d33846008546114e0565b5060016107b3565b6109883384846115e8565b336001600160a01b0385161480610fe05750610fcb82610849565b6001600160a01b0316336001600160a01b0316145b80610ff05750610ff084336111d1565b61100c5760405162461bcd60e51b815260040161091490612361565b611017848484611412565b61102484846008546114e0565b6001600160a01b0383163b158015906110b95750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a029061106c9033908990889088906004016124e8565b6020604051808303815f875af1158015611088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ac91906123c3565b6001600160e01b03191614155b156110d7576040516301d6c93560e61b815260040160405180910390fd5b50505050565b60606009548211156111245760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610914565b5f8054611130906122fe565b90505f0361114b57505060408051602081019091525f815290565b5f6111626008548461115d9190612524565b6119d4565b6002604051602001611176939291906125a6565b6040516020818303038152906040529050919050565b6060600180546107c8906122fe565b600c546001600160a01b031633146111c55760405162461bcd60e51b815260040161091490612398565b6003610d3b8282612429565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205460ff1690565b600654156112445760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610914565b80806020019051810190611258919061261a565b600781905560045f600581600681808060016112748b82612429565b5061128190508a82612429565b5050889055506112918882612429565b5061129e90508782612429565b50505050505050600654600a6112b491906127a1565b60088190556007546001916112c991906127ac565b6112d39190612524565b6009556008546112e5906001906127bf565b600a805467ffffffffffffffff19166001600160401b039290921691909117905561130e610991565b335f9081526011602052604090205560075460085411610bb75760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610914565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161140591815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600f60205260409020546001600160a01b0384811691161461147c5760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610914565b6001600160401b0381165f90815260106020908152604080832080546001600160a01b0319908116909155600f90925290912080549091166001600160a01b0384161790556114cc838383611ad8565b610cf48383836001600160401b0316611c8e565b6001600160a01b0383165f9081526011602052604081208054839290611507908490612524565b90915550506001600160a01b0382165f908152601160205260409020805482019055610cf4838383611cd4565b6001600160a01b038084165f908152600e60209081526040808320938616835292905220548111156115a85760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610914565b6001600160a01b038084165f908152600e60209081526040808320938616835292905290812080548392906115de908490612524565b9091555050505050565b6001600160a01b0383165f9081526011602052604090205481111561165d5760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610914565b6008546001600160a01b0384165f908152601160205260408120549091611683916127fa565b6008546001600160a01b0385165f90815260116020526040812054929350916116ac91906127fa565b90506116b98585856114e0565b6008546001600160a01b0386165f9081526011602052604081205490916116df916127fa565b6008546001600160a01b0387165f908152601160205260408120549293509161170891906127fa565b6001600160a01b0388165f908152601260205260409020909150600b838610156117b3578154156117b3575f825f815481106117465761174661280d565b5f9182526020808320600480840490910154865460018101885587865292852091830490910180546003948516600890810261010090810a9094046001600160401b03908116969095160290920a84810293021990911691909117905591506117b1908b9083611412565b505b8285111561186457805415611859576118155f8983600185805490506117d99190612524565b815481106117e9576117e961280d565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b0316611412565b8080548061182557611825612821565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055611864565b61186288611d19565b505b5f600854886118739190612835565b8354600c54919250906001600160a01b03908116908c16036118a15780821061189c578061189e565b815b91505b8115611980578082106118b457806118b6565b815b90505f5b818110156118e1576118d98c8c875f815481106117e9576117e961280d565b6001016118ba565b506118ec8183612524565b835490925090508082106119005780611902565b815b90505f5b8181101561196c576119255f8c86600188805490506117d99190612524565b8380548061193557611935612821565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055600101611906565b506119808a61197b8385612524565b611dc6565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611405911515815260200190565b6060815f036119fa5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611a235780611a0d81612848565b9150611a1c9050600a83612835565b91506119fd565b5f816001600160401b03811115611a3c57611a3c611fd4565b6040519080825280601f01601f191660200182016040528015611a66576020820181803683370190505b5090505b8415611ad057611a7b600183612524565b9150611a88600a866127fa565b611a93906030612860565b60f81b818381518110611aa857611aa861280d565b60200101906001600160f81b03191690815f1a905350611ac9600a86612835565b9450611a6a565b949350505050565b6001600160401b0381165f908152601360209081526040808320546001600160a01b0387168452601290925282208054919290919082611b19600184612524565b81548110611b2957611b2961280d565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b0316905080838581548110611b6557611b6561280d565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b0316021790555082805480611bac57611bac612821565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055611be6600183612524565b15611c06576001600160401b0381165f9081526013602052604090208490555b6001600160a01b0386165f81815260126020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c1602919091179055929091529054611c6a9190612524565b6001600160401b039095165f90815260136020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161140591815260200190565b600a805467ffffffffffffffff19811660016001600160401b03928316810183169182179093555f818152600f6020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526012808352818420805486865260138552928520839055908352958101865594825281206004850401805460039095166008026101000a9384021990941692820292909217909255611dc1908383611c8e565b919050565b805f03611dd1575050565b80600103611de257610cf482611d19565b600a546001600160a01b0383165f908152601260205260408120546001600160401b0390921691905b83811015611eaa5760019283016001600160401b038181165f818152600f6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560138352818420899055835260128252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093611e9e91908790611c8e565b60019182019101611e0b565b5050600a805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610bb7575f80fd5b5f60208284031215611efc575f80fd5b8135610a9e81611ed7565b5f5b83811015611f21578181015183820152602001611f09565b50505f910152565b5f8151808452611f40816020860160208601611f07565b601f01601f19169290920160200192915050565b602081525f610a9e6020830184611f29565b5f60208284031215611f76575f80fd5b5035919050565b80356001600160a01b0381168114611dc1575f80fd5b5f8060408385031215611fa4575f80fd5b611fad83611f7d565b946020939093013593505050565b5f60208284031215611fcb575f80fd5b610a9e82611f7d565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561201057612010611fd4565b604052919050565b5f6001600160401b0382111561203057612030611fd4565b50601f01601f191660200190565b5f61205061204b84612018565b611fe8565b9050828152838383011115612063575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612088575f80fd5b610a9e8383356020850161203e565b5f805f80608085870312156120aa575f80fd5b6120b385611f7d565b93506120c160208601611f7d565b92506040850135915060608501356001600160401b038111156120e2575f80fd5b6120ee87828801612079565b91505092959194509250565b5f805f6060848603121561210c575f80fd5b61211584611f7d565b925061212360208501611f7d565b9150604084013590509250925092565b5f60208284031215612143575f80fd5b81356001600160401b03811115612158575f80fd5b8201601f81018413612168575f80fd5b611ad08482356020840161203e565b5f6020808385031215612188575f80fd5b82356001600160401b038082111561219e575f80fd5b818501915085601f8301126121b1575f80fd5b8135818111156121c3576121c3611fd4565b8060051b91506121d4848301611fe8565b81815291830184019184810190888411156121ed575f80fd5b938501935b8385101561220b578435825293850193908501906121f2565b98975050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156122575783516001600160401b031683529284019291840191600101612232565b50909695505050505050565b5f8060408385031215612274575f80fd5b61227d83611f7d565b915060208301358015158114612291575f80fd5b809150509250929050565b5f80604083850312156122ad575f80fd5b6122b683611f7d565b91506122c460208401611f7d565b90509250929050565b5f602082840312156122dd575f80fd5b81356001600160401b038111156122f2575f80fd5b611ad084828501612079565b600181811c9082168061231257607f821691505b60208210810361233057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107b3576107b3612336565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f602082840312156123d3575f80fd5b8151610a9e81611ed7565b601f821115610cf457805f5260205f20601f840160051c810160208510156124035750805b601f840160051c820191505b81811015612422575f815560010161240f565b5050505050565b81516001600160401b0381111561244257612442611fd4565b6124568161245084546122fe565b846123de565b602080601f831160018114612489575f84156124725750858301515b5f19600386901b1c1916600185901b1785556124e0565b5f85815260208120601f198616915b828110156124b757888601518255948401946001909101908401612498565b50858210156124d457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061251a90830184611f29565b9695505050505050565b818103818111156107b3576107b3612336565b5f8154612543816122fe565b6001828116801561255b57600181146125705761259c565b60ff198416875282151583028701945061259c565b855f526020805f205f5b858110156125935781548a82015290840190820161257a565b50505082870194505b5050505092915050565b5f6125b18286612537565b84516125c1818360208901611f07565b6125cd81830186612537565b979650505050505050565b5f82601f8301126125e7575f80fd5b81516125f561204b82612018565b818152846020838601011115612609575f80fd5b611ad0826020830160208701611f07565b5f805f805f8060c0878903121561262f575f80fd5b86516001600160401b0380821115612645575f80fd5b6126518a838b016125d8565b97506020890151915080821115612666575f80fd5b6126728a838b016125d8565b965060408901519550606089015191508082111561268e575f80fd5b61269a8a838b016125d8565b945060808901519150808211156126af575f80fd5b506126bc89828a016125d8565b92505060a087015190509295509295509295565b600181815b8085111561270a57815f19048211156126f0576126f0612336565b808516156126fd57918102915b93841c93908002906126d5565b509250929050565b5f82612720575060016107b3565b8161272c57505f6107b3565b816001811461094e57600281036127595760ff84111561274e5761274e612336565b50506001821b6107b3565b5060208310610133831016604e8410600b841016171561277c575081810a6107b3565b61278683836126d0565b805f190482111561279957612799612336565b029392505050565b5f610a9e8383612712565b808201808211156107b3576107b3612336565b6001600160401b038281168282160390808211156127df576127df612336565b5092915050565b634e487b7160e01b5f52601260045260245ffd5b5f82612808576128086127e6565b500690565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f82612843576128436127e6565b500490565b5f6001820161285957612859612336565b5060010190565b60ff81811683821601908111156107b3576107b361233656fea2646970667358221220723f06ae28851c9f340212f441664302d31b2bea59e07e4a4d1bf52efc7555a964736f6c63430008180033

Deployed Bytecode

0x60806040526004361061021d575f3560e01c80636c0360eb1161011e578063a22cb465116100a8578063dd62ed3e1161006d578063dd62ed3e14610667578063e8a3d485146106ab578063e8e81fe4146106bf578063e985e9c5146106de578063ff54d6f0146106fd575f80fd5b8063a22cb465146105d7578063a563833b146105f6578063a9059cbb14610616578063b88d4fde14610635578063c87b56dd14610648575f80fd5b806388a8c95c116100ee57806388a8c95c1461055857806391cca3db14610577578063938e3d7b1461059657806395d89b41146105b5578063983d95ce146105c9575f80fd5b80636c0360eb146104c557806370a08231146104d95780637e2285aa1461050d5780638462151c1461052c575f80fd5b80632d5537b0116101aa5780634f02c4201161016f5780634f02c4201461042057806355f804b31461043f578063598b8e711461045e5780636352211e1461047d5780636bcef9a6146104b1575f80fd5b80632d5537b0146103bb578063313ce567146103cf5780633ccfd60b146103e357806342842e0e146103f957806347ecb6651461040c575f80fd5b80630e313e98116101f05780630e313e98146102cc578063150b7a021461030e57806318160ddd146103515780631a72b87d1461036557806323b872dd1461039c575f80fd5b806301ffc9a71461022157806306fdde0314610255578063081812fc14610276578063095ea7b3146102ad575b5f80fd5b34801561022c575f80fd5b5061024061023b366004611eec565b61071c565b60405190151581526020015b60405180910390f35b348015610260575f80fd5b506102696107b9565b60405161024c9190611f54565b348015610281575f80fd5b50610295610290366004611f66565b610849565b6040516001600160a01b03909116815260200161024c565b3480156102b8575f80fd5b506102406102c7366004611f93565b610883565b3480156102d7575f80fd5b506103006102e6366004611fbb565b6001600160a01b03165f9081526012602052604090205490565b60405190815260200161024c565b348015610319575f80fd5b50610338610328366004612097565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161024c565b34801561035c575f80fd5b50610300610991565b348015610370575f80fd5b5061038461037f366004611f93565b6109a7565b6040516001600160401b03909116815260200161024c565b3480156103a7575f80fd5b506102406103b63660046120fa565b6109ee565b3480156103c6575f80fd5b50610269610aa5565b3480156103da575f80fd5b50600654610300565b3480156103ee575f80fd5b506103f7610b31565b005b6103f76104073660046120fa565b610bba565b348015610417575f80fd5b50610269610cf9565b34801561042b575f80fd5b50600a54610384906001600160401b031681565b34801561044a575f80fd5b506103f7610459366004612133565b610d06565b348015610469575f80fd5b506103f7610478366004612177565b610d3f565b348015610488575f80fd5b50610295610497366004611f66565b600f6020525f90815260409020546001600160a01b031681565b3480156104bc575f80fd5b506103f7610d75565b3480156104d0575f80fd5b50610269610dc0565b3480156104e4575f80fd5b506103006104f3366004611fbb565b6001600160a01b03165f9081526011602052604090205490565b348015610518575f80fd5b506103f7610527366004612133565b610dcc565b348015610537575f80fd5b5061054b610546366004611fbb565b610e02565b60405161024c9190612217565b348015610563575f80fd5b506103f7610572366004611fbb565b610e9c565b348015610582575f80fd5b50600c54610295906001600160a01b031681565b3480156105a1575f80fd5b506103f76105b0366004612133565b610ee8565b3480156105c0575f80fd5b50610269610f1e565b6103f7610478366004612177565b3480156105e2575f80fd5b506103f76105f1366004612263565b610f2d565b348015610601575f80fd5b50600c5461024090600160a01b900460ff1681565b348015610621575f80fd5b50610240610630366004611f93565b610f66565b6103f7610643366004612097565b610fb0565b348015610653575f80fd5b50610269610662366004611f66565b6110dd565b348015610672575f80fd5b5061030061068136600461229c565b6001600160a01b039182165f908152600e6020908152604080832093909416825291909152205490565b3480156106b6575f80fd5b5061026961118c565b3480156106ca575f80fd5b506103f76106d9366004612133565b61119b565b3480156106e9575f80fd5b506102406106f836600461229c565b6111d1565b348015610708575f80fd5b506103f76107173660046122cd565b6111fe565b600c545f90600160a01b900460ff16801561074757506380ac58cd60e01b6001600160e01b03198316145b8061076257506301ffc9a760e01b6001600160e01b03198316145b8061077d57506336372b0760e01b6001600160e01b03198316145b806107985750630a85bd0160e11b6001600160e01b03198316145b806107b35750635a46575f60e01b6001600160e01b03198316145b92915050565b6060600480546107c8906122fe565b80601f01602080910402602001604051908101604052809291908181526020018280546107f4906122fe565b801561083f5780601f106108165761010080835404028352916020019161083f565b820191905f5260205f20905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b5f818152600f60205260408120546001600160a01b0316610868575f80fd5b505f908152601060205260409020546001600160a01b031690565b5f600854821015801561089857506009548211155b15610958575f828152600f60205260409020546001600160a01b03163381148015906108cb57506108c981336111d1565b155b1561091d5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f83815260106020526040902080546001600160a01b0319166001600160a01b03861617905561094e81858561137a565b60019150506107b3565b335f818152600e602090815260408083206001600160a01b038816845290915290208390556109889084846113c0565b50600192915050565b5f6008546007546109a2919061234a565b905090565b6012602052815f5260405f2081815481106109c0575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f6008548210158015610a0357506009548211155b15610a8457336001600160a01b0385161480610a385750610a2382610849565b6001600160a01b0316336001600160a01b0316145b80610a485750610a4884336111d1565b610a645760405162461bcd60e51b815260040161091490612361565b610a6f848484611412565b610a7c84846008546114e0565b506001610a9e565b610a8f843384611534565b610a9a8484846115e8565b5060015b9392505050565b60028054610ab2906122fe565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade906122fe565b8015610b295780601f10610b0057610100808354040283529160200191610b29565b820191905f5260205f20905b815481529060010190602001808311610b0c57829003601f168201915b505050505081565b600c546001600160a01b03163314610b5b5760405162461bcd60e51b815260040161091490612398565b600c546040515f916001600160a01b03169047908381818185875af1925050503d805f8114610ba5576040519150601f19603f3d011682016040523d82523d5f602084013e610baa565b606091505b5050905080610bb7575f80fd5b50565b336001600160a01b0384161480610bea5750610bd581610849565b6001600160a01b0316336001600160a01b0316145b80610bfa5750610bfa83336111d1565b610c165760405162461bcd60e51b815260040161091490612361565b610c21838383611412565b610c2e83836008546114e0565b6001600160a01b0382163b15801590610cd65750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610ca5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc991906123c3565b6001600160e01b03191614155b15610cf4576040516301d6c93560e61b815260040160405180910390fd5b505050565b60038054610ab2906122fe565b600c546001600160a01b03163314610d305760405162461bcd60e51b815260040161091490612398565b5f610d3b8282612429565b5050565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606401610914565b600c546001600160a01b03163314610d9f5760405162461bcd60e51b815260040161091490612398565b600c805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f8054610ab2906122fe565b600c546001600160a01b03163314610df65760405162461bcd60e51b815260040161091490612398565b6002610d3b8282612429565b6001600160a01b0381165f90815260126020908152604091829020805483518184028101840190945280845260609392830182828015610e9057602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b031681526020019060080190602082600701049283019260010382029150808411610e4d5790505b50505050509050919050565b600c546001600160a01b03163314610ec65760405162461bcd60e51b815260040161091490612398565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314610f125760405162461bcd60e51b815260040161091490612398565b6001610d3b8282612429565b6060600580546107c8906122fe565b335f818152600d602090815260408083206001600160a01b03871684529091529020805460ff1916831515179055610d3b90838361198d565b5f818152600f6020526040812054336001600160a01b0390911603610fa557610f90338484611412565b610f9d33846008546114e0565b5060016107b3565b6109883384846115e8565b336001600160a01b0385161480610fe05750610fcb82610849565b6001600160a01b0316336001600160a01b0316145b80610ff05750610ff084336111d1565b61100c5760405162461bcd60e51b815260040161091490612361565b611017848484611412565b61102484846008546114e0565b6001600160a01b0383163b158015906110b95750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a029061106c9033908990889088906004016124e8565b6020604051808303815f875af1158015611088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ac91906123c3565b6001600160e01b03191614155b156110d7576040516301d6c93560e61b815260040160405180910390fd5b50505050565b60606009548211156111245760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610914565b5f8054611130906122fe565b90505f0361114b57505060408051602081019091525f815290565b5f6111626008548461115d9190612524565b6119d4565b6002604051602001611176939291906125a6565b6040516020818303038152906040529050919050565b6060600180546107c8906122fe565b600c546001600160a01b031633146111c55760405162461bcd60e51b815260040161091490612398565b6003610d3b8282612429565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205460ff1690565b600654156112445760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610914565b80806020019051810190611258919061261a565b600781905560045f600581600681808060016112748b82612429565b5061128190508a82612429565b5050889055506112918882612429565b5061129e90508782612429565b50505050505050600654600a6112b491906127a1565b60088190556007546001916112c991906127ac565b6112d39190612524565b6009556008546112e5906001906127bf565b600a805467ffffffffffffffff19166001600160401b039290921691909117905561130e610991565b335f9081526011602052604090205560075460085411610bb75760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610914565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161140591815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600f60205260409020546001600160a01b0384811691161461147c5760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610914565b6001600160401b0381165f90815260106020908152604080832080546001600160a01b0319908116909155600f90925290912080549091166001600160a01b0384161790556114cc838383611ad8565b610cf48383836001600160401b0316611c8e565b6001600160a01b0383165f9081526011602052604081208054839290611507908490612524565b90915550506001600160a01b0382165f908152601160205260409020805482019055610cf4838383611cd4565b6001600160a01b038084165f908152600e60209081526040808320938616835292905220548111156115a85760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610914565b6001600160a01b038084165f908152600e60209081526040808320938616835292905290812080548392906115de908490612524565b9091555050505050565b6001600160a01b0383165f9081526011602052604090205481111561165d5760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610914565b6008546001600160a01b0384165f908152601160205260408120549091611683916127fa565b6008546001600160a01b0385165f90815260116020526040812054929350916116ac91906127fa565b90506116b98585856114e0565b6008546001600160a01b0386165f9081526011602052604081205490916116df916127fa565b6008546001600160a01b0387165f908152601160205260408120549293509161170891906127fa565b6001600160a01b0388165f908152601260205260409020909150600b838610156117b3578154156117b3575f825f815481106117465761174661280d565b5f9182526020808320600480840490910154865460018101885587865292852091830490910180546003948516600890810261010090810a9094046001600160401b03908116969095160290920a84810293021990911691909117905591506117b1908b9083611412565b505b8285111561186457805415611859576118155f8983600185805490506117d99190612524565b815481106117e9576117e961280d565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b0316611412565b8080548061182557611825612821565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055611864565b61186288611d19565b505b5f600854886118739190612835565b8354600c54919250906001600160a01b03908116908c16036118a15780821061189c578061189e565b815b91505b8115611980578082106118b457806118b6565b815b90505f5b818110156118e1576118d98c8c875f815481106117e9576117e961280d565b6001016118ba565b506118ec8183612524565b835490925090508082106119005780611902565b815b90505f5b8181101561196c576119255f8c86600188805490506117d99190612524565b8380548061193557611935612821565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055600101611906565b506119808a61197b8385612524565b611dc6565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611405911515815260200190565b6060815f036119fa5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611a235780611a0d81612848565b9150611a1c9050600a83612835565b91506119fd565b5f816001600160401b03811115611a3c57611a3c611fd4565b6040519080825280601f01601f191660200182016040528015611a66576020820181803683370190505b5090505b8415611ad057611a7b600183612524565b9150611a88600a866127fa565b611a93906030612860565b60f81b818381518110611aa857611aa861280d565b60200101906001600160f81b03191690815f1a905350611ac9600a86612835565b9450611a6a565b949350505050565b6001600160401b0381165f908152601360209081526040808320546001600160a01b0387168452601290925282208054919290919082611b19600184612524565b81548110611b2957611b2961280d565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b0316905080838581548110611b6557611b6561280d565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b0316021790555082805480611bac57611bac612821565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055611be6600183612524565b15611c06576001600160401b0381165f9081526013602052604090208490555b6001600160a01b0386165f81815260126020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c1602919091179055929091529054611c6a9190612524565b6001600160401b039095165f90815260136020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161140591815260200190565b600a805467ffffffffffffffff19811660016001600160401b03928316810183169182179093555f818152600f6020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526012808352818420805486865260138552928520839055908352958101865594825281206004850401805460039095166008026101000a9384021990941692820292909217909255611dc1908383611c8e565b919050565b805f03611dd1575050565b80600103611de257610cf482611d19565b600a546001600160a01b0383165f908152601260205260408120546001600160401b0390921691905b83811015611eaa5760019283016001600160401b038181165f818152600f6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560138352818420899055835260128252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093611e9e91908790611c8e565b60019182019101611e0b565b5050600a805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610bb7575f80fd5b5f60208284031215611efc575f80fd5b8135610a9e81611ed7565b5f5b83811015611f21578181015183820152602001611f09565b50505f910152565b5f8151808452611f40816020860160208601611f07565b601f01601f19169290920160200192915050565b602081525f610a9e6020830184611f29565b5f60208284031215611f76575f80fd5b5035919050565b80356001600160a01b0381168114611dc1575f80fd5b5f8060408385031215611fa4575f80fd5b611fad83611f7d565b946020939093013593505050565b5f60208284031215611fcb575f80fd5b610a9e82611f7d565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561201057612010611fd4565b604052919050565b5f6001600160401b0382111561203057612030611fd4565b50601f01601f191660200190565b5f61205061204b84612018565b611fe8565b9050828152838383011115612063575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612088575f80fd5b610a9e8383356020850161203e565b5f805f80608085870312156120aa575f80fd5b6120b385611f7d565b93506120c160208601611f7d565b92506040850135915060608501356001600160401b038111156120e2575f80fd5b6120ee87828801612079565b91505092959194509250565b5f805f6060848603121561210c575f80fd5b61211584611f7d565b925061212360208501611f7d565b9150604084013590509250925092565b5f60208284031215612143575f80fd5b81356001600160401b03811115612158575f80fd5b8201601f81018413612168575f80fd5b611ad08482356020840161203e565b5f6020808385031215612188575f80fd5b82356001600160401b038082111561219e575f80fd5b818501915085601f8301126121b1575f80fd5b8135818111156121c3576121c3611fd4565b8060051b91506121d4848301611fe8565b81815291830184019184810190888411156121ed575f80fd5b938501935b8385101561220b578435825293850193908501906121f2565b98975050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156122575783516001600160401b031683529284019291840191600101612232565b50909695505050505050565b5f8060408385031215612274575f80fd5b61227d83611f7d565b915060208301358015158114612291575f80fd5b809150509250929050565b5f80604083850312156122ad575f80fd5b6122b683611f7d565b91506122c460208401611f7d565b90509250929050565b5f602082840312156122dd575f80fd5b81356001600160401b038111156122f2575f80fd5b611ad084828501612079565b600181811c9082168061231257607f821691505b60208210810361233057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107b3576107b3612336565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f602082840312156123d3575f80fd5b8151610a9e81611ed7565b601f821115610cf457805f5260205f20601f840160051c810160208510156124035750805b601f840160051c820191505b81811015612422575f815560010161240f565b5050505050565b81516001600160401b0381111561244257612442611fd4565b6124568161245084546122fe565b846123de565b602080601f831160018114612489575f84156124725750858301515b5f19600386901b1c1916600185901b1785556124e0565b5f85815260208120601f198616915b828110156124b757888601518255948401946001909101908401612498565b50858210156124d457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061251a90830184611f29565b9695505050505050565b818103818111156107b3576107b3612336565b5f8154612543816122fe565b6001828116801561255b57600181146125705761259c565b60ff198416875282151583028701945061259c565b855f526020805f205f5b858110156125935781548a82015290840190820161257a565b50505082870194505b5050505092915050565b5f6125b18286612537565b84516125c1818360208901611f07565b6125cd81830186612537565b979650505050505050565b5f82601f8301126125e7575f80fd5b81516125f561204b82612018565b818152846020838601011115612609575f80fd5b611ad0826020830160208701611f07565b5f805f805f8060c0878903121561262f575f80fd5b86516001600160401b0380821115612645575f80fd5b6126518a838b016125d8565b97506020890151915080821115612666575f80fd5b6126728a838b016125d8565b965060408901519550606089015191508082111561268e575f80fd5b61269a8a838b016125d8565b945060808901519150808211156126af575f80fd5b506126bc89828a016125d8565b92505060a087015190509295509295509295565b600181815b8085111561270a57815f19048211156126f0576126f0612336565b808516156126fd57918102915b93841c93908002906126d5565b509250929050565b5f82612720575060016107b3565b8161272c57505f6107b3565b816001811461094e57600281036127595760ff84111561274e5761274e612336565b50506001821b6107b3565b5060208310610133831016604e8410600b841016171561277c575081810a6107b3565b61278683836126d0565b805f190482111561279957612799612336565b029392505050565b5f610a9e8383612712565b808201808211156107b3576107b3612336565b6001600160401b038281168282160390808211156127df576127df612336565b5092915050565b634e487b7160e01b5f52601260045260245ffd5b5f82612808576128086127e6565b500690565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f82612843576128436127e6565b500490565b5f6001820161285957612859612336565b5060010190565b60ff81811683821601908111156107b3576107b361233656fea2646970667358221220723f06ae28851c9f340212f441664302d31b2bea59e07e4a4d1bf52efc7555a964736f6c63430008180033

Deployed Bytecode Sourcemap

26613:885:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25811:795;;;;;;;;;;-1:-1:-1;25811:795:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25811:795:0;;;;;;;;10702:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24381:180::-;;;;;;;;;;-1:-1:-1;24381:180:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;24381:180:0;1533:203:1;12583:997:0;;;;;;;;;;-1:-1:-1;12583:997:0;;;;;:::i;:::-;;:::i;12377:101::-;;;;;;;;;;-1:-1:-1;12377:101:0;;;;;:::i;:::-;-1:-1:-1;;;;;12451:18:0;12437:4;12451:18;;;:9;:18;;;;;:25;;12377:101;;;;2515:25:1;;;2503:2;2488:18;12377:101:0;2369:177:1;8951:172:0;;;;;;;;;;-1:-1:-1;8951:172:0;;;;;:::i;:::-;-1:-1:-1;;;8951:172:0;;;;;;;;;;-1:-1:-1;;;;;;4424:33:1;;;4406:52;;4394:2;4379:18;8951:172:0;4262:202:1;10954:85:0;;;;;;;;;;;;;:::i;10085:45::-;;;;;;;;;;-1:-1:-1;10085:45:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4631:31:1;;;4613:50;;4601:2;4586:18;10085:45:0;4469:200:1;21943:817:0;;;;;;;;;;-1:-1:-1;21943:817:0;;;;;:::i;:::-;;:::i;9272:23::-;;;;;;;;;;;;;:::i;10872:76::-;;;;;;;;;;-1:-1:-1;10936:9:0;;10872:76;;25642:161;;;;;;;;;;;;;:::i;:::-;;22783:654;;;;;;:::i;:::-;;:::i;9302:22::-;;;;;;;;;;;;;:::i;9574:20::-;;;;;;;;;;-1:-1:-1;9574:20:0;;;;-1:-1:-1;;;;;9574:20:0;;;11286:93;;;;;;;;;;-1:-1:-1;11286:93:0;;;;;:::i;:::-;;:::i;27257:112::-;;;;;;;;;;-1:-1:-1;27257:112:0;;;;;:::i;:::-;;:::i;9921:50::-;;;;;;;;;;-1:-1:-1;9921:50:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;9921:50:0;;;12163:101;;;;;;;;;;;;;:::i;9209:21::-;;;;;;;;;;;;;:::i;11045:104::-;;;;;;;;;;-1:-1:-1;11045:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;11127:19:0;11112:4;11127:19;;;:10;:19;;;;;;;11045:104;11501:100;;;;;;;;;;-1:-1:-1;11501:100:0;;;;;:::i;:::-;;:::i;12270:101::-;;;;;;;;;;-1:-1:-1;12270:101:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11709:75::-;;;;;;;;;;-1:-1:-1;11709:75:0;;;;;:::i;:::-;;:::i;9706:18::-;;;;;;;;;;-1:-1:-1;9706:18:0;;;;-1:-1:-1;;;;;9706:18:0;;;11385:110;;;;;;;;;;-1:-1:-1;11385:110:0;;;;;:::i;:::-;;:::i;10785:81::-;;;;;;;;;;;;;:::i;27377:116::-;;;;;;:::i;24569:216::-;;;;;;;;;;-1:-1:-1;24569:216:0;;;;;:::i;:::-;;:::i;9731:32::-;;;;;;;;;;-1:-1:-1;9731:32:0;;;;-1:-1:-1;;;9731:32:0;;;;;;21561:339;;;;;;;;;;-1:-1:-1;21561:339:0;;;;;:::i;:::-;;:::i;23460:675::-;;;;;;:::i;:::-;;:::i;24957:284::-;;;;;;;;;;-1:-1:-1;24957:284:0;;;;;:::i;:::-;;:::i;11155:125::-;;;;;;;;;;-1:-1:-1;11155:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;11251:17:0;;;11236:4;11251:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;11155:125;12484:89;;;;;;;;;;;;;:::i;11607:96::-;;;;;;;;;;-1:-1:-1;11607:96:0;;;;;:::i;:::-;;:::i;24793:156::-;;;;;;;;;;-1:-1:-1;24793:156:0;;;;;:::i;:::-;;:::i;26681:568::-;;;;;;;;;;-1:-1:-1;26681:568:0;;;;;:::i;:::-;;:::i;25811:795::-;26182:20;;25888:4;;-1:-1:-1;;;26182:20:0;;;;:49;;;;-1:-1:-1;;;;;;;;;;26206:25:0;;;26182:49;26181:127;;;-1:-1:-1;;;;;;;;;;26283:25:0;;;26181:127;:203;;;-1:-1:-1;;;;;;;;;;26359:25:0;;;26181:203;:278;;;-1:-1:-1;;;;;;;;;;26434:25:0;;;26181:278;:368;;;-1:-1:-1;;;;;;;;;;26524:25:0;;;26181:368;25905:644;25811:795;-1:-1:-1;;25811:795:0:o;10702:77::-;10747:13;10771:5;10764:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10702:77;:::o;24381:180::-;24449:7;24473:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24473:16:0;24469:44;;24505:8;;;24469:44;-1:-1:-1;24531:22:0;;;;:13;:22;;;;;;-1:-1:-1;;;;;24531:22:0;;24381:180::o;12583:997::-;12655:4;12825:3;;12815:6;:13;;:32;;;;;12842:5;;12832:6;:15;;12815:32;12812:449;;;12864:13;12880:15;;;:7;:15;;;;;;-1:-1:-1;;;;;12880:15:0;12970:10;:19;;;;;:59;;;12994:35;13011:5;13018:10;12994:16;:35::i;:::-;12993:36;12970:59;12966:101;;;13031:36;;-1:-1:-1;;;13031:36:0;;8602:2:1;13031:36:0;;;8584:21:1;8641:2;8621:18;;;8614:30;8680:28;8660:18;;;8653:56;8726:18;;13031:36:0;;;;;;;;12966:101;13082:21;;;;:13;:21;;;;;:31;;-1:-1:-1;;;;;;13082:31:0;-1:-1:-1;;;;;13082:31:0;;;;;13178:45;13200:5;13082:31;:21;13178;:45::i;:::-;13245:4;13238:11;;;;;12812:449;13461:10;13450:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;13450:31:0;;;;;;;;;:40;;;13501:49;;13473:7;13484:6;13501:20;:49::i;:::-;-1:-1:-1;13568:4:0;12583:997;;;;:::o;10954:85::-;11006:4;11033:3;;11021:9;;:15;;;;:::i;:::-;11014:22;;10954:85;:::o;10085:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10085:45:0;;:::o;21943:817::-;22029:4;22158:3;;22148:6;:13;;:32;;;;;22175:5;;22165:6;:15;;22148:32;22145:489;;;22337:10;-1:-1:-1;;;;;22337:18:0;;;;:55;;;22373:19;22385:6;22373:11;:19::i;:::-;-1:-1:-1;;;;;22359:33:0;:10;-1:-1:-1;;;;;22359:33:0;;22337:55;:93;;;;22396:34;22413:4;22419:10;22396:16;:34::i;:::-;22197:303;;;;-1:-1:-1;;;22197:303:0;;;;;;;:::i;:::-;22517:38;22530:4;22536:2;22547:6;22517:12;:38::i;:::-;22570:26;22582:4;22588:2;22592:3;;22570:11;:26::i;:::-;-1:-1:-1;22618:4:0;22611:11;;22145:489;22646:41;22662:4;22668:10;22680:6;22646:15;:41::i;:::-;22698:30;22711:4;22717:2;22721:6;22698:12;:30::i;:::-;-1:-1:-1;22746:4:0;21943:817;;;;;;:::o;9272:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25642:161::-;10280:3;;-1:-1:-1;;;;;10280:3:0;10266:10;:17;10258:47;;;;-1:-1:-1;;;10258:47:0;;;;;;;:::i;:::-;25725:3:::1;::::0;25717:51:::1;::::0;25700:12:::1;::::0;-1:-1:-1;;;;;25725:3:0::1;::::0;25742:21:::1;::::0;25700:12;25717:51;25700:12;25717:51;25742:21;25725:3;25717:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25699:69;;;25787:7;25779:16;;;::::0;::::1;;25688:115;25642:161::o:0;22783:654::-;22913:10;-1:-1:-1;;;;;22913:18:0;;;;:56;;;22949:20;22961:7;22949:11;:20::i;:::-;-1:-1:-1;;;;;22935:34:0;:10;-1:-1:-1;;;;;22935:34:0;;22913:56;:94;;;;22973:34;22990:4;22996:10;22973:16;:34::i;:::-;22887:186;;;;-1:-1:-1;;;22887:186:0;;;;;;;:::i;:::-;23084:39;23097:4;23103:2;23114:7;23084:12;:39::i;:::-;23135:26;23147:4;23153:2;23157:3;;23135:11;:26::i;:::-;-1:-1:-1;;;;;23192:14:0;;;:19;;;;:171;;-1:-1:-1;23228:72:0;;-1:-1:-1;;;23228:72:0;;;23270:10;23228:72;;;10280:34:1;-1:-1:-1;;;;;10350:15:1;;;10330:18;;;10323:43;10382:18;;;10375:34;;;10445:3;10425:18;;;10418:31;-1:-1:-1;10465:19:1;;;10458:30;23317:46:0;;23228:41;;;;23317:46;;10505:19:1;;23228:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23228:135:0;;;23192:171;23174:256;;;23397:21;;-1:-1:-1;;;23397:21:0;;;;;;;;;;;23174:256;22783:654;;;:::o;9302:22::-;;;;;;;:::i;11286:93::-;10280:3;;-1:-1:-1;;;;;10280:3:0;10266:10;:17;10258:47;;;;-1:-1:-1;;;10258:47:0;;;;;;;:::i;:::-;11357:7:::1;:20;11367:10:::0;11357:7;:20:::1;:::i;:::-;;11286:93:::0;:::o;27257:112::-;27340:21;;-1:-1:-1;;;27340:21:0;;13161:2:1;27340:21:0;;;13143::1;13200:2;13180:18;;;13173:30;-1:-1:-1;;;13219:18:1;;;13212:41;13270:18;;27340:21:0;12959:335:1;12163:101:0;10280:3;;-1:-1:-1;;;;;10280:3:0;10266:10;:17;10258:47;;;;-1:-1:-1;;;10258:47:0;;;;;;;:::i;:::-;12242:20:::1;::::0;;-1:-1:-1;;;;12218:44:0;::::1;-1:-1:-1::0;;;12242:20:0;;;::::1;;;12241:21;12218:44:::0;;::::1;;::::0;;12163:101::o;9209:21::-;;;;;;;:::i;11501:100::-;10280:3;;-1:-1:-1;;;;;10280:3:0;10266:10;:17;10258:47;;;;-1:-1:-1;;;10258:47:0;;;;;;;:::i;:::-;11575:9:::1;:24;11587:12:::0;11575:9;:24:::1;:::i;12270:101::-:0;-1:-1:-1;;;;;12353:16:0;;;;;;:9;:16;;;;;;;;;12346:23;;;;;;;;;;;;;;;;;12329:15;;12346:23;;;12353:16;12346:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12346:23:0;-1:-1:-1;;;;;12346:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12270:101;;;:::o;11709:75::-;10280:3;;-1:-1:-1;;;;;10280:3:0;10266:10;:17;10258:47;;;;-1:-1:-1;;;10258:47:0;;;;;;;:::i;:::-;11770:3:::1;:12:::0;;-1:-1:-1;;;;;;11770:12:0::1;-1:-1:-1::0;;;;;11770:12:0;;;::::1;::::0;;;::::1;::::0;;11709:75::o;11385:110::-;10280:3;;-1:-1:-1;;;;;10280:3:0;10266:10;:17;10258:47;;;;-1:-1:-1;;;10258:47:0;;;;;;;:::i;:::-;11464:12:::1;:29;11479:14:::0;11464:12;:29:::1;:::i;10785:81::-:0;10832:13;10856:7;10849:14;;;;;:::i;24569:216::-;24675:10;24656:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;24656:40:0;;;;;;;;;:51;;-1:-1:-1;;24656:51:0;;;;;;;24718:59;;24656:40;:51;24718:27;:59::i;21561:339::-;21629:4;21649:15;;;:7;:15;;;;;;21668:10;-1:-1:-1;;;;;21649:15:0;;;:29;21646:178;;21695:44;21708:10;21720:2;21731:6;21695:12;:44::i;:::-;21754:32;21766:10;21778:2;21782:3;;21754:11;:32::i;:::-;-1:-1:-1;21808:4:0;21801:11;;21646:178;21834:36;21847:10;21859:2;21863:6;21834:12;:36::i;23460:675::-;23609:10;-1:-1:-1;;;;;23609:18:0;;;;:56;;;23645:20;23657:7;23645:11;:20::i;:::-;-1:-1:-1;;;;;23631:34:0;:10;-1:-1:-1;;;;;23631:34:0;;23609:56;:94;;;;23669:34;23686:4;23692:10;23669:16;:34::i;:::-;23583:186;;;;-1:-1:-1;;;23583:186:0;;;;;;;:::i;:::-;23780:39;23793:4;23799:2;23810:7;23780:12;:39::i;:::-;23831:26;23843:4;23849:2;23853:3;;23831:11;:26::i;:::-;-1:-1:-1;;;;;23888:14:0;;;:19;;;;:173;;-1:-1:-1;23924:74:0;;-1:-1:-1;;;23924:74:0;;;24015:46;-1:-1:-1;;;;;23924:41:0;;;24015:46;;23924:74;;23966:10;;23978:4;;23984:7;;23993:4;;23924:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23924:137:0;;;23888:173;23870:258;;;24095:21;;-1:-1:-1;;;24095:21:0;;;;;;;;;;;23870:258;23460:675;;;;:::o;24957:284::-;25021:13;25066:5;;25055:7;:16;;25047:45;;;;-1:-1:-1;;;25047:45:0;;13995:2:1;25047:45:0;;;13977:21:1;14034:2;14014:18;;;14007:30;-1:-1:-1;;;14053:18:1;;;14046:46;14109:18;;25047:45:0;13793:340:1;25047:45:0;25113:7;25107:21;;;;;:::i;:::-;;;25132:1;25107:26;25103:44;;-1:-1:-1;;25136:9:0;;;;;;;;;-1:-1:-1;25136:9:0;;;24957:284::o;25103:44::-;25188:7;25197:23;25216:3;;25206:7;:13;;;;:::i;:::-;25197:8;:23::i;:::-;25222:9;25171:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25157:76;;24957:284;;;:::o;12484:89::-;12536:13;12559:12;12552:19;;;;;:::i;11607:96::-;10280:3;;-1:-1:-1;;;;;10280:3:0;10266:10;:17;10258:47;;;;-1:-1:-1;;;10258:47:0;;;;;;;:::i;:::-;11679:8:::1;:22;11690:11:::0;11679:8;:22:::1;:::i;24793:156::-:0;-1:-1:-1;;;;;24906:25:0;;;24882:4;24906:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24793:156::o;26681:568::-;26767:9;;:14;26759:46;;;;-1:-1:-1;;;26759:46:0;;15675:2:1;26759:46:0;;;15657:21:1;15714:2;15694:18;;;15687:30;-1:-1:-1;;;15733:18:1;;;15726:49;15792:18;;26759:46:0;15473:343:1;26759:46:0;26891:17;26880:70;;;;;;;;;;;;:::i;:::-;26867:9;26816:134;;;26817:5;;26824:7;26817:5;26833:9;26817:5;;;26853:12;26816:134;;26853:12;26816:134;:::i;:::-;-1:-1:-1;26816:134:0;;-1:-1:-1;26816:134:0;;;:::i;:::-;-1:-1:-1;;26816:134:0;;;-1:-1:-1;26816:134:0;;;;:::i;:::-;-1:-1:-1;26816:134:0;;-1:-1:-1;26816:134:0;;;:::i;:::-;;;;;;;;26983:9;;26977:2;:15;;;;:::i;:::-;26971:3;:21;;;27017:9;;27029:1;;27011:15;;27017:9;27011:15;:::i;:::-;:19;;;;:::i;:::-;27003:5;:27;27057:3;;27050:15;;27064:1;;27050:15;:::i;:::-;27041:6;:24;;-1:-1:-1;;27041:24:0;-1:-1:-1;;;;;27041:24:0;;;;;;;;;;27154:13;:11;:13::i;:::-;27140:10;27129:22;;;;:10;:22;;;;;:38;27194:9;;27188:3;;:15;27180:61;;;;-1:-1:-1;;;27180:61:0;;19256:2:1;27180:61:0;;;19238:21:1;19295:2;19275:18;;;19268:30;19334:34;19314:18;;;19307:62;-1:-1:-1;;;19385:18:1;;;19378:31;19426:19;;27180:61:0;19054:397:1;5199:126:0;5313:8;5303;-1:-1:-1;;;;;5286:36:0;5295:6;-1:-1:-1;;;;;5286:36:0;;;;;;;;;;;5199:126;;;:::o;4631:122::-;4733:8;-1:-1:-1;;;;;4716:34:0;4725:6;-1:-1:-1;;;;;4716:34:0;;4743:6;4716:34;;;;2515:25:1;;2503:2;2488:18;;2369:177;4716:34:0;;;;;;;;4631:122;;;:::o;20900:529::-;-1:-1:-1;;;;;21008:16:0;;;;;;:7;:16;;;;;;-1:-1:-1;;;;;21000:24:0;;;21008:16;;21000:24;20992:58;;;;-1:-1:-1;;;20992:58:0;;19658:2:1;20992:58:0;;;19640:21:1;19697:2;19677:18;;;19670:30;-1:-1:-1;;;19716:18:1;;;19709:51;19777:18;;20992:58:0;19456:345:1;20992:58:0;-1:-1:-1;;;;;21116:22:0;;;;;;:13;:22;;;;;;;;21109:29;;-1:-1:-1;;;;;;21109:29:0;;;;;;21187:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;21187:21:0;;;;;21262:35;21279:4;21187:21;21116:22;21262:16;:35::i;:::-;21348:40;21370:4;21376:2;21380:7;-1:-1:-1;;;;;21348:40:0;:21;:40::i;20437:361::-;-1:-1:-1;;;;;20520:16:0;;;;;;:10;:16;;;;;:26;;20540:6;;20520:16;:26;;20540:6;;20520:26;:::i;:::-;;;;-1:-1:-1;;;;;;;20629:14:0;;;;;;:10;:14;;;;;:24;;;;;;20720:38;20741:4;20640:2;20647:6;20720:20;:38::i;24143:230::-;-1:-1:-1;;;;;24249:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;:36;-1:-1:-1;24249:36:0;24241:77;;;;-1:-1:-1;;;24241:77:0;;20008:2:1;24241:77:0;;;19990:21:1;20047:2;20027:18;;;20020:30;20086;20066:18;;;20059:58;20134:18;;24241:77:0;19806:352:1;24241:77:0;-1:-1:-1;;;;;24329:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;:36;;24359:6;;24329:17;:36;;24359:6;;24329:36;:::i;:::-;;;;-1:-1:-1;;;;;24143:230:0:o;13588:3901::-;-1:-1:-1;;;;;13695:16:0;;;;;;:10;:16;;;;;;:26;-1:-1:-1;13695:26:0;13687:76;;;;-1:-1:-1;;;13687:76:0;;20365:2:1;13687:76:0;;;20347:21:1;20404:2;20384:18;;;20377:30;20443:34;20423:18;;;20416:62;-1:-1:-1;;;20494:18:1;;;20487:35;20539:19;;13687:76:0;20163:401:1;13687:76:0;13926:3;;-1:-1:-1;;;;;13907:16:0;;13881:23;13907:16;;;:10;:16;;;;;;13881:23;;13907:22;;;:::i;:::-;13981:3;;-1:-1:-1;;;;;13964:14:0;;13940:21;13964:14;;;:10;:14;;;;;;13881:48;;-1:-1:-1;13940:21:0;13964:20;;13981:3;13964:20;:::i;:::-;13940:44;;14049:29;14061:4;14067:2;14071:6;14049:11;:29::i;:::-;14226:3;;-1:-1:-1;;;;;14207:16:0;;14180:24;14207:16;;;:10;:16;;;;;;14180:24;;14207:22;;;:::i;:::-;14282:3;;-1:-1:-1;;;;;14265:14:0;;14240:22;14265:14;;;:10;:14;;;;;;14180:49;;-1:-1:-1;14240:22:0;14265:20;;14282:3;14265:20;:::i;:::-;-1:-1:-1;;;;;14422:15:0;;14388:31;14422:15;;;:9;:15;;;;;14240:45;;-1:-1:-1;14567:6:0;14696:34;;;14692:473;;;14752:21;;:25;14749:405;;14836:14;14853;14868:1;14853:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;14935:28;;;;;;;;;;;;;;;;;;;;;14853:17;;;;;;;;;;;;;;;-1:-1:-1;;;;;14853:17:0;;;14935:28;;;;;;;;;;;;;;;;;;;;;;;14853:17;-1:-1:-1;15036:39:0;;15049:4;;14853:17;15036:12;:39::i;:::-;14779:375;14749:405;15311:14;15295:13;:30;15291:367;;;15347:21;;:25;15344:289;;15429:71;15450:1;15454:2;15458:14;15497:1;15473:14;:21;;;;:25;;;;:::i;:::-;15458:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15458:41:0;15429:12;:71::i;:::-;15519:14;:20;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;15519:20:0;;;;;;;;;-1:-1:-1;;;;;15519:20:0;;;;;;;;;;;;;;15344:289;;;15608:9;15614:2;15608:5;:9::i;:::-;;15344:289;15755:19;15786:3;;15777:6;:12;;;;:::i;:::-;15813:21;;16236:3;;15755:34;;-1:-1:-1;15813:21:0;-1:-1:-1;;;;;16236:3:0;;;16228:11;;;;16225:165;;16352:3;16335:14;:20;:43;;16375:3;16335:43;;;16358:14;16335:43;16318:60;;16225:165;16405:18;;16402:1080;;16465:3;16448:14;:20;:43;;16488:3;16448:43;;;16471:14;16448:43;16442:49;;16734:6;16729:108;16750:3;16746:1;:7;16729:108;;;16779:41;16792:4;16798:2;16802:14;16817:1;16802:17;;;;;;;;:::i;16779:41::-;16755:3;;16729:108;;;-1:-1:-1;16851:21:0;16869:3;16851:21;;:::i;:::-;16893;;16851;;-1:-1:-1;16893:21:0;-1:-1:-1;16935:20:0;;;:43;;16975:3;16935:43;;;16958:14;16935:43;16929:49;;17237:6;17232:184;17253:3;17249:1;:7;17232:184;;;17290:71;17311:1;17315:2;17319:14;17358:1;17334:14;:21;;;;:25;;;;:::i;17290:71::-;17380:14;:20;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;17380:20:0;;;;;;;;;-1:-1:-1;;;;;17380:20:0;;;;;;;;;;;;;;;17258:3;17232:184;;;-1:-1:-1;17432:36:0;17443:2;17447:20;17464:3;17447:14;:20;:::i;:::-;17432:10;:36::i;:::-;13666:3823;;;;;;;;13588:3901;;;:::o;5331:142::-;5449:9;-1:-1:-1;;;;;5426:44:0;5441:6;-1:-1:-1;;;;;5426:44:0;;5460:9;5426:44;;;;565:14:1;558:22;540:41;;528:2;513:18;;400:187;25249:385:0;25305:13;25335:5;25344:1;25335:10;25331:29;;-1:-1:-1;;25348:10:0;;;;;;;;;;;;-1:-1:-1;;;25348:10:0;;;;;25249:385::o;25331:29::-;25376:5;25361:12;25408:41;25415:9;;25408:41;;25427:8;;;;:::i;:::-;;-1:-1:-1;25437:10:0;;-1:-1:-1;25445:2:0;25437:10;;:::i;:::-;;;25408:41;;;25450:19;25482:6;-1:-1:-1;;;;;25472:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25472:17:0;;25450:39;;25500:95;25507:10;;25500:95;;25520:11;25530:1;25520:11;;:::i;:::-;;-1:-1:-1;25563:10:0;25571:2;25563:5;:10;:::i;:::-;25557:22;;25577:2;25557:22;:::i;:::-;25550:30;;25533:6;25540;25533:14;;;;;;;;:::i;:::-;;;;:47;-1:-1:-1;;;;;25533:47:0;;;;;;;;-1:-1:-1;25582:11:0;25591:2;25582:11;;:::i;:::-;;;25500:95;;;25619:6;25249:385;-1:-1:-1;;;;25249:385:0:o;19336:1045::-;-1:-1:-1;;;;;19441:18:0;;19425:13;19441:18;;;:9;:18;;;;;;;;;-1:-1:-1;;;;;19552:15:0;;;;:9;:15;;;;;19641;;19441:18;;19552:15;;19641;19552;19739:7;19745:1;19641:15;19739:7;:::i;:::-;19730:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19730:17:0;19709:38;;19851:11;19833:8;19842:5;19833:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;19833:29:0;;;;;-1:-1:-1;;;;;19833:29:0;;;;;;19939:8;:14;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;19939:14:0;;;;;;;;;-1:-1:-1;;;;;19939:14:0;;;;;;;;;;;;;;20060:7;19939:14;20060:3;:7;:::i;:::-;:12;20057:115;;-1:-1:-1;;;;;20089:22:0;;;;;;:9;:22;;;;;:30;;;20057:115;-1:-1:-1;;;;;20189:13:0;;;;;;:9;:13;;;;;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20189:27:0;;;;;;;;;;;;;;;;;20295:13;;;;:20;;:24;;20189:27;20295:24;:::i;:::-;-1:-1:-1;;;;;20274:18:0;;;;;;;:9;:18;;;;;:45;;;;-1:-1:-1;;;;;;19336:1045:0:o;5079:114::-;5181:8;5176:3;-1:-1:-1;;;;;5160:30:0;5169:5;-1:-1:-1;;;;;5160:30:0;;;;;;;;;;;5079:114;;;:::o;4513:112::-;4609:3;-1:-1:-1;;;;;4593:29:0;4602:5;-1:-1:-1;;;;;4593:29:0;;4614:7;4593:29;;;;2515:25:1;;2503:2;2488:18;;2369:177;18602:630:0;18705:6;:8;;-1:-1:-1;;18705:8:0;;;-1:-1:-1;;;;;18705:8:0;;;;;;;;;;;;;-1:-1:-1;18847:16:0;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;18847:21:0;-1:-1:-1;;;;;18847:21:0;;;;;;;;18942:13;;:9;:13;;;;;;:20;;18921:18;;;:9;:18;;;;;:41;;;19030:13;;;:27;;;;;;;;;;;;;;;;;;;;;;18705:8;19030:27;;;;;;;;;;;;;;;;;;19138:46;;18847:21;18705:8;19138:21;:46::i;:::-;18602:630;;;:::o;17497:1095::-;17576:6;17586:1;17576:11;17573:23;;17497:1095;;:::o;17573:23::-;17638:6;17648:1;17638:11;17635:105;;17698:9;17704:2;17698:5;:9::i;17635:105::-;17762:6;;-1:-1:-1;;;;;17833:13:0;;17750:9;17833:13;;;:9;:13;;;;;:20;-1:-1:-1;;;;;17762:6:0;;;;17833:20;17904:581;17924:6;17920:1;:10;17904:581;;;17977:4;;;;-1:-1:-1;;;;;18044:11:0;;;;;;;:7;:11;;;;;;;;:16;;-1:-1:-1;;;;;;18044:16:0;-1:-1:-1;;;;;18044:16:0;;;;;;;;18103:9;:13;;;;;:24;;;18186:13;;:9;:13;;;;:22;;;;;;;;;;;;;;;;;;;;;;;18044:16;18186:22;;;;;;;;;;;;;;;;;;17977:4;;18259:41;;18044:11;:16;;18259:21;:41::i;:::-;18373:10;;;;;18435:3;17904:581;;;-1:-1:-1;;18520:6:0;:24;;-1:-1:-1;;18520:24:0;;-1:-1:-1;;;;;18520:24:0;;;;;;;;;;;;;;;-1:-1:-1;;17497:1095:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;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:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:186::-;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2329:29;2348:9;2329:29;:::i;2551:127::-;2612:10;2607:3;2603:20;2600:1;2593:31;2643:4;2640:1;2633:15;2667:4;2664:1;2657:15;2683:275;2754:2;2748:9;2819:2;2800:13;;-1:-1:-1;;2796:27:1;2784:40;;-1:-1:-1;;;;;2839:34:1;;2875:22;;;2836:62;2833:88;;;2901:18;;:::i;:::-;2937:2;2930:22;2683:275;;-1:-1:-1;2683:275:1:o;2963:186::-;3011:4;-1:-1:-1;;;;;3036:6:1;3033:30;3030:56;;;3066:18;;:::i;:::-;-1:-1:-1;3132:2:1;3111:15;-1:-1:-1;;3107:29:1;3138:4;3103:40;;2963:186::o;3154:336::-;3218:5;3247:52;3263:35;3291:6;3263:35;:::i;:::-;3247:52;:::i;:::-;3238:61;;3322:6;3315:5;3308:21;3362:3;3353:6;3348:3;3344:16;3341:25;3338:45;;;3379:1;3376;3369:12;3338:45;3428:6;3423:3;3416:4;3409:5;3405:16;3392:43;3482:1;3475:4;3466:6;3459:5;3455:18;3451:29;3444:40;3154:336;;;;;:::o;3495:220::-;3537:5;3590:3;3583:4;3575:6;3571:17;3567:27;3557:55;;3608:1;3605;3598:12;3557:55;3630:79;3705:3;3696:6;3683:20;3676:4;3668:6;3664:17;3630:79;:::i;3720:537::-;3815:6;3823;3831;3839;3892:3;3880:9;3871:7;3867:23;3863:33;3860:53;;;3909:1;3906;3899:12;3860:53;3932:29;3951:9;3932:29;:::i;:::-;3922:39;;3980:38;4014:2;4003:9;3999:18;3980:38;:::i;:::-;3970:48;;4065:2;4054:9;4050:18;4037:32;4027:42;;4120:2;4109:9;4105:18;4092:32;-1:-1:-1;;;;;4139:6:1;4136:30;4133:50;;;4179:1;4176;4169:12;4133:50;4202:49;4243:7;4234:6;4223:9;4219:22;4202:49;:::i;:::-;4192:59;;;3720:537;;;;;;;:::o;4674:328::-;4751:6;4759;4767;4820:2;4808:9;4799:7;4795:23;4791:32;4788:52;;;4836:1;4833;4826:12;4788:52;4859:29;4878:9;4859:29;:::i;:::-;4849:39;;4907:38;4941:2;4930:9;4926:18;4907:38;:::i;:::-;4897:48;;4992:2;4981:9;4977:18;4964:32;4954:42;;4674:328;;;;;:::o;5007:450::-;5076:6;5129:2;5117:9;5108:7;5104:23;5100:32;5097:52;;;5145:1;5142;5135:12;5097:52;5185:9;5172:23;-1:-1:-1;;;;;5210:6:1;5207:30;5204:50;;;5250:1;5247;5240:12;5204:50;5273:22;;5326:4;5318:13;;5314:27;-1:-1:-1;5304:55:1;;5355:1;5352;5345:12;5304:55;5378:73;5443:7;5438:2;5425:16;5420:2;5416;5412:11;5378:73;:::i;5462:946::-;5546:6;5577:2;5620;5608:9;5599:7;5595:23;5591:32;5588:52;;;5636:1;5633;5626:12;5588:52;5676:9;5663:23;-1:-1:-1;;;;;5746:2:1;5738:6;5735:14;5732:34;;;5762:1;5759;5752:12;5732:34;5800:6;5789:9;5785:22;5775:32;;5845:7;5838:4;5834:2;5830:13;5826:27;5816:55;;5867:1;5864;5857:12;5816:55;5903:2;5890:16;5925:2;5921;5918:10;5915:36;;;5931:18;;:::i;:::-;5977:2;5974:1;5970:10;5960:20;;6000:28;6024:2;6020;6016:11;6000:28;:::i;:::-;6062:15;;;6132:11;;;6128:20;;;6093:12;;;;6160:19;;;6157:39;;;6192:1;6189;6182:12;6157:39;6216:11;;;;6236:142;6252:6;6247:3;6244:15;6236:142;;;6318:17;;6306:30;;6269:12;;;;6356;;;;6236:142;;;6397:5;5462:946;-1:-1:-1;;;;;;;;5462:946:1:o;6413:655::-;6582:2;6634:21;;;6704:13;;6607:18;;;6726:22;;;6553:4;;6582:2;6805:15;;;;6779:2;6764:18;;;6553:4;6848:194;6862:6;6859:1;6856:13;6848:194;;;6927:13;;-1:-1:-1;;;;;6923:38:1;6911:51;;7017:15;;;;6982:12;;;;6884:1;6877:9;6848:194;;;-1:-1:-1;7059:3:1;;6413:655;-1:-1:-1;;;;;;6413:655:1:o;7073:347::-;7138:6;7146;7199:2;7187:9;7178:7;7174:23;7170:32;7167:52;;;7215:1;7212;7205:12;7167:52;7238:29;7257:9;7238:29;:::i;:::-;7228:39;;7317:2;7306:9;7302:18;7289:32;7364:5;7357:13;7350:21;7343:5;7340:32;7330:60;;7386:1;7383;7376:12;7330:60;7409:5;7399:15;;;7073:347;;;;;:::o;7425:260::-;7493:6;7501;7554:2;7542:9;7533:7;7529:23;7525:32;7522:52;;;7570:1;7567;7560:12;7522:52;7593:29;7612:9;7593:29;:::i;:::-;7583:39;;7641:38;7675:2;7664:9;7660:18;7641:38;:::i;:::-;7631:48;;7425:260;;;;;:::o;7690:320::-;7758:6;7811:2;7799:9;7790:7;7786:23;7782:32;7779:52;;;7827:1;7824;7817:12;7779:52;7867:9;7854:23;-1:-1:-1;;;;;7892:6:1;7889:30;7886:50;;;7932:1;7929;7922:12;7886:50;7955:49;7996:7;7987:6;7976:9;7972:22;7955:49;:::i;8015:380::-;8094:1;8090:12;;;;8137;;;8158:61;;8212:4;8204:6;8200:17;8190:27;;8158:61;8265:2;8257:6;8254:14;8234:18;8231:38;8228:161;;8311:10;8306:3;8302:20;8299:1;8292:31;8346:4;8343:1;8336:15;8374:4;8371:1;8364:15;8228:161;;8015:380;;;:::o;8755:127::-;8816:10;8811:3;8807:20;8804:1;8797:31;8847:4;8844:1;8837:15;8871:4;8868:1;8861:15;8887:168;8960:9;;;8991;;9008:15;;;9002:22;;8988:37;8978:71;;9029:18;;:::i;9060:354::-;9262:2;9244:21;;;9301:2;9281:18;;;9274:30;9340:32;9335:2;9320:18;;9313:60;9405:2;9390:18;;9060:354::o;9419:341::-;9621:2;9603:21;;;9660:2;9640:18;;;9633:30;-1:-1:-1;;;9694:2:1;9679:18;;9672:47;9751:2;9736:18;;9419:341::o;10535:249::-;10604:6;10657:2;10645:9;10636:7;10632:23;10628:32;10625:52;;;10673:1;10670;10663:12;10625:52;10705:9;10699:16;10724:30;10748:5;10724:30;:::i;10915:518::-;11017:2;11012:3;11009:11;11006:421;;;11053:5;11050:1;11043:16;11097:4;11094:1;11084:18;11167:2;11155:10;11151:19;11148:1;11144:27;11138:4;11134:38;11203:4;11191:10;11188:20;11185:47;;;-1:-1:-1;11226:4:1;11185:47;11281:2;11276:3;11272:12;11269:1;11265:20;11259:4;11255:31;11245:41;;11336:81;11354:2;11347:5;11344:13;11336:81;;;11413:1;11399:16;;11380:1;11369:13;11336:81;;;11340:3;;10915:518;;;:::o;11609:1345::-;11735:3;11729:10;-1:-1:-1;;;;;11754:6:1;11751:30;11748:56;;;11784:18;;:::i;:::-;11813:97;11903:6;11863:38;11895:4;11889:11;11863:38;:::i;:::-;11857:4;11813:97;:::i;:::-;11965:4;;12022:2;12011:14;;12039:1;12034:663;;;;12741:1;12758:6;12755:89;;;-1:-1:-1;12810:19:1;;;12804:26;12755:89;-1:-1:-1;;11566:1:1;11562:11;;;11558:24;11554:29;11544:40;11590:1;11586:11;;;11541:57;12857:81;;12004:944;;12034:663;10862:1;10855:14;;;10899:4;10886:18;;-1:-1:-1;;12070:20:1;;;12188:236;12202:7;12199:1;12196:14;12188:236;;;12291:19;;;12285:26;12270:42;;12383:27;;;;12351:1;12339:14;;;;12218:19;;12188:236;;;12192:3;12452:6;12443:7;12440:19;12437:201;;;12513:19;;;12507:26;-1:-1:-1;;12596:1:1;12592:14;;;12608:3;12588:24;12584:37;12580:42;12565:58;12550:74;;12437:201;;;12684:1;12675:6;12672:1;12668:14;12664:22;12658:4;12651:36;12004:944;;;;;11609:1345;;:::o;13299:489::-;-1:-1:-1;;;;;13568:15:1;;;13550:34;;13620:15;;13615:2;13600:18;;13593:43;13667:2;13652:18;;13645:34;;;13715:3;13710:2;13695:18;;13688:31;;;13493:4;;13736:46;;13762:19;;13754:6;13736:46;:::i;:::-;13728:54;13299:489;-1:-1:-1;;;;;;13299:489:1:o;14138:128::-;14205:9;;;14226:11;;;14223:37;;;14240:18;;:::i;14271:723::-;14321:3;14362:5;14356:12;14391:36;14417:9;14391:36;:::i;:::-;14446:1;14463:17;;;14489:133;;;;14636:1;14631:357;;;;14456:532;;14489:133;-1:-1:-1;;14522:24:1;;14510:37;;14595:14;;14588:22;14576:35;;14567:45;;;-1:-1:-1;14489:133:1;;14631:357;14662:5;14659:1;14652:16;14691:4;14736;14733:1;14723:18;14763:1;14777:165;14791:6;14788:1;14785:13;14777:165;;;14869:14;;14856:11;;;14849:35;14912:16;;;;14806:10;;14777:165;;;14781:3;;;14971:6;14966:3;14962:16;14955:23;;14456:532;;;;;14271:723;;;;:::o;14999:469::-;15220:3;15248:38;15282:3;15274:6;15248:38;:::i;:::-;15315:6;15309:13;15331:65;15389:6;15385:2;15378:4;15370:6;15366:17;15331:65;:::i;:::-;15412:50;15454:6;15450:2;15446:15;15438:6;15412:50;:::i;:::-;15405:57;14999:469;-1:-1:-1;;;;;;;14999:469:1:o;15821:442::-;15875:5;15928:3;15921:4;15913:6;15909:17;15905:27;15895:55;;15946:1;15943;15936:12;15895:55;15975:6;15969:13;16006:48;16022:31;16050:2;16022:31;:::i;16006:48::-;16079:2;16070:7;16063:19;16125:3;16118:4;16113:2;16105:6;16101:15;16097:26;16094:35;16091:55;;;16142:1;16139;16132:12;16091:55;16155:77;16229:2;16222:4;16213:7;16209:18;16202:4;16194:6;16190:17;16155:77;:::i;16268:1095::-;16423:6;16431;16439;16447;16455;16463;16516:3;16504:9;16495:7;16491:23;16487:33;16484:53;;;16533:1;16530;16523:12;16484:53;16566:9;16560:16;-1:-1:-1;;;;;16636:2:1;16628:6;16625:14;16622:34;;;16652:1;16649;16642:12;16622:34;16675:61;16728:7;16719:6;16708:9;16704:22;16675:61;:::i;:::-;16665:71;;16782:2;16771:9;16767:18;16761:25;16745:41;;16811:2;16801:8;16798:16;16795:36;;;16827:1;16824;16817:12;16795:36;16850:63;16905:7;16894:8;16883:9;16879:24;16850:63;:::i;:::-;16840:73;;16953:2;16942:9;16938:18;16932:25;16922:35;;17003:2;16992:9;16988:18;16982:25;16966:41;;17032:2;17022:8;17019:16;17016:36;;;17048:1;17045;17038:12;17016:36;17071:63;17126:7;17115:8;17104:9;17100:24;17071:63;:::i;:::-;17061:73;;17180:3;17169:9;17165:19;17159:26;17143:42;;17210:2;17200:8;17197:16;17194:36;;;17226:1;17223;17216:12;17194:36;;17249:63;17304:7;17293:8;17282:9;17278:24;17249:63;:::i;:::-;17239:73;;;17352:3;17341:9;17337:19;17331:26;17321:36;;16268:1095;;;;;;;;:::o;17368:416::-;17457:1;17494:5;17457:1;17508:270;17529:7;17519:8;17516:21;17508:270;;;17588:4;17584:1;17580:6;17576:17;17570:4;17567:27;17564:53;;;17597:18;;:::i;:::-;17647:7;17637:8;17633:22;17630:55;;;17667:16;;;;17630:55;17746:22;;;;17706:15;;;;17508:270;;;17512:3;17368:416;;;;;:::o;17789:806::-;17838:5;17868:8;17858:80;;-1:-1:-1;17909:1:1;17923:5;;17858:80;17957:4;17947:76;;-1:-1:-1;17994:1:1;18008:5;;17947:76;18039:4;18057:1;18052:59;;;;18125:1;18120:130;;18032:218;18120:130;18157:3;18147:8;18144:17;18141:43;;;18164:18;;:::i;:::-;-1:-1:-1;;18220:1:1;18206:16;;18235:5;;18032:218;;18334:2;18324:8;18321:16;18315:3;18309:4;18306:13;18302:36;18296:2;18286:8;18283:16;18278:2;18272:4;18269:12;18265:35;18262:77;18259:159;;;-1:-1:-1;18371:19:1;;;18403:5;;18259:159;18450:34;18475:8;18469:4;18450:34;:::i;:::-;18520:6;18516:1;18512:6;18508:19;18499:7;18496:32;18493:58;;;18531:18;;:::i;:::-;18569:20;;17789:806;-1:-1:-1;;;17789:806:1:o;18600:131::-;18660:5;18689:36;18716:8;18710:4;18689:36;:::i;18736:125::-;18801:9;;;18822:10;;;18819:36;;;18835:18;;:::i;18866:183::-;-1:-1:-1;;;;;18985:10:1;;;18973;;;18969:27;;19008:12;;;19005:38;;;19023:18;;:::i;:::-;19005:38;18866:183;;;;:::o;20569:127::-;20630:10;20625:3;20621:20;20618:1;20611:31;20661:4;20658:1;20651:15;20685:4;20682:1;20675:15;20701:112;20733:1;20759;20749:35;;20764:18;;:::i;:::-;-1:-1:-1;20798:9:1;;20701:112::o;20818:127::-;20879:10;20874:3;20870:20;20867:1;20860:31;20910:4;20907:1;20900:15;20934:4;20931:1;20924:15;20950:127;21011:10;21006:3;21002:20;20999:1;20992:31;21042:4;21039:1;21032:15;21066:4;21063:1;21056:15;21082:120;21122:1;21148;21138:35;;21153:18;;:::i;:::-;-1:-1:-1;21187:9:1;;21082:120::o;21207:135::-;21246:3;21267:17;;;21264:43;;21287:18;;:::i;:::-;-1:-1:-1;21334:1:1;21323:13;;21207:135::o;21347:148::-;21435:4;21414:12;;;21428;;;21410:31;;21453:13;;21450:39;;;21469:18;;:::i

Swarm Source

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