ETH Price: $3,058.36 (-7.42%)
Gas: 16 Gwei

Token

Paintglyphs V2 (p☵2)
 

Overview

Max Total Supply

512 p☵2

Holders

185

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 p☵2
0xcbfc78d7e26c2ff131867ed74fa65572dad6fc90
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:
Repaintedglyphs

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-14
*/

pragma solidity ^0.5.17;

interface paintglyphsV1Contract {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}

interface ERC721TokenReceiver
{
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

contract Repaintedglyphs {

    event Generated(uint indexed index, address indexed a, string value);

    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    event ColorChanged(uint id, uint symbolToUpdate, uint newColor);
    
    bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    uint public constant TOKEN_LIMIT = 512;
    uint public constant ARTIST_PRINTS = 0;

    uint public constant PRICE = 200 finney;

    address payable public constant BENEFICIARY = 0x8C9eEEcaeb226f1B8C1385abE0960754e08EC285;

    mapping (uint => address) private idToCreator;
    mapping (uint => uint8) private idToSymbolScheme;
    mapping (uint => uint256) private idToBackgroundColor;
    mapping (uint => uint256[8]) private idToColorScheme;
    mapping (uint => string) private processingCode;

    // ERC 165
    mapping(bytes4 => bool) internal supportedInterfaces;

    /**
     * @dev A mapping from NFT ID to the address that owns it.
     */
    mapping (uint256 => address) internal idToOwner;

    /**
     * @dev A mapping from NFT ID to the seed used to make it.
     */
    mapping (uint256 => uint256) internal idToSeed;
    mapping (uint256 => uint256) internal seedToId;

    /**
     * @dev Mapping from NFT ID to approved address.
     */
    mapping (uint256 => address) internal idToApproval;

    /**
     * @dev Mapping from owner address to mapping of operator addresses.
     */
    mapping (address => mapping (address => bool)) internal ownerToOperators;

    /**
     * @dev Mapping from owner to list of owned NFT IDs.
     */
    mapping(address => uint256[]) internal ownerToIds;

    /**
     * @dev Mapping from NFT ID to its index in the owner tokens list.
     */
    mapping(uint256 => uint256) internal idToOwnerIndex;

    /**
     * @dev Total number of tokens.
     */
    uint internal numTokens = 102; //start index at 102 (# of paintglyphs v1)

    /**
     * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
     * @param _tokenId ID of the NFT to validate.
     */
    modifier canOperate(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender]);
        _;
    }

    /**
     * @dev Guarantees that the msg.sender is allowed to transfer NFT.
     * @param _tokenId ID of the NFT to transfer.
     */
    modifier canTransfer(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(
            tokenOwner == msg.sender
            || idToApproval[_tokenId] == msg.sender
            || ownerToOperators[tokenOwner][msg.sender]
        );
        _;
    }

    /**
     * @dev Guarantees that _tokenId is a valid Token.
     * @param _tokenId ID of the NFT to validate.
     */
    modifier validNFToken(uint256 _tokenId) {
        require(idToOwner[_tokenId] != address(0));
        _;
    }
    
        
    modifier isOwner() {
        require(msg.sender == owner, "Must be deployer of contract");
        _;
    }

    /**
     * @dev Contract constructor.
     */
    constructor() public {
        supportedInterfaces[0x01ffc9a7] = true; // ERC165
        supportedInterfaces[0x80ac58cd] = true; // ERC721
        supportedInterfaces[0x780e9d63] = true; // ERC721 Enumerable
        supportedInterfaces[0x5b5e139f] = true; // ERC721 Metadata
        paintglyphsV1 = paintglyphsV1Contract(paintglyphsAddress);
        owner = msg.sender;
        setURI("https://paintglyphsV2.azurewebsites.net/api/HttpTrigger?id=");
    }

    ///////////////////
    //// GENERATOR ////
    ///////////////////

    int constant ONE = int(0x100000000);
    uint constant USIZE = 32;
    int constant SIZE = int(USIZE);
    int constant HALF_SIZE = SIZE / int(2);
    address public owner;
    string URI;

    int constant SCALE = int(0x1b81a81ab1a81a823);
    int constant HALF_SCALE = SCALE / int(2);

    bytes prefix = "data:text/plain;charset=utf-8,";

    string internal nftName = "Paintglyphs V2";
    string internal nftSymbol = "p☵2";
    address public paintglyphsAddress = 0x2E8b45D550E4bb8c7986EE98879C1740519E0A1A;
    string public allSymbols = "0 - ░; 1 - ▒; 2 - ■; 3 - ┼; 4 - ▓; 5 - ▄; 6 - ▀; 7 - ≡";
    
    paintglyphsV1Contract paintglyphsV1;

    function abs(int n) internal pure returns (int) {
        if (n >= 0) return n;
        return -n;
    }
    
    function getStartColor(uint a) internal pure returns (uint256) {
        uint256 xxxxff = a % 96;
        uint256 xxffxx = xxxxff*256;
        uint256 ffxxxx = xxffxx*256;
        uint256 randomColor = xxxxff + xxffxx + ffxxxx;
        return randomColor;
    }

    function getBackgroundColor(uint a) internal pure returns (uint256) {
        uint256 xxxxff = (a % 128) + 128;
        uint256 xxffxx = xxxxff*256;
        uint256 ffxxxx = xxffxx*256;
        uint256 randomColor = xxxxff + xxffxx + ffxxxx;
        return randomColor;
    }
    
    function getScheme(uint a) internal pure returns (uint8) {
        uint index = a % 100;
        uint8 scheme;
        if (index < 22) {
            scheme = 1;
        } else if (index < 41) {
            scheme = 2;
        } else if (index < 58) {
            scheme = 3;
        } else if (index < 72) {
            scheme = 4;
        } else if (index < 84) {
            scheme = 5;
        } else if (index < 93) {
            scheme = 6;
        }else {
            scheme = 7;
        }
        return scheme;
    }

    /* * ** *** ***** ******** ************* ******** ***** *** ** * */

    // The following code generates art.

    function draw(uint id) public view returns (string memory) {
        uint a = uint((keccak256(abi.encodePacked(idToSeed[id]))));
        bytes memory output = new bytes(USIZE * (USIZE + 3) + 30);
        uint c;
        for (c = 0; c < 30; c++) {
            output[c] = prefix[c];
        }
        int x = 0;
        int y = 0;
        uint v = 0;
        uint value = 0;
        uint mod = (a % 11) + 10;
        bytes10 symbols;
        if (idToSymbolScheme[id] == 0) {
            revert();
        } else if (idToSymbolScheme[id] == 1) {
            symbols = 0x3030302E2E2E2E2E2E2E; // ░
        } else if (idToSymbolScheme[id] == 2) { 
            symbols = 0x303130312E2E2E2E2E2E; // ░▒
        } else if (idToSymbolScheme[id] == 3) {
            symbols = 0x323332332E2E2E2E2E2E; // ■┼
        } else if (idToSymbolScheme[id] == 4) {
            symbols = 0x303134302E2E2E2E2E2E; // ░▒▓
        } else if (idToSymbolScheme[id] == 5) {
            symbols = 0x3035362E2E2E2E2E2E2E; // ░▄▀
        } else if (idToSymbolScheme[id] == 6) {
            symbols = 0x313731332E2E2E2E2E2E; // ▒┼≡
        } else {
            symbols = 0x30313233342E2E2E2E2E; // ░▒■┼▓
        }
        for (int i = int(0); i < SIZE; i++) {
            y = (2 * (i - HALF_SIZE) + 1);
            if (a % 3 == 1) {
                y = -y;
            } else if (a % 3 == 2) {
                y = abs(y);
            }
            y = y * int(a);
            for (int j = int(0); j < SIZE; j++) {
                x = (2 * (j - HALF_SIZE) + 1);
                if (a % 2 == 1) {
                    x = abs(x);
                }
                x = x * int(a);
                v = uint(x * y / ONE) % mod;
                if (v < 10) {
                    value = uint(uint8(symbols[v]));
                } else {
                    value = 0x2E;
                }
                output[c] = byte(bytes32(value << 248));
                c++;
            }
            output[c] = byte(0x25);
            c++;
            output[c] = byte(0x30);
            c++;
            output[c] = byte(0x41);
            c++;
        }
        string memory result = string(output);
        return result;
    }

    /* * ** *** ***** ******** ************* ******** ***** *** ** * */
    
    function creator(uint _id) external view returns (address) {
        return idToCreator[_id];
    }

    function symbolScheme(uint _id) external view returns (uint8) {
        return idToSymbolScheme[_id];
    }

    function backgroundScheme(uint _id) external view returns (uint256) {
        return idToBackgroundColor[_id];
    }

    function colorScheme(uint _id) external view returns (uint256 color0, uint256 color1, uint color2, uint color3, uint color4, uint color5, uint color6, uint color7) {
        color0 = idToColorScheme[_id][0];
        color1 = idToColorScheme[_id][1];
        color2 = idToColorScheme[_id][2];
        color3 = idToColorScheme[_id][3];
        color4 = idToColorScheme[_id][4];
        color5 = idToColorScheme[_id][5];
        color6 = idToColorScheme[_id][6];
        color7 = idToColorScheme[_id][7];
    }
    
    function updateProcessingCode(string memory newProcessingCode, uint256 version) public {
        processingCode[version] = newProcessingCode;
    }
    
    function showProcessingCode(uint version) external view returns (string memory) {
        return processingCode[version];
    }

    //////////////////////////
    //// ERC 721 and 165  ////
    //////////////////////////

    /**
     * @dev Returns whether the target address is a contract.
     * @param _addr Address to check.
     */
    function isContract(address _addr) internal view returns (bool addressCheck) {
        uint256 size;
        assembly { size := extcodesize(_addr) } // solhint-disable-line
        addressCheck = size > 0;
    }

    /**
     * @dev Function to check which interfaces are suported by this contract.
     * @param _interfaceID Id of the interface.
     * @return True if _interfaceID is supported, false otherwise.
     */
    function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
        return supportedInterfaces[_interfaceID];
    }

    /**
     * @dev Transfers the ownership of an NFT from one address to another address. This function can
     * be changed to payable.
     * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
     * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
     * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
     * function checks if `_to` is a smart contract (code size > 0). If so, it calls
     * `onERC721Received` on `_to` and throws if the return value is not
     * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
     * @param _from The current owner of the NFT.
     * @param _to The new owner.
     * @param _tokenId The NFT to transfer.
     * @param _data Additional data with no specified format, sent in call to `_to`.
     */
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata _data) external {
        _safeTransferFrom(_from, _to, _tokenId, _data);
    }

    /**
     * @dev Transfers the ownership of an NFT from one address to another address. This function can
     * be changed to payable.
     * @notice This works identically to the other function with an extra data parameter, except this
     * function just sets data to ""
     * @param _from The current owner of the NFT.
     * @param _to The new owner.
     * @param _tokenId The NFT to transfer.
     */
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
     * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
     * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
     * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
     * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
     * they maybe be permanently lost.
     * @param _from The current owner of the NFT.
     * @param _to The new owner.
     * @param _tokenId The NFT to transfer.
     */
    function transferFrom(address _from, address _to, uint256 _tokenId) external canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from);
        require(_to != address(0));
        _transfer(_to, _tokenId);
    }

    /**
     * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
     * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
     * the current NFT owner, or an authorized operator of the current owner.
     * @param _approved Address to be approved for the given NFT ID.
     * @param _tokenId ID of the token to be approved.
     */
    function approve(address _approved, uint256 _tokenId) external canOperate(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(_approved != tokenOwner);
        idToApproval[_tokenId] = _approved;
        emit Approval(tokenOwner, _approved, _tokenId);
    }

    /**
     * @dev Enables or disables approval for a third party ("operator") to manage all of
     * `msg.sender`'s assets. It also emits the ApprovalForAll event.
     * @notice This works even if sender doesn't own any tokens at the time.
     * @param _operator Address to add to the set of authorized operators.
     * @param _approved True if the operators is approved, false to revoke approval.
     */
    function setApprovalForAll(address _operator, bool _approved) external {
        ownerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /**
     * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
     * considered invalid, and this function throws for queries about the zero address.
     * @param _owner Address for whom to query the balance.
     * @return Balance of _owner.
     */
    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0));
        return _getOwnerNFTCount(_owner);
    }

    /**
     * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
     * invalid, and queries about them do throw.
     */
    function ownerOf(uint256 _tokenId) public view returns (address _owner) {
        _owner = idToOwner[_tokenId];
        require(_owner != address(0));
    }

    /**
     * @dev Get the approved address for a single NFT.
     * @notice Throws if `_tokenId` is not a valid NFT.
     * @param _tokenId ID of the NFT to query the approval of.
     * @return Address that _tokenId is approved for.
     */
    function getApproved(uint256 _tokenId) external view validNFToken(_tokenId) returns (address) {
        return idToApproval[_tokenId];
    }

    /**
     * @dev Checks if `_operator` is an approved operator for `_owner`.
     * @param _owner The address that owns the NFTs.
     * @param _operator The address that acts on behalf of the owner.
     * @return True if approved for all, false otherwise.
     */
    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        return ownerToOperators[_owner][_operator];
    }

    /**
     * @dev Actually preforms the transfer.
     * @notice Does NO checks.
     * @param _to Address of a new owner.
     * @param _tokenId The NFT that is being transferred.
     */
    function _transfer(address _to, uint256 _tokenId) internal {
        address from = idToOwner[_tokenId];
        _clearApproval(_tokenId);

        _removeNFToken(from, _tokenId);
        _addNFToken(_to, _tokenId);

        emit Transfer(from, _to, _tokenId);
}


    function createPiece(uint seed) external payable {
        return _mint(msg.sender, seed);
    }


    /**
     * @dev Mints a new NFT.
     * @notice This is an internal function which should be called from user-implemented external
     * mint function. Its purpose is to show and properly initialize data structures when using this
     * implementation.
     * @param _to The address that will own the minted NFT.
     */
    function _mint(address _to, uint seed) internal {
        require(_to != address(0));
        require(numTokens < TOKEN_LIMIT);
        uint amount = 0;
        if (numTokens >= ARTIST_PRINTS) {
            amount = PRICE;
            require(msg.value >= amount);
        }
        require(seedToId[seed] == 0);
        uint id = numTokens + 1;

        idToCreator[id] = _to;
        idToSeed[id] = seed;
        seedToId[seed] = id;
        uint a = uint((keccak256(abi.encodePacked(seed,id))));
        idToBackgroundColor[id] = getBackgroundColor(a);
        idToSymbolScheme[id] = getScheme(a);
        uint randomColor;
        
        for (uint i = 0; i<8; i = i+1) {
            randomColor = getStartColor(uint(keccak256(abi.encodePacked(a,id,i))));
            idToColorScheme[id][i] = randomColor;
        }

        numTokens = numTokens + 1;
        _addNFToken(_to, id);

        if (msg.value > amount) {
            msg.sender.transfer(msg.value - amount);
        }
        if (amount > 0) {
            BENEFICIARY.transfer(address(this).balance);
        }

        emit Transfer(address(0), _to, id);
        
        feelingLuckyColor(id);
    }

    function createWithV1(uint seed, uint v1GlyphID) external {
        require(v1GlyphID < 103);
        require(address(uint160(paintglyphsV1.ownerOf(v1GlyphID))) == msg.sender);
        
        paintglyphsV1.transferFrom(msg.sender,address(this),v1GlyphID);
        
        return _mintWithV1(msg.sender, seed, v1GlyphID);
    }
    
    function _mintWithV1(address _to, uint seed, uint v1GlyphID) internal {
        require(_to != address(0));
        require(numTokens <= TOKEN_LIMIT);
        
        require(seedToId[seed] == 0);

        uint id = v1GlyphID;
        
        idToCreator[id] = _to;
        idToSeed[id] = seed;
        seedToId[seed] = id;
        uint a = uint((keccak256(abi.encodePacked(seed,id))));
        idToBackgroundColor[id] = getBackgroundColor(a);
        idToSymbolScheme[id] = getScheme(a);
        uint randomColor;
        
        for (uint i = 0; i<8; i = i+1) {
            randomColor = getStartColor(uint(keccak256(abi.encodePacked(a,id,i))));
            idToColorScheme[id][i] = randomColor;
        }

        _addNFToken(_to, id);

        emit Transfer(address(0), _to, id);
        
        feelingLuckyColor(id);
    }
    
    function updateColor(uint id, uint symbolToUpdate, uint newColor) public {
        require(msg.sender == ownerOf(id));
        require(newColor < 16777216);
        require(checkValidSymbol(id,symbolToUpdate) == true);
        
        idToColorScheme[id][symbolToUpdate] = newColor;
        emit ColorChanged(id, symbolToUpdate, newColor);
    }
    
    function feelingLuckyColor(uint id) public {
        require(msg.sender == ownerOf(id));
        
        uint256 symbolToUpdate;
        uint256 seed = uint(keccak256(abi.encodePacked(id,block.number)));
        
        if (idToSymbolScheme[id] == 1) { //if scheme 1, then update symbol 0
            symbolToUpdate == 0;
            }
        else if (idToSymbolScheme[id] == 2) { //if scheme 2, then update symbol 0 or 1
            symbolToUpdate = seed % 2;
        }
        else if (idToSymbolScheme[id] == 3) { //if scheme 3, then update symbol 2 or 3
            symbolToUpdate = (seed % 2) + 2;
        }
        else if (idToSymbolScheme[id] == 4) { //if scheme 4, then update symbol 0, 1, or 4
            symbolToUpdate = (seed % 3);
            if (symbolToUpdate == 2) {
                symbolToUpdate = 4;
            }
        }
        else if (idToSymbolScheme[id] == 5) { //if scheme 5, then update symbol 0, 5, or 6
            symbolToUpdate = (seed % 3);
            if (symbolToUpdate == 1) {
                symbolToUpdate = 5;
            }
            else if (symbolToUpdate == 2) {
                symbolToUpdate = 6;
            }
        }
        else if (idToSymbolScheme[id] == 6) { //if scheme 6, then update symbol 1, 3, or 7
            symbolToUpdate = (seed % 3);
            if (symbolToUpdate == 0) {
                symbolToUpdate = 3;
            }
            else if (symbolToUpdate == 2) {
                symbolToUpdate = 7;
            }
        }
        else {
            symbolToUpdate = seed % 5; // if scheme 7, then update symbol 0, 1, 2, 3, or 4
        }        
        
        uint256 newColor = seed % 16777216;
        
        idToColorScheme[id][symbolToUpdate] = newColor;
        emit ColorChanged(id, symbolToUpdate, newColor);
    }
    
    function checkValidSymbol(uint id, uint symbolToCheck) public view returns (bool isValid){
        if (idToSymbolScheme[id] == 1) {
            if (symbolToCheck == 0) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 2) {
            if (symbolToCheck == 0 || symbolToCheck == 1) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 3) {
            if (symbolToCheck == 2 || symbolToCheck == 3) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 4) {
            if (symbolToCheck == 0 || symbolToCheck == 1 || symbolToCheck == 4) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 5) {
            if (symbolToCheck == 0 || symbolToCheck == 5 || symbolToCheck == 6) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 6) {
            if (symbolToCheck == 1 || symbolToCheck == 3 || symbolToCheck == 7) {
                isValid = true;
            }
        } 
        else {
            if (symbolToCheck == 0 || symbolToCheck == 1 || symbolToCheck == 2 || symbolToCheck == 3 || symbolToCheck == 4) {
                isValid = true;
            }
        } 
    }

    /**
     * @dev Assigns a new NFT to an address.
     * @notice Use and override this function with caution. Wrong usage can have serious consequences.
     * @param _to Address to which we want to add the NFT.
     * @param _tokenId Which NFT we want to add.
     */
    function _addNFToken(address _to, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == address(0));
        idToOwner[_tokenId] = _to;

        uint256 length = ownerToIds[_to].push(_tokenId);
        idToOwnerIndex[_tokenId] = length - 1;
    }

    /**
     * @dev Removes a NFT from an address.
     * @notice Use and override this function with caution. Wrong usage can have serious consequences.
     * @param _from Address from wich we want to remove the NFT.
     * @param _tokenId Which NFT we want to remove.
     */
    function _removeNFToken(address _from, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == _from);
        delete idToOwner[_tokenId];

        uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
        uint256 lastTokenIndex = ownerToIds[_from].length - 1;

        if (lastTokenIndex != tokenToRemoveIndex) {
            uint256 lastToken = ownerToIds[_from][lastTokenIndex];
            ownerToIds[_from][tokenToRemoveIndex] = lastToken;
            idToOwnerIndex[lastToken] = tokenToRemoveIndex;
        }

        ownerToIds[_from].length--;
    }

    /**
     * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
     * extension to remove double storage (gas optimization) of owner nft count.
     * @param _owner Address for whom to query the count.
     * @return Number of _owner NFTs.
     */
    function _getOwnerNFTCount(address _owner) internal view returns (uint256) {
        return ownerToIds[_owner].length;
    }

    /**
     * @dev Actually perform the safeTransferFrom.
     * @param _from The current owner of the NFT.
     * @param _to The new owner.
     * @param _tokenId The NFT to transfer.
     * @param _data Additional data with no specified format, sent in call to `_to`.
     */
    function _safeTransferFrom(address _from,  address _to,  uint256 _tokenId,  bytes memory _data) private canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from);
        require(_to != address(0));

        _transfer(_to, _tokenId);

        if (isContract(_to)) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    /**
     * @dev Clears the current approval of a given NFT ID.
     * @param _tokenId ID of the NFT to be transferred.
     */
    function _clearApproval(uint256 _tokenId) private {
        if (idToApproval[_tokenId] != address(0)) {
            delete idToApproval[_tokenId];
        }
    }

    //// Enumerable

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

    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < numTokens);
        return index;
    }

    /**
     * @dev returns the n-th NFT ID from a list of owner's tokens.
     * @param _owner Token owner's address.
     * @param _index Index number representing n-th token in owner's list of tokens.
     * @return Token id.
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        require(_index < ownerToIds[_owner].length);
        return ownerToIds[_owner][_index];
    }

    //// Metadata

    /**
      * @dev Returns a descriptive name for a collection of NFTokens.
      */
    function name() external view returns (string memory _name) {
        _name = nftName;
    }

    /**
     * @dev Returns an abbreviated name for NFTokens.
     */
    function symbol() external view returns (string memory _symbol) {
        _symbol = nftSymbol;
    }

    /**
     * @dev A distinct URI (RFC 3986) for a given NFT.
     */
    function tokenURI(uint256 id) external view returns (string memory) {
        return string(abi.encodePacked(URI, integerToString(uint256(id))));
    }
    
    function setURI(string memory newURI) public isOwner {
        URI = newURI;
    }

    function integerToString(uint _i) internal pure returns (string memory) {
      if (_i == 0) {
         return "0";
      }
      uint j = _i;
      uint len;
      
      while (j != 0) {
         len++;
         j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;
      
      while (_i != 0) {
         bstr[k--] = byte(uint8(48 + _i % 10));
         _i /= 10;
      }
      return string(bstr);
   }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"symbolToUpdate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newColor","type":"uint256"}],"name":"ColorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"a","type":"address"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"Generated","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"},{"constant":true,"inputs":[],"name":"ARTIST_PRINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BENEFICIARY","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allSymbols","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"backgroundScheme","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"symbolToCheck","type":"uint256"}],"name":"checkValidSymbol","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"colorScheme","outputs":[{"internalType":"uint256","name":"color0","type":"uint256"},{"internalType":"uint256","name":"color1","type":"uint256"},{"internalType":"uint256","name":"color2","type":"uint256"},{"internalType":"uint256","name":"color3","type":"uint256"},{"internalType":"uint256","name":"color4","type":"uint256"},{"internalType":"uint256","name":"color5","type":"uint256"},{"internalType":"uint256","name":"color6","type":"uint256"},{"internalType":"uint256","name":"color7","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"createPiece","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"v1GlyphID","type":"uint256"}],"name":"createWithV1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"draw","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"feelingLuckyColor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paintglyphsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"name":"showProcessingCode","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"symbolScheme","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"symbolToUpdate","type":"uint256"},{"internalType":"uint256","name":"newColor","type":"uint256"}],"name":"updateColor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newProcessingCode","type":"string"},{"internalType":"uint256","name":"version","type":"uint256"}],"name":"updateProcessingCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6066600d5560c0604052601e60808190527f646174613a746578742f706c61696e3b636861727365743d7574662d382c000060a0908152620000459160109190620002a9565b5060408051808201909152600e8082526d2830b4b73a33b63cb83439902b1960911b60209092019182526200007d91601191620002a9565b506040805180820190915260058082526438714c5a9960d91b6020909201918252620000ac91601291620002a9565b50601380546001600160a01b031916732e8b45d550e4bb8c7986ee98879c1740519e0a1a17905560408051608081019091526046808252620029db602083013980516200010291601491602090910190620002a9565b503480156200011057600080fd5b50600560209081527fc01909ce2b517f8cd3a46ae0cfde9179f9b675cf633d3d84c8226585cc73c1568054600160ff1991821681179092557f072ad3113145b5af48d301e3b9fc3bd1c97c3f26a14f5d44904b71469875631e80548216831790557f32dafcc0428d2ef4307d6da1e032ab9698665546cb7ff0633ca92092b13651e18054821683179055635b5e139f60e01b6000527f3b767bd59d7164fff7ec5b80ca1165d9d6e12ee8656896fac4159b0760bfd9f780549091169091179055601354601580546001600160a01b039092166001600160a01b0319928316179055600e80543392169190911790556040805160608101909152603b8082526200022a9262002a21908301396001600160e01b036200023016565b6200034e565b600e546001600160a01b0316331462000290576040805162461bcd60e51b815260206004820152601c60248201527f4d757374206265206465706c6f796572206f6620636f6e747261637400000000604482015290519081900360640190fd5b8051620002a590600f906020840190620002a9565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ec57805160ff19168380011785556200031c565b828001600101855582156200031c579182015b828111156200031c578251825591602001919060010190620002ff565b506200032a9291506200032e565b5090565b6200034b91905b808211156200032a576000815560010162000335565b90565b61267d806200035e6000396000f3fe60806040526004361061020f5760003560e01c8063510b515811610118578063a22cb465116100a0578063c3e7d1231161006f578063c3e7d1231461096f578063c87b56dd1461099f578063d54b3779146109c9578063e985e9c5146109f3578063ea86395f14610a2e5761020f565b8063a22cb46514610804578063a87b0f911461083f578063b88d4fde146108aa578063c3cda50f146109455761020f565b806388214ee5116100e757806388214ee5146106e85780638d859f3e146107125780638da5cb5b1461072757806395d89b411461073c5780639c6da3ce146107515761020f565b8063510b51581461062b5780636352211e146106555780636edb093d1461067f57806370a08231146106b55761020f565b806323b872dd1161019b578063397490641161016a57806339749064146105245780633b304147146105645780634106dffb1461058e57806342842e0e146105be5780634f6ccce7146106015761020f565b806323b872dd1461047e5780632b025c59146104c15780632f745c59146104d65780632f99c6cc1461050f5761020f565b8063081812fc116101e2578063081812fc146103c0578063095ea7b31461040657806316ad94781461043f578063180f0afd1461045457806318160ddd146104695761020f565b806301ffc9a71461021457806302fe53051461025c578063031bd4c41461030f57806306fdde0314610336575b600080fd5b34801561022057600080fd5b506102486004803603602081101561023757600080fd5b50356001600160e01b031916610a4b565b604080519115158252519081900360200190f35b34801561026857600080fd5b5061030d6004803603602081101561027f57600080fd5b810190602081018135600160201b81111561029957600080fd5b8201836020820111156102ab57600080fd5b803590602001918460018302840111600160201b831117156102cc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a6e945050505050565b005b34801561031b57600080fd5b50610324610ae4565b60408051918252519081900360200190f35b34801561034257600080fd5b5061034b610aea565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038557818101518382015260200161036d565b50505050905090810190601f1680156103b25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103cc57600080fd5b506103ea600480360360208110156103e357600080fd5b5035610b80565b604080516001600160a01b039092168252519081900360200190f35b34801561041257600080fd5b5061030d6004803603604081101561042957600080fd5b506001600160a01b038135169060200135610bc0565b34801561044b57600080fd5b506103ea610cbf565b34801561046057600080fd5b50610324610cce565b34801561047557600080fd5b50610324610cd3565b34801561048a57600080fd5b5061030d600480360360608110156104a157600080fd5b506001600160a01b03813581169160208101359091169060400135610cda565b3480156104cd57600080fd5b5061034b610dc0565b3480156104e257600080fd5b50610324600480360360408110156104f957600080fd5b506001600160a01b038135169060200135610e4e565b34801561051b57600080fd5b506103ea610eaa565b34801561053057600080fd5b5061054e6004803603602081101561054757600080fd5b5035610ec2565b6040805160ff9092168252519081900360200190f35b34801561057057600080fd5b5061034b6004803603602081101561058757600080fd5b5035610ed7565b34801561059a57600080fd5b5061030d600480360360408110156105b157600080fd5b5080359060200135611299565b3480156105ca57600080fd5b5061030d600480360360608110156105e157600080fd5b506001600160a01b038135811691602081013590911690604001356113ac565b34801561060d57600080fd5b506103246004803603602081101561062457600080fd5b50356113cc565b34801561063757600080fd5b506103ea6004803603602081101561064e57600080fd5b50356113e0565b34801561066157600080fd5b506103ea6004803603602081101561067857600080fd5b50356113fb565b34801561068b57600080fd5b5061030d600480360360608110156106a257600080fd5b508035906020810135906040013561141d565b3480156106c157600080fd5b50610324600480360360208110156106d857600080fd5b50356001600160a01b03166114cd565b3480156106f457600080fd5b5061034b6004803603602081101561070b57600080fd5b50356114eb565b34801561071e57600080fd5b5061032461158c565b34801561073357600080fd5b506103ea611598565b34801561074857600080fd5b5061034b6115a7565b34801561075d57600080fd5b5061030d6004803603604081101561077457600080fd5b810190602081018135600160201b81111561078e57600080fd5b8201836020820111156107a057600080fd5b803590602001918460018302840111600160201b831117156107c157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611608915050565b34801561081057600080fd5b5061030d6004803603604081101561082757600080fd5b506001600160a01b0381351690602001351515611627565b34801561084b57600080fd5b506108696004803603602081101561086257600080fd5b5035611695565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108b657600080fd5b5061030d600480360360808110156108cd57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561090757600080fd5b82018360208201111561091957600080fd5b803590602001918460018302840111600160201b8311171561093a57600080fd5b5090925090506116da565b34801561095157600080fd5b5061030d6004803603602081101561096857600080fd5b5035611723565b34801561097b57600080fd5b506102486004803603604081101561099257600080fd5b5080359060200135611909565b3480156109ab57600080fd5b5061034b600480360360208110156109c257600080fd5b5035611a92565b3480156109d557600080fd5b50610324600480360360208110156109ec57600080fd5b5035611b65565b3480156109ff57600080fd5b5061024860048036036040811015610a1657600080fd5b506001600160a01b0381358116916020013516611b77565b61030d60048036036020811015610a4457600080fd5b5035611ba5565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b600e546001600160a01b03163314610acd576040805162461bcd60e51b815260206004820152601c60248201527f4d757374206265206465706c6f796572206f6620636f6e747261637400000000604482015290519081900360640190fd5b8051610ae090600f906020840190612594565b5050565b61020081565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b5050505050905090565b60008181526006602052604081205482906001600160a01b0316610ba357600080fd5b50506000908152600960205260409020546001600160a01b031690565b60008181526006602052604090205481906001600160a01b031633811480610c0b57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b610c1457600080fd5b60008381526006602052604090205483906001600160a01b0316610c3757600080fd5b6000848152600660205260409020546001600160a01b03908116908616811415610c6057600080fd5b60008581526009602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b6013546001600160a01b031681565b600081565b600d545b90565b60008181526006602052604090205481906001600160a01b031633811480610d1857506000828152600960205260409020546001600160a01b031633145b80610d4657506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b610d4f57600080fd5b60008381526006602052604090205483906001600160a01b0316610d7257600080fd5b6000848152600660205260409020546001600160a01b039081169087168114610d9a57600080fd5b6001600160a01b038616610dad57600080fd5b610db78686611bb2565b50505050505050565b6014805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b505050505081565b6001600160a01b0382166000908152600b60205260408120548210610e7257600080fd5b6001600160a01b0383166000908152600b60205260409020805483908110610e9657fe5b906000526020600020015490505b92915050565b738c9eeecaeb226f1b8c1385abe0960754e08ec28581565b60009081526001602052604090205460ff1690565b600081815260076020908152604091829020548251808301919091528251808203830181528184018085528151919093012061047e8084526104e090920190935260609291839160208201818038833901905050905060005b601e811015610fab57601081815460018160011615610100020316600290048110610f5757fe5b815460011615610f765790600052602060002090602091828204019190065b9054901a600160f81b02828281518110610f8c57fe5b60200101906001600160f81b031916908160001a905350600101610f30565b600085815260016020526040812054819081908190600a600b89060190829060ff16610fd657600080fd5b60008b81526001602081905260409091205460ff1614156110055750691818181717171717171760b11b6110fb565b60008b81526001602052604090205460ff16600214156110335750691818981897171717171760b11b6110fb565b60008b81526001602052604090205460ff16600314156110615750691919991997171717171760b11b6110fb565b60008b81526001602052604090205460ff166004141561108f57506918189a1817171717171760b11b6110fb565b60008b81526001602052604090205460ff16600514156110bd575069181a9b1717171717171760b11b6110fb565b60008b81526001602052604090205460ff16600614156110eb575069189b989997171717171760b11b6110fb565b5069181899199a171717171760b11b5b60005b6020811215611289576001600f19820160020201955060038a066001141561112b57856000039550611143565b60038a06600214156111435761114086611c2d565b95505b9489029460005b60208112156111f25760026020058103600202600101975060028b8161116c57fe5b06600114156111815761117e88611c2d565b97505b968a029683600160201b888a02058161119657fe5b069550600a8610156111b6578286600a81106111ae57fe5b1a94506111bb565b602e94505b60f885901b60001b8a8a815181106111cf57fe5b60200101906001600160f81b031916908160001a9053506001988901980161114a565b50602560f81b89898151811061120457fe5b60200101906001600160f81b031916908160001a9053508851600190980197600360fc1b908a908a90811061123557fe5b60200101906001600160f81b031916908160001a9053508851600190980197604160f81b908a908a90811061126657fe5b60200101906001600160f81b031916908160001a905350600197880197016110fe565b50969a9950505050505050505050565b606781106112a657600080fd5b601554604080516331a9108f60e11b815260048101849052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b1580156112f157600080fd5b505afa158015611305573d6000803e3d6000fd5b505050506040513d602081101561131b57600080fd5b50516001600160a01b03161461133057600080fd5b601554604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b15801561138957600080fd5b505af115801561139d573d6000803e3d6000fd5b50505050610ae0338383611c44565b6113c783838360405180602001604052806000815250611dea565b505050565b6000600d5482106113dc57600080fd5b5090565b6000908152602081905260409020546001600160a01b031690565b6000818152600660205260409020546001600160a01b031680610a6957600080fd5b611426836113fb565b6001600160a01b0316336001600160a01b03161461144357600080fd5b6301000000811061145357600080fd5b61145d8383611909565b151560011461146b57600080fd5b60008381526003602052604090208190836008811061148657fe5b0155604080518481526020810184905280820183905290517fe4384a54d93bde17f0f7edd5f7fe637b041a848a60262f9a1bf36c4747e36c199181900360600190a1505050565b60006001600160a01b0382166114e257600080fd5b610ea482611ff5565b60008181526004602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156115805780601f1061155557610100808354040283529160200191611580565b820191906000526020600020905b81548152906001019060200180831161156357829003601f168201915b50505050509050919050565b6702c68af0bb14000081565b600e546001600160a01b031681565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b765780601f10610b4b57610100808354040283529160200191610b76565b600081815260046020908152604090912083516113c792850190612594565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526003602081905260409091208054600182015460028301549383015460048401546005850154600686015460079096015494979396959294919390929190565b61171c85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611dea92505050565b5050505050565b61172c816113fb565b6001600160a01b0316336001600160a01b03161461174957600080fd5b604080516020808201849052438284015282518083038401815260609092018352815191810191909120600084815260019283905292832054909160ff90911614156117945761189f565b60008381526001602052604090205460ff16600214156117b95760028106915061189f565b60008381526001602052604090205460ff16600314156117e15760028106600201915061189f565b60008381526001602052604090205460ff166004141561181457600381069150816002141561180f57600491505b61189f565b60008381526001602052604090205460ff1660051415611858576003810691508160011415611846576005915061180f565b816002141561180f576006915061189f565b60008381526001602052604090205460ff16600614156118985760038106915081611886576003915061180f565b816002141561180f576007915061189f565b6005810691505b600083815260036020526040902062ffffff821690819084600881106118c157fe5b0155604080518581526020810185905280820183905290517fe4384a54d93bde17f0f7edd5f7fe637b041a848a60262f9a1bf36c4747e36c199181900360600190a150505050565b600082815260016020819052604082205460ff161415611931578161192c575060015b610ea4565b60008381526001602052604090205460ff1660021415611965578115806119585750816001145b1561192c57506001610ea4565b60008381526001602052604090205460ff166003141561199a5781600214806119585750816003141561192c57506001610ea4565b60008381526001602052604090205460ff16600414156119d8578115806119c15750816001145b806119585750816004141561192c57506001610ea4565b60008381526001602052604090205460ff1660051415611a16578115806119ff5750816005145b806119585750816006141561192c57506001610ea4565b60008381526001602052604090205460ff1660061415611a56578160011480611a3f5750816003145b806119585750816007141561192c57506001610ea4565b811580611a635750816001145b80611a6e5750816002145b80611a795750816003145b80611a845750816004145b15610ea45750600192915050565b6060600f611a9f83612010565b6040516020018083805460018160011615610100020316600290048015611afd5780601f10611adb576101008083540402835291820191611afd565b820191906000526020600020905b815481529060010190602001808311611ae9575b5050825160208401908083835b60208310611b295780518252601f199092019160209182019101611b0a565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b60009081526002602052604090205490565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b611baf33826120d1565b50565b6000818152600660205260409020546001600160a01b0316611bd382612311565b611bdd818361234c565b611be78383612464565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808212611c3d575080610a69565b5060000390565b6001600160a01b038316611c5757600080fd5b610200600d541115611c6857600080fd5b60008281526008602052604090205415611c8157600080fd5b60008181526020818152604080832080546001600160a01b0319166001600160a01b0388161790556007825280832085905584835260088252918290208390558151808201859052808301849052825180820384018152606090910190925281519101208190611cf0816124df565b600083815260026020526040902055611d08816124fe565b6000838152600160205260408120805460ff191660ff9390931692909217909155805b6008811015611d965760408051602080820186905281830187905260608083018590528351808403909101815260809092019092528051910120611d6e90612576565b600085815260036020526040902090925082908260088110611d8c57fe5b0155600101611d2b565b50611da18684612464565b60405183906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611de283611723565b505050505050565b60008281526006602052604090205482906001600160a01b031633811480611e2857506000828152600960205260409020546001600160a01b031633145b80611e5657506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b611e5f57600080fd5b60008481526006602052604090205484906001600160a01b0316611e8257600080fd5b6000858152600660205260409020546001600160a01b039081169088168114611eaa57600080fd5b6001600160a01b038716611ebd57600080fd5b611ec78787611bb2565b611ed08761258e565b15611feb57604051630a85bd0160e11b815233600482018181526001600160a01b038b81166024850152604484018a9052608060648501908152895160848601528951600095928d169463150b7a029490938f938e938e939260a4019060208501908083838e5b83811015611f4f578181015183820152602001611f37565b50505050905090810190601f168015611f7c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b505050506040513d6020811015611fc857600080fd5b505190506001600160e01b03198116630a85bd0160e11b14611fe957600080fd5b505b5050505050505050565b6001600160a01b03166000908152600b602052604090205490565b60608161203557506040805180820190915260018152600360fc1b6020820152610a69565b8160005b811561204d57600101600a82049150612039565b6060816040519080825280601f01601f19166020018201604052801561207a576020820181803883390190505b50905060001982015b85156120c857600a860660300160f81b828280600190039350815181106120a657fe5b60200101906001600160f81b031916908160001a905350600a86049550612083565b50949350505050565b6001600160a01b0382166120e457600080fd5b610200600d54106120f457600080fd5b6702c68af0bb1400003481111561210a57600080fd5b6000828152600860205260409020541561212357600080fd5b600d5460010160008181526020818152604080832080546001600160a01b0319166001600160a01b038916179055600782528083208690558583526008825291829020839055815180820186905280830184905282518082038401815260609091019092528151910120612196816124df565b6000838152600260205260409020556121ae816124fe565b6000838152600160205260408120805460ff191660ff9390931692909217909155805b600881101561223c576040805160208082018690528183018790526060808301859052835180840390910181526080909201909252805191012061221490612576565b60008581526003602052604090209092508290826008811061223257fe5b01556001016121d1565b50600d805460010190556122508684612464565b833411156122895760405133903486900380156108fc02916000818181858888f19350505050158015612287573d6000803e3d6000fd5b505b8315611da157604051738c9eeecaeb226f1b8c1385abe0960754e08ec285904780156108fc02916000818181858888f193505050501580156122cf573d6000803e3d6000fd5b5060405183906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611de283611723565b6000818152600960205260409020546001600160a01b031615611baf57600090815260096020526040902080546001600160a01b0319169055565b6000818152600660205260409020546001600160a01b0383811691161461237257600080fd5b600081815260066020908152604080832080546001600160a01b0319169055600c8252808320546001600160a01b0386168452600b909252909120546000190180821461243b576001600160a01b0384166000908152600b602052604081208054839081106123dd57fe5b9060005260206000200154905080600b6000876001600160a01b03166001600160a01b03168152602001908152602001600020848154811061241b57fe5b6000918252602080832090910192909255918252600c9052604090208290555b6001600160a01b0384166000908152600b6020526040902080549061171c90600019830161260e565b6000818152600660205260409020546001600160a01b03161561248657600080fd5b600081815260066020908152604080832080546001600160a01b039096166001600160a01b031990961686179055938252600b815283822080546001810182559083528183208101849055928252600c90529190912055565b6101006080607f92909216828101918202016201000091909102010190565b6000606482068160168210156125165750600161256f565b60298210156125275750600261256f565b603a8210156125385750600361256f565b60488210156125495750600461256f565b605482101561255a5750600561256f565b605d82101561256b5750600661256f565b5060075b9392505050565b62010000606090910690810261010082029091010190565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106125d557805160ff1916838001178555612602565b82800160010185558215612602579182015b828111156126025782518255916020019190600101906125e7565b506113dc92915061262e565b8154818355818111156113c7576000838152602090206113c79181019083015b610cd791905b808211156113dc576000815560010161263456fea265627a7a723158208847ca3b51547460fd12b0b4e3a5822043337593ba9395624973f7a1bfb6b1ab64736f6c6343000511003230202d20e296913b2031202d20e296923b2032202d20e296a03b2033202d20e294bc3b2034202d20e296933b2035202d20e296843b2036202d20e296803b2037202d20e289a168747470733a2f2f7061696e74676c7970687356322e617a75726577656273697465732e6e65742f6170692f48747470547269676765723f69643d

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063510b515811610118578063a22cb465116100a0578063c3e7d1231161006f578063c3e7d1231461096f578063c87b56dd1461099f578063d54b3779146109c9578063e985e9c5146109f3578063ea86395f14610a2e5761020f565b8063a22cb46514610804578063a87b0f911461083f578063b88d4fde146108aa578063c3cda50f146109455761020f565b806388214ee5116100e757806388214ee5146106e85780638d859f3e146107125780638da5cb5b1461072757806395d89b411461073c5780639c6da3ce146107515761020f565b8063510b51581461062b5780636352211e146106555780636edb093d1461067f57806370a08231146106b55761020f565b806323b872dd1161019b578063397490641161016a57806339749064146105245780633b304147146105645780634106dffb1461058e57806342842e0e146105be5780634f6ccce7146106015761020f565b806323b872dd1461047e5780632b025c59146104c15780632f745c59146104d65780632f99c6cc1461050f5761020f565b8063081812fc116101e2578063081812fc146103c0578063095ea7b31461040657806316ad94781461043f578063180f0afd1461045457806318160ddd146104695761020f565b806301ffc9a71461021457806302fe53051461025c578063031bd4c41461030f57806306fdde0314610336575b600080fd5b34801561022057600080fd5b506102486004803603602081101561023757600080fd5b50356001600160e01b031916610a4b565b604080519115158252519081900360200190f35b34801561026857600080fd5b5061030d6004803603602081101561027f57600080fd5b810190602081018135600160201b81111561029957600080fd5b8201836020820111156102ab57600080fd5b803590602001918460018302840111600160201b831117156102cc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a6e945050505050565b005b34801561031b57600080fd5b50610324610ae4565b60408051918252519081900360200190f35b34801561034257600080fd5b5061034b610aea565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038557818101518382015260200161036d565b50505050905090810190601f1680156103b25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103cc57600080fd5b506103ea600480360360208110156103e357600080fd5b5035610b80565b604080516001600160a01b039092168252519081900360200190f35b34801561041257600080fd5b5061030d6004803603604081101561042957600080fd5b506001600160a01b038135169060200135610bc0565b34801561044b57600080fd5b506103ea610cbf565b34801561046057600080fd5b50610324610cce565b34801561047557600080fd5b50610324610cd3565b34801561048a57600080fd5b5061030d600480360360608110156104a157600080fd5b506001600160a01b03813581169160208101359091169060400135610cda565b3480156104cd57600080fd5b5061034b610dc0565b3480156104e257600080fd5b50610324600480360360408110156104f957600080fd5b506001600160a01b038135169060200135610e4e565b34801561051b57600080fd5b506103ea610eaa565b34801561053057600080fd5b5061054e6004803603602081101561054757600080fd5b5035610ec2565b6040805160ff9092168252519081900360200190f35b34801561057057600080fd5b5061034b6004803603602081101561058757600080fd5b5035610ed7565b34801561059a57600080fd5b5061030d600480360360408110156105b157600080fd5b5080359060200135611299565b3480156105ca57600080fd5b5061030d600480360360608110156105e157600080fd5b506001600160a01b038135811691602081013590911690604001356113ac565b34801561060d57600080fd5b506103246004803603602081101561062457600080fd5b50356113cc565b34801561063757600080fd5b506103ea6004803603602081101561064e57600080fd5b50356113e0565b34801561066157600080fd5b506103ea6004803603602081101561067857600080fd5b50356113fb565b34801561068b57600080fd5b5061030d600480360360608110156106a257600080fd5b508035906020810135906040013561141d565b3480156106c157600080fd5b50610324600480360360208110156106d857600080fd5b50356001600160a01b03166114cd565b3480156106f457600080fd5b5061034b6004803603602081101561070b57600080fd5b50356114eb565b34801561071e57600080fd5b5061032461158c565b34801561073357600080fd5b506103ea611598565b34801561074857600080fd5b5061034b6115a7565b34801561075d57600080fd5b5061030d6004803603604081101561077457600080fd5b810190602081018135600160201b81111561078e57600080fd5b8201836020820111156107a057600080fd5b803590602001918460018302840111600160201b831117156107c157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611608915050565b34801561081057600080fd5b5061030d6004803603604081101561082757600080fd5b506001600160a01b0381351690602001351515611627565b34801561084b57600080fd5b506108696004803603602081101561086257600080fd5b5035611695565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108b657600080fd5b5061030d600480360360808110156108cd57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561090757600080fd5b82018360208201111561091957600080fd5b803590602001918460018302840111600160201b8311171561093a57600080fd5b5090925090506116da565b34801561095157600080fd5b5061030d6004803603602081101561096857600080fd5b5035611723565b34801561097b57600080fd5b506102486004803603604081101561099257600080fd5b5080359060200135611909565b3480156109ab57600080fd5b5061034b600480360360208110156109c257600080fd5b5035611a92565b3480156109d557600080fd5b50610324600480360360208110156109ec57600080fd5b5035611b65565b3480156109ff57600080fd5b5061024860048036036040811015610a1657600080fd5b506001600160a01b0381358116916020013516611b77565b61030d60048036036020811015610a4457600080fd5b5035611ba5565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b600e546001600160a01b03163314610acd576040805162461bcd60e51b815260206004820152601c60248201527f4d757374206265206465706c6f796572206f6620636f6e747261637400000000604482015290519081900360640190fd5b8051610ae090600f906020840190612594565b5050565b61020081565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b5050505050905090565b60008181526006602052604081205482906001600160a01b0316610ba357600080fd5b50506000908152600960205260409020546001600160a01b031690565b60008181526006602052604090205481906001600160a01b031633811480610c0b57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b610c1457600080fd5b60008381526006602052604090205483906001600160a01b0316610c3757600080fd5b6000848152600660205260409020546001600160a01b03908116908616811415610c6057600080fd5b60008581526009602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b6013546001600160a01b031681565b600081565b600d545b90565b60008181526006602052604090205481906001600160a01b031633811480610d1857506000828152600960205260409020546001600160a01b031633145b80610d4657506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b610d4f57600080fd5b60008381526006602052604090205483906001600160a01b0316610d7257600080fd5b6000848152600660205260409020546001600160a01b039081169087168114610d9a57600080fd5b6001600160a01b038616610dad57600080fd5b610db78686611bb2565b50505050505050565b6014805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b505050505081565b6001600160a01b0382166000908152600b60205260408120548210610e7257600080fd5b6001600160a01b0383166000908152600b60205260409020805483908110610e9657fe5b906000526020600020015490505b92915050565b738c9eeecaeb226f1b8c1385abe0960754e08ec28581565b60009081526001602052604090205460ff1690565b600081815260076020908152604091829020548251808301919091528251808203830181528184018085528151919093012061047e8084526104e090920190935260609291839160208201818038833901905050905060005b601e811015610fab57601081815460018160011615610100020316600290048110610f5757fe5b815460011615610f765790600052602060002090602091828204019190065b9054901a600160f81b02828281518110610f8c57fe5b60200101906001600160f81b031916908160001a905350600101610f30565b600085815260016020526040812054819081908190600a600b89060190829060ff16610fd657600080fd5b60008b81526001602081905260409091205460ff1614156110055750691818181717171717171760b11b6110fb565b60008b81526001602052604090205460ff16600214156110335750691818981897171717171760b11b6110fb565b60008b81526001602052604090205460ff16600314156110615750691919991997171717171760b11b6110fb565b60008b81526001602052604090205460ff166004141561108f57506918189a1817171717171760b11b6110fb565b60008b81526001602052604090205460ff16600514156110bd575069181a9b1717171717171760b11b6110fb565b60008b81526001602052604090205460ff16600614156110eb575069189b989997171717171760b11b6110fb565b5069181899199a171717171760b11b5b60005b6020811215611289576001600f19820160020201955060038a066001141561112b57856000039550611143565b60038a06600214156111435761114086611c2d565b95505b9489029460005b60208112156111f25760026020058103600202600101975060028b8161116c57fe5b06600114156111815761117e88611c2d565b97505b968a029683600160201b888a02058161119657fe5b069550600a8610156111b6578286600a81106111ae57fe5b1a94506111bb565b602e94505b60f885901b60001b8a8a815181106111cf57fe5b60200101906001600160f81b031916908160001a9053506001988901980161114a565b50602560f81b89898151811061120457fe5b60200101906001600160f81b031916908160001a9053508851600190980197600360fc1b908a908a90811061123557fe5b60200101906001600160f81b031916908160001a9053508851600190980197604160f81b908a908a90811061126657fe5b60200101906001600160f81b031916908160001a905350600197880197016110fe565b50969a9950505050505050505050565b606781106112a657600080fd5b601554604080516331a9108f60e11b815260048101849052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b1580156112f157600080fd5b505afa158015611305573d6000803e3d6000fd5b505050506040513d602081101561131b57600080fd5b50516001600160a01b03161461133057600080fd5b601554604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b15801561138957600080fd5b505af115801561139d573d6000803e3d6000fd5b50505050610ae0338383611c44565b6113c783838360405180602001604052806000815250611dea565b505050565b6000600d5482106113dc57600080fd5b5090565b6000908152602081905260409020546001600160a01b031690565b6000818152600660205260409020546001600160a01b031680610a6957600080fd5b611426836113fb565b6001600160a01b0316336001600160a01b03161461144357600080fd5b6301000000811061145357600080fd5b61145d8383611909565b151560011461146b57600080fd5b60008381526003602052604090208190836008811061148657fe5b0155604080518481526020810184905280820183905290517fe4384a54d93bde17f0f7edd5f7fe637b041a848a60262f9a1bf36c4747e36c199181900360600190a1505050565b60006001600160a01b0382166114e257600080fd5b610ea482611ff5565b60008181526004602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156115805780601f1061155557610100808354040283529160200191611580565b820191906000526020600020905b81548152906001019060200180831161156357829003601f168201915b50505050509050919050565b6702c68af0bb14000081565b600e546001600160a01b031681565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b765780601f10610b4b57610100808354040283529160200191610b76565b600081815260046020908152604090912083516113c792850190612594565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526003602081905260409091208054600182015460028301549383015460048401546005850154600686015460079096015494979396959294919390929190565b61171c85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611dea92505050565b5050505050565b61172c816113fb565b6001600160a01b0316336001600160a01b03161461174957600080fd5b604080516020808201849052438284015282518083038401815260609092018352815191810191909120600084815260019283905292832054909160ff90911614156117945761189f565b60008381526001602052604090205460ff16600214156117b95760028106915061189f565b60008381526001602052604090205460ff16600314156117e15760028106600201915061189f565b60008381526001602052604090205460ff166004141561181457600381069150816002141561180f57600491505b61189f565b60008381526001602052604090205460ff1660051415611858576003810691508160011415611846576005915061180f565b816002141561180f576006915061189f565b60008381526001602052604090205460ff16600614156118985760038106915081611886576003915061180f565b816002141561180f576007915061189f565b6005810691505b600083815260036020526040902062ffffff821690819084600881106118c157fe5b0155604080518581526020810185905280820183905290517fe4384a54d93bde17f0f7edd5f7fe637b041a848a60262f9a1bf36c4747e36c199181900360600190a150505050565b600082815260016020819052604082205460ff161415611931578161192c575060015b610ea4565b60008381526001602052604090205460ff1660021415611965578115806119585750816001145b1561192c57506001610ea4565b60008381526001602052604090205460ff166003141561199a5781600214806119585750816003141561192c57506001610ea4565b60008381526001602052604090205460ff16600414156119d8578115806119c15750816001145b806119585750816004141561192c57506001610ea4565b60008381526001602052604090205460ff1660051415611a16578115806119ff5750816005145b806119585750816006141561192c57506001610ea4565b60008381526001602052604090205460ff1660061415611a56578160011480611a3f5750816003145b806119585750816007141561192c57506001610ea4565b811580611a635750816001145b80611a6e5750816002145b80611a795750816003145b80611a845750816004145b15610ea45750600192915050565b6060600f611a9f83612010565b6040516020018083805460018160011615610100020316600290048015611afd5780601f10611adb576101008083540402835291820191611afd565b820191906000526020600020905b815481529060010190602001808311611ae9575b5050825160208401908083835b60208310611b295780518252601f199092019160209182019101611b0a565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b60009081526002602052604090205490565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b611baf33826120d1565b50565b6000818152600660205260409020546001600160a01b0316611bd382612311565b611bdd818361234c565b611be78383612464565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808212611c3d575080610a69565b5060000390565b6001600160a01b038316611c5757600080fd5b610200600d541115611c6857600080fd5b60008281526008602052604090205415611c8157600080fd5b60008181526020818152604080832080546001600160a01b0319166001600160a01b0388161790556007825280832085905584835260088252918290208390558151808201859052808301849052825180820384018152606090910190925281519101208190611cf0816124df565b600083815260026020526040902055611d08816124fe565b6000838152600160205260408120805460ff191660ff9390931692909217909155805b6008811015611d965760408051602080820186905281830187905260608083018590528351808403909101815260809092019092528051910120611d6e90612576565b600085815260036020526040902090925082908260088110611d8c57fe5b0155600101611d2b565b50611da18684612464565b60405183906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611de283611723565b505050505050565b60008281526006602052604090205482906001600160a01b031633811480611e2857506000828152600960205260409020546001600160a01b031633145b80611e5657506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b611e5f57600080fd5b60008481526006602052604090205484906001600160a01b0316611e8257600080fd5b6000858152600660205260409020546001600160a01b039081169088168114611eaa57600080fd5b6001600160a01b038716611ebd57600080fd5b611ec78787611bb2565b611ed08761258e565b15611feb57604051630a85bd0160e11b815233600482018181526001600160a01b038b81166024850152604484018a9052608060648501908152895160848601528951600095928d169463150b7a029490938f938e938e939260a4019060208501908083838e5b83811015611f4f578181015183820152602001611f37565b50505050905090810190601f168015611f7c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b505050506040513d6020811015611fc857600080fd5b505190506001600160e01b03198116630a85bd0160e11b14611fe957600080fd5b505b5050505050505050565b6001600160a01b03166000908152600b602052604090205490565b60608161203557506040805180820190915260018152600360fc1b6020820152610a69565b8160005b811561204d57600101600a82049150612039565b6060816040519080825280601f01601f19166020018201604052801561207a576020820181803883390190505b50905060001982015b85156120c857600a860660300160f81b828280600190039350815181106120a657fe5b60200101906001600160f81b031916908160001a905350600a86049550612083565b50949350505050565b6001600160a01b0382166120e457600080fd5b610200600d54106120f457600080fd5b6702c68af0bb1400003481111561210a57600080fd5b6000828152600860205260409020541561212357600080fd5b600d5460010160008181526020818152604080832080546001600160a01b0319166001600160a01b038916179055600782528083208690558583526008825291829020839055815180820186905280830184905282518082038401815260609091019092528151910120612196816124df565b6000838152600260205260409020556121ae816124fe565b6000838152600160205260408120805460ff191660ff9390931692909217909155805b600881101561223c576040805160208082018690528183018790526060808301859052835180840390910181526080909201909252805191012061221490612576565b60008581526003602052604090209092508290826008811061223257fe5b01556001016121d1565b50600d805460010190556122508684612464565b833411156122895760405133903486900380156108fc02916000818181858888f19350505050158015612287573d6000803e3d6000fd5b505b8315611da157604051738c9eeecaeb226f1b8c1385abe0960754e08ec285904780156108fc02916000818181858888f193505050501580156122cf573d6000803e3d6000fd5b5060405183906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611de283611723565b6000818152600960205260409020546001600160a01b031615611baf57600090815260096020526040902080546001600160a01b0319169055565b6000818152600660205260409020546001600160a01b0383811691161461237257600080fd5b600081815260066020908152604080832080546001600160a01b0319169055600c8252808320546001600160a01b0386168452600b909252909120546000190180821461243b576001600160a01b0384166000908152600b602052604081208054839081106123dd57fe5b9060005260206000200154905080600b6000876001600160a01b03166001600160a01b03168152602001908152602001600020848154811061241b57fe5b6000918252602080832090910192909255918252600c9052604090208290555b6001600160a01b0384166000908152600b6020526040902080549061171c90600019830161260e565b6000818152600660205260409020546001600160a01b03161561248657600080fd5b600081815260066020908152604080832080546001600160a01b039096166001600160a01b031990961686179055938252600b815283822080546001810182559083528183208101849055928252600c90529190912055565b6101006080607f92909216828101918202016201000091909102010190565b6000606482068160168210156125165750600161256f565b60298210156125275750600261256f565b603a8210156125385750600361256f565b60488210156125495750600461256f565b605482101561255a5750600561256f565b605d82101561256b5750600661256f565b5060075b9392505050565b62010000606090910690810261010082029091010190565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106125d557805160ff1916838001178555612602565b82800160010185558215612602579182015b828111156126025782518255916020019190600101906125e7565b506113dc92915061262e565b8154818355818111156113c7576000838152602090206113c79181019083015b610cd791905b808211156113dc576000815560010161263456fea265627a7a723158208847ca3b51547460fd12b0b4e3a5822043337593ba9395624973f7a1bfb6b1ab64736f6c63430005110032

Deployed Bytecode Sourcemap

399:28569:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11445:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11445:136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11445:136:0;-1:-1:-1;;;;;;11445:136:0;;:::i;:::-;;;;;;;;;;;;;;;;;;28418:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28418:84:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28418:84:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;28418:84:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28418:84:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;28418:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28418:84:0;;-1:-1:-1;28418:84:0;;-1:-1:-1;;;;;28418:84:0:i;:::-;;1770:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1770:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;27894:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27894:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27894:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16560:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16560:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16560:142:0;;:::i;:::-;;;;-1:-1:-1;;;;;16560:142:0;;;;;;;;;;;;;;14555:311;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14555:311:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14555:311:0;;;;;;;;:::i;5642:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5642:78:0;;;:::i;1815:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1815:38:0;;;:::i;27094:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27094:88:0;;;:::i;13826:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13826:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13826:292:0;;;;;;;;;;;;;;;;;:::i;5727:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5727:99:0;;;:::i;27576:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27576:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27576:199:0;;;;;;;;:::i;1910:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1910:88:0;;;:::i;9721:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9721:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9721:109:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;7240:2285;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7240:2285:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7240:2285:0;;:::i;19276:336::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19276:336:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19276:336:0;;;;;;;:::i;13083:143::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13083:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13083:143:0;;;;;;;;;;;;;;;;;:::i;27190:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27190:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27190:135:0;;:::i;9612:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9612:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9612:101:0;;:::i;16143:159::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16143:159:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16143:159:0;;:::i;20494:353::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20494:353:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20494:353:0;;;;;;;;;;;;:::i;15806:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15806:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15806:158:0;-1:-1:-1;;;;;15806:158:0;;:::i;10653:129::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10653:129:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10653:129:0;;:::i;1862:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1862:39:0;;;:::i;5348:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5348:20:0;;;:::i;28069:102::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28069:102:0;;;:::i;10492:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10492:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10492:149:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10492:149:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10492:149:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;10492:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;10492:149:0;;-1:-1:-1;;10492:149:0;;;-1:-1:-1;10492:149:0;;-1:-1:-1;;10492:149:0:i;15293:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15293:205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15293:205:0;;;;;;;;;;:::i;9964:516::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9964:516:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9964:516:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12485:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12485:168:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;12485:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12485:168:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12485:168:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;12485:168:0;;-1:-1:-1;12485:168:0;-1:-1:-1;12485:168:0;:::i;20859:1848::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20859:1848:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20859:1848:0;;:::i;22719:1342::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22719:1342:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22719:1342:0;;;;;;;:::i;28253:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28253:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28253:153:0;;:::i;9838:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9838:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9838:118:0;;:::i;16985:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16985:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16985:151:0;;;;;;;;;;:::i;17621:98::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17621:98:0;;:::i;11445:136::-;-1:-1:-1;;;;;;11540:33:0;;11516:4;11540:33;;;:19;:33;;;;;;;;11445:136;;;;:::o;28418:84::-;4527:5;;-1:-1:-1;;;;;4527:5:0;4513:10;:19;4505:60;;;;;-1:-1:-1;;;4505:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28482:12;;;;:3;;:12;;;;;:::i;:::-;;28418:84;:::o;1770:38::-;1805:3;1770:38;:::o;27894:94::-;27973:7;27965:15;;;;;;;;-1:-1:-1;;27965:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27933:19;;27965:15;;27973:7;;27965:15;;27973:7;27965:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27894:94;:::o;16560:142::-;16645:7;4399:19;;;:9;:19;;;;;;16626:8;;-1:-1:-1;;;;;4399:19:0;4391:42;;;;;;-1:-1:-1;;16672:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;16672:22:0;;16560:142::o;14555:311::-;3622:18;3643:19;;;:9;:19;;;;;;14629:8;;-1:-1:-1;;;;;3643:19:0;3695:10;3681:24;;;:68;;-1:-1:-1;;;;;;3709:28:0;;;;;;:16;:28;;;;;;;;3738:10;3709:40;;;;;;;;;;3681:68;3673:77;;;;;;4430:1;4399:19;;;:9;:19;;;;;;14652:8;;-1:-1:-1;;;;;4399:19:0;4391:42;;;;;;14673:18;14694:19;;;:9;:19;;;;;;-1:-1:-1;;;;;14694:19:0;;;;14732:23;;;;;14724:32;;;;;;14767:22;;;;:12;:22;;;;;;:34;;-1:-1:-1;;;;;;14767:34:0;-1:-1:-1;;;;;14767:34:0;;;;;;;;;14817:41;;14767:22;;14817:41;;;;;;;4444:1;3761;14555:311;;;;:::o;5642:78::-;;;-1:-1:-1;;;;;5642:78:0;;:::o;1815:38::-;1852:1;1815:38;:::o;27094:88::-;27165:9;;27094:88;;:::o;13826:292::-;3969:18;3990:19;;;:9;:19;;;;;;13915:8;;-1:-1:-1;;;;;3990:19:0;4056:10;4042:24;;;:77;;-1:-1:-1;4083:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;4083:22:0;4109:10;4083:36;4042:77;:134;;;-1:-1:-1;;;;;;4136:28:0;;;;;;:16;:28;;;;;;;;4165:10;4136:40;;;;;;;;;;4042:134;4020:167;;;;;;4430:1;4399:19;;;:9;:19;;;;;;13938:8;;-1:-1:-1;;;;;4399:19:0;4391:42;;;;;;13959:18;13980:19;;;:9;:19;;;;;;-1:-1:-1;;;;;13980:19:0;;;;14018;;;;14010:28;;;;;;-1:-1:-1;;;;;14057:17:0;;14049:26;;;;;;14086:24;14096:3;14101:8;14086:9;:24::i;:::-;4444:1;4198;13826:292;;;;;:::o;5727:99::-;;;;;;;;;;;;;;;-1:-1:-1;;5727:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27576:199::-;-1:-1:-1;;;;;27697:18:0;;27660:7;27697:18;;;:10;:18;;;;;:25;27688:34;;27680:43;;;;;;-1:-1:-1;;;;;27741:18:0;;;;;;:10;:18;;;;;:26;;27760:6;;27741:26;;;;;;;;;;;;;;27734:33;;27576:199;;;;;:::o;1910:88::-;1956:42;1910:88;:::o;9721:109::-;9776:5;9801:21;;;:16;:21;;;;;;;;;9721:109::o;7240:2285::-;7310:6;7352:12;;;:8;:12;;;;;;;;;;7335:30;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;7335:30:0;;;;;;7325:41;;;;;;;7411:24;7401:35;;;;;;;;;;7284:13;;7325:41;7284:13;;7401:35;;;21:6:-1;;104:10;7401:35:0;87:34:-1;135:17;;-1:-1;;7379:57:0;-1:-1:-1;7447:6:0;7464:73;7480:2;7476:1;:6;7464:73;;;7516:6;7523:1;7516:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7516:9:0;7504:6;7511:1;7504:9;;;;;;;;;;;:21;-1:-1:-1;;;;;7504:21:0;;;;;;;;-1:-1:-1;7484:3:0;;7464:73;;;7547:5;7698:20;;;:16;:20;;;;;;7547:5;;;;;;7655:2;7649;7645:6;;7644:13;;7547:5;;7698:20;;7694:793;;7740:8;;;7694:793;7770:20;;;;:16;:20;;;;;;;;;;;:25;7766:721;;;-1:-1:-1;;;;7766:721:0;;;7873:20;;;;:16;:20;;;;;;;;7897:1;7873:25;7869:618;;;-1:-1:-1;;;;7869:618:0;;;7980:20;;;;:16;:20;;;;;;;;8004:1;7980:25;7976:511;;;-1:-1:-1;;;;7976:511:0;;;8086:20;;;;:16;:20;;;;;;;;8110:1;8086:25;8082:405;;;-1:-1:-1;;;;8082:405:0;;;8195:20;;;;:16;:20;;;;;;;;8219:1;8195:25;8191:296;;;-1:-1:-1;;;;8191:296:0;;;8304:20;;;;:16;:20;;;;;;;;8328:1;8304:25;8300:187;;;-1:-1:-1;;;;8300:187:0;;;-1:-1:-1;;;;8300:187:0;8502:5;8497:949;5257:2;8518:1;:8;8497:949;;;8575:1;-1:-1:-1;;8558:13:0;;5339:1;8553:19;:23;;-1:-1:-1;8600:1:0;8596;:5;8605:1;8596:10;8592:124;;;8632:1;8631:2;;8627:6;;8592:124;;;8663:1;8659;:5;8668:1;8659:10;8655:61;;;8694:6;8698:1;8694:3;:6::i;:::-;8690:10;;8655:61;8734:10;;;;8764:5;8759:511;5257:2;8780:1;:8;8759:511;;;5339:1;5257:2;5328:13;8824:1;:13;8819:1;:19;8841:1;8819:23;8814:29;;8870:1;8866;:5;;;;;;8875:1;8866:10;8862:69;;;8905:6;8909:1;8905:3;:6::i;:::-;8901:10;;8862:69;8953:10;;;;9006:3;-1:-1:-1;;;8991:5:0;;;:11;8986:23;;;;;;8982:27;;9036:2;9032:1;:6;9028:147;;;9082:7;9090:1;9082:10;;;;;;;;;-1:-1:-1;9028:147:0;;;9151:4;9143:12;;9028:147;9227:3;9218:5;:12;;9210:21;;9193:6;9200:1;9193:9;;;;;;;;;;;:39;-1:-1:-1;;;;;9193:39:0;;;;;;;;-1:-1:-1;9251:3:0;;;;;8790;8759:511;;;;9301:4;9296:10;;9284:6;9291:1;9284:9;;;;;;;;;;;:22;-1:-1:-1;;;;;9284:22:0;;;;;;;;-1:-1:-1;9339:9:0;;9321:3;;;;;-1:-1:-1;;;9351:10:0;9339:6;;9321:3;;9339:9;;;;;;;;;:22;-1:-1:-1;;;;;9339:22:0;;;;;;;;-1:-1:-1;9394:9:0;;9376:3;;;;;-1:-1:-1;;;9406:10:0;9394:6;;9376:3;;9394:9;;;;;;;;;:22;-1:-1:-1;;;;;9394:22:0;;;;;;;;-1:-1:-1;9431:3:0;;;;;8528;8497:949;;;-1:-1:-1;9486:6:0;;7240:2285;-1:-1:-1;;;;;;;;;;7240:2285:0:o;19276:336::-;19365:3;19353:9;:15;19345:24;;;;;;19404:13;;:32;;;-1:-1:-1;;;19404:32:0;;;;;;;;;;19442:10;;-1:-1:-1;;;;;19404:13:0;;:21;;:32;;;;;;;;;;;;;;:13;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;19404:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19404:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19404:32:0;-1:-1:-1;;;;;19388:64:0;;19380:73;;;;;;19474:13;;:62;;;-1:-1:-1;;;19474:62:0;;19501:10;19474:62;;;;19520:4;19474:62;;;;;;;;;;;;-1:-1:-1;;;;;19474:13:0;;;;:26;;:62;;;;;:13;;:62;;;;;;;;:13;;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;19474:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19474:62:0;;;;19564:40;19576:10;19588:4;19594:9;19564:11;:40::i;13083:143::-;13175:43;13193:5;13200:3;13205:8;13175:43;;;;;;;;;;;;:17;:43::i;:::-;13083:143;;;:::o;27190:135::-;27248:7;27284:9;;27276:5;:17;27268:26;;;;;;-1:-1:-1;27312:5:0;27190:135::o;9612:101::-;9662:7;9689:16;;;;;;;;;;;-1:-1:-1;;;;;9689:16:0;;9612:101::o;16143:159::-;16199:14;16235:19;;;:9;:19;;;;;;-1:-1:-1;;;;;16235:19:0;16273:20;16265:29;;;;;20494:353;20600:11;20608:2;20600:7;:11::i;:::-;-1:-1:-1;;;;;20586:25:0;:10;-1:-1:-1;;;;;20586:25:0;;20578:34;;;;;;20642:8;20631;:19;20623:28;;;;;;20670:35;20687:2;20690:14;20670:16;:35::i;:::-;:43;;20709:4;20670:43;20662:52;;;;;;20735:19;;;;:15;:19;;;;;20773:8;;20755:14;20735:35;;;;;;;;:46;20797:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20494:353;;;:::o;15806:158::-;15864:7;-1:-1:-1;;;;;15892:20:0;;15884:29;;;;;;15931:25;15949:6;15931:17;:25::i;10653:129::-;10751:23;;;;:14;:23;;;;;;;;;10744:30;;;;;;-1:-1:-1;;10744:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10718:13;;10744:30;;;10751:23;10744:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10653:129;;;:::o;1862:39::-;1891:10;1862:39;:::o;5348:20::-;;;-1:-1:-1;;;;;5348:20:0;;:::o;28069:102::-;28154:9;28144:19;;;;;;;;-1:-1:-1;;28144:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28110:21;;28144:19;;28154:9;;28144:19;;28154:9;28144:19;;;;;;;;;;;;;;;;;;;;;;;;10492:149;10590:23;;;;:14;:23;;;;;;;;:43;;;;;;;;:::i;15293:205::-;15392:10;15375:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;15375:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;15375:51:0;;;;;;;;;;15442:48;;;;;;;15375:39;;15392:10;15442:48;;;;;;;;;;;15293:205;;:::o;9964:516::-;10018:14;10148:20;;;:15;:20;;;;;;;;:23;;10212:1;10191:23;;;10255:1;10234:23;;;10277;;;;10341:1;10320:23;;;10384:1;10363:23;;;10427:1;10406:23;;;10470:1;10449:23;;;;10148;;10191;;10234;10277;;10320;;10363;;10406;10449;9964:516::o;12485:168::-;12599:46;12617:5;12624:3;12629:8;12639:5;;12599:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;12599:17:0;;-1:-1:-1;;;12599:46:0:i;:::-;12485:168;;;;;:::o;20859:1848::-;20935:11;20943:2;20935:7;:11::i;:::-;-1:-1:-1;;;;;20921:25:0;:10;-1:-1:-1;;;;;20921:25:0;;20913:34;;;;;;21031:33;;;;;;;;;;21051:12;21031:33;;;;;;26:21:-1;;;22:32;;6:49;;21031:33:0;;;;;;21021:44;;;;;;;;;20968:22;21091:20;;;:16;:20;;;;;;;;21021:44;;21091:20;;;;:25;21087:1425;;;;;;21223:20;;;;:16;:20;;;;;;;;21247:1;21223:25;21219:1293;;;21330:1;21323:4;:8;21306:25;;21219:1293;;;21362:20;;;;:16;:20;;;;;;;;21386:1;21362:25;21358:1154;;;21470:1;21463:4;:8;21475:1;21462:14;21445:31;;21358:1154;;;21507:20;;;;:16;:20;;;;;;;;21531:1;21507:25;21503:1009;;;21619:1;21612:4;:8;21594:27;;21640:14;21658:1;21640:19;21636:78;;;21697:1;21680:18;;21636:78;21503:1009;;;21744:20;;;;:16;:20;;;;;;;;21768:1;21744:25;21740:772;;;21856:1;21849:4;:8;21831:27;;21877:14;21895:1;21877:19;21873:175;;;21934:1;21917:18;;21873:175;;;21974:14;21992:1;21974:19;21970:78;;;22031:1;22014:18;;21740:772;;;22078:20;;;;:16;:20;;;;;;;;22102:1;22078:25;22074:438;;;22190:1;22183:4;:8;;-1:-1:-1;22211:19:0;22207:175;;22268:1;22251:18;;22207:175;;;22308:14;22326:1;22308:19;22304:78;;;22365:1;22348:18;;22074:438;;;22447:1;22440:4;:8;22423:25;;22074:438;22540:16;22595:19;;;:15;:19;;;;;22559:15;;;;;;22615:14;22595:35;;;;;;;;:46;22657:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20859:1848;;;;:::o;22719:1342::-;22795:12;22823:20;;;:16;:20;;;;;;;;;;:25;22819:1234;;;22869:18;22865:73;;-1:-1:-1;22918:4:0;22865:73;22819:1234;;;22968:20;;;;:16;:20;;;;;;;;22992:1;22968:25;22964:1089;;;23014:18;;;:40;;;23036:13;23053:1;23036:18;23014:40;23010:95;;;-1:-1:-1;23085:4:0;22964:1089;;;23135:20;;;;:16;:20;;;;;;;;23159:1;23135:25;23131:922;;;23181:13;23198:1;23181:18;:40;;;;23203:13;23220:1;23203:18;23177:95;;;-1:-1:-1;23252:4:0;23131:922;;;23302:20;;;;:16;:20;;;;;;;;23326:1;23302:25;23298:755;;;23348:18;;;:40;;;23370:13;23387:1;23370:18;23348:40;:62;;;;23392:13;23409:1;23392:18;23344:117;;;-1:-1:-1;23441:4:0;23298:755;;;23491:20;;;;:16;:20;;;;;;;;23515:1;23491:25;23487:566;;;23537:18;;;:40;;;23559:13;23576:1;23559:18;23537:40;:62;;;;23581:13;23598:1;23581:18;23533:117;;;-1:-1:-1;23630:4:0;23487:566;;;23680:20;;;;:16;:20;;;;;;;;23704:1;23680:25;23676:377;;;23726:13;23743:1;23726:18;:40;;;;23748:13;23765:1;23748:18;23726:40;:62;;;;23770:13;23787:1;23770:18;23722:117;;;-1:-1:-1;23819:4:0;23676:377;;;23885:18;;;:40;;;23907:13;23924:1;23907:18;23885:40;:62;;;;23929:13;23946:1;23929:18;23885:62;:84;;;;23951:13;23968:1;23951:18;23885:84;:106;;;;23973:13;23990:1;23973:18;23885:106;23881:161;;;-1:-1:-1;24022:4:0;22719:1342;;;;:::o;28253:153::-;28306:13;28363:3;28368:28;28392:2;28368:15;:28::i;:::-;28346:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28346:51:0;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;28346:51:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28346:51:0;;;28332:66;;28253:153;;;:::o;9838:118::-;9897:7;9924:24;;;:19;:24;;;;;;;9838:118::o;16985:151::-;-1:-1:-1;;;;;17093:24:0;;;17069:4;17093:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;16985:151::o;17621:98::-;17688:23;17694:10;17706:4;17688:5;:23::i;:::-;17621:98;:::o;17341:270::-;17411:12;17426:19;;;:9;:19;;;;;;-1:-1:-1;;;;;17426:19:0;17456:24;17436:8;17456:14;:24::i;:::-;17493:30;17508:4;17514:8;17493:14;:30::i;:::-;17534:26;17546:3;17551:8;17534:11;:26::i;:::-;17598:8;17593:3;-1:-1:-1;;;;;17578:29:0;17587:4;-1:-1:-1;;;;;17578:29:0;;;;;;;;;;;17341:270;;;:::o;5883:107::-;5926:3;5951:1;5946;:6;5942:20;;-1:-1:-1;5961:1:0;5954:8;;5942:20;-1:-1:-1;5980:2:0;;;5883:107::o;19624:858::-;-1:-1:-1;;;;;19713:17:0;;19705:26;;;;;;1805:3;19750:9;;:24;;19742:33;;;;;;19804:14;;;;:8;:14;;;;;;:19;19796:28;;;;;;19837:7;19877:15;;;;;;;;;;;:21;;-1:-1:-1;;;;;;19877:21:0;-1:-1:-1;;;;;19877:21:0;;;;;19909:8;:12;;;;;:19;;;19939:14;;;:8;:14;;;;;;:19;;;19994:25;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;19994:25:0;;;;;;;19984:36;;;;;19877:15;;20059:21;19984:36;20059:18;:21::i;:::-;20033:23;;;;:19;:23;;;;;:47;20114:12;20124:1;20114:9;:12::i;:::-;20091:20;;;;:16;:20;;;;;:35;;-1:-1:-1;;20091:35:0;;;;;;;;;;;;;:20;20174:179;20193:1;20191;:3;20174:179;;;20263:24;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20263:24:0;;;;;;;20253:35;;;;;20234:56;;:13;:56::i;:::-;20305:19;;;;:15;:19;;;;;20220:70;;-1:-1:-1;20220:70:0;;20325:1;20305:22;;;;;;;;:36;20202:1;20200:3;20174:179;;;;20365:20;20377:3;20382:2;20365:11;:20::i;:::-;20403:29;;20429:2;;-1:-1:-1;;;;;20403:29:0;;;20420:1;;20403:29;;20420:1;;20403:29;20453:21;20471:2;20453:17;:21::i;:::-;19624:858;;;;;;:::o;26222:532::-;3969:18;3990:19;;;:9;:19;;;;;;26338:8;;-1:-1:-1;;;;;3990:19:0;4056:10;4042:24;;;:77;;-1:-1:-1;4083:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;4083:22:0;4109:10;4083:36;4042:77;:134;;;-1:-1:-1;;;;;;4136:28:0;;;;;;:16;:28;;;;;;;;4165:10;4136:40;;;;;;;;;;4042:134;4020:167;;;;;;4430:1;4399:19;;;:9;:19;;;;;;26361:8;;-1:-1:-1;;;;;4399:19:0;4391:42;;;;;;26382:18;26403:19;;;:9;:19;;;;;;-1:-1:-1;;;;;26403:19:0;;;;26441;;;;26433:28;;;;;;-1:-1:-1;;;;;26480:17:0;;26472:26;;;;;;26511:24;26521:3;26526:8;26511:9;:24::i;:::-;26552:15;26563:3;26552:10;:15::i;:::-;26548:199;;;26600:77;;-1:-1:-1;;;26600:77:0;;26642:10;26600:77;;;;;;-1:-1:-1;;;;;26600:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26584:13;;26600:41;;;;;;26642:10;;26654:5;;26661:8;;26671:5;;26600:77;;;;;;;;;;;26584:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26600:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26600:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26600:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26600:77:0;;-1:-1:-1;;;;;;;26700:34:0;;-1:-1:-1;;;26700:34:0;26692:43;;;;;;26548:199;;4444:1;4198;26222:532;;;;;;:::o;25802:126::-;-1:-1:-1;;;;;25895:18:0;25868:7;25895:18;;;:10;:18;;;;;:25;;25802:126::o;28510:453::-;28567:13;28595:7;28591:45;;-1:-1:-1;28616:10:0;;;;;;;;;;;;-1:-1:-1;;;28616:10:0;;;;;;28591:45;28653:2;28644:6;28689:61;28696:6;;28689:61;;28716:5;;28738:2;28733:7;;;;28689:61;;;28758:17;28788:3;28778:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;28778:14:0;87:34:-1;135:17;;-1:-1;28778:14:0;-1:-1:-1;28758:34:0;-1:-1:-1;;;28810:7:0;;28834:95;28841:7;;28834:95;;28895:2;28890;:7;28885:2;:12;28874:25;;28862:4;28867:3;;;;;;;28862:9;;;;;;;;;;;:37;-1:-1:-1;;;;;28862:37:0;;;;;;;;-1:-1:-1;28917:2:0;28911:8;;;;28834:95;;;-1:-1:-1;28951:4:0;28510:453;-1:-1:-1;;;;28510:453:0:o;18063:1205::-;-1:-1:-1;;;;;18130:17:0;;18122:26;;;;;;1805:3;18167:9;;:23;18159:32;;;;;;1891:10;18312:9;:19;-1:-1:-1;18312:19:0;18304:28;;;;;;18362:14;;;;:8;:14;;;;;;:19;18354:28;;;;;;18403:9;;18415:1;18403:13;18393:7;18429:15;;;;;;;;;;;:21;;-1:-1:-1;;;;;;18429:21:0;-1:-1:-1;;;;;18429:21:0;;;;;18461:8;:12;;;;;:19;;;18491:14;;;:8;:14;;;;;;:19;;;18546:25;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;18546:25:0;;;;;;;18536:36;;;;;18611:21;18536:36;18611:18;:21::i;:::-;18585:23;;;;:19;:23;;;;;:47;18666:12;18676:1;18666:9;:12::i;:::-;18643:20;;;;:16;:20;;;;;:35;;-1:-1:-1;;18643:35:0;;;;;;;;;;;;;:20;18726:179;18745:1;18743;:3;18726:179;;;18815:24;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18815:24:0;;;;;;;18805:35;;;;;18786:56;;:13;:56::i;:::-;18857:19;;;;:15;:19;;;;;18772:70;;-1:-1:-1;18772:70:0;;18877:1;18857:22;;;;;;;;:36;18754:1;18752:3;18726:179;;;-1:-1:-1;18929:9:0;;;18941:1;18929:13;18917:25;;18953:20;18965:3;18970:2;18953:11;:20::i;:::-;19002:6;18990:9;:18;18986:90;;;19025:39;;:10;;19045:9;:18;;;19025:39;;;;;;;;;19045:18;19025:10;:39;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19025:39:0;18986:90;19090:10;;19086:86;;19117:43;;1956:42;;19138:21;19117:43;;;;;;;;;19138:21;1956:42;19117:43;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19117:43:0;19189:29;;19215:2;;-1:-1:-1;;;;;19189:29:0;;;19206:1;;19189:29;;19206:1;;19189:29;19239:21;19257:2;19239:17;:21::i;26897:166::-;26996:1;26962:22;;;:12;:22;;;;;;-1:-1:-1;;;;;26962:22:0;:36;26958:98;;27022:22;;;;:12;:22;;;;;27015:29;;-1:-1:-1;;;;;;27015:29:0;;;26897:166::o;24906:587::-;24991:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;24991:28:0;;;:19;;:28;24983:37;;;;;;25038:19;;;;:9;:19;;;;;;;;25031:26;;-1:-1:-1;;;;;;25031:26:0;;;25099:14;:24;;;;;;-1:-1:-1;;;;;25159:17:0;;;;:10;:17;;;;;;:24;-1:-1:-1;;25159:28:0;25204:36;;;25200:247;;-1:-1:-1;;;;;25277:17:0;;25257;25277;;;:10;:17;;;;;:33;;25295:14;;25277:33;;;;;;;;;;;;;;25257:53;;25365:9;25325:10;:17;25336:5;-1:-1:-1;;;;;25325:17:0;-1:-1:-1;;;;;25325:17:0;;;;;;;;;;;;25343:18;25325:37;;;;;;;;;;;;;;;;;;;:49;;;;25389:25;;;:14;:25;;;;;:46;;;25200:247;-1:-1:-1;;;;;25459:17:0;;;;;;:10;:17;;;;;:26;;;;;-1:-1:-1;;25459:26:0;;;:::i;24347:266::-;24458:1;24427:19;;;:9;:19;;;;;;-1:-1:-1;;;;;24427:19:0;:33;24419:42;;;;;;24472:19;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;24472:25:0;;;-1:-1:-1;;;;;;24472:25:0;;;;;;;24527:15;;;:10;:15;;;;;27:10:-1;;24472:25:0;23:18:-1;;45:23;;24527:30:0;;;;;;;;;;;24568:24;;;:14;:24;;;;;;:37;24347:266::o;6277:281::-;6423:3;6378;6374:7;;;;;6373:15;;;6416:10;;;6497:15;6454:10;;;;;6497:24;;;6277:281::o;6570:543::-;6620:5;6655:3;6651:7;;6620:5;6704:2;6696:10;;6692:390;;;-1:-1:-1;6732:1:0;6692:390;;;6763:2;6755:5;:10;6751:331;;;-1:-1:-1;6791:1:0;6751:331;;;6822:2;6814:5;:10;6810:272;;;-1:-1:-1;6850:1:0;6810:272;;;6881:2;6873:5;:10;6869:213;;;-1:-1:-1;6909:1:0;6869:213;;;6940:2;6932:5;:10;6928:154;;;-1:-1:-1;6968:1:0;6928:154;;;6999:2;6991:5;:10;6987:95;;;-1:-1:-1;7027:1:0;6987:95;;;-1:-1:-1;7069:1:0;6987:95;7099:6;6570:543;-1:-1:-1;;;6570:543:0:o;6002:267::-;6165:10;6097:2;6093:6;;;6165:10;;;6134:3;6127:10;;6208:15;;;:24;;6002:267::o;11008:215::-;11138:18;11207:8;;;11008:215::o;399:28569::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;399:28569:0;;;-1:-1:-1;399:28569:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://8847ca3b51547460fd12b0b4e3a5822043337593ba9395624973f7a1bfb6b1ab
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.