ETH Price: $3,244.31 (-0.92%)
Gas: 3 Gwei

Token

Discoverfeed NFT Octagon (DF NFT OCTAGON)
 

Overview

Max Total Supply

0 DF NFT OCTAGON

Holders

32

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 DF NFT OCTAGON
0x0a72Cf631bAbA26d442181257e03CC6c22E1821b
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:
DiscoverfeedNftOctagon

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 12: discoverfeed_nft_octagon.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.0;

import "nf-token-metadata.sol";
import "ownable.sol";

/**
 * @dev This is an example contract implementation of NFToken with metadata extension.
 */
contract DiscoverfeedNftOctagon is
  NFTokenMetadata,
  Ownable
{

  /**
   * @dev Contract constructor. Sets metadata extension `name` and `symbol`.
   */
  constructor()
  {
    nftName = "Discoverfeed NFT Octagon";
    nftSymbol = "DF NFT OCTAGON";
  }

  /**
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   * @param _uri String representing RFC 3986 URI.
   */
  function mint(
    address _to,
    uint256 _tokenId,
    string calldata _uri
  )
    external
    onlyOwner
  {
    super._mint(_to, _tokenId);
    super._setTokenUri(_tokenId, _uri);
  }

}

File 1 of 12: address-utils.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev Utility library of inline functions on addresses.
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 */
library AddressUtils
{

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   * @return addressCheck True if _addr is a contract, false if not.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }

}

File 3 of 12: erc165.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}

File 4 of 12: erc721-enumerable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev Optional enumeration extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Enumerable
{

  /**
   * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an
   * assigned and queryable owner not equal to the zero address.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is
   * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address,
   * representing invalid NFTs.
   * @param _owner An address where we are interested in NFTs owned by them.
   * @param _index A counter less than `balanceOf(_owner)`.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    view
    returns (uint256);

}

File 5 of 12: erc721-metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}

File 6 of 12: erc721-token-receiver.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @param _operator The address which called `safeTransferFrom` function.
   * @param _from The address which previously owned the token.
   * @param _tokenId The NFT identifier which is being transferred.
   * @param _data Additional data with no specified format.
   * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}

File 7 of 12: erc721.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721
{

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

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @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;

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @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;

  /**
   * @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.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may 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;

  /**
   * @dev Set or reaffirm the approved address for an NFT.
   * @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 The new approved NFT controller.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @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 The contract MUST allow multiple operators per owner.
   * @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;

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

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @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);

}

File 8 of 12: nf-token-enumerable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "nf-token.sol";
import "erc721-enumerable.sol";

/**
 * @dev Optional enumeration implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenEnumerable is
  NFToken,
  ERC721Enumerable
{

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant INVALID_INDEX = "005007";

  /**
   * @dev Array of all NFT IDs.
   */
  uint256[] internal tokens;

  /**
   * @dev Mapping from token ID to its index in global tokens array.
   */
  mapping(uint256 => uint256) internal idToIndex;

  /**
   * @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 Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
  }

  /**
   * @dev Returns the count of all existing NFTokens.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    override
    view
    returns (uint256)
  {
    return tokens.length;
  }

  /**
   * @dev Returns NFT ID by its index.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < tokens.length, INVALID_INDEX);
    return tokens[_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
    override
    view
    returns (uint256)
  {
    require(_index < ownerToIds[_owner].length, INVALID_INDEX);
    return ownerToIds[_owner][_index];
  }

  /**
   * @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.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._mint(_to, _tokenId);
    tokens.push(_tokenId);
    idToIndex[_tokenId] = tokens.length - 1;
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    uint256 tokenIndex = idToIndex[_tokenId];
    uint256 lastTokenIndex = tokens.length - 1;
    uint256 lastToken = tokens[lastTokenIndex];

    tokens[tokenIndex] = lastToken;

    tokens.pop();
    // This wastes gas if you are burning the last token but saves a little gas if you are not.
    idToIndex[lastToken] = tokenIndex;
    idToIndex[_tokenId] = 0;
  }

  /**
   * @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
    override
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    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].pop();
  }

  /**
   * @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 wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
    idToOwner[_tokenId] = _to;

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

  /**
   * @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
    override
    virtual
    view
    returns (uint256)
  {
    return ownerToIds[_owner].length;
  }
}

File 9 of 12: nf-token-metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "nf-token.sol";
import "erc721-metadata.sol";

/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;

  /**
   * @dev Contract constructor.
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   */
  constructor()
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

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

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

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    delete idToUri[_tokenId];
  }

  /**
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @notice This is an internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _tokenId Id for which we want URI.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    internal
    validNFToken(_tokenId)
  {
    idToUri[_tokenId] = _uri;
  }

}

File 10 of 12: nf-token.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "erc721.sol";
import "erc721-token-receiver.sol";
import "supports-interface.sol";
import "address-utils.sol";

/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can receive NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

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

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

   /**
   * @dev Mapping from owner address to count of their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

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

  /**
   * @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],
      NOT_OWNER_OR_OPERATOR
    );
    _;
  }

  /**
   * @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],
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }

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

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @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
    override
  {
    _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
    override
  {
    _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 may 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
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _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
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    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
    override
  {
    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
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

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

  /**
   * @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
    override
    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
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

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

  /**
   * @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.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

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

  /**
   * @dev Assigns a new NFT to owner.
   * @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
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] += 1;
  }

  /**
   * @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
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @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, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

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

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

}

File 11 of 12: ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

File 12 of 12: supports-interface.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "erc165.sol";

/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @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
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601881526020017f446973636f76657266656564204e4654204f637461676f6e00000000000000008152506005908051906020019062000193929190620001e8565b506040518060400160405280600e81526020017f4446204e4654204f435441474f4e00000000000000000000000000000000000081525060069080519060200190620001e1929190620001e8565b50620002fd565b828054620001f69062000298565b90600052602060002090601f0160209004810192826200021a576000855562000266565b82601f106200023557805160ff191683800117855562000266565b8280016001018555821562000266579182015b828111156200026557825182559160200191906001019062000248565b5b50905062000275919062000279565b5090565b5b80821115620002945760008160009055506001016200027a565b5090565b60006002820490506001821680620002b157607f821691505b60208210811415620002c857620002c7620002ce565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612cf4806200030d6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80638da5cb5b116100a2578063c87b56dd11610071578063c87b56dd146102df578063d3fc98641461030f578063e985e9c51461032b578063f2fde38b1461035b578063f3fe3bc31461037757610116565b80638da5cb5b1461026b57806395d89b4114610289578063a22cb465146102a7578063b88d4fde146102c357610116565b806323b872dd116100e957806323b872dd146101b557806342842e0e146101d15780636352211e146101ed57806370a082311461021d578063860d248a1461024d57610116565b806301ffc9a71461011b57806306fdde031461014b578063081812fc14610169578063095ea7b314610199575b600080fd5b6101356004803603810190610130919061287f565b610395565b6040516101429190612a00565b60405180910390f35b6101536103fc565b6040516101609190612a1b565b60405180910390f35b610183600480360381019061017e91906128d1565b61048e565b6040516101909190612999565b60405180910390f35b6101b360048036038101906101ae91906127d7565b6105a9565b005b6101cf60048036038101906101ca91906126cc565b61098c565b005b6101eb60048036038101906101e691906126cc565b610dde565b005b610207600480360381019061020291906128d1565b610dfe565b6040516102149190612999565b60405180910390f35b61023760048036038101906102329190612667565b610ee4565b6040516102449190612a3d565b60405180910390f35b610255610f9e565b6040516102629190612a1b565b60405180910390f35b610273610fd7565b6040516102809190612999565b60405180910390f35b610291610ffd565b60405161029e9190612a1b565b60405180910390f35b6102c160048036038101906102bc919061279b565b61108f565b005b6102dd60048036038101906102d8919061271b565b61118c565b005b6102f960048036038101906102f491906128d1565b6111e3565b6040516103069190612a1b565b60405180910390f35b61032960048036038101906103249190612813565b611366565b005b61034560048036038101906103409190612690565b61148d565b6040516103529190612a00565b60405180910390f35b61037560048036038101906103709190612667565b611521565b005b61037f611753565b60405161038c9190612a1b565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606005805461040b90612bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461043790612bc1565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061056c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105639190612a1b565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806106a25750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107109190612a1b565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ed9190612a1b565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030380000000000000000000000000000000000000000000000000000815250906108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd9190612a1b565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610a5d57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610aee5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c9190612a1b565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c399190612a1b565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d189190612a1b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19190612a1b565b60405180910390fd5b50610dd5868661178c565b50505050505050565b610df983838360405180602001604052806000815250611841565b505050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed59190612a1b565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f849190612a1b565b60405180910390fd5b50610f9782611e0f565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461100c90612bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461103890612bc1565b80156110855780601f1061105a57610100808354040283529160200191611085565b820191906000526020600020905b81548152906001019060200180831161106857829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111809190612a00565b60405180910390a35050565b6111dc85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611841565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b89190612a1b565b60405180910390fd5b506007600084815260200190815260200160002080546112e090612bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461130c90612bc1565b80156113595780601f1061132e57610100808354040283529160200191611359565b820191906000526020600020905b81548152906001019060200180831161133c57829003601f168201915b5050505050915050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061142e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114259190612a1b565b60405180910390fd5b506114398484611e58565b6114878383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612046565b50505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e09190612a1b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090611692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116899190612a1b565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506117cd82612150565b6117d78183612189565b6117e183836122f4565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061191257503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806119a35750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a119190612a1b565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee9190612a1b565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd9190612a1b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c769190612a1b565b60405180910390fd5b50611c8a878761178c565b611ca98773ffffffffffffffffffffffffffffffffffffffff1661247c565b15611e055760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401611cef94939291906129b4565b602060405180830381600087803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4191906128a8565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f303033303035000000000000000000000000000000000000000000000000000081525090611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df99190612a1b565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef79190612a1b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd29190612a1b565b60405180910390fd5b50611fe682826122f4565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612122576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121199190612a1b565b60405180910390fd5b508160076000858152602001908152602001600020908051906020019061214a9291906124c7565b50505050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122599190612a1b565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b39190612ae6565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c59190612a1b565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124719190612a90565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156124be5750808214155b92505050919050565b8280546124d390612bc1565b90600052602060002090601f0160209004810192826124f5576000855561253c565b82601f1061250e57805160ff191683800117855561253c565b8280016001018555821561253c579182015b8281111561253b578251825591602001919060010190612520565b5b509050612549919061254d565b5090565b5b8082111561256657600081600090555060010161254e565b5090565b60008135905061257981612c62565b92915050565b60008135905061258e81612c79565b92915050565b6000813590506125a381612c90565b92915050565b6000815190506125b881612c90565b92915050565b60008083601f8401126125d057600080fd5b8235905067ffffffffffffffff8111156125e957600080fd5b60208301915083600182028301111561260157600080fd5b9250929050565b60008083601f84011261261a57600080fd5b8235905067ffffffffffffffff81111561263357600080fd5b60208301915083600182028301111561264b57600080fd5b9250929050565b60008135905061266181612ca7565b92915050565b60006020828403121561267957600080fd5b60006126878482850161256a565b91505092915050565b600080604083850312156126a357600080fd5b60006126b18582860161256a565b92505060206126c28582860161256a565b9150509250929050565b6000806000606084860312156126e157600080fd5b60006126ef8682870161256a565b93505060206127008682870161256a565b925050604061271186828701612652565b9150509250925092565b60008060008060006080868803121561273357600080fd5b60006127418882890161256a565b95505060206127528882890161256a565b945050604061276388828901612652565b935050606086013567ffffffffffffffff81111561278057600080fd5b61278c888289016125be565b92509250509295509295909350565b600080604083850312156127ae57600080fd5b60006127bc8582860161256a565b92505060206127cd8582860161257f565b9150509250929050565b600080604083850312156127ea57600080fd5b60006127f88582860161256a565b925050602061280985828601612652565b9150509250929050565b6000806000806060858703121561282957600080fd5b60006128378782880161256a565b945050602061284887828801612652565b935050604085013567ffffffffffffffff81111561286557600080fd5b61287187828801612608565b925092505092959194509250565b60006020828403121561289157600080fd5b600061289f84828501612594565b91505092915050565b6000602082840312156128ba57600080fd5b60006128c8848285016125a9565b91505092915050565b6000602082840312156128e357600080fd5b60006128f184828501612652565b91505092915050565b61290381612b1a565b82525050565b61291281612b2c565b82525050565b600061292382612a58565b61292d8185612a6e565b935061293d818560208601612b8e565b61294681612c51565b840191505092915050565b600061295c82612a63565b6129668185612a7f565b9350612976818560208601612b8e565b61297f81612c51565b840191505092915050565b61299381612b84565b82525050565b60006020820190506129ae60008301846128fa565b92915050565b60006080820190506129c960008301876128fa565b6129d660208301866128fa565b6129e3604083018561298a565b81810360608301526129f58184612918565b905095945050505050565b6000602082019050612a156000830184612909565b92915050565b60006020820190508181036000830152612a358184612951565b905092915050565b6000602082019050612a52600083018461298a565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612a9b82612b84565b9150612aa683612b84565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612adb57612ada612bf3565b5b828201905092915050565b6000612af182612b84565b9150612afc83612b84565b925082821015612b0f57612b0e612bf3565b5b828203905092915050565b6000612b2582612b64565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015612bac578082015181840152602081019050612b91565b83811115612bbb576000848401525b50505050565b60006002820490506001821680612bd957607f821691505b60208210811415612bed57612bec612c22565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b612c6b81612b1a565b8114612c7657600080fd5b50565b612c8281612b2c565b8114612c8d57600080fd5b50565b612c9981612b38565b8114612ca457600080fd5b50565b612cb081612b84565b8114612cbb57600080fd5b5056fea26469706673582212207bfb65c073fe3025d75e6f598084c579e3d40fdd1e9dd7f6c1e83553b5a6fda864736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c80638da5cb5b116100a2578063c87b56dd11610071578063c87b56dd146102df578063d3fc98641461030f578063e985e9c51461032b578063f2fde38b1461035b578063f3fe3bc31461037757610116565b80638da5cb5b1461026b57806395d89b4114610289578063a22cb465146102a7578063b88d4fde146102c357610116565b806323b872dd116100e957806323b872dd146101b557806342842e0e146101d15780636352211e146101ed57806370a082311461021d578063860d248a1461024d57610116565b806301ffc9a71461011b57806306fdde031461014b578063081812fc14610169578063095ea7b314610199575b600080fd5b6101356004803603810190610130919061287f565b610395565b6040516101429190612a00565b60405180910390f35b6101536103fc565b6040516101609190612a1b565b60405180910390f35b610183600480360381019061017e91906128d1565b61048e565b6040516101909190612999565b60405180910390f35b6101b360048036038101906101ae91906127d7565b6105a9565b005b6101cf60048036038101906101ca91906126cc565b61098c565b005b6101eb60048036038101906101e691906126cc565b610dde565b005b610207600480360381019061020291906128d1565b610dfe565b6040516102149190612999565b60405180910390f35b61023760048036038101906102329190612667565b610ee4565b6040516102449190612a3d565b60405180910390f35b610255610f9e565b6040516102629190612a1b565b60405180910390f35b610273610fd7565b6040516102809190612999565b60405180910390f35b610291610ffd565b60405161029e9190612a1b565b60405180910390f35b6102c160048036038101906102bc919061279b565b61108f565b005b6102dd60048036038101906102d8919061271b565b61118c565b005b6102f960048036038101906102f491906128d1565b6111e3565b6040516103069190612a1b565b60405180910390f35b61032960048036038101906103249190612813565b611366565b005b61034560048036038101906103409190612690565b61148d565b6040516103529190612a00565b60405180910390f35b61037560048036038101906103709190612667565b611521565b005b61037f611753565b60405161038c9190612a1b565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606005805461040b90612bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461043790612bc1565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061056c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105639190612a1b565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806106a25750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107109190612a1b565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ed9190612a1b565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030380000000000000000000000000000000000000000000000000000815250906108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd9190612a1b565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610a5d57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610aee5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c9190612a1b565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c399190612a1b565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d189190612a1b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19190612a1b565b60405180910390fd5b50610dd5868661178c565b50505050505050565b610df983838360405180602001604052806000815250611841565b505050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed59190612a1b565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f849190612a1b565b60405180910390fd5b50610f9782611e0f565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461100c90612bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461103890612bc1565b80156110855780601f1061105a57610100808354040283529160200191611085565b820191906000526020600020905b81548152906001019060200180831161106857829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111809190612a00565b60405180910390a35050565b6111dc85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611841565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b89190612a1b565b60405180910390fd5b506007600084815260200190815260200160002080546112e090612bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461130c90612bc1565b80156113595780601f1061132e57610100808354040283529160200191611359565b820191906000526020600020905b81548152906001019060200180831161133c57829003601f168201915b5050505050915050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061142e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114259190612a1b565b60405180910390fd5b506114398484611e58565b6114878383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612046565b50505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e09190612a1b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090611692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116899190612a1b565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506117cd82612150565b6117d78183612189565b6117e183836122f4565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061191257503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806119a35750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a119190612a1b565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee9190612a1b565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd9190612a1b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c769190612a1b565b60405180910390fd5b50611c8a878761178c565b611ca98773ffffffffffffffffffffffffffffffffffffffff1661247c565b15611e055760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401611cef94939291906129b4565b602060405180830381600087803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4191906128a8565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f303033303035000000000000000000000000000000000000000000000000000081525090611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df99190612a1b565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef79190612a1b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd29190612a1b565b60405180910390fd5b50611fe682826122f4565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612122576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121199190612a1b565b60405180910390fd5b508160076000858152602001908152602001600020908051906020019061214a9291906124c7565b50505050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122599190612a1b565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b39190612ae6565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c59190612a1b565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124719190612a90565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156124be5750808214155b92505050919050565b8280546124d390612bc1565b90600052602060002090601f0160209004810192826124f5576000855561253c565b82601f1061250e57805160ff191683800117855561253c565b8280016001018555821561253c579182015b8281111561253b578251825591602001919060010190612520565b5b509050612549919061254d565b5090565b5b8082111561256657600081600090555060010161254e565b5090565b60008135905061257981612c62565b92915050565b60008135905061258e81612c79565b92915050565b6000813590506125a381612c90565b92915050565b6000815190506125b881612c90565b92915050565b60008083601f8401126125d057600080fd5b8235905067ffffffffffffffff8111156125e957600080fd5b60208301915083600182028301111561260157600080fd5b9250929050565b60008083601f84011261261a57600080fd5b8235905067ffffffffffffffff81111561263357600080fd5b60208301915083600182028301111561264b57600080fd5b9250929050565b60008135905061266181612ca7565b92915050565b60006020828403121561267957600080fd5b60006126878482850161256a565b91505092915050565b600080604083850312156126a357600080fd5b60006126b18582860161256a565b92505060206126c28582860161256a565b9150509250929050565b6000806000606084860312156126e157600080fd5b60006126ef8682870161256a565b93505060206127008682870161256a565b925050604061271186828701612652565b9150509250925092565b60008060008060006080868803121561273357600080fd5b60006127418882890161256a565b95505060206127528882890161256a565b945050604061276388828901612652565b935050606086013567ffffffffffffffff81111561278057600080fd5b61278c888289016125be565b92509250509295509295909350565b600080604083850312156127ae57600080fd5b60006127bc8582860161256a565b92505060206127cd8582860161257f565b9150509250929050565b600080604083850312156127ea57600080fd5b60006127f88582860161256a565b925050602061280985828601612652565b9150509250929050565b6000806000806060858703121561282957600080fd5b60006128378782880161256a565b945050602061284887828801612652565b935050604085013567ffffffffffffffff81111561286557600080fd5b61287187828801612608565b925092505092959194509250565b60006020828403121561289157600080fd5b600061289f84828501612594565b91505092915050565b6000602082840312156128ba57600080fd5b60006128c8848285016125a9565b91505092915050565b6000602082840312156128e357600080fd5b60006128f184828501612652565b91505092915050565b61290381612b1a565b82525050565b61291281612b2c565b82525050565b600061292382612a58565b61292d8185612a6e565b935061293d818560208601612b8e565b61294681612c51565b840191505092915050565b600061295c82612a63565b6129668185612a7f565b9350612976818560208601612b8e565b61297f81612c51565b840191505092915050565b61299381612b84565b82525050565b60006020820190506129ae60008301846128fa565b92915050565b60006080820190506129c960008301876128fa565b6129d660208301866128fa565b6129e3604083018561298a565b81810360608301526129f58184612918565b905095945050505050565b6000602082019050612a156000830184612909565b92915050565b60006020820190508181036000830152612a358184612951565b905092915050565b6000602082019050612a52600083018461298a565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612a9b82612b84565b9150612aa683612b84565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612adb57612ada612bf3565b5b828201905092915050565b6000612af182612b84565b9150612afc83612b84565b925082821015612b0f57612b0e612bf3565b5b828203905092915050565b6000612b2582612b64565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015612bac578082015181840152602081019050612b91565b83811115612bbb576000848401525b50505050565b60006002820490506001821680612bd957607f821691505b60208210811415612bed57612bec612c22565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b612c6b81612b1a565b8114612c7657600080fd5b50565b612c8281612b2c565b8114612c8d57600080fd5b50565b612c9981612b38565b8114612ca457600080fd5b50565b612cb081612b84565b8114612cbb57600080fd5b5056fea26469706673582212207bfb65c073fe3025d75e6f598084c579e3d40fdd1e9dd7f6c1e83553b5a6fda864736f6c63430008000033

Deployed Bytecode Sourcemap

217:695:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;712:172:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;928:120:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8151:183:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5936:352;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5162:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4407:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7699:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7225:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;487:65:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;607:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1164:128:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6699:232:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3788:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1445:181:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;708:199:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8603:192:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1432:238:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;431:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;712:172:11;822:4;845:19;:33;865:12;845:33;;;;;;;;;;;;;;;;;;;;;;;;;;;838:40;;712:172;;;:::o;928:120:8:-;996:19;1035:7;1027:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;928:120;:::o;8151:183:9:-;8280:7;8256:8;2751:1;2720:33;;:9;:19;2730:8;2720:19;;;;;;;;;;;;;;;;;;;;;:33;;;;2755:13;;;;;;;;;;;;;;;;;2712:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8306:12:::1;:22;8319:8;8306:22;;;;;;;;;;;;;;;;;;;;;8299:29;;8151:183:::0;;;;:::o;5936:352::-;6049:8;1904:18;1925:9;:19;1935:8;1925:19;;;;;;;;;;;;;;;;;;;;;1904:40;;1981:10;1967:24;;:10;:24;;;:68;;;;1995:16;:28;2012:10;1995:28;;;;;;;;;;;;;;;:40;2024:10;1995:40;;;;;;;;;;;;;;;;;;;;;;;;;1967:68;2044:21;;;;;;;;;;;;;;;;;1951:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6077:8:::1;2751:1;2720:33;;:9;:19;2730:8;2720:19;;;;;;;;;;;;;;;;;;;;;:33;;;;2755:13;;;;;;;;;;;;;;;;::::0;2712:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6097:18:::2;6118:9;:19;6128:8;6118:19;;;;;;;;;;;;;;;;;;;;;6097:40;;6165:10;6152:23;;:9;:23;;;;6177:8;;;;;;;;;;;;;;;;::::0;6144:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6220:9;6195:12;:22;6208:8;6195:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;6273:8;6262:9;6241:41;;6250:10;6241:41;;;;;;;;;;;;2776:1;2079::::1;5936:352:::0;;;;:::o;5162:353::-;5295:8;2284:18;2305:9;:19;2315:8;2305:19;;;;;;;;;;;;;;;;;;;;;2284:40;;2361:10;2347:24;;:10;:24;;;:71;;;;2408:10;2382:36;;:12;:22;2395:8;2382:22;;;;;;;;;;;;;;;;;;;;;:36;;;2347:71;:122;;;;2429:16;:28;2446:10;2429:28;;;;;;;;;;;;;;;:40;2458:10;2429:40;;;;;;;;;;;;;;;;;;;;;;;;;2347:122;2478:30;;;;;;;;;;;;;;;;;2331:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5323:8:::1;2751:1;2720:33;;:9;:19;2730:8;2720:19;;;;;;;;;;;;;;;;;;;;;:33;;;;2755:13;;;;;;;;;;;;;;;;::::0;2712:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5343:18:::2;5364:9;:19;5374:8;5364:19;;;;;;;;;;;;;;;;;;;;;5343:40;;5412:5;5398:19;;:10;:19;;;5419:9;;;;;;;;;;;;;;;;::::0;5390:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5459:1;5444:17;;:3;:17;;;;5463:12;;;;;;;;;;;;;;;;::::0;5436:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5485:24;5495:3;5500:8;5485:9;:24::i;:::-;2776:1;2522::::1;5162:353:::0;;;;;:::o;4407:179::-;4537:43;4555:5;4562:3;4567:8;4537:43;;;;;;;;;;;;:17;:43::i;:::-;4407:179;;;:::o;7699:208::-;7796:14;7831:9;:19;7841:8;7831:19;;;;;;;;;;;;;;;;;;;;;7822:28;;7883:1;7865:20;;:6;:20;;;;7887:13;;;;;;;;;;;;;;;;;7857:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7699:208;;;:::o;7225:204::-;7322:7;7367:1;7349:20;;:6;:20;;;;7371:12;;;;;;;;;;;;;;;;;7341:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7398:25;7416:6;7398:17;:25::i;:::-;7391:32;;7225:204;;;:::o;487:65:10:-;;;;;;;;;;;;;;;;;;;:::o;607:20::-;;;;;;;;;;;;;:::o;1164:128:8:-;1234:21;1277:9;1267:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1164:128;:::o;6699:232:9:-;6856:9;6814:16;:28;6831:10;6814:28;;;;;;;;;;;;;;;:39;6843:9;6814:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;6904:9;6877:48;;6892:10;6877:48;;;6915:9;6877:48;;;;;;:::i;:::-;;;;;;;;6699:232;;:::o;3788:209::-;3945:46;3963:5;3970:3;3975:8;3985:5;;3945:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;3788:209;;;;;:::o;1445:181:8:-;1571:13;1547:8;2751:1:9;2720:33;;:9;:19;2730:8;2720:19;;;;;;;;;;;;;;;;;;;;;:33;;;;2755:13;;;;;;;;;;;;;;;;;2712:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1603:7:8::1;:17;1611:8;1603:17;;;;;;;;;;;1596:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1445:181:::0;;;;:::o;708:199:1:-;1225:5:10;;;;;;;;;;;1211:19;;:10;:19;;;1232:17;;;;;;;;;;;;;;;;;1203:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;834:26:1::1;846:3;851:8;834:11;:26::i;:::-;867:34;886:8;896:4;;867:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:34::i;:::-;708:199:::0;;;;:::o;8603:192:9:-;8731:4;8754:16;:24;8771:6;8754:24;;;;;;;;;;;;;;;:35;8779:9;8754:35;;;;;;;;;;;;;;;;;;;;;;;;;8747:42;;8603:192;;;;:::o;1432:238:10:-;1225:5;;;;;;;;;;;1211:19;;:10;:19;;;1232:17;;;;;;;;;;;;;;;;;1203:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1554:1:::1;1533:23;;:9;:23;;;;1558:31;;;;;;;;;;;;;;;;::::0;1525:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1630:9;1602:38;;1623:5;;;;;;;;;;;1602:38;;;;;;;;;;;;1655:9;1647:5;;:17;;;;;;;;;;;;;;;;;;1432:238:::0;:::o;431:51::-;;;;;;;;;;;;;;;;;;;:::o;8986:275:9:-;9075:12;9090:9;:19;9100:8;9090:19;;;;;;;;;;;;;;;;;;;;;9075:34;;9116:24;9131:8;9116:14;:24::i;:::-;9149:30;9164:4;9170:8;9149:14;:30::i;:::-;9186:26;9198:3;9203:8;9186:11;:26::i;:::-;9246:8;9241:3;9226:29;;9235:4;9226:29;;;;;;;;;;;;8986:275;;;:::o;12388:590::-;12536:8;2284:18;2305:9;:19;2315:8;2305:19;;;;;;;;;;;;;;;;;;;;;2284:40;;2361:10;2347:24;;:10;:24;;;:71;;;;2408:10;2382:36;;:12;:22;2395:8;2382:22;;;;;;;;;;;;;;;;;;;;;:36;;;2347:71;:122;;;;2429:16;:28;2446:10;2429:28;;;;;;;;;;;;;;;:40;2458:10;2429:40;;;;;;;;;;;;;;;;;;;;;;;;;2347:122;2478:30;;;;;;;;;;;;;;;;;2331:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12564:8:::1;2751:1;2720:33;;:9;:19;2730:8;2720:19;;;;;;;;;;;;;;;;;;;;;:33;;;;2755:13;;;;;;;;;;;;;;;;::::0;2712:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12584:18:::2;12605:9;:19;12615:8;12605:19;;;;;;;;;;;;;;;;;;;;;12584:40;;12653:5;12639:19;;:10;:19;;;12660:9;;;;;;;;;;;;;;;;::::0;12631:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12700:1;12685:17;;:3;:17;;;;12704:12;;;;;;;;;;;;;;;;::::0;12677:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12726:24;12736:3;12741:8;12726:9;:24::i;:::-;12763:16;:3;:14;;;:16::i;:::-;12759:214;;;12795:13;12831:3;12811:41;;;12853:10;12865:5;12872:8;12882:5;12811:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12795:93;;1122:10;12915:24;;12905:34;;;:6;:34;;;;12941:23;;;;;;;;;;;;;;;;::::0;12897:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12759:214;;2776:1;2522::::1;12388:590:::0;;;;;;:::o;11947:163::-;12051:7;12077:19;:27;12097:6;12077:27;;;;;;;;;;;;;;;;12070:34;;11947:163;;;:::o;9652:297::-;9773:1;9758:17;;:3;:17;;;;9777:12;;;;;;;;;;;;;;;;;9750:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;9836:1;9805:33;;:9;:19;9815:8;9805:19;;;;;;;;;;;;;;;;;;;;;:33;;;9840:18;;;;;;;;;;;;;;;;;9797:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;9868:26;9880:3;9885:8;9868:11;:26::i;:::-;9934:8;9929:3;9908:35;;9925:1;9908:35;;;;;;;;;;;;9652:297;;:::o;2578:157:8:-;2685:8;2751:1:9;2720:33;;:9;:19;2730:8;2720:19;;;;;;;;;;;;;;;;;;;;;:33;;;;2755:13;;;;;;;;;;;;;;;;;2712:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2725:4:8::1;2705:7;:17;2713:8;2705:17;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;2578:157:::0;;;:::o;13111:110:9:-;13193:12;:22;13206:8;13193:22;;;;;;;;;;;;13186:29;;;;;;;;;;;13111:110;:::o;10909:234::-;11049:5;11026:28;;:9;:19;11036:8;11026:19;;;;;;;;;;;;;;;;;;;;;:28;;;11056:9;;;;;;;;;;;;;;;;;11018:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11103:1;11073:19;:26;11093:5;11073:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;11118:9;:19;11128:8;11118:19;;;;;;;;;;;;11111:26;;;;;;;;;;;10909:234;;:::o;11410:242::-;11553:1;11522:33;;:9;:19;11532:8;11522:19;;;;;;;;;;;;;;;;;;;;;:33;;;11557:18;;;;;;;;;;;;;;;;;11514:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11607:3;11585:9;:19;11595:8;11585:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;11645:1;11617:19;:24;11637:3;11617:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;11410:242;;:::o;483:780:0:-;566:17;1007:16;1030:19;1052:66;1030:88;;;;1160:5;1148:18;1136:30;;1226:3;1214:15;;:8;:15;;:42;;;;;1245:11;1233:8;:23;;1214:42;1198:59;;483:780;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:12:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;;374:6;361:20;352:29;;390:32;416:5;390:32;:::i;:::-;342:86;;;;:::o;434:141::-;;521:6;515:13;506:22;;537:32;563:5;537:32;:::i;:::-;496:79;;;;:::o;594:351::-;;;711:3;704:4;696:6;692:17;688:27;678:2;;729:1;726;719:12;678:2;765:6;752:20;742:30;;795:18;787:6;784:30;781:2;;;827:1;824;817:12;781:2;864:4;856:6;852:17;840:29;;918:3;910:4;902:6;898:17;888:8;884:32;881:41;878:2;;;935:1;932;925:12;878:2;668:277;;;;;:::o;965:352::-;;;1083:3;1076:4;1068:6;1064:17;1060:27;1050:2;;1101:1;1098;1091:12;1050:2;1137:6;1124:20;1114:30;;1167:18;1159:6;1156:30;1153:2;;;1199:1;1196;1189:12;1153:2;1236:4;1228:6;1224:17;1212:29;;1290:3;1282:4;1274:6;1270:17;1260:8;1256:32;1253:41;1250:2;;;1307:1;1304;1297:12;1250:2;1040:277;;;;;:::o;1323:139::-;;1407:6;1394:20;1385:29;;1423:33;1450:5;1423:33;:::i;:::-;1375:87;;;;:::o;1468:262::-;;1576:2;1564:9;1555:7;1551:23;1547:32;1544:2;;;1592:1;1589;1582:12;1544:2;1635:1;1660:53;1705:7;1696:6;1685:9;1681:22;1660:53;:::i;:::-;1650:63;;1606:117;1534:196;;;;:::o;1736:407::-;;;1861:2;1849:9;1840:7;1836:23;1832:32;1829:2;;;1877:1;1874;1867:12;1829:2;1920:1;1945:53;1990:7;1981:6;1970:9;1966:22;1945:53;:::i;:::-;1935:63;;1891:117;2047:2;2073:53;2118:7;2109:6;2098:9;2094:22;2073:53;:::i;:::-;2063:63;;2018:118;1819:324;;;;;:::o;2149:552::-;;;;2291:2;2279:9;2270:7;2266:23;2262:32;2259:2;;;2307:1;2304;2297:12;2259:2;2350:1;2375:53;2420:7;2411:6;2400:9;2396:22;2375:53;:::i;:::-;2365:63;;2321:117;2477:2;2503:53;2548:7;2539:6;2528:9;2524:22;2503:53;:::i;:::-;2493:63;;2448:118;2605:2;2631:53;2676:7;2667:6;2656:9;2652:22;2631:53;:::i;:::-;2621:63;;2576:118;2249:452;;;;;:::o;2707:829::-;;;;;;2885:3;2873:9;2864:7;2860:23;2856:33;2853:2;;;2902:1;2899;2892:12;2853:2;2945:1;2970:53;3015:7;3006:6;2995:9;2991:22;2970:53;:::i;:::-;2960:63;;2916:117;3072:2;3098:53;3143:7;3134:6;3123:9;3119:22;3098:53;:::i;:::-;3088:63;;3043:118;3200:2;3226:53;3271:7;3262:6;3251:9;3247:22;3226:53;:::i;:::-;3216:63;;3171:118;3356:2;3345:9;3341:18;3328:32;3387:18;3379:6;3376:30;3373:2;;;3419:1;3416;3409:12;3373:2;3455:64;3511:7;3502:6;3491:9;3487:22;3455:64;:::i;:::-;3437:82;;;;3299:230;2843:693;;;;;;;;:::o;3542:401::-;;;3664:2;3652:9;3643:7;3639:23;3635:32;3632:2;;;3680:1;3677;3670:12;3632:2;3723:1;3748:53;3793:7;3784:6;3773:9;3769:22;3748:53;:::i;:::-;3738:63;;3694:117;3850:2;3876:50;3918:7;3909:6;3898:9;3894:22;3876:50;:::i;:::-;3866:60;;3821:115;3622:321;;;;;:::o;3949:407::-;;;4074:2;4062:9;4053:7;4049:23;4045:32;4042:2;;;4090:1;4087;4080:12;4042:2;4133:1;4158:53;4203:7;4194:6;4183:9;4179:22;4158:53;:::i;:::-;4148:63;;4104:117;4260:2;4286:53;4331:7;4322:6;4311:9;4307:22;4286:53;:::i;:::-;4276:63;;4231:118;4032:324;;;;;:::o;4362:685::-;;;;;4524:2;4512:9;4503:7;4499:23;4495:32;4492:2;;;4540:1;4537;4530:12;4492:2;4583:1;4608:53;4653:7;4644:6;4633:9;4629:22;4608:53;:::i;:::-;4598:63;;4554:117;4710:2;4736:53;4781:7;4772:6;4761:9;4757:22;4736:53;:::i;:::-;4726:63;;4681:118;4866:2;4855:9;4851:18;4838:32;4897:18;4889:6;4886:30;4883:2;;;4929:1;4926;4919:12;4883:2;4965:65;5022:7;5013:6;5002:9;4998:22;4965:65;:::i;:::-;4947:83;;;;4809:231;4482:565;;;;;;;:::o;5053:260::-;;5160:2;5148:9;5139:7;5135:23;5131:32;5128:2;;;5176:1;5173;5166:12;5128:2;5219:1;5244:52;5288:7;5279:6;5268:9;5264:22;5244:52;:::i;:::-;5234:62;;5190:116;5118:195;;;;:::o;5319:282::-;;5437:2;5425:9;5416:7;5412:23;5408:32;5405:2;;;5453:1;5450;5443:12;5405:2;5496:1;5521:63;5576:7;5567:6;5556:9;5552:22;5521:63;:::i;:::-;5511:73;;5467:127;5395:206;;;;:::o;5607:262::-;;5715:2;5703:9;5694:7;5690:23;5686:32;5683:2;;;5731:1;5728;5721:12;5683:2;5774:1;5799:53;5844:7;5835:6;5824:9;5820:22;5799:53;:::i;:::-;5789:63;;5745:117;5673:196;;;;:::o;5875:118::-;5962:24;5980:5;5962:24;:::i;:::-;5957:3;5950:37;5940:53;;:::o;5999:109::-;6080:21;6095:5;6080:21;:::i;:::-;6075:3;6068:34;6058:50;;:::o;6114:360::-;;6228:38;6260:5;6228:38;:::i;:::-;6282:70;6345:6;6340:3;6282:70;:::i;:::-;6275:77;;6361:52;6406:6;6401:3;6394:4;6387:5;6383:16;6361:52;:::i;:::-;6438:29;6460:6;6438:29;:::i;:::-;6433:3;6429:39;6422:46;;6204:270;;;;;:::o;6480:364::-;;6596:39;6629:5;6596:39;:::i;:::-;6651:71;6715:6;6710:3;6651:71;:::i;:::-;6644:78;;6731:52;6776:6;6771:3;6764:4;6757:5;6753:16;6731:52;:::i;:::-;6808:29;6830:6;6808:29;:::i;:::-;6803:3;6799:39;6792:46;;6572:272;;;;;:::o;6850:118::-;6937:24;6955:5;6937:24;:::i;:::-;6932:3;6925:37;6915:53;;:::o;6974:222::-;;7105:2;7094:9;7090:18;7082:26;;7118:71;7186:1;7175:9;7171:17;7162:6;7118:71;:::i;:::-;7072:124;;;;:::o;7202:640::-;;7435:3;7424:9;7420:19;7412:27;;7449:71;7517:1;7506:9;7502:17;7493:6;7449:71;:::i;:::-;7530:72;7598:2;7587:9;7583:18;7574:6;7530:72;:::i;:::-;7612;7680:2;7669:9;7665:18;7656:6;7612:72;:::i;:::-;7731:9;7725:4;7721:20;7716:2;7705:9;7701:18;7694:48;7759:76;7830:4;7821:6;7759:76;:::i;:::-;7751:84;;7402:440;;;;;;;:::o;7848:210::-;;7973:2;7962:9;7958:18;7950:26;;7986:65;8048:1;8037:9;8033:17;8024:6;7986:65;:::i;:::-;7940:118;;;;:::o;8064:313::-;;8215:2;8204:9;8200:18;8192:26;;8264:9;8258:4;8254:20;8250:1;8239:9;8235:17;8228:47;8292:78;8365:4;8356:6;8292:78;:::i;:::-;8284:86;;8182:195;;;;:::o;8383:222::-;;8514:2;8503:9;8499:18;8491:26;;8527:71;8595:1;8584:9;8580:17;8571:6;8527:71;:::i;:::-;8481:124;;;;:::o;8611:98::-;;8696:5;8690:12;8680:22;;8669:40;;;:::o;8715:99::-;;8801:5;8795:12;8785:22;;8774:40;;;:::o;8820:168::-;;8937:6;8932:3;8925:19;8977:4;8972:3;8968:14;8953:29;;8915:73;;;;:::o;8994:169::-;;9112:6;9107:3;9100:19;9152:4;9147:3;9143:14;9128:29;;9090:73;;;;:::o;9169:305::-;;9228:20;9246:1;9228:20;:::i;:::-;9223:25;;9262:20;9280:1;9262:20;:::i;:::-;9257:25;;9416:1;9348:66;9344:74;9341:1;9338:81;9335:2;;;9422:18;;:::i;:::-;9335:2;9466:1;9463;9459:9;9452:16;;9213:261;;;;:::o;9480:191::-;;9540:20;9558:1;9540:20;:::i;:::-;9535:25;;9574:20;9592:1;9574:20;:::i;:::-;9569:25;;9613:1;9610;9607:8;9604:2;;;9618:18;;:::i;:::-;9604:2;9663:1;9660;9656:9;9648:17;;9525:146;;;;:::o;9677:96::-;;9743:24;9761:5;9743:24;:::i;:::-;9732:35;;9722:51;;;:::o;9779:90::-;;9856:5;9849:13;9842:21;9831:32;;9821:48;;;:::o;9875:149::-;;9951:66;9944:5;9940:78;9929:89;;9919:105;;;:::o;10030:126::-;;10107:42;10100:5;10096:54;10085:65;;10075:81;;;:::o;10162:77::-;;10228:5;10217:16;;10207:32;;;:::o;10245:307::-;10313:1;10323:113;10337:6;10334:1;10331:13;10323:113;;;10422:1;10417:3;10413:11;10407:18;10403:1;10398:3;10394:11;10387:39;10359:2;10356:1;10352:10;10347:15;;10323:113;;;10454:6;10451:1;10448:13;10445:2;;;10534:1;10525:6;10520:3;10516:16;10509:27;10445:2;10294:258;;;;:::o;10558:320::-;;10639:1;10633:4;10629:12;10619:22;;10686:1;10680:4;10676:12;10707:18;10697:2;;10763:4;10755:6;10751:17;10741:27;;10697:2;10825;10817:6;10814:14;10794:18;10791:38;10788:2;;;10844:18;;:::i;:::-;10788:2;10609:269;;;;:::o;10884:180::-;10932:77;10929:1;10922:88;11029:4;11026:1;11019:15;11053:4;11050:1;11043:15;11070:180;11118:77;11115:1;11108:88;11215:4;11212:1;11205:15;11239:4;11236:1;11229:15;11256:102;;11348:2;11344:7;11339:2;11332:5;11328:14;11324:28;11314:38;;11304:54;;;:::o;11364:122::-;11437:24;11455:5;11437:24;:::i;:::-;11430:5;11427:35;11417:2;;11476:1;11473;11466:12;11417:2;11407:79;:::o;11492:116::-;11562:21;11577:5;11562:21;:::i;:::-;11555:5;11552:32;11542:2;;11598:1;11595;11588:12;11542:2;11532:76;:::o;11614:120::-;11686:23;11703:5;11686:23;:::i;:::-;11679:5;11676:34;11666:2;;11724:1;11721;11714:12;11666:2;11656:78;:::o;11740:122::-;11813:24;11831:5;11813:24;:::i;:::-;11806:5;11803:35;11793:2;;11852:1;11849;11842:12;11793:2;11783:79;:::o

Swarm Source

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