Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
406 DWWA
Holders
94
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
14 DWWALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
BaseERC721
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity Multiple files format)
pragma solidity 0.5.17; import "./ERC721Token.sol"; import "./ERC20Interface.sol"; import "./Freezable.sol"; /** * @title Base ERC721 token * @author Prashant Prabhakar Singh [[email protected]] * This contract implements basic ERC721 token functionality with bulk functionalities */ contract BaseERC721 is ERC721Token, Freezable { constructor(string memory name, string memory symbol, string memory _baseTokenURI) public ERC721Token(name, symbol){ baseTokenURI = _baseTokenURI; } /** * @dev Updates the base URL of token * Reverts if the sender is not owner * @param _newURI New base URL */ function updateBaseTokenURI(string memory _newURI) public onlyOwner noEmergencyFreeze { baseTokenURI = _newURI; } /** * @dev Mints new token on blockchain * Reverts if the sender is not operator with level 1 * @param _id Id of NFT to be minted * @dev URI is not provided because URI will be deducted based on baseURL */ function mint(uint256 _id, address _to) public onlyDeputyOrOwner noEmergencyFreeze returns (bool) { super._mint(_to, _id); return true; } function bulkMint(uint[] memory _ids, address[] memory _users) public onlyDeputyOrOwner noEmergencyFreeze returns (bool) { require(_ids.length == _users.length, "Invalid params"); for(uint i=0; i<_ids.length; i++) { super._mint(_users[i], _ids[i]); } return true; } /** * @dev Transfer tokens (similar to ERC-20 transfer) * Reverts if the sender is not owner of the NFT or approved * @param _to address to which token is transferred * @param _tokenId Id of NFT being transferred */ function transfer(address _to, uint256 _tokenId) public noEmergencyFreeze returns (bool) { safeTransferFrom(msg.sender, _to, _tokenId); return true; } /** * @dev Burn an existing NFT * @param _id Id of NFT to be burned */ function burn(uint _id) public noEmergencyFreeze returns (bool) { super._burn(msg.sender, _id); return true; } ////////////////////////////////////////// // PUBLICLY ACCESSIBLE METHODS (CONSTANT) ////////////////////////////////////////// }
pragma solidity 0.5.17; /** * Utility library of inline functions on addresses */ library Address { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { // 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 != accountHash && codehash != 0x0); } }
/** * This is custom ERC-721 token with some add on functionalities */ pragma solidity 0.5.17; import "./BaseERC721.sol"; /** * @title CustomERC721 * @author Prashant Prabhakar Singh [[email protected]] */ contract CustomERC721 is BaseERC721 { // mapping for replay protection mapping(address => uint) private userNonce; bool public isNormalUserAllowed; // can normal user access advanced features constructor(string memory name, string memory symbol, string memory baseURI) public BaseERC721(name, symbol, baseURI) { isNormalUserAllowed = false; } modifier canAccessProvableFunctions() { require(isNormalUserAllowed || msg.sender == owner || isDeputyOwner[msg.sender], "Not allowed to access provable fns"); _; } /** * @dev Allows normal users to call provable fns * Reverts if the sender is not owner of contract * @param _perm permission to users */ function allowNormalUser(bool _perm) public onlyOwner { isNormalUserAllowed = _perm; } /** * @dev Allows submitting already signed transaction * Reverts if the signed data is incorrect * @param message signed message by user * @param r signature * @param s signature * @param v recovery id of signature * @param spender address which is approved * @param approved bool value for status of approval * message should be hash(functionWord, contractAddress, nonce, fnParams) */ function provable_setApprovalForAll(bytes32 message, bytes32 r, bytes32 s, uint8 v, address spender, bool approved) public noEmergencyFreeze canAccessProvableFunctions { address signer = getSigner(message, r, s, v); require (signer != address(0), "Invalid signer"); bytes32 proof = getMessageSetApprovalForAll(signer, spender, approved); require(proof == message, "Invalid proof"); // perform the original set Approval operatorApprovals[signer][spender] = approved; emit ApprovalForAll(signer, spender, approved); userNonce[signer] = userNonce[signer].add(1); } /** * @dev Allows submitting already signed transaction for NFT transfer * Reverts if the signed data is incorrect * @param message signed message by user * @param r signature * @param s signature * @param v recovery id of signature * @param to recipient address * @param tokenId ID of NFT * message should be hash(functionWord, contractAddress, nonce, fnParams) */ function provable_transfer(bytes32 message, bytes32 r, bytes32 s, uint8 v, address to, uint tokenId) public noEmergencyFreeze canAccessProvableFunctions { address signer = getSigner(message, r, s, v); require (signer != address(0),"Invalid signer"); bytes32 proof = getMessageTransfer(signer, to, tokenId); require (proof == message, "Invalid proof"); // Execute original function require(to != address(0), "Zero address not allowed"); clearApproval(signer, tokenId); removeTokenFrom(signer, tokenId); addTokenTo(to, tokenId); emit Transfer(signer, to, tokenId); // update state variables userNonce[signer] = userNonce[signer].add(1); } /** * @dev Check signer of a message * @param message signed message by user * @param r signature * @param s signature * @param v recovery id of signature * @return signer of message */ function getSigner(bytes32 message, bytes32 r, bytes32 s, uint8 v) public pure returns (address){ bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, message)); address signer = ecrecover(prefixedHash,v,r,s); return signer; } /** * @dev Get message to be signed for transfer * @param signer of message * @param to recipient address * @param id NFT id * @return hash of (functionWord, contractAddress, nonce, ...fnParams) */ function getMessageTransfer(address signer, address to, uint id) public view returns (bytes32) { return keccak256(abi.encodePacked( bytes4(0xb483afd3), address(this), userNonce[signer], to, id )); } /** * @dev Get message to be signed for set Approval * @param signer of message * @param spender address which is approved * @param approved bool value for status of approval * @return hash of (functionWord, contractAddress, nonce, ...fnParams) */ function getMessageSetApprovalForAll(address signer, address spender, bool approved) public view returns (bytes32) { bytes32 proof = keccak256(abi.encodePacked( bytes4(0xbad4c8ea), address(this), userNonce[signer], spender, approved )); return proof; } /** * returns nonce of user to be used for next signing */ function getUserNonce(address user) public view returns (uint) { return userNonce[user]; } /** * @dev Owner can transfer out any accidentally sent ERC20 tokens * @param contractAddress ERC20 contract address * @param to withdrawal address * @param value no of tokens to be withdrawan */ function transferAnyERC20Token(address contractAddress, address to, uint value) public onlyOwner { ERC20Interface(contractAddress).transfer(to, value); } /** * @dev Owner can transfer out any accidentally sent ERC721 tokens * @param contractAddress ERC721 contract address * @param to withdrawal address * @param tokenId Id of 721 token */ function withdrawAnyERC721Token(address contractAddress, address to, uint tokenId) public onlyOwner { ERC721Basic(contractAddress).safeTransferFrom(address(this), to, tokenId); } /** * @dev Owner kill the smart contract * @param message Confirmation message to prevent accidebtal calling * @notice BE VERY CAREFULL BEFORE CALLING THIS FUNCTION * Better pause the contract * DO CALL "transferAnyERC20Token" before TO WITHDRAW ANY ERC-2O's FROM CONTRACT */ function kill(uint message) public onlyOwner { require (message == 123456789987654321, "Invalid code"); // Transfer Eth to owner and terminate contract selfdestruct(msg.sender); } }
pragma solidity 0.5.17; /** * @title ERC165 * @author Prashant Prabhakar Singh [[email protected]] * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface ERC165 { /** * @notice Query if a contract implements an interface * @param _interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 _interfaceId) external view returns (bool); }
pragma solidity ^0.5.17; contract ERC20Interface { function transfer(address to, uint tokens) public returns (bool success); function balanceOf(address _sender) public view returns (uint _bal); function allowance(address tokenOwner, address spender) public view returns (uint remaining); event Transfer(address indexed from, address indexed to, uint tokens); event Approval(address indexed owner, address indexed spender, uint256 value); function transferFrom(address from, address to, uint tokens) public returns (bool success); }
pragma solidity 0.5.17; import "./ERC721Basic.sol"; import "./ERC721Enumerable.sol"; import "./ERC721Metadata.sol"; /** * @title ERC-721 Non-Fungible Token Standard, full implementation interface * @author Prashant Prabhakar Singh [[email protected]] * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata { }
pragma solidity 0.5.17; import "./ERC165.sol"; /** * @title ERC721 Non-Fungible Token Standard basic interface * @author Prashant Prabhakar Singh [[email protected]] * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic is ERC165 { 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 ); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); 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 transferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) public; }
pragma solidity 0.5.17; import "./SupportsInterfaceWithLookup.sol"; import "./ERC721Basic.sol"; import "./ERC721Receiver.sol"; import "./SafeMath.sol"; import "./Addresses.sol"; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @author Prashant Prabhakar Singh [[email protected]] * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721BasicToken is SupportsInterfaceWithLookup, ERC721Basic { bytes4 private constant InterfaceId_ERC721 = 0x80ac58cd; /* * 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ bytes4 private constant InterfaceId_ERC721Exists = 0x4f558e79; /* * 0x4f558e79 === * bytes4(keccak256('exists(uint256)')) */ using SafeMath for uint256; using Address for address; // Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))` // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` bytes4 private constant ERC721_RECEIVED = 0xf0b9e5ba; // Mapping from token ID to owner mapping (uint256 => address) internal tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) internal tokenApprovals; // Mapping from owner to number of owned token mapping (address => uint256) internal ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) internal operatorApprovals; /** * @dev Guarantees msg.sender is owner of the given token * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender */ modifier onlyOwnerOf(uint256 _tokenId) { require(ownerOf(_tokenId) == msg.sender, "Only asset owner is allowed"); _; } /** * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator * @param _tokenId uint256 ID of the token to validate */ modifier canTransfer(uint256 _tokenId) { require(isApprovedOrOwner(msg.sender, _tokenId), "Can not transfer"); _; } constructor() public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(InterfaceId_ERC721); _registerInterface(InterfaceId_ERC721Exists); } /** * @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), "Zero address not allowed"); return ownedTokensCount[_owner]; } /** * @dev Gets the owner of the specified token ID * @param _tokenId uint256 ID of the token to query the owner of * @return owner 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), "Zero address not allowed"); return owner; } /** * @dev Returns whether the specified token exists * @param _tokenId uint256 ID of the token to query the existence of * @return whether the token exists */ function exists(uint256 _tokenId) public view returns (bool) { address owner = tokenOwner[_tokenId]; return owner != address(0); } /** * @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, "Can not approve to self"); require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "Not allowed to update approvals"); tokenApprovals[_tokenId] = _to; emit Approval(owner, _to, _tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * @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) { 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 != msg.sender, "Can not approve to self"); operatorApprovals[msg.sender][_to] = _approved; emit ApprovalForAll(msg.sender, _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 canTransfer(_tokenId) { require(_from != address(0), "Zero address not allowed"); require(_to != address(0), "Zero address not allowed"); clearApproval(_from, _tokenId); removeTokenFrom(_from, _tokenId); addTokenTo(_to, _tokenId); emit Transfer(_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 `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(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 canTransfer(_tokenId) { // solium-disable-next-line arg-overflow 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 `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(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 ) public canTransfer(_tokenId) { transferFrom(_from, _to, _tokenId); // solium-disable-next-line arg-overflow require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data), "Safe Transfer failed"); } /** * @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) { address owner = ownerOf(_tokenId); // Disable solium check because of // https://github.com/duaraghav8/Solium/issues/175 // solium-disable-next-line operator-whitespace return ( _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender) ); } /** * @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 by the msg.sender */ function _mint(address _to, uint256 _tokenId) internal { require(_to != address(0), "Zero address not allowed"); addTokenTo(_to, _tokenId); emit Transfer(address(0), _to, _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 by the msg.sender */ function _burn(address _owner, uint256 _tokenId) internal { clearApproval(_owner, _tokenId); removeTokenFrom(_owner, _tokenId); emit Transfer(_owner, address(0), _tokenId); } /** * @dev Internal function to clear current approval of a given token ID * Reverts if the given address is not indeed the owner of the token * @param _owner owner of the token * @param _tokenId uint256 ID of the token to be transferred */ function clearApproval(address _owner, uint256 _tokenId) internal { require(ownerOf(_tokenId) == _owner, "Asset does not belong to given owmer"); if (tokenApprovals[_tokenId] != address(0)) { tokenApprovals[_tokenId] = address(0); emit Approval(_owner, address(0), _tokenId); } } /** * @dev Internal function to add a token ID to the list of a given address * @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 addTokenTo(address _to, uint256 _tokenId) internal { require(tokenOwner[_tokenId] == address(0), "Asset already exists"); tokenOwner[_tokenId] = _to; ownedTokensCount[_to] = ownedTokensCount[_to].add(1); } /** * @dev Internal function to remove a token ID from the list of a given address * @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 removeTokenFrom(address _from, uint256 _tokenId) internal { require(ownerOf(_tokenId) == _from, "Asset does not belong to given owmer"); ownedTokensCount[_from] = ownedTokensCount[_from].sub(1); tokenOwner[_tokenId] = address(0); } /** * @dev Internal function to invoke `onERC721Received` on a target address * The call is not executed if the target address is not a contract * @param _from address representing the previous owner of the given token ID * @param _to target address that will receive the tokens * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return whether the call correctly returned the expected magic value */ function checkAndCallSafeTransfer( address _from, address _to, uint256 _tokenId, bytes memory _data ) internal returns (bool) { if (!_to.isContract()) { return true; } bytes4 retval = ERC721Receiver(_to).onERC721Received( _from, _tokenId, _data); return (retval == ERC721_RECEIVED); } }
pragma solidity 0.5.17; import "./ERC721Basic.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @author Prashant Prabhakar Singh [[email protected]] * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Enumerable is ERC721Basic { 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); }
pragma solidity 0.5.17; import "./ERC721Basic.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata * @author Prashant Prabhakar Singh [[email protected]] * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Metadata is ERC721Basic { function name() external view returns (string memory _name); function symbol() external view returns (string memory _symbol); function tokenURI(uint256 _tokenId) public view returns (string memory); }
pragma solidity 0.5.17; /** * @title ERC721 token receiver interface * @author Prashant Prabhakar Singh [[email protected]] * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract ERC721Receiver { /** * @dev Magic value to be returned upon successful reception of an NFT * Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`, * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` */ bytes4 internal constant ERC721_RECEIVED = 0xf0b9e5ba; /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safetransfer`. This function MAY throw to revert and reject the * transfer. This function MUST use 50,000 gas or less. Return of other * than the magic value MUST result in the transaction being reverted. * Note: the contract address is always the message sender. * @param _from The sending address * @param _tokenId The NFT identifier which is being transfered * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))` */ function onERC721Received( address _from, uint256 _tokenId, bytes memory _data ) public returns(bytes4); }
pragma solidity 0.5.17; import "./ERC721.sol"; import "./ERC721BasicToken.sol"; import "./SupportsInterfaceWithLookup.sol"; import "./Strings.sol"; /** * @title Full ERC721 Token * @author Prashant Prabhakar Singh [[email protected]] * This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Token is SupportsInterfaceWithLookup, ERC721BasicToken, ERC721 { bytes4 private constant InterfaceId_ERC721Enumerable = 0x780e9d63; /** * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f; /** * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ // Token name string internal name_; // Token symbol string internal symbol_; // to store base URL string internal baseTokenURI; // Mapping from owner to list of owned token IDs mapping(address => uint256[]) internal ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) internal ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] internal allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) internal allTokensIndex; /** * @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(InterfaceId_ERC721Enumerable); _registerInterface(InterfaceId_ERC721Metadata); } /** * @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_; } /** * @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) public view returns (string memory) { require(exists(_tokenId), "Asset does not exist"); return string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId))); } /** * @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), "Invalid index"); 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(), "Invalid index"); return allTokens[_index]; } // @dev This function is not needed as token URI will be created automatically based in base URL // /** // * @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)); // tokenURI[_tokenId] = _uri; // } /** * @dev Internal function to add a token ID to the list of a given address * @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 addTokenTo(address _to, uint256 _tokenId) internal { super.addTokenTo(_to, _tokenId); uint256 length = ownedTokens[_to].length; ownedTokens[_to].push(_tokenId); ownedTokensIndex[_tokenId] = length; } /** * @dev Internal function to remove a token ID from the list of a given address * @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 removeTokenFrom(address _from, uint256 _tokenId) internal { super.removeTokenFrom(_from, _tokenId); uint256 tokenIndex = ownedTokensIndex[_tokenId]; uint256 lastTokenIndex = ownedTokens[_from].length.sub(1); uint256 lastToken = ownedTokens[_from][lastTokenIndex]; ownedTokens[_from][tokenIndex] = lastToken; ownedTokens[_from][lastTokenIndex] = 0; // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping // the lastToken to the first position, and then dropping the element placed in the last position of the list ownedTokens[_from].length--; ownedTokensIndex[_tokenId] = 0; ownedTokensIndex[lastToken] = tokenIndex; } /** * @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 by the msg.sender */ function _mint(address _to, uint256 _tokenId) internal { super._mint(_to, _tokenId); allTokensIndex[_tokenId] = allTokens.length; allTokens.push(_tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @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(tokenURI[_tokenId]).length != 0) { // delete tokenURIs[_tokenId]; // } // Reorg all tokens array uint256 tokenIndex = allTokensIndex[_tokenId]; uint256 lastTokenIndex = allTokens.length.sub(1); uint256 lastToken = allTokens[lastTokenIndex]; allTokens[tokenIndex] = lastToken; allTokens[lastTokenIndex] = 0; allTokens.length--; allTokensIndex[_tokenId] = 0; allTokensIndex[lastToken] = tokenIndex; } }
pragma solidity 0.5.17; import "./Ownership.sol"; contract Freezable is Ownership { mapping (address => bool) frozen; bool public emergencyFreeze = false; event Freezed(address targetAddress, bool frozen); event EmerygencyFreezed(bool emergencyFreezeStatus); modifier unfreezed(address _account) { require(!frozen[_account]); _; } modifier noEmergencyFreeze() { require(!emergencyFreeze); _; } // ------------------------------------------------------------------------ // Freeze account - onlyOwner // ------------------------------------------------------------------------ function freezeAccount (address _target, bool _freeze) public onlyOwner returns(bool) { frozen[_target] = _freeze; emit Freezed(_target, _freeze); return true; } // ------------------------------------------------------------------------ // Emerygency freeze - onlyOwner // ------------------------------------------------------------------------ function emergencyFreezeAllAccounts (bool _freeze) public onlyOwner returns(bool) { emergencyFreeze = _freeze; emit EmerygencyFreezed(_freeze); return true; } // ------------------------------------------------------------------------ // Get Freeze Status : Constant // ------------------------------------------------------------------------ function isFreezed(address _targetAddress) public view returns (bool) { return frozen[_targetAddress]; } }
pragma solidity 0.5.17; contract Ownership { address public owner; address[] public deputyOwners; mapping(address => bool) public isDeputyOwner; event OwnershipUpdated(address oldOwner, address newOwner); event DeputyOwnerUpdated(address _do, bool _isAdded); constructor() public { owner = msg.sender; deputyOwners = [msg.sender]; } modifier onlyOwner() { require(msg.sender == owner, "Not owner"); _; } modifier onlyDeputyOrOwner() { require(msg.sender == owner || isDeputyOwner[msg.sender], "Only owner or deputy owner is allowed"); _; } /** * @dev Transfer the ownership to some other address. * new owner can not be a zero address. * Only owner can call this function * @param _newOwner Address to which ownership is being transferred */ function updateOwner(address _newOwner) public onlyOwner { require(_newOwner != address(0x0), "Invalid address"); owner = _newOwner; emit OwnershipUpdated(msg.sender, owner); } /** * @dev Add new deputy owner. * Only Owner can call this function * New Deputy should not be zero address * New Deputy should not be be already exisitng * emit DeputyOwnerUdpatd event * @param _newDO Address of new deputy owner */ function addDeputyOwner(address _newDO) public onlyOwner { require(!isDeputyOwner[_newDO], "Deputy Owner already exists"); require(_newDO != address(0), "Zero address not allowed"); deputyOwners.push(_newDO); isDeputyOwner[_newDO] = true; emit DeputyOwnerUpdated(_newDO, true); } /** * @dev Remove an existing deputy owner. * Only Owner can call this function * Given address should be a deputy owner * emit DeputyOwnerUdpatd event * @param _existingDO Address of existing deputy owner */ function removeDeputyOwner(address _existingDO) public onlyOwner { require(isDeputyOwner[_existingDO], "Deputy Owner does not exits"); uint existingId; for(uint i=0; i<deputyOwners.length; i++) { if(deputyOwners[i] == _existingDO) existingId=i; } // swap this with last element deputyOwners[existingId] = deputyOwners[deputyOwners.length-1]; delete deputyOwners[deputyOwners.length-1]; deputyOwners.length--; isDeputyOwner[_existingDO] = false; emit DeputyOwnerUpdated(_existingDO, false); } /** * @dev Renounce the ownership. * This will leave the contract without any owner. * Only owner can call this function * @param _validationCode A code to prevent aaccidental calling of this function */ function renounceOwnership(uint _validationCode) public onlyOwner { require(_validationCode == 123456789, "Invalid code"); owner = address(0); emit OwnershipUpdated(msg.sender, owner); } }
pragma solidity ^0.5.17; library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a && c>=b); return c; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.5.17; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = byte(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } }
pragma solidity 0.5.17; import "./ERC165.sol"; /** * @title SupportsInterfaceWithLookup * @author Prashant Prabhakar Singh [[email protected]] * @dev Implements ERC165 using a lookup table. */ contract SupportsInterfaceWithLookup is ERC165 { bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7; /** * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ /** * @dev a mapping of interface id to whether or not it's supported */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev A contract implementing SupportsInterfaceWithLookup * implement ERC165 itself */ constructor() public { _registerInterface(InterfaceId_ERC165); } /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 _interfaceId) external view returns (bool) { return supportedInterfaces[_interfaceId]; } /** * @dev private method for registering an interface */ function _registerInterface(bytes4 _interfaceId) internal { require(_interfaceId != 0xffffffff); supportedInterfaces[_interfaceId] = true; } }
/** * This is enhancement over custom NFT allowing users to mint tokens approved by admin * This contract will be used as enhanced version of NFT (v2) */ pragma solidity 0.5.17; import "./CustomERC721.sol"; contract UserMintableNFT is CustomERC721 { mapping(address => mapping(uint => bool)) isNonceUsed; constructor(string memory name, string memory symbol, string memory baseURI) public CustomERC721(name, symbol, baseURI) { } /** * @dev Allows anyone to mint token signed by admin * Reverts if admin has not signed for `tokenId` or `to` * @param r signature * @param s signature * @param v recovery id of signature * @param tokenId tokenId to be minted * @param to address to which tokens needs to be minted * @param _signerNonce non-sequential nonce of signer to avoid replay protection * @return bool true when operation is successful */ function userMint( bytes32 r, bytes32 s, uint8 v, uint256 tokenId, address to, uint256 _signerNonce ) public noEmergencyFreeze returns (bool) { bytes32 message = keccak256(abi.encodePacked( bytes4(0x8cd49589), // Keccak-256 hash of "userMint" address(this), _signerNonce, to, tokenId )); address signer = getSigner(message, r, s, v); require(signer == owner || isDeputyOwner[signer], "Admin should sign message"); require(isNonceUsed[signer][_signerNonce], "nonce already used"); super._mint(to, tokenId); isNonceUsed[signer][_signerNonce] = true; return true; } /** * @dev Allows anyone to mint tokens signed by admin * Reverts if admin has not signed for `tokenIds` or `to` * @param r signature * @param s signature * @param v recovery id of signature * @param tokenIds tokenIds to be minted * @param to address to which tokens needs to be minted * @param _signerNonce non-sequential nonce of signer to avoid replay protection * @return bool true when operation is successful */ function userBulkMint( bytes32 r, bytes32 s, uint8 v, uint256[] memory tokenIds, address to, uint256 _signerNonce ) public noEmergencyFreeze returns (bool) { bytes32 message = keccak256(abi.encodePacked( bytes4(0x5827c1ff), // Keccak-256 hash of "userBulkMint" address(this), _signerNonce, to, tokenIds )); address signer = getSigner(message, r, s, v); require(signer == owner || isDeputyOwner[signer], "Admin should sign message"); require(isNonceUsed[signer][_signerNonce], "nonce already used"); for(uint256 i=0; i<tokenIds.length; i++) { super._mint(to, tokenIds[i]); } isNonceUsed[signer][_signerNonce] = true; return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"_baseTokenURI","type":"string"}],"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":"_do","type":"address"},{"indexed":false,"internalType":"bool","name":"_isAdded","type":"bool"}],"name":"DeputyOwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"emergencyFreezeStatus","type":"bool"}],"name":"EmerygencyFreezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"targetAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"frozen","type":"bool"}],"name":"Freezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newDO","type":"address"}],"name":"addDeputyOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"bulkMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deputyOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"emergencyFreeze","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_freeze","type":"bool"}],"name":"emergencyFreezeAllAccounts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bool","name":"_freeze","type":"bool"}],"name":"freezeAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDeputyOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_targetAddress","type":"address"}],"name":"isFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_existingDO","type":"address"}],"name":"removeDeputyOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_validationCode","type":"uint256"}],"name":"renounceOwnership","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"}],"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":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":"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":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"updateBaseTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"updateOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526010805460ff191690553480156200001b57600080fd5b5060405162002a5438038062002a54833981810160405260608110156200004157600080fd5b81019080805160405193929190846401000000008211156200006257600080fd5b9083019060208201858111156200007857600080fd5b82516401000000008111828201881017156200009357600080fd5b82525081516020918201929091019080838360005b83811015620000c2578181015183820152602001620000a8565b50505050905090810190601f168015620000f05780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011457600080fd5b9083019060208201858111156200012a57600080fd5b82516401000000008111828201881017156200014557600080fd5b82525081516020918201929091019080838360005b83811015620001745781810151838201526020016200015a565b50505050905090810190601f168015620001a25780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115620001c657600080fd5b908301906020820185811115620001dc57600080fd5b8251640100000000811182820188101715620001f757600080fd5b82525081516020918201929091019080838360005b83811015620002265781810151838201526020016200020c565b50505050905090810190601f168015620002545780820380516001836020036101000a031916815260200191505b50604052508491508390506200027a6301ffc9a760e01b6001600160e01b036200036716565b620002956380ac58cd60e01b6001600160e01b036200036716565b620002b0634f558e7960e01b6001600160e01b036200036716565b8151620002c5906005906020850190620003a4565b508051620002db906006906020840190620003a4565b50620002f763780e9d6360e01b6001600160e01b036200036716565b62000312635b5e139f60e01b6001600160e01b036200036716565b5050600c80546001600160a01b0319163390811790915560408051602081019091529081526200034790600d90600162000429565b5080516200035d906007906020840190620003a4565b50505050620004d6565b6001600160e01b031980821614156200037f57600080fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003e757805160ff191683800117855562000417565b8280016001018555821562000417579182015b8281111562000417578251825591602001919060010190620003fa565b50620004259291506200048f565b5090565b82805482825590600052602060002090810192821562000481579160200282015b828111156200048157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200044a565b5062000425929150620004af565b620004ac91905b8082111562000425576000815560010162000496565b90565b620004ac91905b80821115620004255780546001600160a01b0319168155600101620004b6565b61256e80620004e66000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806376c16f991161011a578063a22cb465116100ad578063c400956a1161007c578063c400956a146108b6578063c87b56dd146108d3578063e724529c146108f0578063e985e9c51461091e578063f3d4b9421461094c57610206565b8063a22cb46514610772578063a33cdc41146107a0578063a9059cbb146107c6578063b88d4fde146107f257610206565b8063880cdc31116100e9578063880cdc31146107105780638da5cb5b1461073657806394bf804d1461073e57806395d89b411461076a57610206565b806376c16f99146106885780637898278f146106ae5780637d654c7f146106cd5780638111f24e146106ea57610206565b806323b872dd1161019d5780634f558e791161016c5780634f558e79146105675780634f6ccce7146105845780636352211e146105a1578063655391c9146105be57806370a082311461066257610206565b806323b872dd146104b25780632f745c59146104e857806342842e0e1461051457806342966c681461054a57610206565b80631505780e116101d95780631505780e1461032a57806315761f0e1461044d57806318160ddd1461047357806319fa8f501461048d57610206565b806301ffc9a71461020b57806306fdde0314610246578063081812fc146102c3578063095ea7b3146102fc575b600080fd5b6102326004803603602081101561022157600080fd5b50356001600160e01b031916610954565b604080519115158252519081900360200190f35b61024e610977565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610288578181015183820152602001610270565b50505050905090810190601f1680156102b55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e0600480360360208110156102d957600080fd5b5035610a0e565b604080516001600160a01b039092168252519081900360200190f35b6103286004803603604081101561031257600080fd5b506001600160a01b038135169060200135610a29565b005b6102326004803603604081101561034057600080fd5b810190602081018135600160201b81111561035a57600080fd5b82018360208201111561036c57600080fd5b803590602001918460208302840111600160201b8311171561038d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103dc57600080fd5b8201836020820111156103ee57600080fd5b803590602001918460208302840111600160201b8311171561040f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610b60945050505050565b6102326004803603602081101561046357600080fd5b50356001600160a01b0316610c6b565b61047b610c80565b60408051918252519081900360200190f35b610495610c86565b604080516001600160e01b03199092168252519081900360200190f35b610328600480360360608110156104c857600080fd5b506001600160a01b03813581169160208101359091169060400135610c91565b61047b600480360360408110156104fe57600080fd5b506001600160a01b038135169060200135610dd7565b6103286004803603606081101561052a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e5c565b6102326004803603602081101561056057600080fd5b5035610ecc565b6102326004803603602081101561057d57600080fd5b5035610ef1565b61047b6004803603602081101561059a57600080fd5b5035610f0e565b6102e0600480360360208110156105b757600080fd5b5035610f7a565b610328600480360360208110156105d457600080fd5b810190602081018135600160201b8111156105ee57600080fd5b82018360208201111561060057600080fd5b803590602001918460018302840111600160201b8311171561062157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fd8945050505050565b61047b6004803603602081101561067857600080fd5b50356001600160a01b031661104a565b6103286004803603602081101561069e57600080fd5b50356001600160a01b03166110b1565b610232600480360360208110156106c457600080fd5b503515156112b5565b610328600480360360208110156106e357600080fd5b503561134f565b6102326004803603602081101561070057600080fd5b50356001600160a01b031661142f565b6103286004803603602081101561072657600080fd5b50356001600160a01b031661144d565b6102e0611545565b6102326004803603604081101561075457600080fd5b50803590602001356001600160a01b0316611554565b61024e6115dd565b6103286004803603604081101561078857600080fd5b506001600160a01b038135169060200135151561163e565b610328600480360360208110156107b657600080fd5b50356001600160a01b0316611704565b610232600480360360408110156107dc57600080fd5b506001600160a01b0381351690602001356118a7565b6103286004803603608081101561080857600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460018302840111600160201b8311171561087557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118c5945050505050565b6102e0600480360360208110156108cc57600080fd5b503561197a565b61024e600480360360208110156108e957600080fd5b50356119a1565b6102326004803603604081101561090657600080fd5b506001600160a01b0381351690602001351515611ac5565b6102326004803603604081101561093457600080fd5b506001600160a01b0381358116916020013516611b7c565b610232611baa565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b505050505090505b90565b6000908152600260205260409020546001600160a01b031690565b6000610a3482610f7a565b9050806001600160a01b0316836001600160a01b03161415610a97576040805162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b604482015290519081900360640190fd5b336001600160a01b0382161480610ab35750610ab38133611b7c565b610b04576040805162461bcd60e51b815260206004820152601f60248201527f4e6f7420616c6c6f77656420746f2075706461746520617070726f76616c7300604482015290519081900360640190fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600c546000906001600160a01b0316331480610b8b5750336000908152600e602052604090205460ff165b610bc65760405162461bcd60e51b81526004018080602001828103825260258152602001806124d16025913960400191505060405180910390fd5b60105460ff1615610bd657600080fd5b8151835114610c1d576040805162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b604482015290519081900360640190fd5b60005b8351811015610c6157610c59838281518110610c3857fe5b6020026020010151858381518110610c4c57fe5b6020026020010151611bb3565b600101610c20565b5060019392505050565b600e6020526000908152604090205460ff1681565b600a5490565b6301ffc9a760e01b81565b80610c9c3382611c02565b610ce0576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b6001600160a01b038416610d29576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b6001600160a01b038316610d72576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b610d7c8483611c61565b610d868483611d2b565b610d908383611e5d565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6000610de28361104a565b8210610e25576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600860205260409020805483908110610e4957fe5b9060005260206000200154905092915050565b80610e673382611c02565b610eab576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b610ec6848484604051806020016040528060008152506118c5565b50505050565b60105460009060ff1615610edf57600080fd5b610ee93383611ea3565b506001919050565b6000908152600160205260409020546001600160a01b0316151590565b6000610f18610c80565b8210610f5b576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b600a8281548110610f6857fe5b90600052602060002001549050919050565b6000818152600160205260408120546001600160a01b031680610fd2576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b92915050565b600c546001600160a01b03163314611023576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60105460ff161561103357600080fd5b805161104690600790602084019061240f565b5050565b60006001600160a01b038216611095576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b506001600160a01b031660009081526003602052604090205490565b600c546001600160a01b031633146110fc576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600e602052604090205460ff16611169576040805162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220646f6573206e6f742065786974730000000000604482015290519081900360640190fd5b6000805b600d548110156111b557826001600160a01b0316600d828154811061118e57fe5b6000918252602090912001546001600160a01b031614156111ad578091505b60010161116d565b50600d805460001981019081106111c857fe5b600091825260209091200154600d80546001600160a01b0390921691839081106111ee57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600d8054600019810190811061122957fe5b600091825260209091200180546001600160a01b0319169055600d80549061125590600019830161248d565b506001600160a01b0382166000818152600e60209081526040808320805460ff1916905580519384529083019190915280517f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf855339281900390910190a15050565b600c546000906001600160a01b03163314611303576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6010805483151560ff19909116811790915560408051918252517f20cab5a89e9642fc2f3e47bcd2c27f01489aa2e5f76f1a2e673d2e1358dbfdf59181900360200190a1506001919050565b600c546001600160a01b0316331461139a576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b8063075bcd15146113e1576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b600c80546001600160a01b0319169055604080513381526000602082015281517f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d929181900390910190a150565b6001600160a01b03166000908152600f602052604090205460ff1690565b600c546001600160a01b03163314611498576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166114e5576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0383811691909117918290556040805133815292909116602083015280517f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d9281900390910190a150565b600c546001600160a01b031681565b600c546000906001600160a01b031633148061157f5750336000908152600e602052604090205460ff165b6115ba5760405162461bcd60e51b81526004018080602001828103825260258152602001806124d16025913960400191505060405180910390fd5b60105460ff16156115ca57600080fd5b6115d48284611bb3565b50600192915050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a035780601f106109d857610100808354040283529160200191610a03565b6001600160a01b038216331415611696576040805162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600c546001600160a01b0316331461174f576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600e602052604090205460ff16156117bd576040805162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b6001600160a01b038116611806576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b600d805460018082019092557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384169081179091556000818152600e6020908152604091829020805460ff191685179055815192835282019290925281517f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf85533929181900390910190a150565b60105460009060ff16156118ba57600080fd5b6115d4338484610e5c565b816118d03382611c02565b611914576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b61191f858585610c91565b61192b85858585611f59565b611973576040805162461bcd60e51b815260206004820152601460248201527314d8599948151c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b5050505050565b600d818154811061198757fe5b6000918252602090912001546001600160a01b0316905081565b60606119ac82610ef1565b6119f4576040805162461bcd60e51b8152602060048201526014602482015273105cdcd95d08191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60076119ff83612082565b6040516020018083805460018160011615610100020316600290048015611a5d5780601f10611a3b576101008083540402835291820191611a5d565b820191906000526020600020905b815481529060010190602001808311611a49575b5050825160208401908083835b60208310611a895780518252601f199092019160209182019101611a6a565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b600c546000906001600160a01b03163314611b13576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0383166000818152600f6020908152604091829020805460ff191686151590811790915582519384529083015280517f8e0072eb5b566b3db642c008c48eecb43223b42000750a06f59acbbc58580aed9281900390910190a150600192915050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60105460ff1681565b611bbd8282612146565b600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8015550565b600080611c0e83610f7a565b9050806001600160a01b0316846001600160a01b03161480611c495750836001600160a01b0316611c3e84610a0e565b6001600160a01b0316145b80611c595750611c598185611b7c565b949350505050565b816001600160a01b0316611c7482610f7a565b6001600160a01b031614611cb95760405162461bcd60e51b81526004018080602001828103825260248152602001806124f66024913960400191505060405180910390fd5b6000818152600260205260409020546001600160a01b0316156110465760008181526002602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b611d3582826121d5565b6000818152600960209081526040808320546001600160a01b03861684526008909252822054909190611d6f90600163ffffffff61229016565b6001600160a01b03851660009081526008602052604081208054929350909183908110611d9857fe5b906000526020600020015490508060086000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110611dd657fe5b60009182526020808320909101929092556001600160a01b0387168152600890915260408120805484908110611e0857fe5b60009182526020808320909101929092556001600160a01b0387168152600890915260409020805490611e3f90600019830161248d565b50600093845260096020526040808520859055908452909220555050565b611e6782826122a2565b6001600160a01b039091166000908152600860209081526040808320805460018101825590845282842081018590559383526009909152902055565b611ead8282612364565b6000818152600b6020526040812054600a54909190611ed390600163ffffffff61229016565b90506000600a8281548110611ee457fe5b9060005260206000200154905080600a8481548110611eff57fe5b90600052602060002001819055506000600a8381548110611f1c57fe5b600091825260209091200155600a805490611f3b90600019830161248d565b506000938452600b6020526040808520859055908452909220555050565b6000611f6d846001600160a01b03166123b4565b611f7957506001611c59565b60405163785cf2dd60e11b81526001600160a01b0386811660048301908152602483018690526060604484019081528551606485015285516000949389169363f0b9e5ba938b938a938a936084019060208501908083838d5b83811015611fea578181015183820152602001611fd2565b50505050905090810190601f1680156120175780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b50516001600160e01b03191663785cf2dd60e11b14915050949350505050565b6060816120a757506040805180820190915260018152600360fc1b6020820152610972565b8160005b81156120bf57600101600a820491506120ab565b6060816040519080825280601f01601f1916602001820160405280156120ec576020820181803883390190505b50859350905060001982015b831561213d57600a840660300160f81b8282806001900393508151811061211b57fe5b60200101906001600160f81b031916908160001a905350600a840493506120f8565b50949350505050565b6001600160a01b03821661218f576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b6121998282611e5d565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b03166121e882610f7a565b6001600160a01b03161461222d5760405162461bcd60e51b81526004018080602001828103825260248152602001806124f66024913960400191505060405180910390fd5b6001600160a01b03821660009081526003602052604090205461225790600163ffffffff61229016565b6001600160a01b0390921660009081526003602090815260408083209490945591815260019091522080546001600160a01b0319169055565b60008282111561229c57fe5b50900390565b6000818152600160205260409020546001600160a01b031615612303576040805162461bcd60e51b8152602060048201526014602482015273417373657420616c72656164792065786973747360601b604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600390915290912054612344916123ed565b6001600160a01b0390921660009081526003602052604090209190915550565b61236e8282611c61565b6123788282611d2b565b60405181906000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c59575050151592915050565b60008282018381108015906124025750828110155b61240857fe5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061245057805160ff191683800117855561247d565b8280016001018555821561247d579182015b8281111561247d578251825591602001919060010190612462565b506124899291506124b6565b5090565b8154818355818111156124b1576000838152602090206124b19181019083016124b6565b505050565b610a0b91905b8082111561248957600081556001016124bc56fe4f6e6c79206f776e6572206f7220646570757479206f776e657220697320616c6c6f776564417373657420646f6573206e6f742062656c6f6e6720746f20676976656e206f776d65725a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000a265627a7a723158202629ada9d4e32422862f1866b3fbdf659a683171356fa694c87c1a1a775f4bd864736f6c63430005110032000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000019446f63746f722057686f202d20576f726c64732041706172740000000000000000000000000000000000000000000000000000000000000000000000000000044457574100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003968747470733a2f2f646f63746f7277686f2d776f726c647361706172742e636f6d2f647277686f2f61737365742f64657461696c732f69642f00000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806376c16f991161011a578063a22cb465116100ad578063c400956a1161007c578063c400956a146108b6578063c87b56dd146108d3578063e724529c146108f0578063e985e9c51461091e578063f3d4b9421461094c57610206565b8063a22cb46514610772578063a33cdc41146107a0578063a9059cbb146107c6578063b88d4fde146107f257610206565b8063880cdc31116100e9578063880cdc31146107105780638da5cb5b1461073657806394bf804d1461073e57806395d89b411461076a57610206565b806376c16f99146106885780637898278f146106ae5780637d654c7f146106cd5780638111f24e146106ea57610206565b806323b872dd1161019d5780634f558e791161016c5780634f558e79146105675780634f6ccce7146105845780636352211e146105a1578063655391c9146105be57806370a082311461066257610206565b806323b872dd146104b25780632f745c59146104e857806342842e0e1461051457806342966c681461054a57610206565b80631505780e116101d95780631505780e1461032a57806315761f0e1461044d57806318160ddd1461047357806319fa8f501461048d57610206565b806301ffc9a71461020b57806306fdde0314610246578063081812fc146102c3578063095ea7b3146102fc575b600080fd5b6102326004803603602081101561022157600080fd5b50356001600160e01b031916610954565b604080519115158252519081900360200190f35b61024e610977565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610288578181015183820152602001610270565b50505050905090810190601f1680156102b55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e0600480360360208110156102d957600080fd5b5035610a0e565b604080516001600160a01b039092168252519081900360200190f35b6103286004803603604081101561031257600080fd5b506001600160a01b038135169060200135610a29565b005b6102326004803603604081101561034057600080fd5b810190602081018135600160201b81111561035a57600080fd5b82018360208201111561036c57600080fd5b803590602001918460208302840111600160201b8311171561038d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103dc57600080fd5b8201836020820111156103ee57600080fd5b803590602001918460208302840111600160201b8311171561040f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610b60945050505050565b6102326004803603602081101561046357600080fd5b50356001600160a01b0316610c6b565b61047b610c80565b60408051918252519081900360200190f35b610495610c86565b604080516001600160e01b03199092168252519081900360200190f35b610328600480360360608110156104c857600080fd5b506001600160a01b03813581169160208101359091169060400135610c91565b61047b600480360360408110156104fe57600080fd5b506001600160a01b038135169060200135610dd7565b6103286004803603606081101561052a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e5c565b6102326004803603602081101561056057600080fd5b5035610ecc565b6102326004803603602081101561057d57600080fd5b5035610ef1565b61047b6004803603602081101561059a57600080fd5b5035610f0e565b6102e0600480360360208110156105b757600080fd5b5035610f7a565b610328600480360360208110156105d457600080fd5b810190602081018135600160201b8111156105ee57600080fd5b82018360208201111561060057600080fd5b803590602001918460018302840111600160201b8311171561062157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fd8945050505050565b61047b6004803603602081101561067857600080fd5b50356001600160a01b031661104a565b6103286004803603602081101561069e57600080fd5b50356001600160a01b03166110b1565b610232600480360360208110156106c457600080fd5b503515156112b5565b610328600480360360208110156106e357600080fd5b503561134f565b6102326004803603602081101561070057600080fd5b50356001600160a01b031661142f565b6103286004803603602081101561072657600080fd5b50356001600160a01b031661144d565b6102e0611545565b6102326004803603604081101561075457600080fd5b50803590602001356001600160a01b0316611554565b61024e6115dd565b6103286004803603604081101561078857600080fd5b506001600160a01b038135169060200135151561163e565b610328600480360360208110156107b657600080fd5b50356001600160a01b0316611704565b610232600480360360408110156107dc57600080fd5b506001600160a01b0381351690602001356118a7565b6103286004803603608081101561080857600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460018302840111600160201b8311171561087557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118c5945050505050565b6102e0600480360360208110156108cc57600080fd5b503561197a565b61024e600480360360208110156108e957600080fd5b50356119a1565b6102326004803603604081101561090657600080fd5b506001600160a01b0381351690602001351515611ac5565b6102326004803603604081101561093457600080fd5b506001600160a01b0381358116916020013516611b7c565b610232611baa565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b505050505090505b90565b6000908152600260205260409020546001600160a01b031690565b6000610a3482610f7a565b9050806001600160a01b0316836001600160a01b03161415610a97576040805162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b604482015290519081900360640190fd5b336001600160a01b0382161480610ab35750610ab38133611b7c565b610b04576040805162461bcd60e51b815260206004820152601f60248201527f4e6f7420616c6c6f77656420746f2075706461746520617070726f76616c7300604482015290519081900360640190fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600c546000906001600160a01b0316331480610b8b5750336000908152600e602052604090205460ff165b610bc65760405162461bcd60e51b81526004018080602001828103825260258152602001806124d16025913960400191505060405180910390fd5b60105460ff1615610bd657600080fd5b8151835114610c1d576040805162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b604482015290519081900360640190fd5b60005b8351811015610c6157610c59838281518110610c3857fe5b6020026020010151858381518110610c4c57fe5b6020026020010151611bb3565b600101610c20565b5060019392505050565b600e6020526000908152604090205460ff1681565b600a5490565b6301ffc9a760e01b81565b80610c9c3382611c02565b610ce0576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b6001600160a01b038416610d29576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b6001600160a01b038316610d72576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b610d7c8483611c61565b610d868483611d2b565b610d908383611e5d565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6000610de28361104a565b8210610e25576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600860205260409020805483908110610e4957fe5b9060005260206000200154905092915050565b80610e673382611c02565b610eab576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b610ec6848484604051806020016040528060008152506118c5565b50505050565b60105460009060ff1615610edf57600080fd5b610ee93383611ea3565b506001919050565b6000908152600160205260409020546001600160a01b0316151590565b6000610f18610c80565b8210610f5b576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b600a8281548110610f6857fe5b90600052602060002001549050919050565b6000818152600160205260408120546001600160a01b031680610fd2576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b92915050565b600c546001600160a01b03163314611023576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60105460ff161561103357600080fd5b805161104690600790602084019061240f565b5050565b60006001600160a01b038216611095576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b506001600160a01b031660009081526003602052604090205490565b600c546001600160a01b031633146110fc576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600e602052604090205460ff16611169576040805162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220646f6573206e6f742065786974730000000000604482015290519081900360640190fd5b6000805b600d548110156111b557826001600160a01b0316600d828154811061118e57fe5b6000918252602090912001546001600160a01b031614156111ad578091505b60010161116d565b50600d805460001981019081106111c857fe5b600091825260209091200154600d80546001600160a01b0390921691839081106111ee57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600d8054600019810190811061122957fe5b600091825260209091200180546001600160a01b0319169055600d80549061125590600019830161248d565b506001600160a01b0382166000818152600e60209081526040808320805460ff1916905580519384529083019190915280517f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf855339281900390910190a15050565b600c546000906001600160a01b03163314611303576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6010805483151560ff19909116811790915560408051918252517f20cab5a89e9642fc2f3e47bcd2c27f01489aa2e5f76f1a2e673d2e1358dbfdf59181900360200190a1506001919050565b600c546001600160a01b0316331461139a576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b8063075bcd15146113e1576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b600c80546001600160a01b0319169055604080513381526000602082015281517f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d929181900390910190a150565b6001600160a01b03166000908152600f602052604090205460ff1690565b600c546001600160a01b03163314611498576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166114e5576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0383811691909117918290556040805133815292909116602083015280517f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d9281900390910190a150565b600c546001600160a01b031681565b600c546000906001600160a01b031633148061157f5750336000908152600e602052604090205460ff165b6115ba5760405162461bcd60e51b81526004018080602001828103825260258152602001806124d16025913960400191505060405180910390fd5b60105460ff16156115ca57600080fd5b6115d48284611bb3565b50600192915050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a035780601f106109d857610100808354040283529160200191610a03565b6001600160a01b038216331415611696576040805162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600c546001600160a01b0316331461174f576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600e602052604090205460ff16156117bd576040805162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b6001600160a01b038116611806576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b600d805460018082019092557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384169081179091556000818152600e6020908152604091829020805460ff191685179055815192835282019290925281517f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf85533929181900390910190a150565b60105460009060ff16156118ba57600080fd5b6115d4338484610e5c565b816118d03382611c02565b611914576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b61191f858585610c91565b61192b85858585611f59565b611973576040805162461bcd60e51b815260206004820152601460248201527314d8599948151c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b5050505050565b600d818154811061198757fe5b6000918252602090912001546001600160a01b0316905081565b60606119ac82610ef1565b6119f4576040805162461bcd60e51b8152602060048201526014602482015273105cdcd95d08191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60076119ff83612082565b6040516020018083805460018160011615610100020316600290048015611a5d5780601f10611a3b576101008083540402835291820191611a5d565b820191906000526020600020905b815481529060010190602001808311611a49575b5050825160208401908083835b60208310611a895780518252601f199092019160209182019101611a6a565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b600c546000906001600160a01b03163314611b13576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0383166000818152600f6020908152604091829020805460ff191686151590811790915582519384529083015280517f8e0072eb5b566b3db642c008c48eecb43223b42000750a06f59acbbc58580aed9281900390910190a150600192915050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60105460ff1681565b611bbd8282612146565b600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8015550565b600080611c0e83610f7a565b9050806001600160a01b0316846001600160a01b03161480611c495750836001600160a01b0316611c3e84610a0e565b6001600160a01b0316145b80611c595750611c598185611b7c565b949350505050565b816001600160a01b0316611c7482610f7a565b6001600160a01b031614611cb95760405162461bcd60e51b81526004018080602001828103825260248152602001806124f66024913960400191505060405180910390fd5b6000818152600260205260409020546001600160a01b0316156110465760008181526002602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b611d3582826121d5565b6000818152600960209081526040808320546001600160a01b03861684526008909252822054909190611d6f90600163ffffffff61229016565b6001600160a01b03851660009081526008602052604081208054929350909183908110611d9857fe5b906000526020600020015490508060086000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110611dd657fe5b60009182526020808320909101929092556001600160a01b0387168152600890915260408120805484908110611e0857fe5b60009182526020808320909101929092556001600160a01b0387168152600890915260409020805490611e3f90600019830161248d565b50600093845260096020526040808520859055908452909220555050565b611e6782826122a2565b6001600160a01b039091166000908152600860209081526040808320805460018101825590845282842081018590559383526009909152902055565b611ead8282612364565b6000818152600b6020526040812054600a54909190611ed390600163ffffffff61229016565b90506000600a8281548110611ee457fe5b9060005260206000200154905080600a8481548110611eff57fe5b90600052602060002001819055506000600a8381548110611f1c57fe5b600091825260209091200155600a805490611f3b90600019830161248d565b506000938452600b6020526040808520859055908452909220555050565b6000611f6d846001600160a01b03166123b4565b611f7957506001611c59565b60405163785cf2dd60e11b81526001600160a01b0386811660048301908152602483018690526060604484019081528551606485015285516000949389169363f0b9e5ba938b938a938a936084019060208501908083838d5b83811015611fea578181015183820152602001611fd2565b50505050905090810190601f1680156120175780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b50516001600160e01b03191663785cf2dd60e11b14915050949350505050565b6060816120a757506040805180820190915260018152600360fc1b6020820152610972565b8160005b81156120bf57600101600a820491506120ab565b6060816040519080825280601f01601f1916602001820160405280156120ec576020820181803883390190505b50859350905060001982015b831561213d57600a840660300160f81b8282806001900393508151811061211b57fe5b60200101906001600160f81b031916908160001a905350600a840493506120f8565b50949350505050565b6001600160a01b03821661218f576040805162461bcd60e51b8152602060048201526018602482015260008051602061251a833981519152604482015290519081900360640190fd5b6121998282611e5d565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b03166121e882610f7a565b6001600160a01b03161461222d5760405162461bcd60e51b81526004018080602001828103825260248152602001806124f66024913960400191505060405180910390fd5b6001600160a01b03821660009081526003602052604090205461225790600163ffffffff61229016565b6001600160a01b0390921660009081526003602090815260408083209490945591815260019091522080546001600160a01b0319169055565b60008282111561229c57fe5b50900390565b6000818152600160205260409020546001600160a01b031615612303576040805162461bcd60e51b8152602060048201526014602482015273417373657420616c72656164792065786973747360601b604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600390915290912054612344916123ed565b6001600160a01b0390921660009081526003602052604090209190915550565b61236e8282611c61565b6123788282611d2b565b60405181906000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c59575050151592915050565b60008282018381108015906124025750828110155b61240857fe5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061245057805160ff191683800117855561247d565b8280016001018555821561247d579182015b8281111561247d578251825591602001919060010190612462565b506124899291506124b6565b5090565b8154818355818111156124b1576000838152602090206124b19181019083016124b6565b505050565b610a0b91905b8082111561248957600081556001016124bc56fe4f6e6c79206f776e6572206f7220646570757479206f776e657220697320616c6c6f776564417373657420646f6573206e6f742062656c6f6e6720746f20676976656e206f776d65725a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000a265627a7a723158202629ada9d4e32422862f1866b3fbdf659a683171356fa694c87c1a1a775f4bd864736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000019446f63746f722057686f202d20576f726c64732041706172740000000000000000000000000000000000000000000000000000000000000000000000000000044457574100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003968747470733a2f2f646f63746f7277686f2d776f726c647361706172742e636f6d2f647277686f2f61737365742f64657461696c732f69642f00000000000000
-----Decoded View---------------
Arg [0] : name (string): Doctor Who - Worlds Apart
Arg [1] : symbol (string): DWWA
Arg [2] : _baseTokenURI (string): https://doctorwho-worldsapart.com/drwho/asset/details/id/
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 446f63746f722057686f202d20576f726c647320417061727400000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4457574100000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000039
Arg [8] : 68747470733a2f2f646f63746f7277686f2d776f726c647361706172742e636f
Arg [9] : 6d2f647277686f2f61737365742f64657461696c732f69642f00000000000000
Deployed Bytecode Sourcemap
303:1940:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;303:1940:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;808:142:16;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;808:142:16;-1:-1:-1;;;;;;808:142:16;;:::i;:::-;;;;;;;;;;;;;;;;;;2078:77:11;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2078:77:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4787:111:7;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4787:111:7;;:::i;:::-;;;;-1:-1:-1;;;;;4787:111:7;;;;;;;;;;;;;;4221:339;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4221:339:7;;;;;;;;:::i;:::-;;1167:307:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1167:307:1;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;1167:307:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1167:307:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1167:307:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1167:307:1;;;;;;;;-1:-1:-1;1167:307:1;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;1167:307:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1167:307:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1167:307:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1167:307:1;;-1:-1:-1;1167:307:1;;-1:-1:-1;;;;;1167:307:1:i;107:45:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;107:45:13;-1:-1:-1;;;;;107:45:13;;:::i;3456:87:11:-;;;:::i;:::-;;;;;;;;;;;;;;;;263:54:16;;;:::i;:::-;;;;-1:-1:-1;;;;;;263:54:16;;;;;;;;;;;;;;6305:401:7;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6305:401:7;;;;;;;;;;;;;;;;;:::i;3094:220:11:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3094:220:11;;;;;;;;:::i;7314:228:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7314:228:7;;;;;;;;;;;;;;;;;:::i;1971:134:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1971:134:1;;:::i;3676:140:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3676:140:7;;:::i;3867:157:11:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3867:157:11;;:::i;3306:192:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3306:192:7;;:::i;638:133:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;638:133:1;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;638:133:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;638:133:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;638:133:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;638:133:1;;-1:-1:-1;638:133:1;;-1:-1:-1;;;;;638:133:1:i;2923:170:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2923:170:7;-1:-1:-1;;;;;2923:170:7;;:::i;1832:550:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1832:550:13;-1:-1:-1;;;;;1832:550:13;;:::i;1068:186:12:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1068:186:12;;;;:::i;2607:210:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2607:210:13;;:::i;1456:117:12:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1456:117:12;-1:-1:-1;;;;;1456:117:12;;:::i;816:200:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;816:200:13;-1:-1:-1;;;;;816:200:13;;:::i;49:20::-;;;:::i;998:165:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;998:165:1;;;;;;-1:-1:-1;;;;;998:165:1;;:::i;2253:81:11:-;;;:::i;5178:232:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5178:232:7;;;;;;;;;;:::i;1283:311:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1283:311:13;-1:-1:-1;;;;;1283:311:13;;:::i;1711:174:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1711:174:1;;;;;;;;:::i;8216:333:7:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;8216:333:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;8216:333:7;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8216:333:7;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;8216:333:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;8216:333:7;;-1:-1:-1;8216:333:7;;-1:-1:-1;;;;;8216:333:7:i;73:29:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73:29:13;;:::i;2522:211:11:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2522:211:11;;:::i;676:189:12:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;676:189:12;;;;;;;;;;:::i;5719:168:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5719:168:7;;;;;;;;;;:::i;133:35:12:-;;;:::i;808:142:16:-;-1:-1:-1;;;;;;912:33:16;;891:4;912:33;;;;;;;;;;;;;808:142;;;;:::o;2078:77:11:-;2145:5;2138:12;;;;;;;;-1:-1:-1;;2138:12:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2117:13;;2138:12;;2145:5;;2138:12;;2145:5;2138:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2078:77;;:::o;4787:111:7:-;4847:7;4869:24;;;:14;:24;;;;;;-1:-1:-1;;;;;4869:24:7;;4787:111::o;4221:339::-;4282:13;4298:17;4306:8;4298:7;:17::i;:::-;4282:33;;4336:5;-1:-1:-1;;;;;4329:12:7;:3;-1:-1:-1;;;;;4329:12:7;;;4321:48;;;;;-1:-1:-1;;;4321:48:7;;;;;;;;;;;;-1:-1:-1;;;4321:48:7;;;;;;;;;;;;;;;4383:10;-1:-1:-1;;;;;4383:19:7;;;;:58;;;4406:35;4423:5;4430:10;4406:16;:35::i;:::-;4375:102;;;;;-1:-1:-1;;;4375:102:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;4484:24;;;;:14;:24;;;;;;:30;;-1:-1:-1;;;;;;4484:30:7;-1:-1:-1;;;;;4484:30:7;;;;;;;;;4525;;4484:24;;4525:30;;;;;;;4221:339;;;:::o;1167:307:1:-;504:5:13;;1298:4:1;;-1:-1:-1;;;;;504:5:13;490:10;:19;;:48;;-1:-1:-1;527:10:13;513:25;;;;:13;:25;;;;;;;;490:48;482:98;;;;-1:-1:-1;;;482:98:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;441:15:12;;;;440:16;432:25;;;;;;1335:6:1;:13;1320:4;:11;:28;1312:55;;;;;-1:-1:-1;;;1312:55:1;;;;;;;;;;;;-1:-1:-1;;;1312:55:1;;;;;;;;;;;;;;;1377:6;1373:80;1389:4;:11;1387:1;:13;1373:80;;;1415:31;1427:6;1434:1;1427:9;;;;;;;;;;;;;;1438:4;1443:1;1438:7;;;;;;;;;;;;;;1415:11;:31::i;:::-;1402:3;;1373:80;;;-1:-1:-1;1465:4:1;;1167:307;-1:-1:-1;;;1167:307:1:o;107:45:13:-;;;;;;;;;;;;;;;:::o;3456:87:11:-;3522:9;:16;3456:87;:::o;263:54:16:-;-1:-1:-1;;;263:54:16;:::o;6305:401:7:-;6416:8;2456:39;2474:10;2486:8;2456:17;:39::i;:::-;2448:68;;;;;-1:-1:-1;;;2448:68:7;;;;;;;;;;;;-1:-1:-1;;;2448:68:7;;;;;;;;;;;;;;;-1:-1:-1;;;;;6445:19:7;;6437:56;;;;;-1:-1:-1;;;6437:56:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6437:56:7;;;;;;;;;;;;;;;-1:-1:-1;;;;;6507:17:7;;6499:54;;;;;-1:-1:-1;;;6499:54:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6499:54:7;;;;;;;;;;;;;;;6560:30;6574:5;6581:8;6560:13;:30::i;:::-;6596:32;6612:5;6619:8;6596:15;:32::i;:::-;6634:25;6645:3;6650:8;6634:10;:25::i;:::-;6692:8;6687:3;-1:-1:-1;;;;;6671:30:7;6680:5;-1:-1:-1;;;;;6671:30:7;;;;;;;;;;;6305:401;;;;:::o;3094:220:11:-;3200:7;3234:17;3244:6;3234:9;:17::i;:::-;3225:6;:26;3217:52;;;;;-1:-1:-1;;;3217:52:11;;;;;;;;;;;;-1:-1:-1;;;3217:52:11;;;;;;;;;;;;;;;-1:-1:-1;;;;;3282:19:11;;;;;;:11;:19;;;;;:27;;3302:6;;3282:27;;;;;;;;;;;;;;3275:34;;3094:220;;;;:::o;7314:228:7:-;7429:8;2456:39;2474:10;2486:8;2456:17;:39::i;:::-;2448:68;;;;;-1:-1:-1;;;2448:68:7;;;;;;;;;;;;-1:-1:-1;;;2448:68:7;;;;;;;;;;;;;;;7495:42;7512:5;7519:3;7524:8;7495:42;;;;;;;;;;;;:16;:42::i;:::-;7314:228;;;;:::o;1971:134:1:-;441:15:12;;2041:4:1;;441:15:12;;440:16;432:25;;;;;;2055:28:1;2067:10;2079:3;2055:11;:28::i;:::-;-1:-1:-1;2096:4:1;1971:134;;;:::o;3676:140:7:-;3731:4;3759:20;;;:10;:20;;;;;;-1:-1:-1;;;;;3759:20:7;3792:19;;;3676:140::o;3867:157:11:-;3926:7;3958:13;:11;:13::i;:::-;3949:6;:22;3941:48;;;;;-1:-1:-1;;;3941:48:11;;;;;;;;;;;;-1:-1:-1;;;3941:48:11;;;;;;;;;;;;;;;4002:9;4012:6;4002:17;;;;;;;;;;;;;;;;3995:24;;3867:157;;;:::o;3306:192:7:-;3362:7;3393:20;;;:10;:20;;;;;;-1:-1:-1;;;;;3393:20:7;3427:19;3419:56;;;;;-1:-1:-1;;;3419:56:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3419:56:7;;;;;;;;;;;;;;;3488:5;3306:192;-1:-1:-1;;3306:192:7:o;638:133:1:-;412:5:13;;-1:-1:-1;;;;;412:5:13;398:10;:19;390:41;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;;;;441:15:12;;;;440:16;432:25;;;;;;744:22:1;;;;:12;;:22;;;;;:::i;:::-;;638:133;:::o;2923:170:7:-;2979:7;-1:-1:-1;;;;;3002:20:7;;2994:57;;;;;-1:-1:-1;;;2994:57:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2994:57:7;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3064:24:7;;;;;:16;:24;;;;;;;2923:170::o;1832:550:13:-;412:5;;-1:-1:-1;;;;;412:5:13;398:10;:19;390:41;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;1921:26:13;;;;;;:13;:26;;;;;;;;1913:66;;;;;-1:-1:-1;;;1913:66:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;1985:15;;2006:104;2022:12;:19;2020:21;;2006:104;;;2078:11;-1:-1:-1;;;;;2059:30:13;:12;2072:1;2059:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2059:15:13;:30;2056:47;;;2102:1;2091:12;;2056:47;2043:3;;2006:104;;;-1:-1:-1;2178:12:13;2191:19;;-1:-1:-1;;2191:21:13;;;2178:35;;;;;;;;;;;;;;;;2151:12;:24;;-1:-1:-1;;;;;2178:35:13;;;;2164:10;;2151:24;;;;;;;;;;;;;;;:62;;-1:-1:-1;;;;;;2151:62:13;-1:-1:-1;;;;;2151:62:13;;;;;;;;;;2226:12;2239:19;;-1:-1:-1;;2239:21:13;;;2226:35;;;;;;;;;;;;;;;2219:42;;-1:-1:-1;;;;;;2219:42:13;;;2267:12;:21;;;;;-1:-1:-1;;2267:21:13;;;:::i;:::-;-1:-1:-1;;;;;;2294:26:13;;2323:5;2294:26;;;:13;:26;;;;;;;;:34;;-1:-1:-1;;2294:34:13;;;2339:38;;;;;;;;;;;;;;;;;;;;;;;;437:1;1832:550;:::o;1068:186:12:-;412:5:13;;1144:4:12;;-1:-1:-1;;;;;412:5:13;398:10;:19;390:41;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;;;;1160:15:12;:25;;;;;-1:-1:-1;;1160:25:12;;;;;;;;1200:26;;;;;;;;;;;;;;;;-1:-1:-1;1243:4:12;1068:186;;;:::o;2607:210:13:-;412:5;;-1:-1:-1;;;;;412:5:13;398:10;:19;390:41;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;;;;2697:15;2716:9;2697:28;2689:53;;;;;-1:-1:-1;;;2689:53:13;;;;;;;;;;;;-1:-1:-1;;;2689:53:13;;;;;;;;;;;;;;;2748:5;:18;;-1:-1:-1;;;;;;2748:18:13;;;2777:35;;;2794:10;2777:35;;2764:1;2777:35;;;;;;;;;;;;;;;;;2607:210;:::o;1456:117:12:-;-1:-1:-1;;;;;1543:22:12;1520:4;1543:22;;;:6;:22;;;;;;;;;1456:117::o;816:200:13:-;412:5;;-1:-1:-1;;;;;412:5:13;398:10;:19;390:41;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;897:25:13;;889:53;;;;;-1:-1:-1;;;889:53:13;;;;;;;;;;;;-1:-1:-1;;;889:53:13;;;;;;;;;;;;;;;948:5;:17;;-1:-1:-1;;;;;;948:17:13;-1:-1:-1;;;;;948:17:13;;;;;;;;;;;976:35;;;993:10;976:35;;1005:5;;;;976:35;;;;;;;;;;;;;;;;816:200;:::o;49:20::-;;;-1:-1:-1;;;;;49:20:13;;:::o;998:165:1:-;504:5:13;;1106:4:1;;-1:-1:-1;;;;;504:5:13;490:10;:19;;:48;;-1:-1:-1;527:10:13;513:25;;;;:13;:25;;;;;;;;490:48;482:98;;;;-1:-1:-1;;;482:98:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;441:15:12;;;;440:16;432:25;;;;;;1120:21:1;1132:3;1137;1120:11;:21::i;:::-;-1:-1:-1;1154:4:1;998:165;;;;:::o;2253:81:11:-;2322:7;2315:14;;;;;;;;-1:-1:-1;;2315:14:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2294:13;;2315:14;;2322:7;;2315:14;;2322:7;2315:14;;;;;;;;;;;;;;;;;;;;;;;;5178:232:7;-1:-1:-1;;;;;5255:17:7;;5262:10;5255:17;;5247:53;;;;;-1:-1:-1;;;5247:53:7;;;;;;;;;;;;-1:-1:-1;;;5247:53:7;;;;;;;;;;;;;;;5324:10;5306:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;5306:34:7;;;;;;;;;;;;:46;;-1:-1:-1;;5306:46:7;;;;;;;;;;5363:42;;;;;;;5306:34;;5324:10;5363:42;;;;;;;;;;;5178:232;;:::o;1283:311:13:-;412:5;;-1:-1:-1;;;;;412:5:13;398:10;:19;390:41;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;1365:21:13;;;;;;:13;:21;;;;;;;;1364:22;1356:62;;;;;-1:-1:-1;;;1356:62:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1432:20:13;;1424:57;;;;;-1:-1:-1;;;1424:57:13;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1424:57:13;;;;;;;;;;;;;;;1487:12;27:10:-1;;39:1;23:18;;;45:23;;;1487:25:13;;;;-1:-1:-1;;;;;;1487:25:13;-1:-1:-1;;;;;1487:25:13;;;;;;;;-1:-1:-1;1518:21:13;;;:13;1487:25;1518:21;;;;;;;;:28;;-1:-1:-1;;1518:28:13;;;;;1557:32;;;;;;;;;;;;;;;;;;;;;;;;1283:311;:::o;1711:174:1:-;441:15:12;;1806:4:1;;441:15:12;;440:16;432:25;;;;;;1820:43:1;1837:10;1849:3;1854:8;1820:16;:43::i;8216:333:7:-;8355:8;2456:39;2474:10;2486:8;2456:17;:39::i;:::-;2448:68;;;;;-1:-1:-1;;;2448:68:7;;;;;;;;;;;;-1:-1:-1;;;2448:68:7;;;;;;;;;;;;;;;8373:34;8386:5;8393:3;8398:8;8373:12;:34::i;:::-;8466:53;8491:5;8498:3;8503:8;8513:5;8466:24;:53::i;:::-;8458:86;;;;;-1:-1:-1;;;8458:86:7;;;;;;;;;;;;-1:-1:-1;;;8458:86:7;;;;;;;;;;;;;;;8216:333;;;;;:::o;73:29:13:-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73:29:13;;-1:-1:-1;73:29:13;:::o;2522:211:11:-;2579:13;2608:16;2615:8;2608:6;:16::i;:::-;2600:49;;;;;-1:-1:-1;;;2600:49:11;;;;;;;;;;;;-1:-1:-1;;;2600:49:11;;;;;;;;;;;;;;;2686:12;2700:26;2717:8;2700:16;:26::i;:::-;2669:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2669:58:11;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2669:58:11;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2669:58:11;;;2655:73;;2522:211;;;:::o;676:189:12:-;412:5:13;;756:4:12;;-1:-1:-1;;;;;412:5:13;398:10;:19;390:41;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;-1:-1:-1;;;390:41:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;772:15:12;;;;;;:6;:15;;;;;;;;;:25;;-1:-1:-1;;772:25:12;;;;;;;;;;812;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;854:4:12;676:189;;;;:::o;5719:168:7:-;-1:-1:-1;;;;;5846:25:7;;;5825:4;5846:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;5719:168::o;133:35:12:-;;;;;;:::o;6399:172:11:-;6460:26;6472:3;6477:8;6460:11;:26::i;:::-;6520:9;:16;;6493:24;;;;:14;:24;;;;;:43;;;39:1:-1;23:18;;45:23;;6542:24:11;;;;;;;-1:-1:-1;6399:172:11:o;8896:438:7:-;9006:4;9020:13;9036:17;9044:8;9036:7;:17::i;:::-;9020:33;;9232:5;-1:-1:-1;;;;;9220:17:7;:8;-1:-1:-1;;;;;9220:17:7;;:60;;;;9272:8;-1:-1:-1;;;;;9247:33:7;:21;9259:8;9247:11;:21::i;:::-;-1:-1:-1;;;;;9247:33:7;;9220:60;:103;;;;9290:33;9307:5;9314:8;9290:16;:33::i;:::-;9205:124;8896:438;-1:-1:-1;;;;8896:438:7:o;10416:305::-;10517:6;-1:-1:-1;;;;;10496:27:7;:17;10504:8;10496:7;:17::i;:::-;-1:-1:-1;;;;;10496:27:7;;10488:76;;;;-1:-1:-1;;;10488:76:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10610:1;10574:24;;;:14;:24;;;;;;-1:-1:-1;;;;;10574:24:7;:38;10570:147;;10657:1;10622:24;;;:14;:24;;;;;;:37;;-1:-1:-1;;;;;;10622:37:7;;;10672:38;10637:8;;10657:1;-1:-1:-1;;;;;10672:38:7;;;;;10657:1;;10672:38;10416:305;;:::o;5282:856:11:-;5355:38;5377:5;5384:8;5355:21;:38::i;:::-;5400:18;5421:26;;;:16;:26;;;;;;;;;-1:-1:-1;;;;;5478:18:11;;;;:11;:18;;;;;:25;5421:26;;5400:18;5478:32;;5508:1;5478:32;:29;:32;:::i;:::-;-1:-1:-1;;;;;5536:18:11;;5516:17;5536:18;;;:11;:18;;;;;:34;;5453:57;;-1:-1:-1;5516:17:11;;5453:57;;5536:34;;;;;;;;;;;;;;5516:54;;5610:9;5577:11;:18;5589:5;-1:-1:-1;;;;;5577:18:11;-1:-1:-1;;;;;5577:18:11;;;;;;;;;;;;5596:10;5577:30;;;;;;;;;;;;;;;;;;;:42;;;;-1:-1:-1;;;;;5625:18:11;;;;:11;:18;;;;;;:34;;5644:14;;5625:34;;;;;;;;;;;;;;;;;:38;;;;-1:-1:-1;;;;;6024:18:11;;;;:11;:18;;;;;;:27;;;;;-1:-1:-1;;6024:27:11;;;:::i;:::-;-1:-1:-1;6086:1:11;6057:26;;;:16;:26;;;;;;:30;;;6093:27;;;;;;:40;-1:-1:-1;;5282:856:11:o;4777:226::-;4843:31;4860:3;4865:8;4843:16;:31::i;:::-;-1:-1:-1;;;;;4897:16:11;;;4880:14;4897:16;;;:11;:16;;;;;;;;:23;;39:1:-1;23:18;;45:23;;4926:31:11;;;;;;;;;;;4963:26;;;:16;:26;;;;;:35;4777:226::o;6803:593::-;6867:29;6879:6;6887:8;6867:11;:29::i;:::-;7063:18;7084:24;;;:14;:24;;;;;;7139:9;:16;7084:24;;7063:18;7139:23;;7160:1;7139:23;:20;:23;:::i;:::-;7114:48;;7168:17;7188:9;7198:14;7188:25;;;;;;;;;;;;;;;;7168:45;;7244:9;7220;7230:10;7220:21;;;;;;;;;;;;;;;:33;;;;7287:1;7259:9;7269:14;7259:25;;;;;;;;;;;;;;;;;:29;7295:9;:18;;;;;-1:-1:-1;;7295:18:11;;;:::i;:::-;-1:-1:-1;7346:1:11;7319:24;;;:14;:24;;;;;;:28;;;7353:25;;;;;;:38;-1:-1:-1;;6803:593:11:o;12251:342:7:-;12397:4;12416:16;:3;-1:-1:-1;;;;;12416:14:7;;:16::i;:::-;12411:49;;-1:-1:-1;12449:4:7;12442:11;;12411:49;12481:67;;-1:-1:-1;;;12481:67:7;;-1:-1:-1;;;;;12481:67:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:13;;12481:36;;;;;;12525:5;;12532:8;;12542:5;;12481:67;;;;;;;;;;12465:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12481:67:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12481:67:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12481:67:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12481:67:7;-1:-1:-1;;;;;;12562:25:7;-1:-1:-1;;;12562:25:7;;-1:-1:-1;;12251:342:7;;;;;;:::o;203:723:15:-;259:13;476:10;472:51;;-1:-1:-1;502:10:15;;;;;;;;;;;;-1:-1:-1;;;502:10:15;;;;;;472:51;547:5;532:12;586:75;593:9;;586:75;;618:8;;648:2;640:10;;;;586:75;;;670:19;702:6;692:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;692:17:15;87:34:-1;135:17;;-1:-1;692:17:15;-1:-1:-1;762:5:15;;-1:-1:-1;670:39:15;-1:-1:-1;;;735:10:15;;777:112;784:9;;777:112;;850:2;843:4;:9;838:2;:14;827:27;;809:6;816:7;;;;;;;809:15;;;;;;;;;;;:45;-1:-1:-1;;;;;809:45:15;;;;;;;;-1:-1:-1;876:2:15;868:10;;;;777:112;;;-1:-1:-1;912:6:15;203:723;-1:-1:-1;;;;203:723:15:o;9583:197:7:-;-1:-1:-1;;;;;9652:17:7;;9644:54;;;;;-1:-1:-1;;;9644:54:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9644:54:7;;;;;;;;;;;;;;;9704:25;9715:3;9720:8;9704:10;:25::i;:::-;9740:35;;9766:8;;-1:-1:-1;;;;;9740:35:7;;;9757:1;;9740:35;;9757:1;;9740:35;9583:197;;:::o;11491:254::-;11593:5;-1:-1:-1;;;;;11572:26:7;:17;11580:8;11572:7;:17::i;:::-;-1:-1:-1;;;;;11572:26:7;;11564:75;;;;-1:-1:-1;;;11564:75:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11671:23:7;;;;;;:16;:23;;;;;;:30;;11699:1;11671:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;11645:23:7;;;;;;;:16;:23;;;;;;;;:56;;;;11707:20;;;:10;:20;;;;:33;;-1:-1:-1;;;;;;11707:33:7;;;11491:254::o;491:110:14:-;549:7;576:1;571;:6;;564:14;;;;-1:-1:-1;591:5:14;;;491:110::o;10984:228:7:-;11090:1;11058:20;;;:10;:20;;;;;;-1:-1:-1;;;;;11058:20:7;:34;11050:67;;;;;-1:-1:-1;;;11050:67:7;;;;;;;;;;;;-1:-1:-1;;;11050:67:7;;;;;;;;;;;;;;;11123:20;;;;:10;:20;;;;;;;;:26;;-1:-1:-1;;;;;;11123:26:7;-1:-1:-1;;;;;11123:26:7;;;;;;;;11179:21;;:16;:21;;;;;;;:28;;:25;:28::i;:::-;-1:-1:-1;;;;;11155:21:7;;;;;;;:16;:21;;;;;:52;;;;-1:-1:-1;10984:228:7:o;9966:188::-;10030:31;10044:6;10052:8;10030:13;:31::i;:::-;10067:33;10083:6;10091:8;10067:15;:33::i;:::-;10111:38;;10140:8;;10136:1;;-1:-1:-1;;;;;10111:38:7;;;;;10136:1;;10111:38;9966:188;;:::o;436:592:0:-;496:4;943:20;;792:66;980:23;;;;;;:42;;-1:-1:-1;;1007:15:0;;;972:51;-1:-1:-1;;436:592:0:o;604:137:14:-;662:7;689:5;;;707:6;;;;;;:14;;;720:1;717;:4;;707:14;700:22;;;;735:1;604:137;-1:-1:-1;;;604:137:14:o;303:1940:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;303:1940:1;;;-1:-1:-1;303:1940:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://2629ada9d4e32422862f1866b3fbdf659a683171356fa694c87c1a1a775f4bd8
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.