ETH Price: $2,883.05 (+7.15%)
 

Overview

Max Total Supply

511 BEEPLESPRINGCOLLECTION

Holders

247

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BEEPLESPRINGCOLLECTION
0xb3b391997f16662b7e16871368cdd105fcccb98e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Beeple is Mike Winkelmann, a graphic designer from Charleston, SC, USA who does a variety of digital artwork including short films, Creative Commons VJ loops, everydays and VR / AR work. He has done work for Apple, Space X, Nike, Coca-Cola, Adobe, Pepsi, Samsung and many more.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BeepleSpringCollection

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-27
*/

pragma solidity ^0.5.0;

/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
contract Context {
   // Empty internal constructor, to prevent people from mistakenly deploying
   // an instance of this contract, which should be used via inheritance.
   constructor () internal { }
   // solhint-disable-previous-line no-empty-blocks

   function _msgSender() internal view returns (address payable) {
       return msg.sender;
   }

   function _msgData() internal view returns (bytes memory) {
       this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
       return msg.data;
   }
}

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

/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
contract ERC165 is IERC165 {
   /*
    * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
    */
   bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

   /**
    * @dev Mapping of interface ids to whether or not it's supported.
    */
   mapping(bytes4 => bool) private _supportedInterfaces;

   constructor () internal {
       // Derived contracts need only register support for their own interfaces,
       // we register support for ERC165 itself here
       _registerInterface(_INTERFACE_ID_ERC165);
   }

   /**
    * @dev See {IERC165-supportsInterface}.
    *
    * Time complexity O(1), guaranteed to always use less than 30 000 gas.
    */
   function supportsInterface(bytes4 interfaceId) external view returns (bool) {
       return _supportedInterfaces[interfaceId];
   }

   /**
    * @dev Registers the contract as an implementer of the interface defined by
    * `interfaceId`. Support of the actual ERC165 interface is automatic and
    * registering its interface id is not required.
    *
    * See {IERC165-supportsInterface}.
    *
    * Requirements:
    *
    * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
    */
   function _registerInterface(bytes4 interfaceId) internal {
       require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
       _supportedInterfaces[interfaceId] = true;
   }
}

/**
* @dev Required interface of an ERC721 compliant contract.
*/
contract IERC721 is IERC165 {
   event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
   event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
   event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

   /**
    * @dev Returns the owner of the NFT specified by `tokenId`.
    */
   function ownerOf(uint256 tokenId) public view returns (address owner);

   /**
    * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
    * another (`to`).
    *
    *
    *
    * Requirements:
    * - `from`, `to` cannot be zero.
    * - `tokenId` must be owned by `from`.
    * - If the caller is not `from`, it must be have been allowed to move this
    * NFT by either {approve} or {setApprovalForAll}.
    */
   function safeTransferFrom(address from, address to, uint256 tokenId) public;
   /**
    * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
    * another (`to`).
    *
    * Requirements:
    * - If the caller is not `from`, it must be approved to move this NFT by
    * either {approve} or {setApprovalForAll}.
    */
   function transferFrom(address from, address to, uint256 tokenId) public;
   function approve(address to, uint256 tokenId) public;
   function getApproved(uint256 tokenId) public view returns (address operator);

   function setApprovalForAll(address operator, bool _approved) public;
   function isApprovedForAll(address owner, address operator) public view returns (bool);


   function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
contract IERC721Receiver {
   /**
    * @notice Handle the receipt of an NFT
    * @dev The ERC721 smart contract calls this function on the recipient
    * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
    * otherwise the caller will revert the transaction. The selector to be
    * returned can be obtained as `this.onERC721Received.selector`. This
    * function MAY throw to revert and reject the transfer.
    * Note: the ERC721 contract address is always the message sender.
    * @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 bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    */
   function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
   public returns (bytes4);
}

/**
* @title ERC721 Non-Fungible Token Standard basic implementation
* @dev see https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721 is Context, ERC165, IERC721 {
   using SafeMath for uint256;
   using Address for address;
   using Counters for Counters.Counter;

   // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
   // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
   bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

   // Mapping from token ID to owner
   mapping (uint256 => address) private _tokenOwner;

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

   // Mapping from owner to number of owned token
   mapping (address => Counters.Counter) private _ownedTokensCount;

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

   /*
    *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
    *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
    *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
    *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
    *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
    *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
    *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
    *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
    *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
    *
    *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
    *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
    */
   bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

   constructor () public {
       // register the supported interfaces to conform to ERC721 via ERC165
       _registerInterface(_INTERFACE_ID_ERC721);
   }

   /**
    * @dev Gets the balance of the specified address.
    * @param owner address to query the balance of
    * @return uint256 representing the amount owned by the passed address
    */
   function balanceOf(address owner) public view returns (uint256) {
       require(owner != address(0), "ERC721: balance query for the zero address");

       return _ownedTokensCount[owner].current();
   }

   /**
    * @dev Gets the owner of the specified token ID.
    * @param tokenId uint256 ID of the token to query the owner of
    * @return address currently marked as the owner of the given token ID
    */
   function ownerOf(uint256 tokenId) public view returns (address) {
       address owner = _tokenOwner[tokenId];
       require(owner != address(0), "ERC721: owner query for nonexistent token");

       return owner;
   }

   /**
    * @dev Approves another address to transfer the given token ID
    * The zero address indicates there is no approved address.
    * There can only be one approved address per token at a given time.
    * Can only be called by the token owner or an approved operator.
    * @param to address to be approved for the given token ID
    * @param tokenId uint256 ID of the token to be approved
    */
   function approve(address to, uint256 tokenId) public {
       address owner = ownerOf(tokenId);
       require(to != owner, "ERC721: approval to current owner");

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

       _tokenApprovals[tokenId] = to;
       emit Approval(owner, to, tokenId);
   }

   /**
    * @dev Gets the approved address for a token ID, or zero if no address set
    * Reverts if the token ID does not exist.
    * @param tokenId uint256 ID of the token to query the approval of
    * @return address currently approved for the given token ID
    */
   function getApproved(uint256 tokenId) public view returns (address) {
       require(_exists(tokenId), "ERC721: approved query for nonexistent token");

       return _tokenApprovals[tokenId];
   }

   /**
    * @dev Sets or unsets the approval of a given operator
    * An operator is allowed to transfer all tokens of the sender on their behalf.
    * @param to operator address to set the approval
    * @param approved representing the status of the approval to be set
    */
   function setApprovalForAll(address to, bool approved) public {
       require(to != _msgSender(), "ERC721: approve to caller");

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

   /**
    * @dev Tells whether an operator is approved by a given owner.
    * @param owner owner address which you want to query the approval of
    * @param operator operator address which you want to query the approval of
    * @return bool whether the given operator is approved by the given owner
    */
   function isApprovedForAll(address owner, address operator) public view returns (bool) {
       return _operatorApprovals[owner][operator];
   }

   /**
    * @dev Transfers the ownership of a given token ID to another address.
    * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
    * Requires the msg.sender to be the owner, approved, or operator.
    * @param from current owner of the token
    * @param to address to receive the ownership of the given token ID
    * @param tokenId uint256 ID of the token to be transferred
    */
   function transferFrom(address from, address to, uint256 tokenId) public {
       //solhint-disable-next-line max-line-length
       require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

       _transferFrom(from, to, tokenId);
   }

   /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
    * which is called upon a safe transfer, and return the magic value
    * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    * the transfer is reverted.
    * Requires the msg.sender to be the owner, approved, or operator
    * @param from current owner of the token
    * @param to address to receive the ownership of the given token ID
    * @param tokenId uint256 ID of the token to be transferred
    */
   function safeTransferFrom(address from, address to, uint256 tokenId) public {
       safeTransferFrom(from, to, tokenId, "");
   }

   /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
    * which is called upon a safe transfer, and return the magic value
    * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    * the transfer is reverted.
    * Requires the _msgSender() to be the owner, approved, or operator
    * @param from current owner of the token
    * @param to address to receive the ownership of the given token ID
    * @param tokenId uint256 ID of the token to be transferred
    * @param _data bytes data to send along with a safe transfer check
    */
   function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
       require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
       _safeTransferFrom(from, to, tokenId, _data);
   }

   /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * If the target address is a contract, it must implement `onERC721Received`,
    * which is called upon a safe transfer, and return the magic value
    * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    * the transfer is reverted.
    * Requires the msg.sender to be the owner, approved, or operator
    * @param from current owner of the token
    * @param to address to receive the ownership of the given token ID
    * @param tokenId uint256 ID of the token to be transferred
    * @param _data bytes data to send along with a safe transfer check
    */
   function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal {
       _transferFrom(from, to, tokenId);
       require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
   }

   /**
    * @dev Returns whether the specified token exists.
    * @param tokenId uint256 ID of the token to query the existence of
    * @return bool whether the token exists
    */
   function _exists(uint256 tokenId) internal view returns (bool) {
       address owner = _tokenOwner[tokenId];
       return owner != address(0);
   }

   /**
    * @dev Returns whether the given spender can transfer a given token ID.
    * @param spender address of the spender to query
    * @param tokenId uint256 ID of the token to be transferred
    * @return bool whether the msg.sender is approved for the given token ID,
    * is an operator of the owner, or is the owner of the token
    */
   function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
       require(_exists(tokenId), "ERC721: operator query for nonexistent token");
       address owner = ownerOf(tokenId);
       return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
   }

   /**
    * @dev Internal function to safely mint a new token.
    * Reverts if the given token ID already exists.
    * If the target address is a contract, it must implement `onERC721Received`,
    * which is called upon a safe transfer, and return the magic value
    * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    * the transfer is reverted.
    * @param to The address that will own the minted token
    * @param tokenId uint256 ID of the token to be minted
    */
   function _safeMint(address to, uint256 tokenId) internal {
       _safeMint(to, tokenId, "");
   }

   /**
    * @dev Internal function to safely mint a new token.
    * Reverts if the given token ID already exists.
    * If the target address is a contract, it must implement `onERC721Received`,
    * which is called upon a safe transfer, and return the magic value
    * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    * the transfer is reverted.
    * @param to The address that will own the minted token
    * @param tokenId uint256 ID of the token to be minted
    * @param _data bytes data to send along with a safe transfer check
    */
   function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
       _mint(to, tokenId);
       require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
   }

   /**
    * @dev Internal function to mint a new token.
    * Reverts if the given token ID already exists.
    * @param to The address that will own the minted token
    * @param tokenId uint256 ID of the token to be minted
    */
   function _mint(address to, uint256 tokenId) internal {
       require(to != address(0), "ERC721: mint to the zero address");
       require(!_exists(tokenId), "ERC721: token already minted");

       _tokenOwner[tokenId] = to;
       _ownedTokensCount[to].increment();

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

   /**
    * @dev Internal function to burn a specific token.
    * Reverts if the token does not exist.
    * Deprecated, use {_burn} instead.
    * @param owner owner of the token to burn
    * @param tokenId uint256 ID of the token being burned
    */
   function _burn(address owner, uint256 tokenId) internal {
       require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

       _clearApproval(tokenId);

       _ownedTokensCount[owner].decrement();
       _tokenOwner[tokenId] = address(0);

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

   /**
    * @dev Internal function to burn a specific token.
    * Reverts if the token does not exist.
    * @param tokenId uint256 ID of the token being burned
    */
   function _burn(uint256 tokenId) internal {
       _burn(ownerOf(tokenId), tokenId);
   }

   /**
    * @dev Internal function to transfer ownership of a given token ID to another address.
    * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
    * @param from current owner of the token
    * @param to address to receive the ownership of the given token ID
    * @param tokenId uint256 ID of the token to be transferred
    */
   function _transferFrom(address from, address to, uint256 tokenId) internal {
       require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
       require(to != address(0), "ERC721: transfer to the zero address");

       _clearApproval(tokenId);

       _ownedTokensCount[from].decrement();
       _ownedTokensCount[to].increment();

       _tokenOwner[tokenId] = to;

       emit Transfer(from, to, tokenId);
   }

   /**
    * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
    * The call is not executed if the target address is not a contract.
    *
    * This function is deprecated.
    * @param from address representing the previous owner of the given token ID
    * @param to target address that will receive the tokens
    * @param tokenId uint256 ID of the token to be transferred
    * @param _data bytes optional data to send along with the call
    * @return bool whether the call correctly returned the expected magic value
    */
   function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
       internal returns (bool)
   {
       if (!to.isContract()) {
           return true;
       }

       bytes4 retval = IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data);
       return (retval == _ERC721_RECEIVED);
   }

   /**
    * @dev Private function to clear current approval of a given token ID.
    * @param tokenId uint256 ID of the token to be transferred
    */
   function _clearApproval(uint256 tokenId) private {
       if (_tokenApprovals[tokenId] != address(0)) {
           _tokenApprovals[tokenId] = address(0);
       }
   }
}

/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
contract IERC721Enumerable is IERC721 {
   function totalSupply() public view returns (uint256);
   function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

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

/**
* @title ERC-721 Non-Fungible Token with optional enumeration extension logic
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable {
   // Mapping from owner to list of owned token IDs
   mapping(address => uint256[]) private _ownedTokens;

   // Mapping from token ID to index of the owner tokens list
   mapping(uint256 => uint256) private _ownedTokensIndex;

   // Array with all token ids, used for enumeration
   uint256[] private _allTokens;

   // Mapping from token id to position in the allTokens array
   mapping(uint256 => uint256) private _allTokensIndex;

   /*
    *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
    *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
    *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
    *
    *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
    */
   bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

   /**
    * @dev Constructor function.
    */
   constructor () public {
       // register the supported interface to conform to ERC721Enumerable via ERC165
       _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
   }

   /**
    * @dev Gets the token ID at a given index of the tokens list of the requested owner.
    * @param owner address owning the tokens list to be accessed
    * @param index uint256 representing the index to be accessed of the requested tokens list
    * @return uint256 token ID at the given index of the tokens list owned by the requested address
    */
   function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
       require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
       return _ownedTokens[owner][index];
   }

   /**
    * @dev Gets the total amount of tokens stored by the contract.
    * @return uint256 representing the total amount of tokens
    */
   function totalSupply() public view returns (uint256) {
       return _allTokens.length;
   }

   /**
    * @dev Gets the token ID at a given index of all the tokens in this contract
    * Reverts if the index is greater or equal to the total number of tokens.
    * @param index uint256 representing the index to be accessed of the tokens list
    * @return uint256 token ID at the given index of the tokens list
    */
   function tokenByIndex(uint256 index) public view returns (uint256) {
       require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
       return _allTokens[index];
   }

   /**
    * @dev Internal function to transfer ownership of a given token ID to another address.
    * As opposed to transferFrom, this imposes no restrictions on msg.sender.
    * @param from current owner of the token
    * @param to address to receive the ownership of the given token ID
    * @param tokenId uint256 ID of the token to be transferred
    */
   function _transferFrom(address from, address to, uint256 tokenId) internal {
       super._transferFrom(from, to, tokenId);

       _removeTokenFromOwnerEnumeration(from, tokenId);

       _addTokenToOwnerEnumeration(to, tokenId);
   }

   /**
    * @dev Internal function to mint a new token.
    * Reverts if the given token ID already exists.
    * @param to address the beneficiary that will own the minted token
    * @param tokenId uint256 ID of the token to be minted
    */
   function _mint(address to, uint256 tokenId) internal {
       super._mint(to, tokenId);

       _addTokenToOwnerEnumeration(to, tokenId);

       _addTokenToAllTokensEnumeration(tokenId);
   }

   /**
    * @dev Internal function to burn a specific token.
    * Reverts if the token does not exist.
    * Deprecated, use {ERC721-_burn} instead.
    * @param owner owner of the token to burn
    * @param tokenId uint256 ID of the token being burned
    */
   function _burn(address owner, uint256 tokenId) internal {
       super._burn(owner, tokenId);

       _removeTokenFromOwnerEnumeration(owner, tokenId);
       // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
       _ownedTokensIndex[tokenId] = 0;

       _removeTokenFromAllTokensEnumeration(tokenId);
   }

   /**
    * @dev Gets the list of token IDs of the requested owner.
    * @param owner address owning the tokens
    * @return uint256[] List of token IDs owned by the requested address
    */
   function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
       return _ownedTokens[owner];
   }

   /**
    * @dev Private function to add a token to this extension's ownership-tracking data structures.
    * @param to address representing the new owner of the given token ID
    * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
    */
   function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
       _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
       _ownedTokens[to].push(tokenId);
   }

   /**
    * @dev Private function to add a token to this extension's token tracking data structures.
    * @param tokenId uint256 ID of the token to be added to the tokens list
    */
   function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
       _allTokensIndex[tokenId] = _allTokens.length;
       _allTokens.push(tokenId);
   }

   /**
    * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
    * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
    * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
    * This has O(1) time complexity, but alters the order of the _ownedTokens array.
    * @param from address representing the previous owner of the given token ID
    * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
    */
   function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
       // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
       // then delete the last slot (swap and pop).

       uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
       uint256 tokenIndex = _ownedTokensIndex[tokenId];

       // When the token to delete is the last token, the swap operation is unnecessary
       if (tokenIndex != lastTokenIndex) {
           uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

           _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
           _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
       }

       // This also deletes the contents at the last position of the array
       _ownedTokens[from].length--;

       // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
       // lastTokenId, or just over the end of the array if the token was the last one).
   }

   /**
    * @dev Private function to remove a token from this extension's token tracking data structures.
    * This has O(1) time complexity, but alters the order of the _allTokens array.
    * @param tokenId uint256 ID of the token to be removed from the tokens list
    */
   function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
       // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
       // then delete the last slot (swap and pop).

       uint256 lastTokenIndex = _allTokens.length.sub(1);
       uint256 tokenIndex = _allTokensIndex[tokenId];

       // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
       // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
       // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
       uint256 lastTokenId = _allTokens[lastTokenIndex];

       _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
       _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

       // This also deletes the contents at the last position of the array
       _allTokens.length--;
       _allTokensIndex[tokenId] = 0;
   }
}

/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
contract IERC721Metadata is IERC721 {
   function name() external view returns (string memory);
   function symbol() external view returns (string memory);
   function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata {
   // Token name
   string private _name;

   // Token symbol
   string private _symbol;
   
   //Base URI
   string private _baseURI;

   // Optional mapping for token URIs
   mapping(uint256 => string) private _tokenURIs;
  
   
   //Optional mapping for IPFS link to canonical image file
   mapping(uint256 => string) private _tokenIPFSHashes;
   
   mapping(uint256 => string) private _niftyTypeName;
   
    //Optional mapping for IPFS link to canonical image file by  Nifty type 
   mapping(uint256 => string) private _niftyTypeIPFSHashes;
   
   //Token name 
   mapping(uint256 => string) private _tokenName;

   /*
    *     bytes4(keccak256('name()')) == 0x06fdde03
    *     bytes4(keccak256('symbol()')) == 0x95d89b41
    *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
    *
    *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
    */
   bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

   /**
    * @dev Constructor function
    */
   constructor (string memory name, string memory symbol) public {
       _name = name;
       _symbol = symbol;

       // register the supported interfaces to conform to ERC721 via ERC165
       _registerInterface(_INTERFACE_ID_ERC721_METADATA);
   }

   /**
    * @dev Gets the token name.
    * @return string representing the token name
    */
   function name() external view returns (string memory) {
       return _name;
   }

   /**
    * @dev Gets the token symbol.
    * @return string representing the token symbol
    */
   function symbol() external view returns (string memory) {
       return _symbol;
   }
   
   //master builder - ONLY DOES STATIC CALLS
   address public masterBuilderContract = 0x6EFB06cF568253a53C7511BD3c31AB28BecB0192;

   /**
    * @dev Returns an URI for a given token ID.
    * Throws if the token ID does not exist. May return an empty string.
    * @param tokenId uint256 ID of the token to query
    */
   
   function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        BuilderMaster bm = BuilderMaster(masterBuilderContract);
       string memory tokenIdStr = bm.uint2str(tokenId);
       string memory tokenURIStr = bm.strConcat(_baseURI, tokenIdStr);
       return tokenURIStr;
   }
   
     /**
    * @dev Returns an IPFS Hash for a given token ID.
    * Throws if the token ID does not exist. May return an empty string.
    * @param tokenId uint256 ID of the token to query
    */
   function tokenIPFSHash(uint256 tokenId) external view returns (string memory) {
       require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        //master for static calls
       BuilderMaster bm = BuilderMaster(masterBuilderContract);
       uint nifty_type = bm.getNiftyTypeId(tokenId);
       return _niftyTypeIPFSHashes[nifty_type];
   }
   
        /**
    * @dev Returns an URI for a given token ID.
    * Throws if the token ID does not exist. May return an empty string.
    * @param tokenId uint256 ID of the token to query
    */
   function tokenName(uint256 tokenId) external view returns (string memory) {
       require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        //master for static calls
       BuilderMaster bm = BuilderMaster(masterBuilderContract);
       uint nifty_type = bm.getNiftyTypeId(tokenId);
       return _niftyTypeName[nifty_type];
   }

   /**
    * @dev Internal function to set the token URI for a given token.
    * Reverts if the token ID does not exist.
    * @param tokenId uint256 ID of the token to set its URI
    * @param uri string URI to assign
    */
   function _setTokenURI(uint256 tokenId, string memory uri) internal {
       require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
       _tokenURIs[tokenId] = uri;
   }
   
      /**
    * @dev Internal function to set the token IPFS hash for a given token.
    * Reverts if the token ID does not exist.
    * @param tokenId uint256 ID of the token to set its URI
    * @param ipfs_hash string IPFS link to assign
    */
   function _setTokenIPFSHash(uint256 tokenId, string memory ipfs_hash) internal {
       require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
       _tokenIPFSHashes[tokenId] = ipfs_hash;
   }
   
            /**
    * @dev Internal function to set the token IPFS hash for a given token.
    * Reverts if the token ID does not exist.
    * @param niftyType uint256 ID of the token to set its URI
    * @param ipfs_hash string IPFS link to assign
    */
   function _setTokenIPFSHashNiftyType(uint256 niftyType, string memory ipfs_hash) internal {
    //   require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
       _niftyTypeIPFSHashes[niftyType] = ipfs_hash;
   }
   
         /**
    * @dev Internal function to set the token IPFS hash for a given token.
    * Reverts if the token ID does not exist.
    * @param nifty_type uint256 of nifty type name to be set
    * @param nifty_type_name name of nifty type
    */
   function _setNiftyTypeName(uint256 nifty_type, string memory nifty_type_name) internal {
       _niftyTypeName[nifty_type] = nifty_type_name;
   }
   
   function _setBaseURIParent(string memory newBaseURI) internal {
       _baseURI = newBaseURI;
   }
   
   

   /**
    * @dev Internal function to burn a specific token.
    * Reverts if the token does not exist.
    * Deprecated, use _burn(uint256) instead.
    * @param owner owner of the token to burn
    * @param tokenId uint256 ID of the token being burned by the msg.sender
    */
   function _burn(address owner, uint256 tokenId) internal {
       super._burn(owner, tokenId);

       // Clear metadata (if any)
       if (bytes(_tokenURIs[tokenId]).length != 0) {
           delete _tokenURIs[tokenId];
       }
   }
}


/**
* @title Full ERC721 Token
* @dev This implementation includes all the required and some optional functionality of the ERC721 standard
* Moreover, it includes approve all functionality using operator terminology.
*
* See https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
   constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
       // solhint-disable-previous-line no-empty-blocks
   }
}


contract BeepleSpringCollection is ERC721Full {

   //MODIFIERS
   
   modifier onlyOwner() {
       require(msg.sender == contractOwner);
       _;
   }

   //CONSTANTS

   // how many nifties this contract is selling
   // used for metadat retrieval
   uint public numNiftiesCurrentlyInContract;

   //id of this contract for metadata server
   uint public contractId;

   //baseURI for metadata server
   string public baseURI;
   
   // name of creator
   string public nameOfCreator;
   
   address public contractOwner;

   //master builder - ONLY DOES STATIC CALLS
   address public masterBuilderContract = 0x6EFB06cF568253a53C7511BD3c31AB28BecB0192;

   using Counters for Counters.Counter;

   //MAPPINGS

   //mappings for token Ids
   mapping (uint => Counters.Counter) public _numNiftyMinted;
   mapping (uint => uint) public _numNiftyPermitted;
   mapping (uint => uint) public _niftyPrice;
   mapping (uint => bool) public _IPFSHashHasBeenSet;

   //EVENTS

   //purchase + creation events
   event NiftyPurchased(address _buyer, uint256 _amount, uint _tokenId);
   event NiftyCreated(address new_owner, uint _niftyType, uint _tokenId);

   //CONSTRUCTOR FUNCTION

   constructor() ERC721Full("Beeple Spring Collection", "BEEPLESPRINGCOLLECTION") public {
           
       //set contract owner to deployer wallet
       contractOwner = msg.sender;

       //set local variables based on inputs
       contractId = 1;
       numNiftiesCurrentlyInContract = 12;
       nameOfCreator = "Beeple";
       
       //Spring collection consists of:
        // edition of #100, as $1 drawing - 4
        // edition of #100, in the "leaderboard" style - 1
        // edition of #1, auction - 5
        // edition of #3, silent auction - 2
        // In total, we have 12 Nifty Types.
        // 5 (100/100) + 5 (1/1) + 2 (3/3) = 12
       _numNiftyPermitted[1] = 100;
       _numNiftyPermitted[2] = 100;
       _numNiftyPermitted[3] = 100;
       _numNiftyPermitted[4] = 100;
       _numNiftyPermitted[5] = 100;
       _numNiftyPermitted[6] = 1;
       _numNiftyPermitted[7] = 1;
       _numNiftyPermitted[8] = 1;
       _numNiftyPermitted[9] = 1;
       _numNiftyPermitted[10] = 1;
       _numNiftyPermitted[11] = 3;
       _numNiftyPermitted[12] = 3;
   }
   
   function setnewOwner (address newOwner) onlyOwner public {
       //allow owner to change nifty name
       contractOwner = newOwner;
   }
   
   function setNiftyName (uint niftyType, string memory niftyName) onlyOwner public {
       //allow owner to change nifty name
        _setNiftyTypeName(niftyType, niftyName);
   }
   
   function setBaseURI(string memory newBaseURI) onlyOwner public {
       //allow owner to change base URI
        _setBaseURIParent(newBaseURI);
   }
   
   function setNiftyIPFSHash(uint nifty_type, string memory ipfs_hash) onlyOwner public {
       //check if IPFS hash has been set
       if (_IPFSHashHasBeenSet[nifty_type] == true) { 
           revert ("IPFS hash already set for ths NFT");
       } else {
           _setTokenIPFSHashNiftyType(nifty_type, ipfs_hash);
           _IPFSHashHasBeenSet[nifty_type] = true;
       }
   }

   function isNiftySoldOut(uint niftyType) public view returns (bool) {
       if (niftyType > numNiftiesCurrentlyInContract) {
           return true;
       }
       if (_numNiftyMinted[niftyType].current() > _numNiftyPermitted[niftyType]) {
           return (true);
       } else {
           return (false);
       }
   }

   function giftNifty(address collector_address, 
                      uint niftyType) onlyOwner public {
       //master for static calls
       BuilderMaster bm = BuilderMaster(masterBuilderContract);
       _numNiftyMinted[niftyType].increment();
       //check if this nifty is sold out
       if (isNiftySoldOut(niftyType)==true) {
           revert("Nifty sold out!");
       }
       //mint a nifty
       uint specificTokenId = _numNiftyMinted[niftyType].current();
       uint tokenId = bm.encodeTokenId(contractId, niftyType, specificTokenId);
       //mint token
       _mint(collector_address, tokenId);
       //do events
       emit NiftyCreated(collector_address, niftyType, tokenId);
   }
   
    function massMintNFTs(address collector_address, uint numToMint, uint niftyType) onlyOwner public {
        //loop through array and create nifties
        for (uint i=0; i < numToMint; i++) {
            giftNifty(collector_address,niftyType);
        }
       
   }
   

}

contract NiftyRegistry {
   function isValidNiftySender(address sending_key) public view returns (bool);
   function isOwner(address owner_key) public view returns (bool);
}

contract BuilderMaster {
   function getContractId(uint tokenId) public view returns (uint);
   function getNiftyTypeId(uint tokenId) public view returns (uint);
   function getSpecificNiftyNum(uint tokenId) public view returns (uint);
   function encodeTokenId(uint contractId, uint niftyType, uint specificNiftyNum) public view returns (uint);
   function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) public view returns (string memory);
   function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) public view returns (string memory);
   function strConcat(string memory _a, string memory _b, string memory _c) public view returns (string memory);
   function strConcat(string memory _a, string memory _b) public view returns (string memory);
   function uint2str(uint _i) public view returns (string memory _uintAsString);
}

/**
* Contracts and libraries below are from OpenZeppelin, except nifty builder instance
**/


/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
   /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    * - Addition cannot overflow.
    */
   function add(uint256 a, uint256 b) internal pure returns (uint256) {
       uint256 c = a + b;
       require(c >= a, "SafeMath: addition overflow");

       return c;
   }

   /**
    * @dev Returns the subtraction of two unsigned integers, reverting on
    * overflow (when the result is negative).
    *
    * Counterpart to Solidity's `-` operator.
    *
    * Requirements:
    * - Subtraction cannot overflow.
    */
   function sub(uint256 a, uint256 b) internal pure returns (uint256) {
       return sub(a, b, "SafeMath: subtraction overflow");
   }

   /**
    * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
    * overflow (when the result is negative).
    *
    * Counterpart to Solidity's `-` operator.
    *
    * Requirements:
    * - Subtraction cannot overflow.
    *
    * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
    * @dev Get it via `npm install @openzeppelin/contracts@next`.
    */
   function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
       require(b <= a, errorMessage);
       uint256 c = a - b;

       return c;
   }

   /**
    * @dev Returns the multiplication of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `*` operator.
    *
    * Requirements:
    * - Multiplication cannot overflow.
    */
   function mul(uint256 a, uint256 b) internal pure returns (uint256) {
       // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
       // benefit is lost if 'b' is also tested.
       // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
       if (a == 0) {
           return 0;
       }

       uint256 c = a * b;
       require(c / a == b, "SafeMath: multiplication overflow");

       return c;
   }

   /**
    * @dev Returns the integer division of two unsigned integers. Reverts on
    * division by zero. The result is rounded towards zero.
    *
    * Counterpart to Solidity's `/` operator. Note: this function uses a
    * `revert` opcode (which leaves remaining gas untouched) while Solidity
    * uses an invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    * - The divisor cannot be zero.
    */
   function div(uint256 a, uint256 b) internal pure returns (uint256) {
       return div(a, b, "SafeMath: division by zero");
   }

   /**
    * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
    * division by zero. The result is rounded towards zero.
    *
    * Counterpart to Solidity's `/` operator. Note: this function uses a
    * `revert` opcode (which leaves remaining gas untouched) while Solidity
    * uses an invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    * - The divisor cannot be zero.
    * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
    * @dev Get it via `npm install @openzeppelin/contracts@next`.
    */
   function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
       // Solidity only automatically asserts when dividing by 0
       require(b > 0, errorMessage);
       uint256 c = a / b;
       // assert(a == b * c + a % b); // There is no case in which this doesn't hold

       return c;
   }

   /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * Reverts when dividing by zero.
    *
    * Counterpart to Solidity's `%` operator. This function uses a `revert`
    * opcode (which leaves remaining gas untouched) while Solidity uses an
    * invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    * - The divisor cannot be zero.
    */
   function mod(uint256 a, uint256 b) internal pure returns (uint256) {
       return mod(a, b, "SafeMath: modulo by zero");
   }

   /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * Reverts with custom message when dividing by zero.
    *
    * Counterpart to Solidity's `%` operator. This function uses a `revert`
    * opcode (which leaves remaining gas untouched) while Solidity uses an
    * invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    * - The divisor cannot be zero.
    *
    * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
    * @dev Get it via `npm install @openzeppelin/contracts@next`.
    */
   function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
       require(b != 0, errorMessage);
       return a % b;
   }
}

/**
* @dev Collection of functions related to the address type
*/
library Address {
   /**
    * @dev Returns true if `account` is a contract.
    *
    * This test is non-exhaustive, and there may be false-negatives: during the
    * execution of a contract's constructor, its address will be reported as
    * not containing a contract.
    *
    * IMPORTANT: It is unsafe to assume that an address for which this
    * function returns false is an externally-owned account (EOA) and not a
    * contract.
    */
   function isContract(address account) internal view returns (bool) {
       // 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;
       // solhint-disable-next-line no-inline-assembly
       assembly { codehash := extcodehash(account) }
       return (codehash != 0x0 && codehash != accountHash);
   }

   /**
    * @dev Converts an `address` into `address payable`. Note that this is
    * simply a type cast: the actual underlying value is not changed.
    *
    * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
    * @dev Get it via `npm install @openzeppelin/contracts@next`.
    */
   function toPayable(address account) internal pure returns (address payable) {
       return address(uint160(account));
   }

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

       // solhint-disable-next-line avoid-call-value
       (bool success, ) = recipient.call.value(amount)("");
       require(success, "Address: unable to send value, recipient may have reverted");
   }
}

/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
* Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
* overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
* directly accessed.
*/
library Counters {
   using SafeMath for uint256;

   struct Counter {
       // This variable should never be directly accessed by users of the library: interactions must be restricted to
       // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
       // this feature: see https://github.com/ethereum/solidity/issues/4637
       uint256 _value; // default: 0
   }

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

   function increment(Counter storage counter) internal {
       // The {SafeMath} overflow check can be skipped here, see the comment at the top
       counter._value += 1;
   }

   function decrement(Counter storage counter) internal {
       counter._value = counter._value.sub(1);
   }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"new_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_niftyType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"NiftyCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"NiftyPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_IPFSHashHasBeenSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_niftyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_numNiftyMinted","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_numNiftyPermitted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"collector_address","type":"address"},{"internalType":"uint256","name":"niftyType","type":"uint256"}],"name":"giftNifty","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"niftyType","type":"uint256"}],"name":"isNiftySoldOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"collector_address","type":"address"},{"internalType":"uint256","name":"numToMint","type":"uint256"},{"internalType":"uint256","name":"niftyType","type":"uint256"}],"name":"massMintNFTs","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"masterBuilderContract","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nameOfCreator","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numNiftiesCurrentlyInContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"nifty_type","type":"uint256"},{"internalType":"string","name":"ipfs_hash","type":"string"}],"name":"setNiftyIPFSHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"niftyType","type":"uint256"},{"internalType":"string","name":"niftyName","type":"string"}],"name":"setNiftyName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setnewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenIPFSHash","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052736efb06cf568253a53c7511bd3c31ab28becb0192601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736efb06cf568253a53c7511bd3c31ab28becb0192601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000bb57600080fd5b506040518060400160405280601881526020017f426565706c6520537072696e6720436f6c6c656374696f6e00000000000000008152506040518060400160405280601681526020017f424545504c45535052494e47434f4c4c454354494f4e000000000000000000008152508181620001426301ffc9a760e01b6200039d60201b60201c565b6200015a6380ac58cd60e01b6200039d60201b60201c565b6200017263780e9d6360e01b6200039d60201b60201c565b81600990805190602001906200018a929190620004a6565b5080600a9080519060200190620001a3929190620004a6565b50620001bc635b5e139f60e01b6200039d60201b60201c565b5050505033601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601381905550600c6012819055506040518060400160405280600681526020017f426565706c650000000000000000000000000000000000000000000000000000815250601590805190602001906200025e929190620004a6565b50606460196000600181526020019081526020016000208190555060646019600060028152602001908152602001600020819055506064601960006003815260200190815260200160002081905550606460196000600481526020019081526020016000208190555060646019600060058152602001908152602001600020819055506001601960006006815260200190815260200160002081905550600160196000600781526020019081526020016000208190555060016019600060088152602001908152602001600020819055506001601960006009815260200190815260200160002081905550600160196000600a815260200190815260200160002081905550600360196000600b815260200190815260200160002081905550600360196000600c81526020019081526020016000208190555062000555565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200043a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004e957805160ff19168380011785556200051a565b828001600101855582156200051a579182015b8281111562000519578251825591602001919060010190620004fc565b5b5090506200052991906200052d565b5090565b6200055291905b808211156200054e57600081600090555060010162000534565b5090565b90565b613c1080620005656000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806370a0823111610125578063c87b56dd116100ad578063d7a853be1161007c578063d7a853be14610e76578063e725f87714610f3b578063e943753714610fe2578063e985e9c514611024578063faeaa153146110a057610211565b8063c87b56dd14610c98578063cc61697b14610d3f578063ce606ee014610d85578063d371663014610dcf57610211565b8063983472c3116100f4578063983472c314610a225780639b18f57414610aa5578063a22cb46514610aeb578063b88d4fde14610b3b578063ba653ab414610c4057610211565b806370a08231146108e757806372ba8c091461093f5780638291286c1461098157806395d89b411461099f57610211565b80632f745c59116101a85780634f6ccce7116101775780634f6ccce7146106af57806355f804b3146106f15780636352211e146107ac57806363b7e1731461081a5780636c0360eb1461086457610211565b80632f745c591461054d57806334b8160c146105af57806342842e0e146105f35780634f1d48321461066157610211565b806316e978c5116101e457806316e978c5146103ba57806318160ddd146103fc57806323b872dd1461041a5780632b6db0551461048857610211565b806301ffc9a71461021657806306fdde031461027b578063081812fc146102fe578063095ea7b31461036c575b600080fd5b6102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506110be565b604051808215151515815260200191505060405180910390f35b610283611125565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c35780820151818401526020810190506102a8565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61032a6004803603602081101561031457600080fd5b81019080803590602001909291905050506111c7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103b86004803603604081101561038257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611262565b005b6103e6600480360360208110156103d057600080fd5b8101908080359060200190929190505050611449565b6040518082815260200191505060405180910390f35b610404611461565b6040518082815260200191505060405180910390f35b6104866004803603606081101561043057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061146e565b005b61054b6004803603604081101561049e57600080fd5b8101908080359060200190929190803590602001906401000000008111156104c557600080fd5b8201836020820111156104d757600080fd5b803590602001918460018302840111640100000000831117156104f957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506114e4565b005b6105996004803603604081101561056357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115f6565b6040518082815260200191505060405180910390f35b6105f1600480360360208110156105c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116b5565b005b61065f6004803603606081101561060957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611753565b005b6106ad6004803603604081101561067757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611773565b005b6106db600480360360208110156106c557600080fd5b81019080803590602001909291905050506119d7565b6040518082815260200191505060405180910390f35b6107aa6004803603602081101561070757600080fd5b810190808035906020019064010000000081111561072457600080fd5b82018360208201111561073657600080fd5b8035906020019184600183028401116401000000008311171561075857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611a57565b005b6107d8600480360360208110156107c257600080fd5b8101908080359060200190929190505050611abd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610822611b85565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61086c611bab565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ac578082015181840152602081019050610891565b50505050905090810190601f1680156108d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610929600480360360208110156108fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c49565b6040518082815260200191505060405180910390f35b61096b6004803603602081101561095557600080fd5b8101908080359060200190929190505050611d1e565b6040518082815260200191505060405180910390f35b610989611d36565b6040518082815260200191505060405180910390f35b6109a7611d3c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109e75780820151818401526020810190506109cc565b50505050905090810190601f168015610a145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a2a611dde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ad160048036036020811015610abb57600080fd5b8101908080359060200190929190505050611e7c565b604051808215151515815260200191505060405180910390f35b610b3960048036036040811015610b0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611ed9565b005b610c3e60048036036080811015610b5157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610bb857600080fd5b820183602082011115610bca57600080fd5b80359060200191846001830284011164010000000083111715610bec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612091565b005b610c9660048036036060811015610c5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612109565b005b610cc460048036036020811015610cae57600080fd5b810190808035906020019092919050505061218e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d04578082015181840152602081019050610ce9565b50505050905090810190601f168015610d315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610d6b60048036036020811015610d5557600080fd5b81019080803590602001909291905050506125ac565b604051808215151515815260200191505060405180910390f35b610d8d6125cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610dfb60048036036020811015610de557600080fd5b81019080803590602001909291905050506125f2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e3b578082015181840152602081019050610e20565b50505050905090810190601f168015610e685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610f3960048036036040811015610e8c57600080fd5b810190808035906020019092919080359060200190640100000000811115610eb357600080fd5b820183602082011115610ec557600080fd5b80359060200191846001830284011164010000000083111715610ee757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506127be565b005b610f6760048036036020811015610f5157600080fd5b8101908080359060200190929190505050612826565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610fa7578082015181840152602081019050610f8c565b50505050905090810190601f168015610fd45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61100e60048036036020811015610ff857600080fd5b81019080803590602001909291905050506129f2565b6040518082815260200191505060405180910390f35b6110866004803603604081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a10565b604051808215151515815260200191505060405180910390f35b6110a8612aa4565b6040518082815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111bd5780601f10611192576101008083540402835291602001916111bd565b820191906000526020600020905b8154815290600101906020018083116111a057829003601f168201915b5050505050905090565b60006111d282612aaa565b611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613ab9602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061126d82611abd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613b3d6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611313612b1c565b73ffffffffffffffffffffffffffffffffffffffff16148061134257506113418161133c612b1c565b612a10565b5b611397576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613a2e6038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601a6020528060005260406000206000915090505481565b6000600780549050905090565b61147f611479612b1c565b82612b24565b6114d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613b5e6031913960400191505060405180910390fd5b6114df838383612c18565b505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461153e57600080fd5b60011515601b600084815260200190815260200160002060009054906101000a900460ff16151514156115bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613bbb6021913960400191505060405180910390fd5b6115c68282612c3c565b6001601b600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061160183611c49565b8210611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613981602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106116a257fe5b9060005260206000200154905092915050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461170f57600080fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61176e83838360405180602001604052806000815250612091565b505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117cd57600080fd5b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061180f60186000848152602001908152602001600020612c68565b6001151561181c83611e7c565b15151415611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6966747920736f6c64206f757421000000000000000000000000000000000081525060200191505060405180910390fd5b60006118af60186000858152602001908152602001600020612c7e565b905060008273ffffffffffffffffffffffffffffffffffffffff1663959c45b760135486856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561191657600080fd5b505afa15801561192a573d6000803e3d6000fd5b505050506040513d602081101561194057600080fd5b8101908080519060200190929190505050905061195d8582612c8c565b7fce98476f2a1c16f3466ad65b59759356e098b8f100a498ebb025280fcc6759f6858583604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b60006119e1611461565b8210611a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613b8f602c913960400191505060405180910390fd5b60078281548110611a4557fe5b90600052602060002001549050919050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ab157600080fd5b611aba81612cad565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613a906029913960400191505060405180910390fd5b80915050919050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c415780601f10611c1657610100808354040283529160200191611c41565b820191906000526020600020905b815481529060010190602001808311611c2457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613a66602a913960400191505060405180910390fd5b611d17600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c7e565b9050919050565b60196020528060005260406000206000915090505481565b60135481565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dd45780601f10611da957610100808354040283529160200191611dd4565b820191906000526020600020905b815481529060010190602001808311611db757829003601f168201915b5050505050905090565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e745780601f10611e4957610100808354040283529160200191611e74565b820191906000526020600020905b815481529060010190602001808311611e5757829003601f168201915b505050505081565b6000601254821115611e915760019050611ed4565b6019600083815260200190815260200160002054611ec060186000858152602001908152602001600020612c7e565b1115611ecf5760019050611ed4565b600090505b919050565b611ee1612b1c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060046000611f8f612b1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661203c612b1c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6120a261209c612b1c565b83612b24565b6120f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613b5e6031913960400191505060405180910390fd5b61210384848484612cc7565b50505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461216357600080fd5b60008090505b828110156121885761217b8483611773565b8080600101915050612169565b50505050565b606061219982612aaa565b6121ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613b0e602f913960400191505060405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060608173ffffffffffffffffffffffffffffffffffffffff1663f76f950e856040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561226857600080fd5b505afa15801561227c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156122a657600080fd5b81019080805160405193929190846401000000008211156122c657600080fd5b838201915060208201858111156122dc57600080fd5b82518660018202830111640100000000821117156122f957600080fd5b8083526020830192505050908051906020019080838360005b8381101561232d578082015181840152602081019050612312565b50505050905090810190601f16801561235a5780820380516001836020036101000a031916815260200191505b50604052505050905060608273ffffffffffffffffffffffffffffffffffffffff1663ff74927b600b846040518363ffffffff1660e01b81526004018080602001806020018381038352858181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156124205780601f106123f557610100808354040283529160200191612420565b820191906000526020600020905b81548152906001019060200180831161240357829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b8381101561245a57808201518184015260208101905061243f565b50505050905090810190601f1680156124875780820380516001836020036101000a031916815260200191505b5094505050505060006040518083038186803b1580156124a657600080fd5b505afa1580156124ba573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156124e457600080fd5b810190808051604051939291908464010000000082111561250457600080fd5b8382019150602082018581111561251a57600080fd5b825186600182028301116401000000008211171561253757600080fd5b8083526020830192505050908051906020019080838360005b8381101561256b578082015181840152602081019050612550565b50505050905090810190601f1680156125985780820380516001836020036101000a031916815260200191505b506040525050509050809350505050919050565b601b6020528060005260406000206000915054906101000a900460ff1681565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606125fd82612aaa565b612652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613b0e602f913960400191505060405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a9d659c2856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156126cc57600080fd5b505afa1580156126e0573d6000803e3d6000fd5b505050506040513d60208110156126f657600080fd5b81019080805190602001909291905050509050600f60008281526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127b05780601f10612785576101008083540402835291602001916127b0565b820191906000526020600020905b81548152906001019060200180831161279357829003601f168201915b505050505092505050919050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461281857600080fd5b6128228282612d39565b5050565b606061283182612aaa565b612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613b0e602f913960400191505060405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a9d659c2856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561290057600080fd5b505afa158015612914573d6000803e3d6000fd5b505050506040513d602081101561292a57600080fd5b81019080805190602001909291905050509050600e60008281526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129e45780601f106129b9576101008083540402835291602001916129e4565b820191906000526020600020905b8154815290600101906020018083116129c757829003601f168201915b505050505092505050919050565b60186020528060005260406000206000915090508060000154905081565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b6000612b2f82612aaa565b612b84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613a02602c913960400191505060405180910390fd5b6000612b8f83611abd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612bfe57508373ffffffffffffffffffffffffffffffffffffffff16612be6846111c7565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c0f5750612c0e8185612a10565b5b91505092915050565b612c23838383612d65565b612c2d8382612fc0565b612c37828261315e565b505050565b80600f60008481526020019081526020016000209080519060200190612c639291906138af565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612c968282613225565b612ca0828261315e565b612ca98161343d565b5050565b80600b9080519060200190612cc39291906138af565b5050565b612cd2848484612c18565b612cde84848484613489565b612d33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806139ac6032913960400191505060405180910390fd5b50505050565b80600e60008481526020019081526020016000209080519060200190612d609291906138af565b505050565b8273ffffffffffffffffffffffffffffffffffffffff16612d8582611abd565b73ffffffffffffffffffffffffffffffffffffffff1614612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613ae56029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806139de6024913960400191505060405180910390fd5b612e8081613679565b612ec7600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613737565b612f0e600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c68565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006130186001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061375a90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114613105576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061308557fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106130dd57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003613157919061392f565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6132d181612aaa565b15613344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133dd600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c68565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60006134aa8473ffffffffffffffffffffffffffffffffffffffff166137a4565b6134b75760019050613671565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a026134dd612b1c565b8887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561359957808201518184015260208101905061357e565b50505050905090810190601f1680156135c65780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156135e857600080fd5b505af11580156135fc573d6000803e3d6000fd5b505050506040513d602081101561361257600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146137345760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b61374f6001826000015461375a90919063ffffffff16565b816000018190555050565b600061379c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137ef565b905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156137e65750808214155b92505050919050565b600083831115829061389c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613861578082015181840152602081019050613846565b50505050905090810190601f16801561388e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106138f057805160ff191683800117855561391e565b8280016001018555821561391e579182015b8281111561391d578251825591602001919060010190613902565b5b50905061392b919061395b565b5090565b81548183558181111561395657818360005260206000209182019101613955919061395b565b5b505050565b61397d91905b80821115613979576000816000905550600101613961565b5090565b9056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e647349504653206861736820616c72656164792073657420666f7220746873204e4654a265627a7a7231582096ff624e879fd619a34b3a9b9dd86d45be2822657079050dc178b9d5d2d64fed64736f6c63430005110032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c806370a0823111610125578063c87b56dd116100ad578063d7a853be1161007c578063d7a853be14610e76578063e725f87714610f3b578063e943753714610fe2578063e985e9c514611024578063faeaa153146110a057610211565b8063c87b56dd14610c98578063cc61697b14610d3f578063ce606ee014610d85578063d371663014610dcf57610211565b8063983472c3116100f4578063983472c314610a225780639b18f57414610aa5578063a22cb46514610aeb578063b88d4fde14610b3b578063ba653ab414610c4057610211565b806370a08231146108e757806372ba8c091461093f5780638291286c1461098157806395d89b411461099f57610211565b80632f745c59116101a85780634f6ccce7116101775780634f6ccce7146106af57806355f804b3146106f15780636352211e146107ac57806363b7e1731461081a5780636c0360eb1461086457610211565b80632f745c591461054d57806334b8160c146105af57806342842e0e146105f35780634f1d48321461066157610211565b806316e978c5116101e457806316e978c5146103ba57806318160ddd146103fc57806323b872dd1461041a5780632b6db0551461048857610211565b806301ffc9a71461021657806306fdde031461027b578063081812fc146102fe578063095ea7b31461036c575b600080fd5b6102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506110be565b604051808215151515815260200191505060405180910390f35b610283611125565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c35780820151818401526020810190506102a8565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61032a6004803603602081101561031457600080fd5b81019080803590602001909291905050506111c7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103b86004803603604081101561038257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611262565b005b6103e6600480360360208110156103d057600080fd5b8101908080359060200190929190505050611449565b6040518082815260200191505060405180910390f35b610404611461565b6040518082815260200191505060405180910390f35b6104866004803603606081101561043057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061146e565b005b61054b6004803603604081101561049e57600080fd5b8101908080359060200190929190803590602001906401000000008111156104c557600080fd5b8201836020820111156104d757600080fd5b803590602001918460018302840111640100000000831117156104f957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506114e4565b005b6105996004803603604081101561056357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115f6565b6040518082815260200191505060405180910390f35b6105f1600480360360208110156105c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116b5565b005b61065f6004803603606081101561060957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611753565b005b6106ad6004803603604081101561067757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611773565b005b6106db600480360360208110156106c557600080fd5b81019080803590602001909291905050506119d7565b6040518082815260200191505060405180910390f35b6107aa6004803603602081101561070757600080fd5b810190808035906020019064010000000081111561072457600080fd5b82018360208201111561073657600080fd5b8035906020019184600183028401116401000000008311171561075857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611a57565b005b6107d8600480360360208110156107c257600080fd5b8101908080359060200190929190505050611abd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610822611b85565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61086c611bab565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ac578082015181840152602081019050610891565b50505050905090810190601f1680156108d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610929600480360360208110156108fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c49565b6040518082815260200191505060405180910390f35b61096b6004803603602081101561095557600080fd5b8101908080359060200190929190505050611d1e565b6040518082815260200191505060405180910390f35b610989611d36565b6040518082815260200191505060405180910390f35b6109a7611d3c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109e75780820151818401526020810190506109cc565b50505050905090810190601f168015610a145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a2a611dde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ad160048036036020811015610abb57600080fd5b8101908080359060200190929190505050611e7c565b604051808215151515815260200191505060405180910390f35b610b3960048036036040811015610b0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611ed9565b005b610c3e60048036036080811015610b5157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610bb857600080fd5b820183602082011115610bca57600080fd5b80359060200191846001830284011164010000000083111715610bec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612091565b005b610c9660048036036060811015610c5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612109565b005b610cc460048036036020811015610cae57600080fd5b810190808035906020019092919050505061218e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d04578082015181840152602081019050610ce9565b50505050905090810190601f168015610d315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610d6b60048036036020811015610d5557600080fd5b81019080803590602001909291905050506125ac565b604051808215151515815260200191505060405180910390f35b610d8d6125cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610dfb60048036036020811015610de557600080fd5b81019080803590602001909291905050506125f2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e3b578082015181840152602081019050610e20565b50505050905090810190601f168015610e685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610f3960048036036040811015610e8c57600080fd5b810190808035906020019092919080359060200190640100000000811115610eb357600080fd5b820183602082011115610ec557600080fd5b80359060200191846001830284011164010000000083111715610ee757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506127be565b005b610f6760048036036020811015610f5157600080fd5b8101908080359060200190929190505050612826565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610fa7578082015181840152602081019050610f8c565b50505050905090810190601f168015610fd45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61100e60048036036020811015610ff857600080fd5b81019080803590602001909291905050506129f2565b6040518082815260200191505060405180910390f35b6110866004803603604081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a10565b604051808215151515815260200191505060405180910390f35b6110a8612aa4565b6040518082815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111bd5780601f10611192576101008083540402835291602001916111bd565b820191906000526020600020905b8154815290600101906020018083116111a057829003601f168201915b5050505050905090565b60006111d282612aaa565b611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613ab9602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061126d82611abd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613b3d6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611313612b1c565b73ffffffffffffffffffffffffffffffffffffffff16148061134257506113418161133c612b1c565b612a10565b5b611397576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613a2e6038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601a6020528060005260406000206000915090505481565b6000600780549050905090565b61147f611479612b1c565b82612b24565b6114d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613b5e6031913960400191505060405180910390fd5b6114df838383612c18565b505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461153e57600080fd5b60011515601b600084815260200190815260200160002060009054906101000a900460ff16151514156115bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613bbb6021913960400191505060405180910390fd5b6115c68282612c3c565b6001601b600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061160183611c49565b8210611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613981602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106116a257fe5b9060005260206000200154905092915050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461170f57600080fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61176e83838360405180602001604052806000815250612091565b505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117cd57600080fd5b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061180f60186000848152602001908152602001600020612c68565b6001151561181c83611e7c565b15151415611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6966747920736f6c64206f757421000000000000000000000000000000000081525060200191505060405180910390fd5b60006118af60186000858152602001908152602001600020612c7e565b905060008273ffffffffffffffffffffffffffffffffffffffff1663959c45b760135486856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561191657600080fd5b505afa15801561192a573d6000803e3d6000fd5b505050506040513d602081101561194057600080fd5b8101908080519060200190929190505050905061195d8582612c8c565b7fce98476f2a1c16f3466ad65b59759356e098b8f100a498ebb025280fcc6759f6858583604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b60006119e1611461565b8210611a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613b8f602c913960400191505060405180910390fd5b60078281548110611a4557fe5b90600052602060002001549050919050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ab157600080fd5b611aba81612cad565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613a906029913960400191505060405180910390fd5b80915050919050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c415780601f10611c1657610100808354040283529160200191611c41565b820191906000526020600020905b815481529060010190602001808311611c2457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613a66602a913960400191505060405180910390fd5b611d17600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c7e565b9050919050565b60196020528060005260406000206000915090505481565b60135481565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dd45780601f10611da957610100808354040283529160200191611dd4565b820191906000526020600020905b815481529060010190602001808311611db757829003601f168201915b5050505050905090565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e745780601f10611e4957610100808354040283529160200191611e74565b820191906000526020600020905b815481529060010190602001808311611e5757829003601f168201915b505050505081565b6000601254821115611e915760019050611ed4565b6019600083815260200190815260200160002054611ec060186000858152602001908152602001600020612c7e565b1115611ecf5760019050611ed4565b600090505b919050565b611ee1612b1c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060046000611f8f612b1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661203c612b1c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6120a261209c612b1c565b83612b24565b6120f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613b5e6031913960400191505060405180910390fd5b61210384848484612cc7565b50505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461216357600080fd5b60008090505b828110156121885761217b8483611773565b8080600101915050612169565b50505050565b606061219982612aaa565b6121ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613b0e602f913960400191505060405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060608173ffffffffffffffffffffffffffffffffffffffff1663f76f950e856040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561226857600080fd5b505afa15801561227c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156122a657600080fd5b81019080805160405193929190846401000000008211156122c657600080fd5b838201915060208201858111156122dc57600080fd5b82518660018202830111640100000000821117156122f957600080fd5b8083526020830192505050908051906020019080838360005b8381101561232d578082015181840152602081019050612312565b50505050905090810190601f16801561235a5780820380516001836020036101000a031916815260200191505b50604052505050905060608273ffffffffffffffffffffffffffffffffffffffff1663ff74927b600b846040518363ffffffff1660e01b81526004018080602001806020018381038352858181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156124205780601f106123f557610100808354040283529160200191612420565b820191906000526020600020905b81548152906001019060200180831161240357829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b8381101561245a57808201518184015260208101905061243f565b50505050905090810190601f1680156124875780820380516001836020036101000a031916815260200191505b5094505050505060006040518083038186803b1580156124a657600080fd5b505afa1580156124ba573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156124e457600080fd5b810190808051604051939291908464010000000082111561250457600080fd5b8382019150602082018581111561251a57600080fd5b825186600182028301116401000000008211171561253757600080fd5b8083526020830192505050908051906020019080838360005b8381101561256b578082015181840152602081019050612550565b50505050905090810190601f1680156125985780820380516001836020036101000a031916815260200191505b506040525050509050809350505050919050565b601b6020528060005260406000206000915054906101000a900460ff1681565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606125fd82612aaa565b612652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613b0e602f913960400191505060405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a9d659c2856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156126cc57600080fd5b505afa1580156126e0573d6000803e3d6000fd5b505050506040513d60208110156126f657600080fd5b81019080805190602001909291905050509050600f60008281526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127b05780601f10612785576101008083540402835291602001916127b0565b820191906000526020600020905b81548152906001019060200180831161279357829003601f168201915b505050505092505050919050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461281857600080fd5b6128228282612d39565b5050565b606061283182612aaa565b612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613b0e602f913960400191505060405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a9d659c2856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561290057600080fd5b505afa158015612914573d6000803e3d6000fd5b505050506040513d602081101561292a57600080fd5b81019080805190602001909291905050509050600e60008281526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129e45780601f106129b9576101008083540402835291602001916129e4565b820191906000526020600020905b8154815290600101906020018083116129c757829003601f168201915b505050505092505050919050565b60186020528060005260406000206000915090508060000154905081565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b6000612b2f82612aaa565b612b84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613a02602c913960400191505060405180910390fd5b6000612b8f83611abd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612bfe57508373ffffffffffffffffffffffffffffffffffffffff16612be6846111c7565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c0f5750612c0e8185612a10565b5b91505092915050565b612c23838383612d65565b612c2d8382612fc0565b612c37828261315e565b505050565b80600f60008481526020019081526020016000209080519060200190612c639291906138af565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612c968282613225565b612ca0828261315e565b612ca98161343d565b5050565b80600b9080519060200190612cc39291906138af565b5050565b612cd2848484612c18565b612cde84848484613489565b612d33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806139ac6032913960400191505060405180910390fd5b50505050565b80600e60008481526020019081526020016000209080519060200190612d609291906138af565b505050565b8273ffffffffffffffffffffffffffffffffffffffff16612d8582611abd565b73ffffffffffffffffffffffffffffffffffffffff1614612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613ae56029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806139de6024913960400191505060405180910390fd5b612e8081613679565b612ec7600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613737565b612f0e600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c68565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006130186001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061375a90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114613105576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061308557fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106130dd57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003613157919061392f565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6132d181612aaa565b15613344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133dd600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c68565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60006134aa8473ffffffffffffffffffffffffffffffffffffffff166137a4565b6134b75760019050613671565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a026134dd612b1c565b8887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561359957808201518184015260208101905061357e565b50505050905090810190601f1680156135c65780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156135e857600080fd5b505af11580156135fc573d6000803e3d6000fd5b505050506040513d602081101561361257600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146137345760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b61374f6001826000015461375a90919063ffffffff16565b816000018190555050565b600061379c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137ef565b905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156137e65750808214155b92505050919050565b600083831115829061389c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613861578082015181840152602081019050613846565b50505050905090810190601f16801561388e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106138f057805160ff191683800117855561391e565b8280016001018555821561391e579182015b8281111561391d578251825591602001919060010190613902565b5b50905061392b919061395b565b5090565b81548183558181111561395657818360005260206000209182019101613955919061395b565b5b505050565b61397d91905b80821115613979576000816000905550600101613961565b5090565b9056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e647349504653206861736820616c72656164792073657420666f7220746873204e4654a265627a7a7231582096ff624e879fd619a34b3a9b9dd86d45be2822657079050dc178b9d5d2d64fed64736f6c63430005110032

Deployed Bytecode Sourcemap

37411:4600:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37411:4600:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2726:133;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2726:133:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32235:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;32235:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10582:201;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10582:201:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9879:417;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9879:417:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38308:41;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38308:41:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23775:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12233:288;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12233:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40263:390;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40263:390:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;40263:390:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40263:390:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40263:390:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;40263:390:0;;;;;;;;;;;;;;;:::i;:::-;;23392:229;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23392:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39760:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39760:141:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13171:132;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13171:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40999:718;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40999:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24208:196;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24208:196:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40102:151;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40102:151:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;40102:151:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40102:151:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40102:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;40102:151:0;;;;;;;;;;;;;;;:::i;:::-;;9233:224;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9233:224:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38013:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37838:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37838:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8805:208;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8805:208:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38254:48;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38254:48:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37774:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32428:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;32428:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37893:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37893:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40660:332;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40660:332:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11077:250;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11077:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14027:269;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14027:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14027:269:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14027:269:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14027:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14027:269:0;;;;;;;;;;;;;;;:::i;:::-;;41728:273;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41728:273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32859:390;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32859:390:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;32859:390:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38355:49;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38355:49:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37931:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33461:374;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33461:374:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33461:374:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39911:181;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39911:181:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;39911:181:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39911:181:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39911:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39911:181:0;;;;;;;;;;;;;;;:::i;:::-;;34044:364;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34044:364:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34044:364:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38191:57;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38191:57:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11650:145;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11650:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37679:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2726:133;2796:4;2819:20;:33;2840:11;2819:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2812:40;;2726:133;;;:::o;32235:83::-;32274:13;32306:5;32299:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32235:83;:::o;10582:201::-;10641:7;10668:16;10676:7;10668;:16::i;:::-;10660:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10752:15;:24;10768:7;10752:24;;;;;;;;;;;;;;;;;;;;;10745:31;;10582:201;;;:::o;9879:417::-;9942:13;9958:16;9966:7;9958;:16::i;:::-;9942:32;;9998:5;9992:11;;:2;:11;;;;9984:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10077:5;10061:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;10086:37;10103:5;10110:12;:10;:12::i;:::-;10086:16;:37::i;:::-;10061:62;10053:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10244:2;10217:15;:24;10233:7;10217:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;10281:7;10277:2;10261:28;;10270:5;10261:28;;;;;;;;;;;;9879:417;;;:::o;38308:41::-;;;;;;;;;;;;;;;;;:::o;23775:94::-;23819:7;23845:10;:17;;;;23838:24;;23775:94;:::o;12233:288::-;12375:41;12394:12;:10;:12::i;:::-;12408:7;12375:18;:41::i;:::-;12367:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12482:32;12496:4;12502:2;12506:7;12482:13;:32::i;:::-;12233:288;;;:::o;40263:390::-;37539:13;;;;;;;;;;;37525:27;;:10;:27;;;37517:36;;;;;;40439:4;40404:39;;:19;:31;40424:10;40404:31;;;;;;;;;;;;;;;;;;;;;:39;;;40400:247;;;40460:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40400:247;40535:49;40562:10;40574:9;40535:26;:49::i;:::-;40632:4;40598:19;:31;40618:10;40598:31;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;40263:390;;:::o;23392:229::-;23472:7;23507:16;23517:5;23507:9;:16::i;:::-;23499:5;:24;23491:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23588:12;:19;23601:5;23588:19;;;;;;;;;;;;;;;23608:5;23588:26;;;;;;;;;;;;;;;;23581:33;;23392:229;;;;:::o;39760:141::-;37539:13;;;;;;;;;;;37525:27;;:10;:27;;;37517:36;;;;;;39886:8;39870:13;;:24;;;;;;;;;;;;;;;;;;39760:141;:::o;13171:132::-;13257:39;13274:4;13280:2;13284:7;13257:39;;;;;;;;;;;;:16;:39::i;:::-;13171:132;;;:::o;40999:718::-;37539:13;;;;;;;;;;;37525:27;;:10;:27;;;37517:36;;;;;;41146:16;41179:21;;;;;;;;;;;41146:55;;41211:38;:15;:26;41227:9;41211:26;;;;;;;;;;;:36;:38::i;:::-;41332:4;41305:31;;:25;41320:9;41305:14;:25::i;:::-;:31;;;41301:87;;;41352:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41301:87;41420:20;41443:36;:15;:26;41459:9;41443:26;;;;;;;;;;;:34;:36::i;:::-;41420:59;;41489:12;41504:2;:16;;;41521:10;;41533:9;41544:15;41504:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41504:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41504:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41504:56:0;;;;;;;;;;;;;;;;41489:71;;41591:33;41597:17;41616:7;41591:5;:33::i;:::-;41659:51;41672:17;41691:9;41702:7;41659:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37563:1;;;40999:718;;:::o;24208:196::-;24266:7;24301:13;:11;:13::i;:::-;24293:5;:21;24285:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24380:10;24391:5;24380:17;;;;;;;;;;;;;;;;24373:24;;24208:196;;;:::o;40102:151::-;37539:13;;;;;;;;;;;37525:27;;:10;:27;;;37517:36;;;;;;40217:29;40235:10;40217:17;:29::i;:::-;40102:151;:::o;9233:224::-;9288:7;9307:13;9323:11;:20;9335:7;9323:20;;;;;;;;;;;;;;;;;;;;;9307:36;;9378:1;9361:19;;:5;:19;;;;9353:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9445:5;9438:12;;;9233:224;;;:::o;38013:81::-;;;;;;;;;;;;;:::o;37838:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8805:208::-;8860:7;8904:1;8887:19;;:5;:19;;;;8879:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8972:34;:17;:24;8990:5;8972:24;;;;;;;;;;;;;;;:32;:34::i;:::-;8965:41;;8805:208;;;:::o;38254:48::-;;;;;;;;;;;;;;;;;:::o;37774:22::-;;;;:::o;32428:87::-;32469:13;32501:7;32494:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32428:87;:::o;37893:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40660:332::-;40721:4;40753:29;;40741:9;:41;40737:83;;;40805:4;40798:11;;;;40737:83;40872:18;:29;40891:9;40872:29;;;;;;;;;;;;40833:36;:15;:26;40849:9;40833:26;;;;;;;;;;;:34;:36::i;:::-;:68;40829:157;;;40925:4;40917:13;;;;40829:157;40969:5;40961:14;;40660:332;;;;:::o;11077:250::-;11162:12;:10;:12::i;:::-;11156:18;;:2;:18;;;;11148:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11255:8;11216:18;:32;11235:12;:10;:12::i;:::-;11216:32;;;;;;;;;;;;;;;:36;11249:2;11216:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;11307:2;11278:42;;11293:12;:10;:12::i;:::-;11278:42;;;11311:8;11278:42;;;;;;;;;;;;;;;;;;;;;;11077:250;;:::o;14027:269::-;14141:41;14160:12;:10;:12::i;:::-;14174:7;14141:18;:41::i;:::-;14133:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14246:43;14264:4;14270:2;14274:7;14283:5;14246:17;:43::i;:::-;14027:269;;;;:::o;41728:273::-;37539:13;;;;;;;;;;;37525:27;;:10;:27;;;37517:36;;;;;;41891:6;41898:1;41891:8;;41886:100;41905:9;41901:1;:13;41886:100;;;41936:38;41946:17;41964:9;41936;:38::i;:::-;41916:3;;;;;;;41886:100;;;;41728:273;;;:::o;32859:390::-;32917:13;32951:16;32959:7;32951;:16::i;:::-;32943:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33030:16;33063:21;;;;;;;;;;;33030:55;;33095:24;33122:2;:11;;;33134:7;33122:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33122:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33122:20:0;;;;;;39:16:-1;36:1;17:17;2:54;33122:20:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33122:20:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;384:12;379:3;372:25;420:4;415:3;411:14;404:21;;0:432;;33122:20:0;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33122:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33095:47;;33152:25;33180:2;:12;;;33193:8;33203:10;33180:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33180:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33180:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33180:34:0;;;;;;39:16:-1;36:1;17:17;2:54;33180:34:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33180:34:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;384:12;379:3;372:25;420:4;415:3;411:14;404:21;;0:432;;33180:34:0;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33180:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33152:62;;33231:11;33224:18;;;;;32859:390;;;:::o;38355:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;37931:28::-;;;;;;;;;;;;;:::o;33461:374::-;33524:13;33557:16;33565:7;33557;:16::i;:::-;33549:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33670:16;33703:21;;;;;;;;;;;33670:55;;33735:15;33753:2;:17;;;33771:7;33753:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33753:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33753:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33753:26:0;;;;;;;;;;;;;;;;33735:44;;33796:20;:32;33817:10;33796:32;;;;;;;;;;;33789:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33461:374;;;:::o;39911:181::-;37539:13;;;;;;;;;;;37525:27;;:10;:27;;;37517:36;;;;;;40046:39;40064:9;40075;40046:17;:39::i;:::-;39911:181;;:::o;34044:364::-;34103:13;34136:16;34144:7;34136;:16::i;:::-;34128:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34249:16;34282:21;;;;;;;;;;;34249:55;;34314:15;34332:2;:17;;;34350:7;34332:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34332:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34332:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34332:26:0;;;;;;;;;;;;;;;;34314:44;;34375:14;:26;34390:10;34375:26;;;;;;;;;;;34368:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34044:364;;;:::o;38191:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;11650:145::-;11730:4;11753:18;:25;11772:5;11753:25;;;;;;;;;;;;;;;:35;11779:8;11753:35;;;;;;;;;;;;;;;;;;;;;;;;;11746:42;;11650:145;;;;:::o;37679:41::-;;;;:::o;15467:152::-;15524:4;15540:13;15556:11;:20;15568:7;15556:20;;;;;;;;;;;;;;;;;;;;;15540:36;;15610:1;15593:19;;:5;:19;;;;15586:26;;;15467:152;;;:::o;792:96::-;837:15;871:10;864:17;;792:96;:::o;15981:329::-;16066:4;16090:16;16098:7;16090;:16::i;:::-;16082:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16165:13;16181:16;16189:7;16181;:16::i;:::-;16165:32;;16226:5;16215:16;;:7;:16;;;:51;;;;16259:7;16235:31;;:20;16247:7;16235:11;:20::i;:::-;:31;;;16215:51;:87;;;;16270:32;16287:5;16294:7;16270:16;:32::i;:::-;16215:87;16207:96;;;15981:329;;;;:::o;24780:241::-;24865:38;24885:4;24891:2;24895:7;24865:19;:38::i;:::-;24915:47;24948:4;24954:7;24915:32;:47::i;:::-;24974:40;25002:2;25006:7;24974:27;:40::i;:::-;24780:241;;;:::o;35591:234::-;35809:9;35775:20;:31;35796:9;35775:31;;;;;;;;;;;:43;;;;;;;;;;;;:::i;:::-;;35591:234;;:::o;53043:178::-;53213:1;53195:7;:14;;;:19;;;;;;;;;;;53043:178;:::o;52924:112::-;52989:7;53015;:14;;;53008:21;;52924:112;;;:::o;25279:198::-;25342:24;25354:2;25358:7;25342:11;:24::i;:::-;25378:40;25406:2;25410:7;25378:27;:40::i;:::-;25430;25462:7;25430:31;:40::i;:::-;25279:198;;:::o;36249:100::-;36332:10;36321:8;:21;;;;;;;;;;;;:::i;:::-;;36249:100;:::o;15002:269::-;15111:32;15125:4;15131:2;15135:7;15111:13;:32::i;:::-;15161:48;15184:4;15190:2;15194:7;15203:5;15161:22;:48::i;:::-;15153:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15002:269;;;;:::o;36091:148::-;36217:15;36188:14;:26;36203:10;36188:26;;;;;;;;;;;:44;;;;;;;;;;;;:::i;:::-;;36091:148;;:::o;19602:451::-;19715:4;19695:24;;:16;19703:7;19695;:16::i;:::-;:24;;;19687:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19797:1;19783:16;;:2;:16;;;;19775:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19852:23;19867:7;19852:14;:23::i;:::-;19887:35;:17;:23;19905:4;19887:23;;;;;;;;;;;;;;;:33;:35::i;:::-;19932:33;:17;:21;19950:2;19932:21;;;;;;;;;;;;;;;:31;:33::i;:::-;20000:2;19977:11;:20;19989:7;19977:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;20038:7;20034:2;20019:27;;20028:4;20019:27;;;;;;;;;;;;19602:451;;;:::o;27902:1133::-;28165:22;28190:32;28220:1;28190:12;:18;28203:4;28190:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;28165:57;;28232:18;28253:17;:26;28271:7;28253:26;;;;;;;;;;;;28232:47;;28398:14;28384:10;:28;28380:324;;28428:19;28450:12;:18;28463:4;28450:18;;;;;;;;;;;;;;;28469:14;28450:34;;;;;;;;;;;;;;;;28428:56;;28533:11;28500:12;:18;28513:4;28500:18;;;;;;;;;;;;;;;28519:10;28500:30;;;;;;;;;;;;;;;:44;;;;28649:10;28616:17;:30;28634:11;28616:30;;;;;;;;;;;:43;;;;28380:324;;28791:12;:18;28804:4;28791:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;27902:1133;;;;:::o;26744:183::-;26857:12;:16;26870:2;26857:16;;;;;;;;;;;;;;;:23;;;;26828:17;:26;26846:7;26828:26;;;;;;;;;;;:52;;;;26890:12;:16;26903:2;26890:16;;;;;;;;;;;;;;;26912:7;26890:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;26890:30:0;;;;;;;;;;;;;;;;;;;;;;26744:183;;:::o;18027:329::-;18112:1;18098:16;;:2;:16;;;;18090:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18170:16;18178:7;18170;:16::i;:::-;18169:17;18161:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18254:2;18231:11;:20;18243:7;18231:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;18266:33;:17;:21;18284:2;18266:21;;;;;;;;;;;;;;;:31;:33::i;:::-;18341:7;18337:2;18316:33;;18333:1;18316:33;;;;;;;;;;;;18027:329;;:::o;27123:161::-;27226:10;:17;;;;27199:15;:24;27215:7;27199:24;;;;;;;;;;;:44;;;;27253:10;27269:7;27253:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27253:24:0;;;;;;;;;;;;;;;;;;;;;;27123:161;:::o;20643:350::-;20764:4;20789:15;:2;:13;;;:15::i;:::-;20784:58;;20827:4;20820:11;;;;20784:58;20853:13;20885:2;20869:36;;;20906:12;:10;:12::i;:::-;20920:4;20926:7;20935:5;20869:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20869:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20869:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20869:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20869:72:0;;;;;;;;;;;;;;;;20853:88;;7039:10;20969:16;;20959:26;;;:6;:26;;;;20951:35;;;20643:350;;;;;;;:::o;21156:171::-;21255:1;21219:38;;:15;:24;21235:7;21219:24;;;;;;;;;;;;;;;;;;;;;:38;;;21215:106;;21308:1;21273:15;:24;21289:7;21273:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;21215:106;21156:171;:::o;53228:108::-;53308:21;53327:1;53308:7;:14;;;:18;;:21;;;;:::i;:::-;53291:7;:14;;:38;;;;53228:108;:::o;44477:134::-;44535:7;44561:43;44565:1;44568;44561:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;44554:50;;44477:134;;;;:::o;49377:798::-;49437:4;49883:16;49909:19;49931:66;49909:88;;;;50098:7;50086:20;50074:32;;50137:3;50125:15;;:8;:15;;:42;;;;;50156:11;50144:8;:23;;50125:42;50117:51;;;;49377:798;;;:::o;45048:188::-;45134:7;45166:1;45161;:6;;45169:12;45153:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;45153:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45192:9;45208:1;45204;:5;45192:17;;45228:1;45221:8;;;45048:188;;;;;:::o;37411:4600::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://96ff624e879fd619a34b3a9b9dd86d45be2822657079050dc178b9d5d2d64fed
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.