ERC-721
Overview
Max Total Supply
14,077 LAND
Holders
140
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3,262 LANDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Landemic
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-08-01 */ // File: openzeppelin-solidity/contracts/introspection/IERC165.sol pragma solidity ^0.4.24; /** * @title IERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface IERC165 { /** * @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); } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol pragma solidity ^0.4.24; /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract IERC721 is IERC165 { event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); function balanceOf(address owner) public view returns (uint256 balance); function ownerOf(uint256 tokenId) public view returns (address owner); 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 data ) public; } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.4.24; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safeTransfer`. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received( address operator, address from, uint256 tokenId, bytes data ) public returns(bytes4); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.4.24; /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two numbers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0); // Solidity only automatically asserts 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; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: openzeppelin-solidity/contracts/utils/Address.sol pragma solidity ^0.4.24; /** * 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 of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File: openzeppelin-solidity/contracts/introspection/ERC165.sol pragma solidity ^0.4.24; /** * @title ERC165 * @author Matt Condon (@shrugs) * @dev Implements ERC165 using a lookup table. */ contract ERC165 is IERC165 { bytes4 private 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) private _supportedInterfaces; /** * @dev A contract implementing SupportsInterfaceWithLookup * implement ERC165 itself */ constructor() internal { _registerInterface(_InterfaceId_ERC165); } /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev internal method for registering an interface */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff); _supportedInterfaces[interfaceId] = true; } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol pragma solidity ^0.4.24; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721 is ERC165, IERC721 { using SafeMath for uint256; using Address for address; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => uint256) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; 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)')) */ constructor() public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_InterfaceId_ERC721); } /** * @dev Gets the balance of the specified address * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0)); 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)); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner); require(msg.sender == owner || isApprovedForAll(owner, msg.sender)); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId)); 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); _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 { require(_isApprovedOrOwner(msg.sender, tokenId)); require(to != address(0)); _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,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 { // 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,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 _data ) public { transferFrom(from, to, tokenId); // solium-disable-next-line arg-overflow require(_checkOnERC721Received(from, to, tokenId, _data)); } /** * @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) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner( address spender, uint256 tokenId ) internal view returns (bool) { 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)); _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 add a token ID to the list of a given address * Note that this function is left internal to make ERC721Enumerable possible, but is not * intended to be called by custom derived contracts: in particular, it emits no Transfer event. * @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)); _tokenOwner[tokenId] = to; _ownedTokensCount[to] = _ownedTokensCount[to].add(1); } /** * @dev Internal function to remove a token ID from the list of a given address * Note that this function is left internal to make ERC721Enumerable possible, but is not * intended to be called by custom derived contracts: in particular, it emits no Transfer event, * and doesn't clear approvals. * @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); _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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes _data ) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received( msg.sender, from, tokenId, _data); return (retval == _ERC721_RECEIVED); } /** * @dev Private 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) private { require(ownerOf(tokenId) == owner); if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity ^0.4.24; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract IERC721Enumerable is IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex( address owner, uint256 index ) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol pragma solidity ^0.4.24; contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; bytes4 private constant _InterfaceId_ERC721Enumerable = 0x780e9d63; /** * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ /** * @dev Constructor function */ constructor() public { // register the supported interface to conform to ERC721 via ERC165 _registerInterface(_InterfaceId_ERC721Enumerable); } /** * @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)); 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()); return _allTokens[index]; } /** * @dev Internal function to add a token ID to the list of a given address * This function is internal due to language limitations, see the note in ERC721.sol. * It is not intended to be called by custom derived contracts: in particular, it emits no Transfer event. * @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 * This function is internal due to language limitations, see the note in ERC721.sol. * It is not intended to be called by custom derived contracts: in particular, it emits no Transfer event, * and doesn't clear approvals. * @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); // To prevent a gap in the array, we store the last token in the index of the token to delete, and // then delete the last slot. uint256 tokenIndex = _ownedTokensIndex[tokenId]; uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 lastToken = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastToken; // This also deletes the contents at the last position of the array _ownedTokens[from].length--; // 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 _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); // 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; } } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Metadata.sol pragma solidity ^0.4.24; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract IERC721Metadata is IERC721 { function name() external view returns (string); function symbol() external view returns (string); function tokenURI(uint256 tokenId) external view returns (string); } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Metadata.sol pragma solidity ^0.4.24; contract ERC721Metadata is ERC165, ERC721, IERC721Metadata { // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f; /** * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ /** * @dev Constructor function */ constructor(string name, string symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(InterfaceId_ERC721Metadata); } /** * @dev Gets the token name * @return string representing the token name */ function name() external view returns (string) { return _name; } /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() external view returns (string) { 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) external view returns (string) { require(_exists(tokenId)); return _tokenURIs[tokenId]; } /** * @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 uri) internal { require(_exists(tokenId)); _tokenURIs[tokenId] = uri; } /** * @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(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol pragma solidity ^0.4.24; /** * @title Full ERC721 Token * 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 ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata { constructor(string name, string symbol) ERC721Metadata(name, symbol) public { } } // File: contracts/Landemic.sol pragma solidity ^0.4.24; /* The latest stable Truffle is Truffle 4, which also uses Solidity 4. The highest OpenZeppelin that is compatible with Solidity 4 is 2.0.0. */ contract Landemic is ERC721Full("Landemic","LAND") { uint256 public _basePrice = 810000000000000; // $0.25 ETH/USD as of May 2019 uint8 public _bountyDivisor = 20; // 5% to each player uint16 public _defaultMultiple = 100; // using 1 decimal point divisibility, max 1000 address public _owner = msg.sender; string public _baseURL = "https://landemic.io/"; struct Price { uint240 lastPrice; uint16 multiple; } mapping(uint256 => Price) public _prices; // When recepient cannot receive the bounty, // it is stored here and can be pulled manually mapping(address => uint256) public failedPayouts; uint256 public failedPayoutsSum; /* Admin */ modifier onlyContractOwner() { require(msg.sender == _owner); _; } function _lastPrice(uint256 tokenId) public view returns (uint256) { return uint256(_prices[tokenId].lastPrice); } function _multiple(uint256 tokenId) public view returns (uint16) { return _prices[tokenId].multiple; } function setBasePrice(uint256 basePrice) onlyContractOwner public { _basePrice = basePrice; } function setBountyDivisor(uint8 bountyDivisor) onlyContractOwner public { _bountyDivisor = bountyDivisor; } function setBaseURL(string baseURL) public onlyContractOwner { _baseURL = baseURL; } function setOwner(address owner) onlyContractOwner public { _owner = owner; } // Allows the owner to withdraw profits and failed payouts. // Owner should check failedPayoutsSum to not withdraw extra. function withdraw(uint256 amount) onlyContractOwner public { msg.sender.transfer(amount); } function withdrawProfit() onlyContractOwner public { msg.sender.transfer(address(this).balance.sub(failedPayoutsSum)); } /* Temp Functions Until Server-Side Component */ function getAllOwned() public view returns (uint256[], address[]) { uint totalOwned = totalSupply(); uint256[] memory ownedUint256 = new uint256[](totalOwned); address[] memory ownersAddress = new address[](totalOwned); for (uint i = 0; i < totalOwned; i++) { ownedUint256[i] = tokenByIndex(i); ownersAddress[i] = ownerOf(ownedUint256[i]); } return (ownedUint256, ownersAddress); } function metadataForToken(uint256 tokenId) public view returns (uint256, address, uint16, uint256) { uint256 price = priceOf(tokenId); if (_exists(tokenId)) { return (_lastPrice(tokenId), ownerOf(tokenId), multipleOf(tokenId), price); } return (_basePrice, 0, 10, price); } function priceOf(uint256 tokenId) public view returns (uint256) { if (_exists(tokenId)) { return _lastPrice(tokenId).mul(uint256(multipleOf(tokenId))).div(10); } return _basePrice; } function multipleOf(uint256 tokenId) public view returns (uint16) { uint16 multiple = _multiple(tokenId); if (multiple > 0) { return multiple; } return _defaultMultiple; } /* Adjust metadata */ modifier onlyTokenOwner(uint256 tokenId) { require(msg.sender == ownerOf(tokenId)); _; } function setMultiple(uint256 tokenId, uint16 multiple) public onlyTokenOwner(tokenId) { require(multiple >= 1 && multiple <= 1000); _prices[tokenId].multiple = multiple; } /* Buy & Sell */ // TODO: // function grabCodes(uint256[] tokens) public payable { // for (uint i = 0; i < tokens.length; i++) { // _mint(msg.sender, tokens[i]); // } // } function _pushOrDelayBounty(address to, uint256 amount) internal { bool success = to.send(amount); if (!success) { failedPayouts[to] = failedPayouts[to].add(amount); failedPayoutsSum = failedPayoutsSum.add(amount); } } function grabCode(uint256 tokenId) public payable { // uint256 tokenId = uint256(stringToBytes32(code)); uint256 price = priceOf(tokenId); // _lastPrice * 0.1 <= price <= _lastPrice * 10 require(msg.value >= price); _prices[tokenId] = Price(uint240(msg.value), uint16(0)); if (!_exists(tokenId)) { _mint(msg.sender, tokenId); return; } address owner = ownerOf(tokenId); require(owner != msg.sender); _burn(owner, tokenId); _mint(msg.sender, tokenId); uint256 bounty = msg.value.div(_bountyDivisor); // 5% uint256 bountiesCount = 1; // Landemic. uint256[4] memory neighbors = neighborsOfToken(tokenId); for (uint i = 0; i < 4; i++) { uint256 neighbor = neighbors[i]; if (!_exists(neighbor)) { continue; } _pushOrDelayBounty(ownerOf(neighbor), bounty); bountiesCount++; } _pushOrDelayBounty(owner, msg.value.sub(bounty.mul(bountiesCount))); // 75% } function pullBounty(address to) public { uint256 bounty = failedPayouts[msg.sender]; if (bounty == 0) { return; } failedPayouts[msg.sender] = 0; failedPayoutsSum = failedPayoutsSum.sub(bounty); to.transfer(bounty); } /* ERC721Metadata overrides */ /** * @dev Returns an URI for a given token ID * @dev Throws if the token ID does not exist. May return an empty string. * @param _tokenId uint256 ID of the token to query */ function tokenURI(uint256 _tokenId) external view returns (string) { require(_exists(_tokenId)); return strConcat(strConcat(_baseURL, uint256ToString(_tokenId)),".json"); } /* Utilities */ // https://ethereum.stackexchange.com/a/9152/3847 function uint256ToString(uint256 y) private pure returns (string) { bytes32 x = bytes32(y); bytes memory bytesString = new bytes(32); uint charCount = 0; for (uint j = 0; j < 32; j++) { byte char = byte(bytes32(uint(x) * 2 ** (8 * j))); if (char != 0) { bytesString[charCount] = char; charCount++; } } bytes memory bytesStringTrimmed = new bytes(charCount); for (j = 0; j < charCount; j++) { bytesStringTrimmed[j] = bytesString[j]; } return string(bytesStringTrimmed); } function stringToBytes32(string memory source) private pure returns (bytes32 result) { bytes memory testEmptyStringTest = bytes(source); if (testEmptyStringTest.length == 0) { return 0x0; } assembly { result := mload(add(source, 32)) } } // https://ethereum.stackexchange.com/questions/729/how-to-concatenate-strings-in-solidity function strConcat(string _a, string _b) private pure returns (string) { bytes memory bytes_a = bytes(_a); bytes memory bytes_b = bytes(_b); string memory ab = new string (bytes_a.length + bytes_b.length); bytes memory bytes_ab = bytes(ab); uint k = 0; for (uint i = 0; i < bytes_a.length; i++) bytes_ab[k++] = bytes_a[i]; for (i = 0; i < bytes_b.length; i++) bytes_ab[k++] = bytes_b[i]; return string(bytes_ab); } // TODO: This should be a separate library: OLC.sol bytes20 constant DIGITS = bytes20('23456789CFGHJMPQRVWX'); bytes20 constant STIGID = bytes20('XWVRQPMJHGFC98765432'); function nextChar(byte c, bytes20 digits) private pure returns (byte) { for (uint i = 0; i < 20; i++) if (c == digits[i]) return (i == 19) ? digits[0] : digits[i+1]; } function replaceChar(uint256 tokenId, uint pos, byte c) private pure returns (uint256) { uint shift = (8 - pos) * 8; uint256 insert = uint256(c) << shift; uint256 mask = ~(uint256(0xff) << shift); return tokenId & mask | insert; } function incrementChar(uint256 tokenId, int pos, bytes20 digits) private pure returns (uint256) { if (pos < 0) return tokenId; byte c = nextChar(bytes32(tokenId)[23 + uint(pos)], digits); uint256 updated = replaceChar(tokenId, uint(pos), c); if (c == digits[0]) { int nextPos = pos - 2; byte nextPosChar = bytes32(updated)[23 + uint(nextPos)]; // Longitude has only 18 slices. if (nextPos == 1) { if (digits == DIGITS && nextPosChar == 'V') { return replaceChar(updated, uint(nextPos), '2'); } if (digits == STIGID && nextPosChar == '2') { return replaceChar(updated, uint(nextPos), 'V'); } } // Latitude has only 9 slices. if (nextPos == 0) { if (digits == DIGITS && nextPosChar == 'C') { return replaceChar(updated, uint(nextPos), '2'); } if (digits == STIGID && nextPosChar == '2') { return replaceChar(updated, uint(nextPos), 'C'); } } return incrementChar(updated, nextPos, digits); } return updated; } function northOfToken(uint256 tokenId) public pure returns (uint256) { return incrementChar(tokenId, 6, DIGITS); } function southOfToken(uint256 tokenId) public pure returns (uint256) { return incrementChar(tokenId, 6, STIGID); } function eastOfToken(uint256 tokenId) public pure returns (uint256) { return incrementChar(tokenId, 7, DIGITS); } function westOfToken(uint256 tokenId) public pure returns (uint256) { return incrementChar(tokenId, 7, STIGID); } function neighborsOfToken(uint256 tokenId) public pure returns (uint256[4]) { return [ northOfToken(tokenId), eastOfToken(tokenId), southOfToken(tokenId), westOfToken(tokenId) ]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"northOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"southOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"westOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_basePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_defaultMultiple","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"baseURL","type":"string"}],"name":"setBaseURL","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"_multiple","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"pullBounty","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_bountyDivisor","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"neighborsOfToken","outputs":[{"name":"","type":"uint256[4]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawProfit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"metadataForToken","outputs":[{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"uint16"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"priceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"multiple","type":"uint16"}],"name":"setMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"failedPayoutsSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"eastOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"_lastPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"basePrice","type":"uint256"}],"name":"setBasePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"failedPayouts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"grabCode","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"multipleOf","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"bountyDivisor","type":"uint8"}],"name":"setBountyDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllOwned","outputs":[{"name":"","type":"uint256[]"},{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_baseURL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"_prices","outputs":[{"name":"lastPrice","type":"uint240"},{"name":"multiple","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]
Contract Creation Code
6602e0b0d244a000600c55600d8054601460ff19909116811762ffff00191661640017630100000060b860020a031916336301000000021790915560c060405260808190527f68747470733a2f2f6c616e64656d69632e696f2f00000000000000000000000060a09081526200007991600e919062000258565b50604080518082018252600881527f4c616e64656d69630000000000000000000000000000000000000000000000006020808301919091528251808401909352600483527f4c414e440000000000000000000000000000000000000000000000000000000090830152908181620001197f01ffc9a700000000000000000000000000000000000000000000000000000000640100000000620001eb810204565b6200014d7f80ac58cd00000000000000000000000000000000000000000000000000000000640100000000620001eb810204565b620001817f780e9d6300000000000000000000000000000000000000000000000000000000640100000000620001eb810204565b81516200019690600990602085019062000258565b508051620001ac90600a90602084019062000258565b50620001e17f5b5e139f00000000000000000000000000000000000000000000000000000000640100000000620001eb810204565b50505050620002fd565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200021b57600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200029b57805160ff1916838001178555620002cb565b82800160010185558215620002cb579182015b82811115620002cb578251825591602001919060010190620002ae565b50620002d9929150620002dd565b5090565b620002fa91905b80821115620002d95760008155600101620002e4565b90565b612e38806200030d6000396000f3006080604052600436106102195763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461021e57806306fdde031461026c578063081812fc146102f6578063095ea7b31461033757806313af40351461036a57806318160ddd146103985780631c79b4fc146103bf57806322835acc146103d757806323b872dd146103ef57806329cc044d146104265780632e1a7d4d1461043e5780632f745c591461045657806342842e0e1461048757806344cf661f146104be5780634501efbe146104d357806349f2553a146104ff5780634e2e470e146105585780634f6ccce7146105705780635adadef7146105885780636352211e146105b657806365063805146105ce5780636a3dc446146105f957806370a0823114610649578063959499b61461067757806395d89b411461068c578063a22cb465146106a1578063a3bbe569146106d4578063b2bdfa7b1461072a578063b88d4fde1461073f578063b9186d7d146107bb578063c2b6fb61146107d3578063c87b56dd146107f2578063d13b89411461080a578063d2834a9b1461081f578063ddf3d15f14610837578063de4b32621461084f578063de64a76514610867578063e121ba7c14610895578063e566f2b2146108a0578063e58de971146108b8578063e985e9c5146108d3578063f071810014610907578063f9e0edae146109b5578063fe776dd0146109ca575b600080fd5b34801561022a57600080fd5b506102587fffffffff0000000000000000000000000000000000000000000000000000000060043516610a1f565b604080519115158252519081900360200190f35b34801561027857600080fd5b50610281610a5a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bb5781810151838201526020016102a3565b50505050905090810190601f1680156102e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030257600080fd5b5061030e600435610af1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561034357600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516602435610b30565b005b34801561037657600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516610c18565b3480156103a457600080fd5b506103ad610c91565b60408051918252519081900360200190f35b3480156103cb57600080fd5b506103ad600435610c97565b3480156103e357600080fd5b506103ad600435610ccb565b3480156103fb57600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610cf9565b34801561043257600080fd5b506103ad600435610dae565b34801561044a57600080fd5b50610368600435610ddc565b34801561046257600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff60043516602435610e38565b34801561049357600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610e92565b3480156104ca57600080fd5b506103ad610eb3565b3480156104df57600080fd5b506104e8610eb9565b6040805161ffff9092168252519081900360200190f35b34801561050b57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610368943694929360249392840191908190840183828082843750949750610ec89650505050505050565b34801561056457600080fd5b506104e8600435610f06565b34801561057c57600080fd5b506103ad600435610f3e565b34801561059457600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516610f73565b3480156105c257600080fd5b5061030e600435610ff8565b3480156105da57600080fd5b506105e3611033565b6040805160ff9092168252519081900360200190f35b34801561060557600080fd5b5061061160043561103c565b6040518082608080838360005b8381101561063657818101518382015260200161061e565b5050505090500191505060405180910390f35b34801561065557600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff6004351661108b565b34801561068357600080fd5b506103686110d8565b34801561069857600080fd5b50610281611149565b3480156106ad57600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff6004351660243515156111aa565b3480156106e057600080fd5b506106ec600435611266565b6040805194855273ffffffffffffffffffffffffffffffffffffffff909316602085015261ffff909116838301526060830152519081900360800190f35b34801561073657600080fd5b5061030e6112c9565b34801561074b57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103689473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506112ec9650505050505050565b3480156107c757600080fd5b506103ad600435611314565b3480156107df57600080fd5b5061036860043561ffff60243516611369565b3480156107fe57600080fd5b5061028160043561141d565b34801561081657600080fd5b506103ad61150f565b34801561082b57600080fd5b506103ad600435611515565b34801561084357600080fd5b506103ad600435611543565b34801561085b57600080fd5b50610368600435611575565b34801561087357600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff600435166115a5565b6103686004356115b7565b3480156108ac57600080fd5b506104e8600435611793565b3480156108c457600080fd5b5061036860ff600435166117c9565b3480156108df57600080fd5b5061025873ffffffffffffffffffffffffffffffffffffffff60043581169060243516611828565b34801561091357600080fd5b5061091c611863565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610960578181015183820152602001610948565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561099f578181015183820152602001610987565b5050505090500194505050505060405180910390f35b3480156109c157600080fd5b50610281611965565b3480156109d657600080fd5b506109e26004356119f3565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316835261ffff90911660208301528051918290030190f35b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b505050505090505b90565b6000610afc82611a4d565b1515610b0757600080fd5b5060009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b3b82610ff8565b905073ffffffffffffffffffffffffffffffffffffffff8381169082161415610b6357600080fd5b3373ffffffffffffffffffffffffffffffffffffffff82161480610b8c5750610b8c8133611828565b1515610b9757600080fd5b60008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610c4357600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff9092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b60075490565b6000610cc58260067f3233343536373839434647484a4d505152565758000000000000000000000000611a77565b92915050565b6000610cc58260067f5857565251504d4a484746433938373635343332000000000000000000000000611a77565b610d033382611edc565b1515610d0e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82161515610d3057600080fd5b610d3a8382611f71565b610d448382612012565b610d4e828261215a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610cc58260077f5857565251504d4a484746433938373635343332000000000000000000000000611a77565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610e0757600080fd5b604051339082156108fc029083906000818181858888f19350505050158015610e34573d6000803e3d6000fd5b5050565b6000610e438361108b565b8210610e4e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600560205260409020805483908110610e7f57fe5b9060005260206000200154905092915050565b610eae83838360206040519081016040528060008152506112ec565b505050565b600c5481565b600d54610100900461ffff1681565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610ef357600080fd5b8051610e3490600e906020840190612cf1565b6000908152600f60205260409020547e01000000000000000000000000000000000000000000000000000000000000900461ffff1690565b6000610f48610c91565b8210610f5357600080fd5b6007805483908110610f6157fe5b90600052602060002001549050919050565b33600090815260106020526040902054801515610f8f57610e34565b33600090815260106020526040812055601154610fb2908263ffffffff6121b016565b60115560405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610eae573d6000803e3d6000fd5b60008181526001602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561102957600080fd5b8091505b50919050565b600d5460ff1681565b611044612d6f565b60806040519081016040528061105984610c97565b815260200161106784611515565b815260200161107584610ccb565b815260200161108384610dae565b905292915050565b600073ffffffffffffffffffffffffffffffffffffffff821615156110af57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff16331461110357600080fd5b60115433906108fc9061111e9030319063ffffffff6121b016565b6040518115909202916000818181858888f19350505050158015611146573d6000803e3d6000fd5b50565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b73ffffffffffffffffffffffffffffffffffffffff82163314156111cd57600080fd5b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600080600080600061127786611314565b905061128286611a4d565b156112b05761129086611543565b61129987610ff8565b6112a288611793565b8394509450945094506112c1565b600c54945060009350600a92509050805b509193509193565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6112f7848484610cf9565b611303848484846121c7565b151561130e57600080fd5b50505050565b600061131f82611a4d565b156113615761135a600a61134e61133585611793565b61ffff1661134286611543565b9063ffffffff61236616565b9063ffffffff61239b16565b9050610a55565b5050600c5490565b8161137381610ff8565b73ffffffffffffffffffffffffffffffffffffffff16331461139457600080fd5b60018261ffff16101580156113af57506103e88261ffff1611155b15156113ba57600080fd5b506000918252600f6020526040909120805461ffff9092167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b606061142882611a4d565b151561143357600080fd5b600e805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152610cc5936114d693919290918301828280156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b50505050506114d1856123be565b61256e565b60408051808201909152600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602082015261256e565b60115481565b6000610cc58260077f3233343536373839434647484a4d505152565758000000000000000000000000611a77565b6000908152600f60205260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1633146115a057600080fd5b600c55565b60106020526000908152604090205481565b6000806000806115c5612d6f565b6000806115d188611314565b9650348711156115e057600080fd5b6040805180820182527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3481168252600060208084018281528d8352600f90915293902091518254935161ffff167e01000000000000000000000000000000000000000000000000000000000000029082167fffff000000000000000000000000000000000000000000000000000000000000909416939093171691909117905561168888611a4d565b151561169d57611698338961272d565b611789565b6116a688610ff8565b955073ffffffffffffffffffffffffffffffffffffffff86163314156116cb57600080fd5b6116d5868961277c565b6116df338961272d565b600d546116f690349060ff1663ffffffff61239b16565b9450600193506117058861103c565b9250600091505b60048210156117605782826004811061172157fe5b6020020151905061173181611a4d565b151561173c57611755565b61174e61174882610ff8565b866127c4565b6001909301925b60019091019061170c565b61178986611784611777888863ffffffff61236616565b349063ffffffff6121b016565b6127c4565b5050505050505050565b60008061179f83610f06565b905060008161ffff1611156117b65780915061102d565b5050600d54610100900461ffff16919050565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1633146117f457600080fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b60608060006060806000611875610c91565b9350836040519080825280602002602001820160405280156118a1578160200160208202803883390190505b509250836040519080825280602002602001820160405280156118ce578160200160208202803883390190505b509150600090505b8381101561195a576118e781610f3e565b83828151811015156118f557fe5b6020908102909101015282516119209084908390811061191157fe5b90602001906020020151610ff8565b828281518110151561192e57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302909101909101526001016118d6565b509094909350915050565b600e805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156119eb5780601f106119c0576101008083540402835291602001916119eb565b820191906000526020600020905b8154815290600101906020018083116119ce57829003601f168201915b505050505081565b600f602052600090815260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116907e01000000000000000000000000000000000000000000000000000000000000900461ffff1682565b60009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b600080600080600080871215611a8f57879450611ed1565b611aca886017890160208110611aa157fe5b1a7f01000000000000000000000000000000000000000000000000000000000000000287612878565b9350611ad7888886612974565b92508560001a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611ecd577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe87019150826015880160208110611b7e57fe5b1a7f01000000000000000000000000000000000000000000000000000000000000000290508160011415611d37577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f3233343536373839434647484a4d505152565758000000000000000000000000148015611c3e57507f56000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611c7557611c6e83837f3200000000000000000000000000000000000000000000000000000000000000612974565b9450611ed1565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f5857565251504d4a484746433938373635343332000000000000000000000000148015611d0757507f32000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611d3757611c6e83837f5600000000000000000000000000000000000000000000000000000000000000612974565b811515611ec2577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f3233343536373839434647484a4d505152565758000000000000000000000000148015611dd057507f43000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611e0057611c6e83837f3200000000000000000000000000000000000000000000000000000000000000612974565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f5857565251504d4a484746433938373635343332000000000000000000000000148015611e9257507f32000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611ec257611c6e83837f4300000000000000000000000000000000000000000000000000000000000000612974565b611c6e838388611a77565b8294505b505050509392505050565b600080611ee883610ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5757508373ffffffffffffffffffffffffffffffffffffffff16611f3f84610af1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f675750611f678185611828565b91505b5092915050565b8173ffffffffffffffffffffffffffffffffffffffff16611f9182610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614611fb157600080fd5b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610e3457600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b600080600061202185856129b2565b60008481526006602090815260408083205473ffffffffffffffffffffffffffffffffffffffff8916845260059092529091205490935061206990600163ffffffff6121b016565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602052604090208054919350908390811061209e57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811015156120f857fe5b600091825260208083209091019290925573ffffffffffffffffffffffffffffffffffffffff8716815260059091526040902080549061213c906000198301612d8e565b50600093845260066020526040808520859055908452909220555050565b60006121668383612a87565b5073ffffffffffffffffffffffffffffffffffffffff9091166000908152600560209081526040808320805460018101825590845282842081018590559383526006909152902055565b600080838311156121c057600080fd5b5050900390565b6000806121e98573ffffffffffffffffffffffffffffffffffffffff16612b49565b15156121f8576001915061235d565b6040517f150b7a02000000000000000000000000000000000000000000000000000000008152336004820181815273ffffffffffffffffffffffffffffffffffffffff898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015612298578181015183820152602001612280565b50505050905090810190601f1680156122c55780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156122e757600080fd5b505af11580156122fb573d6000803e3d6000fd5b505050506040513d602081101561231157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b6000808315156123795760009150611f6a565b5082820282848281151561238957fe5b041461239457600080fd5b9392505050565b6000808083116123aa57600080fd5b82848115156123b557fe5b04949350505050565b604080516020808252818301909252606091839183916000918291829185918082016104008038833901905050945060009350600092505b6020831015612483576008830260020a860291507fff000000000000000000000000000000000000000000000000000000000000008216156124785781858581518110151561244157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916123f6565b836040519080825280601f01601f1916602001820160405280156124b1578160200160208202803883390190505b509050600092505b838310156125635784838151811015156124cf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110151561252857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201916124b9565b979650505050505050565b606080606080606060008088955087945084518651016040519080825280601f01601f1916602001820160405280156125b1578160200160208202803883390190505b50935083925060009150600090505b855181101561266e5785818151811015156125d757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561263657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016125c0565b5060005b845181101561272057848181518110151561268957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156126e857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612672565b5090979650505050505050565b6127378282612b51565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688015550565b6127868282612bc6565b6000818152600b60205260409020546002600019610100600184161502019091160415610e34576000818152600b60205260408120610e3491612db2565b60405160009073ffffffffffffffffffffffffffffffffffffffff84169083156108fc0290849084818181858888f193505050509050801515610eae5773ffffffffffffffffffffffffffffffffffffffff8316600090815260106020526040902054612837908363ffffffff612c8216565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260106020526040902055601154612870908363ffffffff612c8216565b601155505050565b6000805b6014811015611f6a5782816014811061289157fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561296c578060131461293e5782600182016014811061291657fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002612965565b8260001a7f0100000000000000000000000000000000000000000000000000000000000000025b9150611f6a565b60010161287c565b60ff600892830390920260020a91820219929092167f0100000000000000000000000000000000000000000000000000000000000000909204021790565b8173ffffffffffffffffffffffffffffffffffffffff166129d282610ff8565b73ffffffffffffffffffffffffffffffffffffffff16146129f257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040902054612a2990600163ffffffff6121b016565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526003602090815260408083209490945591815260019091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612ab657600080fd5b600081815260016020818152604080842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88169081179091558452600390915290912054612b1c91612c82565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526003602052604090209190915550565b6000903b1190565b73ffffffffffffffffffffffffffffffffffffffff82161515612b7357600080fd5b612b7d828261215a565b604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000806000612bd58585612c94565b600084815260086020526040902054600754909350612bfb90600163ffffffff6121b016565b9150600782815481101515612c0c57fe5b9060005260206000200154905080600784815481101515612c2957fe5b60009182526020822001919091556007805484908110612c4557fe5b6000918252602090912001556007805490612c64906000198301612d8e565b50600093845260086020526040808520859055908452909220555050565b60008282018381101561239457600080fd5b612c9e8282611f71565b612ca88282612012565b604051819060009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612d3257805160ff1916838001178555612d5f565b82800160010185558215612d5f579182015b82811115612d5f578251825591602001919060010190612d44565b50612d6b929150612df2565b5090565b6080604051908101604052806004906020820280388339509192915050565b815481835581811115610eae57600083815260209020610eae918101908301612df2565b50805460018160011615610100020316600290046000825580601f10612dd85750611146565b601f01602090049060005260206000209081019061114691905b610aee91905b80821115612d6b5760008155600101612df85600a165627a7a7230582004634b7278889d13c95e1a21bf89bf2c92f54ff1a10419167995cf7532f8e9d70029
Deployed Bytecode
0x6080604052600436106102195763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461021e57806306fdde031461026c578063081812fc146102f6578063095ea7b31461033757806313af40351461036a57806318160ddd146103985780631c79b4fc146103bf57806322835acc146103d757806323b872dd146103ef57806329cc044d146104265780632e1a7d4d1461043e5780632f745c591461045657806342842e0e1461048757806344cf661f146104be5780634501efbe146104d357806349f2553a146104ff5780634e2e470e146105585780634f6ccce7146105705780635adadef7146105885780636352211e146105b657806365063805146105ce5780636a3dc446146105f957806370a0823114610649578063959499b61461067757806395d89b411461068c578063a22cb465146106a1578063a3bbe569146106d4578063b2bdfa7b1461072a578063b88d4fde1461073f578063b9186d7d146107bb578063c2b6fb61146107d3578063c87b56dd146107f2578063d13b89411461080a578063d2834a9b1461081f578063ddf3d15f14610837578063de4b32621461084f578063de64a76514610867578063e121ba7c14610895578063e566f2b2146108a0578063e58de971146108b8578063e985e9c5146108d3578063f071810014610907578063f9e0edae146109b5578063fe776dd0146109ca575b600080fd5b34801561022a57600080fd5b506102587fffffffff0000000000000000000000000000000000000000000000000000000060043516610a1f565b604080519115158252519081900360200190f35b34801561027857600080fd5b50610281610a5a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bb5781810151838201526020016102a3565b50505050905090810190601f1680156102e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030257600080fd5b5061030e600435610af1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561034357600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516602435610b30565b005b34801561037657600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516610c18565b3480156103a457600080fd5b506103ad610c91565b60408051918252519081900360200190f35b3480156103cb57600080fd5b506103ad600435610c97565b3480156103e357600080fd5b506103ad600435610ccb565b3480156103fb57600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610cf9565b34801561043257600080fd5b506103ad600435610dae565b34801561044a57600080fd5b50610368600435610ddc565b34801561046257600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff60043516602435610e38565b34801561049357600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610e92565b3480156104ca57600080fd5b506103ad610eb3565b3480156104df57600080fd5b506104e8610eb9565b6040805161ffff9092168252519081900360200190f35b34801561050b57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610368943694929360249392840191908190840183828082843750949750610ec89650505050505050565b34801561056457600080fd5b506104e8600435610f06565b34801561057c57600080fd5b506103ad600435610f3e565b34801561059457600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516610f73565b3480156105c257600080fd5b5061030e600435610ff8565b3480156105da57600080fd5b506105e3611033565b6040805160ff9092168252519081900360200190f35b34801561060557600080fd5b5061061160043561103c565b6040518082608080838360005b8381101561063657818101518382015260200161061e565b5050505090500191505060405180910390f35b34801561065557600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff6004351661108b565b34801561068357600080fd5b506103686110d8565b34801561069857600080fd5b50610281611149565b3480156106ad57600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff6004351660243515156111aa565b3480156106e057600080fd5b506106ec600435611266565b6040805194855273ffffffffffffffffffffffffffffffffffffffff909316602085015261ffff909116838301526060830152519081900360800190f35b34801561073657600080fd5b5061030e6112c9565b34801561074b57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103689473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506112ec9650505050505050565b3480156107c757600080fd5b506103ad600435611314565b3480156107df57600080fd5b5061036860043561ffff60243516611369565b3480156107fe57600080fd5b5061028160043561141d565b34801561081657600080fd5b506103ad61150f565b34801561082b57600080fd5b506103ad600435611515565b34801561084357600080fd5b506103ad600435611543565b34801561085b57600080fd5b50610368600435611575565b34801561087357600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff600435166115a5565b6103686004356115b7565b3480156108ac57600080fd5b506104e8600435611793565b3480156108c457600080fd5b5061036860ff600435166117c9565b3480156108df57600080fd5b5061025873ffffffffffffffffffffffffffffffffffffffff60043581169060243516611828565b34801561091357600080fd5b5061091c611863565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610960578181015183820152602001610948565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561099f578181015183820152602001610987565b5050505090500194505050505060405180910390f35b3480156109c157600080fd5b50610281611965565b3480156109d657600080fd5b506109e26004356119f3565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316835261ffff90911660208301528051918290030190f35b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b505050505090505b90565b6000610afc82611a4d565b1515610b0757600080fd5b5060009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b3b82610ff8565b905073ffffffffffffffffffffffffffffffffffffffff8381169082161415610b6357600080fd5b3373ffffffffffffffffffffffffffffffffffffffff82161480610b8c5750610b8c8133611828565b1515610b9757600080fd5b60008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610c4357600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff9092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b60075490565b6000610cc58260067f3233343536373839434647484a4d505152565758000000000000000000000000611a77565b92915050565b6000610cc58260067f5857565251504d4a484746433938373635343332000000000000000000000000611a77565b610d033382611edc565b1515610d0e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82161515610d3057600080fd5b610d3a8382611f71565b610d448382612012565b610d4e828261215a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610cc58260077f5857565251504d4a484746433938373635343332000000000000000000000000611a77565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610e0757600080fd5b604051339082156108fc029083906000818181858888f19350505050158015610e34573d6000803e3d6000fd5b5050565b6000610e438361108b565b8210610e4e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600560205260409020805483908110610e7f57fe5b9060005260206000200154905092915050565b610eae83838360206040519081016040528060008152506112ec565b505050565b600c5481565b600d54610100900461ffff1681565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610ef357600080fd5b8051610e3490600e906020840190612cf1565b6000908152600f60205260409020547e01000000000000000000000000000000000000000000000000000000000000900461ffff1690565b6000610f48610c91565b8210610f5357600080fd5b6007805483908110610f6157fe5b90600052602060002001549050919050565b33600090815260106020526040902054801515610f8f57610e34565b33600090815260106020526040812055601154610fb2908263ffffffff6121b016565b60115560405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610eae573d6000803e3d6000fd5b60008181526001602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561102957600080fd5b8091505b50919050565b600d5460ff1681565b611044612d6f565b60806040519081016040528061105984610c97565b815260200161106784611515565b815260200161107584610ccb565b815260200161108384610dae565b905292915050565b600073ffffffffffffffffffffffffffffffffffffffff821615156110af57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff16331461110357600080fd5b60115433906108fc9061111e9030319063ffffffff6121b016565b6040518115909202916000818181858888f19350505050158015611146573d6000803e3d6000fd5b50565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b73ffffffffffffffffffffffffffffffffffffffff82163314156111cd57600080fd5b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600080600080600061127786611314565b905061128286611a4d565b156112b05761129086611543565b61129987610ff8565b6112a288611793565b8394509450945094506112c1565b600c54945060009350600a92509050805b509193509193565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6112f7848484610cf9565b611303848484846121c7565b151561130e57600080fd5b50505050565b600061131f82611a4d565b156113615761135a600a61134e61133585611793565b61ffff1661134286611543565b9063ffffffff61236616565b9063ffffffff61239b16565b9050610a55565b5050600c5490565b8161137381610ff8565b73ffffffffffffffffffffffffffffffffffffffff16331461139457600080fd5b60018261ffff16101580156113af57506103e88261ffff1611155b15156113ba57600080fd5b506000918252600f6020526040909120805461ffff9092167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b606061142882611a4d565b151561143357600080fd5b600e805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152610cc5936114d693919290918301828280156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b50505050506114d1856123be565b61256e565b60408051808201909152600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602082015261256e565b60115481565b6000610cc58260077f3233343536373839434647484a4d505152565758000000000000000000000000611a77565b6000908152600f60205260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1633146115a057600080fd5b600c55565b60106020526000908152604090205481565b6000806000806115c5612d6f565b6000806115d188611314565b9650348711156115e057600080fd5b6040805180820182527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3481168252600060208084018281528d8352600f90915293902091518254935161ffff167e01000000000000000000000000000000000000000000000000000000000000029082167fffff000000000000000000000000000000000000000000000000000000000000909416939093171691909117905561168888611a4d565b151561169d57611698338961272d565b611789565b6116a688610ff8565b955073ffffffffffffffffffffffffffffffffffffffff86163314156116cb57600080fd5b6116d5868961277c565b6116df338961272d565b600d546116f690349060ff1663ffffffff61239b16565b9450600193506117058861103c565b9250600091505b60048210156117605782826004811061172157fe5b6020020151905061173181611a4d565b151561173c57611755565b61174e61174882610ff8565b866127c4565b6001909301925b60019091019061170c565b61178986611784611777888863ffffffff61236616565b349063ffffffff6121b016565b6127c4565b5050505050505050565b60008061179f83610f06565b905060008161ffff1611156117b65780915061102d565b5050600d54610100900461ffff16919050565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1633146117f457600080fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b60608060006060806000611875610c91565b9350836040519080825280602002602001820160405280156118a1578160200160208202803883390190505b509250836040519080825280602002602001820160405280156118ce578160200160208202803883390190505b509150600090505b8381101561195a576118e781610f3e565b83828151811015156118f557fe5b6020908102909101015282516119209084908390811061191157fe5b90602001906020020151610ff8565b828281518110151561192e57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302909101909101526001016118d6565b509094909350915050565b600e805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156119eb5780601f106119c0576101008083540402835291602001916119eb565b820191906000526020600020905b8154815290600101906020018083116119ce57829003601f168201915b505050505081565b600f602052600090815260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116907e01000000000000000000000000000000000000000000000000000000000000900461ffff1682565b60009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b600080600080600080871215611a8f57879450611ed1565b611aca886017890160208110611aa157fe5b1a7f01000000000000000000000000000000000000000000000000000000000000000287612878565b9350611ad7888886612974565b92508560001a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611ecd577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe87019150826015880160208110611b7e57fe5b1a7f01000000000000000000000000000000000000000000000000000000000000000290508160011415611d37577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f3233343536373839434647484a4d505152565758000000000000000000000000148015611c3e57507f56000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611c7557611c6e83837f3200000000000000000000000000000000000000000000000000000000000000612974565b9450611ed1565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f5857565251504d4a484746433938373635343332000000000000000000000000148015611d0757507f32000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611d3757611c6e83837f5600000000000000000000000000000000000000000000000000000000000000612974565b811515611ec2577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f3233343536373839434647484a4d505152565758000000000000000000000000148015611dd057507f43000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611e0057611c6e83837f3200000000000000000000000000000000000000000000000000000000000000612974565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f5857565251504d4a484746433938373635343332000000000000000000000000148015611e9257507f32000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611ec257611c6e83837f4300000000000000000000000000000000000000000000000000000000000000612974565b611c6e838388611a77565b8294505b505050509392505050565b600080611ee883610ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5757508373ffffffffffffffffffffffffffffffffffffffff16611f3f84610af1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f675750611f678185611828565b91505b5092915050565b8173ffffffffffffffffffffffffffffffffffffffff16611f9182610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614611fb157600080fd5b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610e3457600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b600080600061202185856129b2565b60008481526006602090815260408083205473ffffffffffffffffffffffffffffffffffffffff8916845260059092529091205490935061206990600163ffffffff6121b016565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602052604090208054919350908390811061209e57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811015156120f857fe5b600091825260208083209091019290925573ffffffffffffffffffffffffffffffffffffffff8716815260059091526040902080549061213c906000198301612d8e565b50600093845260066020526040808520859055908452909220555050565b60006121668383612a87565b5073ffffffffffffffffffffffffffffffffffffffff9091166000908152600560209081526040808320805460018101825590845282842081018590559383526006909152902055565b600080838311156121c057600080fd5b5050900390565b6000806121e98573ffffffffffffffffffffffffffffffffffffffff16612b49565b15156121f8576001915061235d565b6040517f150b7a02000000000000000000000000000000000000000000000000000000008152336004820181815273ffffffffffffffffffffffffffffffffffffffff898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015612298578181015183820152602001612280565b50505050905090810190601f1680156122c55780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156122e757600080fd5b505af11580156122fb573d6000803e3d6000fd5b505050506040513d602081101561231157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b6000808315156123795760009150611f6a565b5082820282848281151561238957fe5b041461239457600080fd5b9392505050565b6000808083116123aa57600080fd5b82848115156123b557fe5b04949350505050565b604080516020808252818301909252606091839183916000918291829185918082016104008038833901905050945060009350600092505b6020831015612483576008830260020a860291507fff000000000000000000000000000000000000000000000000000000000000008216156124785781858581518110151561244157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916123f6565b836040519080825280601f01601f1916602001820160405280156124b1578160200160208202803883390190505b509050600092505b838310156125635784838151811015156124cf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110151561252857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201916124b9565b979650505050505050565b606080606080606060008088955087945084518651016040519080825280601f01601f1916602001820160405280156125b1578160200160208202803883390190505b50935083925060009150600090505b855181101561266e5785818151811015156125d757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561263657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016125c0565b5060005b845181101561272057848181518110151561268957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156126e857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612672565b5090979650505050505050565b6127378282612b51565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688015550565b6127868282612bc6565b6000818152600b60205260409020546002600019610100600184161502019091160415610e34576000818152600b60205260408120610e3491612db2565b60405160009073ffffffffffffffffffffffffffffffffffffffff84169083156108fc0290849084818181858888f193505050509050801515610eae5773ffffffffffffffffffffffffffffffffffffffff8316600090815260106020526040902054612837908363ffffffff612c8216565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260106020526040902055601154612870908363ffffffff612c8216565b601155505050565b6000805b6014811015611f6a5782816014811061289157fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561296c578060131461293e5782600182016014811061291657fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002612965565b8260001a7f0100000000000000000000000000000000000000000000000000000000000000025b9150611f6a565b60010161287c565b60ff600892830390920260020a91820219929092167f0100000000000000000000000000000000000000000000000000000000000000909204021790565b8173ffffffffffffffffffffffffffffffffffffffff166129d282610ff8565b73ffffffffffffffffffffffffffffffffffffffff16146129f257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040902054612a2990600163ffffffff6121b016565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526003602090815260408083209490945591815260019091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612ab657600080fd5b600081815260016020818152604080842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88169081179091558452600390915290912054612b1c91612c82565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526003602052604090209190915550565b6000903b1190565b73ffffffffffffffffffffffffffffffffffffffff82161515612b7357600080fd5b612b7d828261215a565b604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000806000612bd58585612c94565b600084815260086020526040902054600754909350612bfb90600163ffffffff6121b016565b9150600782815481101515612c0c57fe5b9060005260206000200154905080600784815481101515612c2957fe5b60009182526020822001919091556007805484908110612c4557fe5b6000918252602090912001556007805490612c64906000198301612d8e565b50600093845260086020526040808520859055908452909220555050565b60008282018381101561239457600080fd5b612c9e8282611f71565b612ca88282612012565b604051819060009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612d3257805160ff1916838001178555612d5f565b82800160010185558215612d5f579182015b82811115612d5f578251825591602001919060010190612d44565b50612d6b929150612df2565b5090565b6080604051908101604052806004906020820280388339509192915050565b815481835581811115610eae57600083815260209020610eae918101908301612df2565b50805460018160011615610100020316600290046000825580601f10612dd85750611146565b601f01602090049060005260206000209081019061114691905b610aee91905b80821115612d6b5760008155600101612df85600a165627a7a7230582004634b7278889d13c95e1a21bf89bf2c92f54ff1a10419167995cf7532f8e9d70029
Deployed Bytecode Sourcemap
29242:10481:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6944:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6944:147:0;;;;;;;;;;;;;;;;;;;;;;;;;27049:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27049:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;27049:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10863:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10863:144:0;;;;;;;;;;;;;;;;;;;;;;;;10307:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10307:277:0;;;;;;;;;;;30686:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30686:91:0;;;;;;;21629:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21629:90:0;;;;;;;;;;;;;;;;;;;;38921:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38921:128:0;;;;;39057;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39057:128:0;;;;;12410:341;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12410:341:0;;;;;;;;;;;;;;39328:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39328:127:0;;;;;30917:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30917:105:0;;;;;21273:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21273:208:0;;;;;;;;;13378:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13378:202:0;;;;;;;;;;;;;;29302:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29302:43:0;;;;29444:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29444:36:0;;;;;;;;;;;;;;;;;;;;;;;30580:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30580:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30580:98:0;;-1:-1:-1;30580:98:0;;-1:-1:-1;;;;;;;30580:98:0;30212:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30212:116:0;;;;;22050:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22050:141:0;;;;;34515:288;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34515:288:0;;;;;;;9727:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9727:167:0;;;;;29384:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29384:32:0;;;;;;;;;;;;;;;;;;;;;;;39463:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39463:255:0;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39463:255:0;;;;;;;;;;;;;;;;9365:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9365:143:0;;;;;;;31030:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31030:134:0;;;;27225:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27225:76:0;;;;11293:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11293:203:0;;;;;;;;;;;31712:329;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31712:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29535:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29535:34:0;;;;14273:276;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14273:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14273:276:0;;-1:-1:-1;14273:276:0;;-1:-1:-1;;;;;;;14273:276:0;32049:227;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32049:227:0;;;;;32665:194;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32665:194:0;;;;;;;;;35051:195;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35051:195:0;;;;;29920:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29920:31:0;;;;39193:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39193:127:0;;;;;30076:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30076:128:0;;;;;30336:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30336:107:0;;;;;29865:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29865:48:0;;;;;;;33382:1125;;;;;;32284:225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32284:225:0;;;;;30451:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30451:121:0;;;;;;;11811:174;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11811:174:0;;;;;;;;;;;;31228:476;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31228:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31228:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31228:476:0;;;;;;;;;;;;;;;;;;;29576:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29576:47:0;;;;29713:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29713:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6944:147;7052:33;;;7029:4;7052:33;;;;;;;;;;;;;6944:147;;;;:::o;27049:72::-;27110:5;27103:12;;;;;;;;-1:-1:-1;;27103:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27088:6;;27103:12;;27110:5;;27103:12;;27110:5;27103:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27049:72;;:::o;10863:144::-;10922:7;10946:16;10954:7;10946;:16::i;:::-;10938:25;;;;;;;;-1:-1:-1;10977:24:0;;;;:15;:24;;;;;;;;;10863:144::o;10307:277::-;10367:13;10383:16;10391:7;10383;:16::i;:::-;10367:32;-1:-1:-1;10414:11:0;;;;;;;;;10406:20;;;;;;10441:10;:19;;;;;:58;;;10464:35;10481:5;10488:10;10464:16;:35::i;:::-;10433:67;;;;;;;;10509:24;;;;:15;:24;;;;;;:29;;;;;;;;;;;;;;10550:28;;10509:24;;10550:28;;;;;;;10307:277;;;:::o;30686:91::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30755:6;:14;;;;;;;;;;;;;;;;;;30686:91::o;21629:90::-;21696:10;:17;21629:90;:::o;38921:128::-;38981:7;39008:33;39022:7;39031:1;36985:31;39008:13;:33::i;:::-;39001:40;38921:128;-1:-1:-1;;38921:128:0:o;39057:::-;39117:7;39144:33;39158:7;39167:1;37049:31;39144:13;:33::i;12410:341::-;12525:39;12544:10;12556:7;12525:18;:39::i;:::-;12517:48;;;;;;;;12580:16;;;;;12572:25;;;;;;12606:29;12621:4;12627:7;12606:14;:29::i;:::-;12642:31;12659:4;12665:7;12642:16;:31::i;:::-;12680:24;12692:2;12696:7;12680:11;:24::i;:::-;12737:7;12733:2;12718:27;;12727:4;12718:27;;;;;;;;;;;;12410:341;;;:::o;39328:127::-;39387:7;39414:33;39428:7;39437:1;37049:31;39414:13;:33::i;30917:105::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30987:27;;:10;;:27;;;;;31007:6;;30987:27;;;;31007:6;30987:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30987:27:0;30917:105;:::o;21273:208::-;21383:7;21418:16;21428:5;21418:9;:16::i;:::-;21410:24;;21402:33;;;;;;21449:19;;;;;;;:12;:19;;;;;:26;;21469:5;;21449:26;;;;;;;;;;;;;;21442:33;;21273:208;;;;:::o;13378:202::-;13535:39;13552:4;13558:2;13562:7;13535:39;;;;;;;;;;;;;:16;:39::i;:::-;13378:202;;;:::o;29302:43::-;;;;:::o;29444:36::-;;;;;;;;;:::o;30580:98::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30652:18;;;;:8;;:18;;;;;:::i;30212:116::-;30269:6;30295:16;;;:7;:16;;;;;:25;;;;;;;30212:116::o;22050:141::-;22108:7;22140:13;:11;:13::i;:::-;22132:21;;22124:30;;;;;;22168:10;:17;;22179:5;;22168:17;;;;;;;;;;;;;;22161:24;;22050:141;;;:::o;34515:288::-;34596:10;34565:14;34582:25;;;:13;:25;;;;;;34622:11;;34618:50;;;34650:7;;34618:50;34692:10;34706:1;34678:25;;;:13;:25;;;;;:29;34737:16;;:28;;34758:6;34737:28;:20;:28;:::i;:::-;34718:16;:47;34776:19;;:11;;;;:19;;;;;34788:6;;34776:19;;;;34788:6;34776:11;:19;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;9727:167:0;9782:7;9814:20;;;:11;:20;;;;;;;;9849:19;;;9841:28;;;;;;9883:5;9876:12;;9727:167;;;;;:::o;29384:32::-;;;;;;:::o;39463:255::-;39527:10;;:::i;:::-;39550:160;;;;;;;;;39572:21;39585:7;39572:12;:21::i;:::-;39550:160;;;;39608:20;39620:7;39608:11;:20::i;:::-;39550:160;;;;39643:21;39656:7;39643:12;:21::i;:::-;39550:160;;;;39679:20;39691:7;39679:11;:20::i;:::-;39550:160;;;39463:255;-1:-1:-1;;39463:255:0:o;9365:143::-;9420:7;9444:19;;;;;9436:28;;;;;;-1:-1:-1;9478:24:0;;;;;;:17;:24;;;;;;;9365:143::o;31030:134::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;31138:16;;31092:10;;:64;;31112:43;;31120:4;31112:21;;:43;:25;:43;:::i;:::-;31092:64;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31092:64:0;31030:134::o;27225:76::-;27288:7;27281:14;;;;;;;;-1:-1:-1;;27281:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27266:6;;27281:14;;27288:7;;27281:14;;27288:7;27281:14;;;;;;;;;;;;;;;;;;;;;;;;11293:203;11369:16;;;11375:10;11369:16;;11361:25;;;;;;11412:10;11393:30;;;;:18;:30;;;;;;;;;:34;;;;;;;;;;;;:45;;;;;;;;;;;;;11450:40;;;;;;;11393:34;;11412:10;11450:40;;;;;;;;;;;11293:203;;:::o;31712:329::-;31776:7;31785;31794:6;31802:7;31822:13;31838:16;31846:7;31838;:16::i;:::-;31822:32;;31871:16;31879:7;31871;:16::i;:::-;31867:123;;;31912:19;31923:7;31912:10;:19::i;:::-;31933:16;31941:7;31933;:16::i;:::-;31951:19;31962:7;31951:10;:19::i;:::-;31972:5;31904:74;;;;;;;;;;31867:123;32008:10;;;-1:-1:-1;32020:1:0;;-1:-1:-1;32023:2:0;;-1:-1:-1;32027:5:0;-1:-1:-1;32027:5:0;31712:329;;;;;;;:::o;29535:34::-;;;;;;;;;:::o;14273:276::-;14402:31;14415:4;14421:2;14425:7;14402:12;:31::i;:::-;14494:48;14517:4;14523:2;14527:7;14536:5;14494:22;:48::i;:::-;14486:57;;;;;;;;14273:276;;;;:::o;32049:227::-;32104:7;32128:16;32136:7;32128;:16::i;:::-;32124:117;;;32168:61;32226:2;32168:53;32200:19;32211:7;32200:10;:19::i;:::-;32192:28;;32168:19;32179:7;32168:10;:19::i;:::-;:23;:53;:23;:53;:::i;:::-;:57;:61;:57;:61;:::i;:::-;32161:68;;;;32124:117;-1:-1:-1;;32258:10:0;;;32049:227::o;32665:194::-;32742:7;32620:16;32628:7;32620;:16::i;:::-;32606:30;;:10;:30;32598:39;;;;;;32782:1;32770:8;:13;;;;:33;;;;;32799:4;32787:8;:16;;;;32770:33;32762:42;;;;;;;;-1:-1:-1;32815:16:0;;;;:7;:16;;;;;;:36;;;;;;;;;;;;;;;;;;32665:194::o;35051:195::-;35110:6;35137:17;35145:8;35137:7;:17::i;:::-;35129:26;;;;;;;;35193:8;35183:46;;;;;;;;;;;;;-1:-1:-1;;35183:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;35173:65;;35183:46;;;;35193:8;;35183:46;;35193:8;35183:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35203:25;35219:8;35203:15;:25::i;:::-;35183:9;:46::i;:::-;35173:65;;;;;;;;;;;;;;;;;:9;:65::i;29920:31::-;;;;:::o;39193:127::-;39252:7;39279:33;39293:7;39302:1;36985:31;39279:13;:33::i;30076:128::-;30134:7;30169:16;;;:7;:16;;;;;:26;;;;30076:128::o;30336:107::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30413:10;:22;30336:107::o;29865:48::-;;;;;;;;;;;;;:::o;33382:1125::-;33507:13;33820;33975:14;34039:21;34088:27;;:::i;:::-;34159:6;34198:16;33523;33531:7;33523;:16::i;:::-;33507:32;-1:-1:-1;33611:9:0;:18;-1:-1:-1;33611:18:0;33603:27;;;;;;33662:36;;;;;;;;;33676:9;33662:36;;;;-1:-1:-1;33662:36:0;;;;;;;33643:16;;;:7;:16;;;;;;:55;;;;;;33662:36;33643:55;;;;;;;;;;;;;;;;;;;;;33716:16;33651:7;33716;:16::i;:::-;33715:17;33711:97;;;33749:26;33755:10;33767:7;33749:5;:26::i;:::-;33790:7;;33711:97;33836:16;33844:7;33836;:16::i;:::-;33820:32;-1:-1:-1;33871:19:0;;;33880:10;33871:19;;33863:28;;;;;;33904:21;33910:5;33917:7;33904:5;:21::i;:::-;33936:26;33942:10;33954:7;33936:5;:26::i;:::-;34006:14;;33992:29;;:9;;34006:14;;33992:29;:13;:29;:::i;:::-;33975:46;;34063:1;34039:25;;34118;34135:7;34118:16;:25::i;:::-;34088:55;;34168:1;34159:10;;34154:258;34175:1;34171;:5;34154:258;;;34217:9;34227:1;34217:12;;;;;;;;;;;34198:31;;34249:17;34257:8;34249:7;:17::i;:::-;34248:18;34244:67;;;34287:8;;34244:67;34325:45;34344:17;34352:8;34344:7;:17::i;:::-;34363:6;34325:18;:45::i;:::-;34385:15;;;;;34154:258;34178:3;;;;;34154:258;;;34424:67;34443:5;34450:40;34464:25;:6;34475:13;34464:25;:10;:25;:::i;:::-;34450:9;;:40;:13;:40;:::i;:::-;34424:18;:67::i;:::-;33382:1125;;;;;;;;:::o;32284:225::-;32342:6;32361:15;32379:18;32389:7;32379:9;:18::i;:::-;32361:36;;32423:1;32412:8;:12;;;32408:60;;;32448:8;32441:15;;;;32408:60;-1:-1:-1;;32485:16:0;;;;;;;;32284:225;-1:-1:-1;32284:225:0:o;30451:121::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30534:14;:30;;;;;;;;;;;;;;;30451:121::o;11811:174::-;11944:25;;;;11921:4;11944:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;11811:174::o;31228:476::-;31272:9;31283;31307:15;31351:29;31419:30;31495:6;31325:13;:11;:13::i;:::-;31307:31;;31397:10;31383:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;31383:25:0;;31351:57;;31466:10;31452:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;31452:25:0;;31419:58;;31504:1;31495:10;;31490:156;31511:10;31507:1;:14;31490:156;;;31561:15;31574:1;31561:12;:15::i;:::-;31543:12;31556:1;31543:15;;;;;;;;;;;;;;;;;;:33;31618:15;;31610:24;;31618:12;;31631:1;;31618:15;;;;;;;;;;;;;;31610:7;:24::i;:::-;31591:13;31605:1;31591:16;;;;;;;;;;:43;;;;:16;;;;;;;;;;:43;31523:3;;31490:156;;;-1:-1:-1;31666:12:0;;31680:13;;-1:-1:-1;31228:476:0;-1:-1:-1;;31228:476:0:o;29576:47::-;;;;;;;;;;;;;;;-1:-1:-1;;29576:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29713:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;14733:145::-;14790:4;14819:20;;;:11;:20;;;;;;;;14853:19;;;14733:145::o;37593:1320::-;37680:7;37755:6;37825:15;37923:11;37959:16;37712:1;37706:3;:7;37702:40;;;37735:7;37728:14;;;;37702:40;37764:50;37781:7;37790:2;:14;;37773:32;;;;;;;;;;37807:6;37764:8;:50::i;:::-;37755:59;;37843:34;37855:7;37869:3;37875:1;37843:11;:34::i;:::-;37825:52;-1:-1:-1;37897:6:0;37904:1;37897:9;;;37892:14;;;:1;:14;;;;37888:993;;;37937:7;;;;-1:-1:-1;37986:7:0;37995:18;;;37978:36;;;;;;;;;;37959:55;;38079:7;38090:1;38079:12;38075:338;;;38116:16;;;36985:31;38116:16;:38;;;;-1:-1:-1;38136:18:0;;;;;38116:38;38112:134;;;38186:40;38198:7;38212;38186:40;:11;:40::i;:::-;38179:47;;;;38112:134;38268:16;;;37049:31;38268:16;:38;;;;-1:-1:-1;38288:18:0;;;;;38268:38;38264:134;;;38338:40;38350:7;38364;38338:40;:11;:40::i;38264:134::-;38475:12;;38471:338;;;38512:16;;;36985:31;38512:16;:38;;;;-1:-1:-1;38532:18:0;;;;;38512:38;38508:134;;;38582:40;38594:7;38608;38582:40;:11;:40::i;38508:134::-;38664:16;;;37049:31;38664:16;:38;;;;-1:-1:-1;38684:18:0;;;;;38664:38;38660:134;;;38734:40;38746:7;38760;38734:40;:11;:40::i;38660:134::-;38830:39;38844:7;38853;38862:6;38830:13;:39::i;37888:993::-;38898:7;38891:14;;37593:1320;;;;;;;;;;:::o;15232:449::-;15347:4;15363:13;15379:16;15387:7;15379;:16::i;:::-;15363:32;;15578:5;15567:16;;:7;:16;;;:58;;;;15618:7;15594:31;;:20;15606:7;15594:11;:20::i;:::-;:31;;;15567:58;:101;;;;15636:32;15653:5;15660:7;15636:16;:32::i;:::-;15551:124;;15232:449;;;;;;:::o;19011:215::-;19110:5;19090:25;;:16;19098:7;19090;:16::i;:::-;:25;;;19082:34;;;;;;19163:1;19127:24;;;:15;:24;;;;;;:38;:24;:38;19123:98;;19211:1;19176:24;;;:15;:24;;;;;:37;;;;;;-1:-1:-1;19011:215:0:o;23404:1039::-;23662:18;23716:22;23780:17;23477:37;23500:4;23506:7;23477:22;:37::i;:::-;23683:26;;;;:17;:26;;;;;;;;;23741:18;;;;;:12;:18;;;;;;:25;23683:26;;-1:-1:-1;23741:32:0;;23771:1;23741:32;:29;:32;:::i;:::-;23800:18;;;;;;;:12;:18;;;;;:34;;23716:57;;-1:-1:-1;23800:18:0;23716:57;;23800:34;;;;;;;;;;;;;;23780:54;;23876:9;23843:12;:18;23856:4;23843:18;;;;;;;;;;;;;;;23862:10;23843:30;;;;;;;;;;;;;;;;;;;;;:42;;;;23965:18;;;;;:12;:18;;;;;;:27;;;;;-1:-1:-1;;23965:27:0;;;:::i;:::-;-1:-1:-1;24388:1:0;24359:26;;;:17;:26;;;;;;:30;;;24396:28;;;;;;:41;-1:-1:-1;;23404:1039:0:o;22658:228::-;22761:14;22724:30;22742:2;22746:7;22724:17;:30::i;:::-;-1:-1:-1;22778:16:0;;;;;;;;:12;:16;;;;;;;;:23;;39:1:-1;23:18;;45:23;;22808:30:0;;;;;;;;;;;22845:26;;;:17;:26;;;;;:35;22658:228::o;4400:136::-;4458:7;;4482:6;;;;4474:15;;;;;;-1:-1:-1;;4508:5:0;;;4400:136::o;18389:355::-;18530:4;18602:13;18551:15;:2;:13;;;:15::i;:::-;18550:16;18546:50;;;18584:4;18577:11;;;;18546:50;18618:78;;;;;18663:10;18618:78;;;;;;:36;:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;;;18663:10;18675:4;;18681:7;;18690:5;;18618:78;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;18618:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18618:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18618:78:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18618:78:0;18711:26;;;18721:16;18711:26;;-1:-1:-1;18618:78:0;-1:-1:-1;18389:355:0;;;;;;;;:::o;3498:393::-;3556:7;;3784:6;;3780:37;;;3808:1;3801:8;;;;3780:37;-1:-1:-1;3837:5:0;;;3841:1;3837;:5;3857;;;;;;;;:10;3849:19;;;;;;3884:1;3498:393;-1:-1:-1;;;3498:393:0:o;4006:276::-;4064:7;;4088:5;;;4080:14;;;;;;4175:1;4171;:5;;;;;;;;;4006:276;-1:-1:-1;;;;4006:276:0:o;35332:642::-;35469:13;;;35479:2;35469:13;;;;;;;;;35390:6;;35429:1;;35390:6;;35409:9;;;;;;35390:6;;35469:13;;;17:15:-1;;105:10;35469:13:0;88:34:-1;136:17;;-1:-1;35469:13:0;35442:40;;35510:1;35493:18;;35536:1;35527:10;;35522:229;35543:2;35539:1;:6;35522:229;;;35608:1;:5;;35602:1;:12;35592:22;;;-1:-1:-1;35635:9:0;;;;35631:109;;35690:4;35665:11;35677:9;35665:22;;;;;;;;;;;;;;:29;;;;;;;;;;-1:-1:-1;35713:11:0;;;;;35631:109;35547:3;;;;;35522:229;;;35805:9;35795:20;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;35795:20:0;;35761:54;;35835:1;35831:5;;35826:97;35842:9;35838:1;:13;35826:97;;;35897:11;35909:1;35897:14;;;;;;;;;;;;;;;;;;;;35873:18;35892:1;35873:21;;;;;;;;;;;;;;:38;;;;;;;;;;-1:-1:-1;35853:3:0;;;;;35826:97;;;35947:18;35332:642;-1:-1:-1;;;;;;;35332:642:0:o;36401:491::-;36464:6;36483:20;36526;36569:16;36643:21;36687:6;36713;36512:2;36483:32;;36555:2;36526:32;;36617:7;:14;36600:7;:14;:31;36588:44;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;36588:44:0;;36569:63;;36673:2;36643:33;;36696:1;36687:10;;36722:1;36713:10;;36708:68;36729:7;:14;36725:1;:18;36708:68;;;36766:7;36774:1;36766:10;;;;;;;;;;;;;;;;;;;;36750:8;36759:3;;;;;;36750:13;;;;;;;;;;;;;;:26;;;;;;;;;;-1:-1:-1;36745:3:0;;36708:68;;;-1:-1:-1;36796:1:0;36787:63;36803:7;:14;36799:1;:18;36787:63;;;36840:7;36848:1;36840:10;;;;;;;;;;;;;;;;;;;;36824:8;36833:3;;;;;;36824:13;;;;;;;;;;;;;;:26;;;;;;;;;;-1:-1:-1;36819:3:0;;36787:63;;;-1:-1:-1;36875:8:0;;36401:491;-1:-1:-1;;;;;;;36401:491:0:o;24710:174::-;24770:24;24782:2;24786:7;24770:11;:24::i;:::-;24830:10;:17;;24803:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;24854:24:0;;;;;;;-1:-1:-1;24710:174:0:o;28231:223::-;28294:27;28306:5;28313:7;28294:11;:27::i;:::-;28372:19;;;;:10;:19;;;;;28366:33;;-1:-1:-1;;28366:33:0;;;;;;;;;;;:38;28362:87;;28422:19;;;;:10;:19;;;;;28415:26;;;:::i;33098:276::-;33189:15;;33174:12;;33189:7;;;;:15;;;;;33197:6;;33174:12;33189:15;33174:12;33189:15;33197:6;33189:7;:15;;;;;;;33174:30;;33220:7;33219:8;33215:152;;;33264:17;;;;;;;:13;:17;;;;;;:29;;33286:6;33264:29;:21;:29;:::i;:::-;33244:17;;;;;;;:13;:17;;;;;:49;33327:16;;:28;;33348:6;33327:28;:20;:28;:::i;:::-;33308:16;:47;33098:276;;;:::o;37089:213::-;37153:4;;37170:122;37191:2;37187:1;:6;37170:122;;;37222:6;37229:1;37222:9;;;;;;;;;;37217:14;;;:1;:14;;;;37213:79;;;37258:1;37263:2;37258:7;37257:35;;37281:6;37290:1;37288:3;;37281:11;;;;;;;;;;37257:35;;;37269:6;37276:1;37269:9;;;37257:35;37250:42;;;;37213:79;37195:3;;37170:122;;37310:275;37519:4;37424:1;:7;;;37423:13;;;37464:19;;37511:22;;;37509:25;37554:14;;;;37464:10;;;;:19;37554:23;;37310:275::o;17660:215::-;17761:4;17741:24;;:16;17749:7;17741;:16::i;:::-;:24;;;17733:33;;;;;;17799:23;;;;;;;:17;:23;;;;;;:30;;17827:1;17799:30;:27;:30;:::i;:::-;17773:23;;;;;;;;:17;:23;;;;;;;;:56;;;;17836:20;;;:11;:20;;;;:33;;;;;;17660:215::o;16942:206::-;17048:1;17016:20;;;:11;:20;;;;;;:34;:20;:34;17008:43;;;;;;17058:20;;;;:11;:20;;;;;;;;:25;;;;;;;;;;;;;17114:21;;:17;:21;;;;;;;:28;;:25;:28::i;:::-;17090:21;;;;;;;;:17;:21;;;;;:52;;;;-1:-1:-1;16942:206:0:o;5524:593::-;5584:4;6068:20;;6103:8;;5524:593::o;15936:167::-;16004:16;;;;;15996:25;;;;;;16028:24;16040:2;16044:7;16028:11;:24::i;:::-;16064:33;;16089:7;;16064:33;;;;16081:1;;16064:33;;16081:1;;16064:33;15936:167;;:::o;25122:479::-;25252:18;25304:22;25360:17;25185:27;25197:5;25204:7;25185:11;:27::i;:::-;25273:24;;;;:15;:24;;;;;;25329:10;:17;25273:24;;-1:-1:-1;25329:24:0;;25351:1;25329:24;:21;:24;:::i;:::-;25304:49;;25380:10;25391:14;25380:26;;;;;;;;;;;;;;;;;;25360:46;;25440:9;25415:10;25426;25415:22;;;;;;;;;;;;;;;;;;:34;;;;25456:10;:26;;25467:14;;25456:26;;;;;;;;;;;;;;;:30;25495:10;:19;;;;;-1:-1:-1;;25495:19:0;;;:::i;:::-;-1:-1:-1;25548:1:0;25521:24;;;:15;:24;;;;;;:28;;;25556:26;;;;;;:39;-1:-1:-1;;25122:479:0:o;4604:136::-;4662:7;4690:5;;;4710:6;;;;4702:15;;;;;16295:186;16358:30;16373:5;16380:7;16358:14;:30::i;:::-;16395:32;16412:5;16419:7;16395:16;:32::i;:::-;16439:36;;16467:7;;16463:1;;16439:36;;;;;;16463:1;;16439:36;16295:186;;:::o;29242:10481::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29242:10481:0;;;-1:-1:-1;29242:10481:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;29242:10481:0;;;-1:-1:-1;;29242:10481:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://04634b7278889d13c95e1a21bf89bf2c92f54ff1a10419167995cf7532f8e9d7
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.