Overview
Max Total Supply
1,047 CSPL
Holders
147
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 CSPLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GuildAsset
Compiler Version
v0.5.5+commit.47a71e8f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-02-02 */ // File: openzeppelin-solidity/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: openzeppelin-solidity/contracts/introspection/IERC165.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol pragma solidity ^0.5.0; /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either {approve} or {setApprovalForAll}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either {approve} or {setApprovalForAll}. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.5.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: openzeppelin-solidity/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * IMPORTANT: It is unsafe to assume that an address for which this * function returns false is an externally-owned account (EOA) and not a * contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: openzeppelin-solidity/contracts/drafts/Counters.sol pragma solidity ^0.5.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } // File: openzeppelin-solidity/contracts/introspection/ERC165.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol pragma solidity ^0.5.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } /** * @dev Gets the balance of the specified address. * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf. * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][to] = approved; emit ApprovalForAll(_msgSender(), to, approved); } /** * @dev Tells whether an operator is approved by a given owner. * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the msg.sender to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransferFrom(from, to, tokenId, _data); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted * @param _data bytes data to send along with a safe transfer check */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use {_burn} instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * This function is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data); return (retval == _ERC721_RECEIVED); } /** * @dev Private function to clear current approval of a given token ID. * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Enumerable is IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token with optional enumeration extension logic * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Constructor function. */ constructor () public { // register the supported interface to conform to ERC721Enumerable via ERC165 _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner. * @param owner address owning the tokens list to be accessed * @param index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev Gets the total amount of tokens stored by the contract. * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return _allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens. * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { super._transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to address the beneficiary that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { super._mint(to, tokenId); _addTokenToOwnerEnumeration(to, tokenId); _addTokenToAllTokensEnumeration(tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use {ERC721-_burn} instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); _removeTokenFromOwnerEnumeration(owner, tokenId); // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund _ownedTokensIndex[tokenId] = 0; _removeTokenFromAllTokensEnumeration(tokenId); } /** * @dev Gets the list of token IDs of the requested owner. * @param owner address owning the tokens * @return uint256[] List of token IDs owned by the requested address */ function _tokensOfOwner(address owner) internal view returns (uint256[] storage) { return _ownedTokens[owner]; } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { _ownedTokensIndex[tokenId] = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array _ownedTokens[from].length--; // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by // lastTokenId, or just over the end of the array if the token was the last one). } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length.sub(1); uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array _allTokens.length--; _allTokensIndex[tokenId] = 0; } } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Metadata.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Metadata.sol pragma solidity ^0.5.0; contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata { // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /** * @dev Constructor function */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721_METADATA); } /** * @dev Gets the token name. * @return string representing the token name */ function name() external view returns (string memory) { return _name; } /** * @dev Gets the token symbol. * @return string representing the token symbol */ function symbol() external view returns (string memory) { return _symbol; } /** * @dev Returns an URI for a given token ID. * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); 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 memory uri) internal { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = uri; } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use _burn(uint256) instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol pragma solidity ^0.5.0; /** * @title Full ERC721 Token * @dev This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology. * * See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata { constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) { // solhint-disable-previous-line no-empty-blocks } } // File: openzeppelin-solidity/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: openzeppelin-solidity/contracts/access/roles/MinterRole.sol pragma solidity ^0.5.0; contract MinterRole is Context { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(_msgSender()); } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Mintable.sol pragma solidity ^0.5.0; /** * @title ERC721Mintable * @dev ERC721 minting logic. */ contract ERC721Mintable is ERC721, MinterRole { /** * @dev Function to mint tokens. * @param to The address that will receive the minted token. * @param tokenId The token id to mint. * @return A boolean that indicates if the operation was successful. */ function mint(address to, uint256 tokenId) public onlyMinter returns (bool) { _mint(to, tokenId); return true; } /** * @dev Function to safely mint tokens. * @param to The address that will receive the minted token. * @param tokenId The token id to mint. * @return A boolean that indicates if the operation was successful. */ function safeMint(address to, uint256 tokenId) public onlyMinter returns (bool) { _safeMint(to, tokenId); return true; } /** * @dev Function to safely mint tokens. * @param to The address that will receive the minted token. * @param tokenId The token id to mint. * @param _data bytes data to send along with a safe transfer check. * @return A boolean that indicates if the operation was successful. */ function safeMint(address to, uint256 tokenId, bytes memory _data) public onlyMinter returns (bool) { _safeMint(to, tokenId, _data); return true; } } // File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol pragma solidity ^0.5.0; contract PauserRole is Context { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(_msgSender()); } modifier onlyPauser() { require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role"); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(_msgSender()); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } } // File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol pragma solidity ^0.5.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context, PauserRole { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. Assigns the Pauser role * to the deployer. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Pausable.sol pragma solidity ^0.5.0; /** * @title ERC721 Non-Fungible Pausable token * @dev ERC721 modified with pausable transfers. */ contract ERC721Pausable is ERC721, Pausable { function approve(address to, uint256 tokenId) public whenNotPaused { super.approve(to, tokenId); } function setApprovalForAll(address to, bool approved) public whenNotPaused { super.setApprovalForAll(to, approved); } function _transferFrom(address from, address to, uint256 tokenId) internal whenNotPaused { super._transferFrom(from, to, tokenId); } } // File: contracts/GuildAsset.sol pragma solidity ^0.5.5; contract GuildAsset is ERC721Full, ERC721Mintable, ERC721Pausable { uint16 public constant GUILD_TYPE_OFFSET = 10000; uint16 public constant GUILD_RARITY_OFFSET = 1000; uint256 public constant SHARE_RATE_DECIMAL = 10**18; uint16 public constant LEGENDARY_RARITY = 3; uint16 public constant GOLD_RARITY = 2; uint16 public constant SILVER_RARITY = 1; uint16 public constant NO_GUILD = 0; string public tokenURIPrefix = "https://cryptospells.jp/metadata/guild/"; mapping(uint16 => uint256) private guildTypeToTotalVolume; mapping(uint16 => uint256) private guildTypeToStockSupplyLimit; mapping(uint16 => mapping(uint16 => uint256)) private guildTypeAndRarityToStockSupply; mapping(uint16 => uint256[]) private guildTypeToGuildStockList; mapping(uint16 => uint256) private guildTypeToGuildStockIndex; mapping(uint16 => mapping(uint16 => uint256)) private guildTypeAndRarityToGuildStockCount; mapping(uint16 => uint256) private rarityToStockVolume; // ロックアップ期間用変数 //mapping(uint256 => bool) private allowed; constructor() ERC721Full("CryptoSpells:Guild", "CSPL") public { rarityToStockVolume[LEGENDARY_RARITY] = 100; rarityToStockVolume[GOLD_RARITY] = 10; rarityToStockVolume[SILVER_RARITY] = 1; guildTypeToTotalVolume[NO_GUILD] = 0; } function setSupplyAndStock( uint16 _guildType, // 3桁。ギルドごと1つ uint256 _totalVolume, uint256 _stockSupplyLimit, uint256 legendarySupply, uint256 goldSupply, uint256 silverSupply ) external onlyMinter { require(_guildType != 0, "guildType 0 is noguild"); require(_totalVolume != 0, "totalVolume must not be 0"); //require(getMintedStockCount(_guildType) == 0, "This GuildType already exists"); require( legendarySupply.mul(rarityToStockVolume[LEGENDARY_RARITY]) .add(goldSupply.mul(rarityToStockVolume[GOLD_RARITY])) .add(silverSupply.mul(rarityToStockVolume[SILVER_RARITY])) == _totalVolume ); require( legendarySupply .add(goldSupply) .add(silverSupply) == _stockSupplyLimit ); guildTypeToTotalVolume[_guildType] = _totalVolume; guildTypeToStockSupplyLimit[_guildType] = _stockSupplyLimit; guildTypeAndRarityToStockSupply[_guildType][LEGENDARY_RARITY] = legendarySupply; guildTypeAndRarityToStockSupply[_guildType][GOLD_RARITY] = goldSupply; guildTypeAndRarityToStockSupply[_guildType][SILVER_RARITY] = silverSupply; } // mapping(uint16 => uint16) private guildTypeToSupplyLimit; // ロックアップ期間用 /* function approve(address _to, uint256 _tokenId) public { require(allowed[_tokenId]); super.approve(_to, _tokenId); } function transferFrom(address _from, address _to, uint256 _tokenId) public { require(allowed[_tokenId]); super.transferFrom(_from, _to, _tokenId); } function unLockToken(uint256 _tokenId) public onlyMinter { allowed[_tokenId] = true; } function canTransfer(uint256 _tokenId) public view returns (bool) { return allowed[_tokenId]; } */ function isAlreadyMinted(uint256 _tokenId) public view returns (bool) { return _exists(_tokenId); } function isValidGuildStock(uint256 _guildTokenId) public view { uint16 rarity = getRarity(_guildTokenId); require((rarityToStockVolume[rarity] > 0), "invalid rarityToStockVolume"); uint16 guildType = getGuildType(_guildTokenId); require((guildTypeToTotalVolume[guildType] > 0), "invalid guildTypeToTotalVolume"); uint256 serial = _guildTokenId % GUILD_TYPE_OFFSET; require(serial != 0, "invalid serial zero"); require(serial <= guildTypeAndRarityToStockSupply[guildType][rarity], "invalid serial guildTypeAndRarityToStockSupply"); } function getTotalVolume(uint16 _guildType) public view returns (uint256) { return guildTypeToTotalVolume[_guildType]; } function getStockSupplyLimit(uint16 _guildType) public view returns (uint256) { return guildTypeToStockSupplyLimit[_guildType]; } function getGuildType(uint256 _guildTokenId) public view returns (uint16) { uint16 _guildType = uint16((_guildTokenId.div(GUILD_TYPE_OFFSET)) % GUILD_RARITY_OFFSET); return _guildType; } function getRarity(uint256 _guildTokenId) public view returns (uint16) { return uint16(_guildTokenId.div(GUILD_TYPE_OFFSET).div(GUILD_RARITY_OFFSET) % 10); } function getMintedStockCount(uint16 _guildType) public view returns (uint256) { return guildTypeToGuildStockIndex[_guildType]; } function getMintedStockCountByRarity(uint16 _guildType, uint16 _rarity) public view returns (uint256) { return guildTypeAndRarityToGuildStockCount[_guildType][_rarity]; } function getStockSupplyByRarity(uint16 _guildType, uint16 _rarity) public view returns (uint256) { return guildTypeAndRarityToStockSupply[_guildType][_rarity]; } function getMintedStockList(uint16 _guildType) public view returns (uint256[] memory) { return guildTypeToGuildStockList[_guildType]; } function getStockVolumeByRarity(uint16 _rarity) public view returns (uint256) { return rarityToStockVolume[_rarity]; } function getShareRateWithDecimal(uint256 _guildTokenId) public view returns (uint256, uint256) { return ( getStockVolumeByRarity(getRarity(_guildTokenId)) .mul(SHARE_RATE_DECIMAL) .div(getTotalVolume(getGuildType(_guildTokenId))), SHARE_RATE_DECIMAL ); } /* function setSupplyLimit(uint16 _guildType, uint16 _supplyLimit) external onlyMinter { require(_supplyLimit != 0); require(guildTypeToSupplyLimit[_guildType] == 0 || _supplyLimit < guildTypeToSupplyLimit[_guildType], "_supplyLimit is bigger"); guildTypeToSupplyLimit[_guildType] = _supplyLimit; } */ function setTokenURIPrefix(string calldata _tokenURIPrefix) external onlyMinter { tokenURIPrefix = _tokenURIPrefix; } /* function getSupplyLimit(uint16 _guildType) public view returns (uint16) { return guildTypeToSupplyLimit[_guildType]; } */ function mintGuildStock(address _owner, uint256 _guildTokenId) public onlyMinter { // _guildStockがtokenId require(!isAlreadyMinted(_guildTokenId), "is Already Minted"); // バリデーションチェック isValidGuildStock(_guildTokenId); // supplyチェック uint16 _guildType = getGuildType(_guildTokenId); require(guildTypeToGuildStockIndex[_guildType] < guildTypeToStockSupplyLimit[_guildType]); uint16 rarity = getRarity(_guildTokenId); require(guildTypeAndRarityToGuildStockCount[_guildType][rarity] < guildTypeAndRarityToStockSupply[_guildType][rarity], "supply over"); _mint(_owner, _guildTokenId); guildTypeToGuildStockList[_guildType].push(_guildTokenId); guildTypeToGuildStockIndex[_guildType]++; guildTypeAndRarityToGuildStockCount[_guildType][rarity]++; } /* function mintGuildAsset(address _owner, uint256 _tokenId) public onlyMinter { // 200010001 uint16 _guildType = uint16(_tokenId / GUILD_TYPE_OFFSET); uint16 _guildTypeIndex = uint16(_tokenId % GUILD_TYPE_OFFSET) - 1; require(_guildTypeIndex < guildTypeToSupplyLimit[_guildType], "supply over"); _mint(_owner, _tokenId); } */ function tokenURI(uint256 tokenId) public view returns (string memory) { bytes32 tokenIdBytes; if (tokenId == 0) { tokenIdBytes = "0"; } else { uint256 value = tokenId; while (value > 0) { tokenIdBytes = bytes32(uint256(tokenIdBytes) / (2 ** 8)); tokenIdBytes |= bytes32(((value % 10) + 48) * 2 ** (8 * 31)); value /= 10; } } bytes memory prefixBytes = bytes(tokenURIPrefix); bytes memory tokenURIBytes = new bytes(prefixBytes.length + tokenIdBytes.length); uint8 i; uint8 index = 0; for (i = 0; i < prefixBytes.length; i++) { tokenURIBytes[index] = prefixBytes[i]; index++; } for (i = 0; i < tokenIdBytes.length; i++) { tokenURIBytes[index] = tokenIdBytes[i]; index++; } return string(tokenURIBytes); } }
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":"GUILD_RARITY_OFFSET","outputs":[{"name":"","type":"uint16"}],"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":true,"inputs":[{"name":"_guildType","type":"uint16"},{"name":"_rarity","type":"uint16"}],"name":"getStockSupplyByRarity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GUILD_TYPE_OFFSET","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildTokenId","type":"uint256"}],"name":"getShareRateWithDecimal","outputs":[{"name":"","type":"uint256"},{"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":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GOLD_RARITY","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","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":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_guildTokenId","type":"uint256"}],"name":"isValidGuildStock","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"_guildType","type":"uint16"}],"name":"getMintedStockList","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildTokenId","type":"uint256"}],"name":"getRarity","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rarity","type":"uint16"}],"name":"getStockVolumeByRarity","outputs":[{"name":"","type":"uint256"}],"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":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":"NO_GUILD","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_owner","type":"address"},{"name":"_guildTokenId","type":"uint256"}],"name":"mintGuildStock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SHARE_RATE_DECIMAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"},{"name":"_rarity","type":"uint16"}],"name":"getMintedStockCountByRarity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"}],"name":"getMintedStockCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenURIPrefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isAlreadyMinted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"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":"LEGENDARY_RARITY","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_guildType","type":"uint16"},{"name":"_totalVolume","type":"uint256"},{"name":"_stockSupplyLimit","type":"uint256"},{"name":"legendarySupply","type":"uint256"},{"name":"goldSupply","type":"uint256"},{"name":"silverSupply","type":"uint256"}],"name":"setSupplyAndStock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"}],"name":"getStockSupplyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"SILVER_RARITY","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"}],"name":"getTotalVolume","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildTokenId","type":"uint256"}],"name":"getGuildType","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"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
60806040526040518060600160405280602781526020016200536f60279139600f908051906020019062000035929190620005cd565b503480156200004357600080fd5b506040518060400160405280601281526020017f43727970746f5370656c6c733a4775696c6400000000000000000000000000008152506040518060400160405280600481526020017f4353504c000000000000000000000000000000000000000000000000000000008152508181620000ca6301ffc9a760e01b6200023060201b60201c565b620000e26380ac58cd60e01b6200023060201b60201c565b620000fa63780e9d6360e01b6200023060201b60201c565b816009908051906020019062000112929190620005cd565b5080600a90805190602001906200012b929190620005cd565b5062000144635b5e139f60e01b6200023060201b60201c565b50505050620001686200015c6200033b60201b60201c565b6200034360201b60201c565b620001886200017c6200033b60201b60201c565b620003a460201b60201c565b6000600e60006101000a81548160ff021916908315150217905550606460166000600361ffff1661ffff16815260200190815260200160002081905550600a60166000600261ffff1661ffff16815260200190815260200160002081905550600160166000600161ffff1661ffff168152602001908152602001600020819055506000601060008061ffff1661ffff168152602001908152602001600020819055506200067c565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614151515620002cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6200035e81600c6200040560201b62003fa51790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b620003bf81600d6200040560201b62003fa51790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b620004178282620004eb60201b60201c565b1515156200048d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151562000576576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806200534d6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200061057805160ff191683800117855562000641565b8280016001018555821562000641579182015b828111156200064057825182559160200191906001019062000623565b5b50905062000650919062000654565b5090565b6200067991905b80821115620006755760008160009055506001016200065b565b5090565b90565b614cc1806200068c6000396000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c806370a082311161019d578063a1448194116100e9578063c87b56dd116100a2578063e985e9c51161007c578063e985e9c514611262578063fbb7fc6c146112de578063fbba7b6214611304578063fc044eb21461134a576102f1565b8063c87b56dd14611111578063d908c2fd146111b8578063dfe9b31f1461121c576102f1565b8063a144819414610e51578063a22cb46514610eb7578063aa271e1a14610f07578063b88d4fde14610f63578063bd7c40c714611068578063c0ac99831461108e576102f1565b806395d89b411161015657806398650275116101305780639865027514610d42578063988e4e2214610d4c57806399e0dd7c14610d925780639cc19bfb14610e0b576102f1565b806395d89b4114610c2757806397b388df14610caa578063983b2d5614610cfe576102f1565b806370a0823114610a185780637f6cc1a314610a7057806382dc1ec414610abe5780638456cb5914610b025780638832e6e314610b0c5780638c75065f14610c09576102f1565b80633f4ba83a1161025c57806348758697116102155780635c975abb116101ef5780635c975abb146109585780636352211e1461097a5780636db27957146109e85780636ef8d66d14610a0e576102f1565b806348758697146108865780634bc3ffef146108d05780634f6ccce714610916576102f1565b80633f4ba83a146106975780633f6fcc59146106a157806340c10f19146106cf57806342842e0e1461073557806343ec1724146107a357806346fbf68e1461082a576102f1565b806318160ddd116102ae57806318160ddd146105145780631ea7aabf146105325780631ee2ec931461055857806323b872dd146105a157806324e7a8841461060f5780632f745c5914610635576102f1565b806301ffc9a7146102f65780630563bdc61461035b57806306fdde0314610381578063081812fc14610404578063095ea7b3146104725780630d49ac7a146104c0575b600080fd5b6103416004803603602081101561030c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611394565b604051808215151515815260200191505060405180910390f35b6103636113fb565b604051808261ffff1661ffff16815260200191505060405180910390f35b610389611401565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c95780820151818401526020810190506103ae565b50505050905090810190601f1680156103f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104306004803603602081101561041a57600080fd5b81019080803590602001909291905050506114a3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104be6004803603604081101561048857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611540565b005b6104fe600480360360408110156104d657600080fd5b81019080803561ffff169060200190929190803561ffff1690602001909291905050506115d3565b6040518082815260200191505060405180910390f35b61051c611612565b6040518082815260200191505060405180910390f35b61053a61161f565b604051808261ffff1661ffff16815260200191505060405180910390f35b6105846004803603602081101561056e57600080fd5b8101908080359060200190929190505050611625565b604051808381526020018281526020019250505060405180910390f35b61060d600480360360608110156105b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611687565b005b6106176116ff565b604051808261ffff1661ffff16815260200191505060405180910390f35b6106816004803603604081101561064b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611704565b6040518082815260200191505060405180910390f35b61069f6117c7565b005b6106cd600480360360208110156106b757600080fd5b8101908080359060200190929190505050611939565b005b61071b600480360360408110156106e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b9d565b604051808215151515815260200191505060405180910390f35b6107a16004803603606081101561074b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c1a565b005b6107d3600480360360208110156107b957600080fd5b81019080803561ffff169060200190929190505050611c3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108165780820151818401526020810190506107fb565b505050509050019250505060405180910390f35b61086c6004803603602081101561084057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cad565b604051808215151515815260200191505060405180910390f35b6108b26004803603602081101561089c57600080fd5b8101908080359060200190929190505050611cca565b604051808261ffff1661ffff16815260200191505060405180910390f35b610900600480360360208110156108e657600080fd5b81019080803561ffff169060200190929190505050611d10565b6040518082815260200191505060405180910390f35b6109426004803603602081101561092c57600080fd5b8101908080359060200190929190505050611d35565b6040518082815260200191505060405180910390f35b610960611db9565b604051808215151515815260200191505060405180910390f35b6109a66004803603602081101561099057600080fd5b8101908080359060200190929190505050611dd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109f0611e9a565b604051808261ffff1661ffff16815260200191505060405180910390f35b610a16611e9f565b005b610a5a60048036036020811015610a2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611eb1565b6040518082815260200191505060405180910390f35b610abc60048036036040811015610a8657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f88565b005b610b0060048036036020811015610ad457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612277565b005b610b0a6122ea565b005b610bef60048036036060811015610b2257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610b6957600080fd5b820183602082011115610b7b57600080fd5b80359060200191846001830284011164010000000083111715610b9d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061245d565b604051808215151515815260200191505060405180910390f35b610c116124dc565b6040518082815260200191505060405180910390f35b610c2f6124e8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c6f578082015181840152602081019050610c54565b50505050905090810190601f168015610c9c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ce860048036036040811015610cc057600080fd5b81019080803561ffff169060200190929190803561ffff16906020019092919050505061258a565b6040518082815260200191505060405180910390f35b610d4060048036036020811015610d1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125c9565b005b610d4a61263c565b005b610d7c60048036036020811015610d6257600080fd5b81019080803561ffff16906020019092919050505061264e565b6040518082815260200191505060405180910390f35b610e0960048036036020811015610da857600080fd5b8101908080359060200190640100000000811115610dc557600080fd5b820183602082011115610dd757600080fd5b80359060200191846001830284011164010000000083111715610df957600080fd5b9091929391929390505050612673565b005b610e3760048036036020811015610e2157600080fd5b81019080803590602001909291905050506126f0565b604051808215151515815260200191505060405180910390f35b610e9d60048036036040811015610e6757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612702565b604051808215151515815260200191505060405180910390f35b610f0560048036036040811015610ecd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061277f565b005b610f4960048036036020811015610f1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612812565b604051808215151515815260200191505060405180910390f35b61106660048036036080811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fe057600080fd5b820183602082011115610ff257600080fd5b8035906020019184600183028401116401000000008311171561101457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061282f565b005b6110706128a9565b604051808261ffff1661ffff16815260200191505060405180910390f35b6110966128ae565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110d65780820151818401526020810190506110bb565b50505050905090810190601f1680156111035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61113d6004803603602081101561112757600080fd5b810190808035906020019092919050505061294c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561117d578082015181840152602081019050611162565b50505050905090810190601f1680156111aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61121a600480360360c08110156111ce57600080fd5b81019080803561ffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612be9565b005b61124c6004803603602081101561123257600080fd5b81019080803561ffff169060200190929190505050612f2a565b6040518082815260200191505060405180910390f35b6112c46004803603604081101561127857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f4f565b604051808215151515815260200191505060405180910390f35b6112e6612fe3565b604051808261ffff1661ffff16815260200191505060405180910390f35b6113346004803603602081101561131a57600080fd5b81019080803561ffff169060200190929190505050612fe8565b6040518082815260200191505060405180910390f35b6113766004803603602081101561136057600080fd5b810190808035906020019092919050505061300d565b604051808261ffff1661ffff16815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6103e881565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114995780601f1061146e57610100808354040283529160200191611499565b820191906000526020600020905b81548152906001019060200180831161147c57829003601f168201915b5050505050905090565b60006114ae82613045565b1515611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614ba1602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60009054906101000a900460ff161515156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6115cf82826130b7565b5050565b6000601260008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff16815260200190815260200160002054905092915050565b6000600780549050905090565b61271081565b60008061167561163c6116378561300d565b612fe8565b611667670de0b6b3a764000061165961165488611cca565b611d10565b6132a290919063ffffffff16565b61332c90919063ffffffff16565b670de0b6b3a764000091509150915091565b611698611692613376565b8261337e565b15156116ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c396031913960400191505060405180910390fd5b6116fa838383613474565b505050565b600281565b600061170f83611eb1565b82101515611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614999602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156117b457fe5b9060005260206000200154905092915050565b6117d76117d2613376565b611cad565b151561182e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b600e60009054906101000a900460ff1615156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118f6613376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061194482611cca565b90506000601660008361ffff1661ffff168152602001908152602001600020541115156119d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f696e76616c696420726172697479546f53746f636b566f6c756d65000000000081525060200191505060405180910390fd5b60006119e48361300d565b90506000601060008361ffff1661ffff16815260200190815260200160002054111515611a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f696e76616c6964206775696c6454797065546f546f74616c566f6c756d65000081525060200191505060405180910390fd5b600061271061ffff1684811515611a8c57fe5b06905060008114151515611b08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c69642073657269616c207a65726f0000000000000000000000000081525060200191505060405180910390fd5b601260008361ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020548111151515611b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614b52602e913960400191505060405180910390fd5b50505050565b6000611baf611baa613376565b612812565b1515611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b611c108383613509565b6001905092915050565b611c358383836040518060200160405280600081525061282f565b505050565b6060601360008361ffff1661ffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611ca157602002820191906000526020600020905b815481526020019060010190808311611c8d575b50505050509050919050565b6000611cc382600d61352a90919063ffffffff16565b9050919050565b6000600a611cff6103e861ffff16611cf161271061ffff168661332c90919063ffffffff16565b61332c90919063ffffffff16565b811515611d0857fe5b069050919050565b6000601660008361ffff1661ffff168152602001908152602001600020549050919050565b6000611d3f611612565b82101515611d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614c6a602c913960400191505060405180910390fd5b600782815481101515611da757fe5b90600052602060002001549050919050565b6000600e60009054906101000a900460ff16905090565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ad86029913960400191505060405180910390fd5b80915050919050565b600081565b611eaf611eaa613376565b61360a565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614aae602a913960400191505060405180910390fd5b611f81600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613664565b9050919050565b611f98611f93613376565b612812565b1515611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b611ff8816126f0565b15151561206d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f697320416c7265616479204d696e74656400000000000000000000000000000081525060200191505060405180910390fd5b61207681611939565b60006120818261300d565b9050601160008261ffff1661ffff16815260200190815260200160002054601460008361ffff1661ffff168152602001908152602001600020541015156120c757600080fd5b60006120d283611cca565b9050601260008361ffff1661ffff16815260200190815260200160002060008261ffff1661ffff16815260200190815260200160002054601560008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff168152602001908152602001600020541015156121b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f737570706c79206f76657200000000000000000000000000000000000000000081525060200191505060405180910390fd5b6121bd8484613509565b601360008361ffff1661ffff168152602001908152602001600020839080600181540180825580915050906001820390600052602060002001600090919290919091505550601460008361ffff1661ffff16815260200190815260200160002060008154809291906001019190505550601560008361ffff1661ffff16815260200190815260200160002060008261ffff1661ffff1681526020019081526020016000206000815480929190600101919050555050505050565b612287612282613376565b611cad565b15156122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b6122e781613672565b50565b6122fa6122f5613376565b611cad565b1515612351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b600e60009054906101000a900460ff161515156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861241a613376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061246f61246a613376565b612812565b15156124c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b6124d18484846136cc565b600190509392505050565b670de0b6b3a764000081565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125805780601f1061255557610100808354040283529160200191612580565b820191906000526020600020905b81548152906001019060200180831161256357829003601f168201915b5050505050905090565b6000601560008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff16815260200190815260200160002054905092915050565b6125d96125d4613376565b612812565b1515612630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b6126398161373f565b50565b61264c612647613376565b613799565b565b6000601460008361ffff1661ffff168152602001908152602001600020549050919050565b61268361267e613376565b612812565b15156126da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b8181600f91906126eb9291906148c7565b505050565b60006126fb82613045565b9050919050565b600061271461270f613376565b612812565b151561276b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b61277583836137f3565b6001905092915050565b600e60009054906101000a900460ff16151515612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61280e8282613811565b5050565b600061282882600c61352a90919063ffffffff16565b9050919050565b61284061283a613376565b8361337e565b1515612897576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c396031913960400191505060405180910390fd5b6128a3848484846139cb565b50505050565b600381565b600f8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129445780601f1061291957610100808354040283529160200191612944565b820191906000526020600020905b81548152906001019060200180831161292757829003601f168201915b505050505081565b6060600080831415612980577f300000000000000000000000000000000000000000000000000000000000000090506129f4565b60008390505b60008111156129f2576101008260001c81151561299f57fe5b0460001b91507f01000000000000000000000000000000000000000000000000000000000000006030600a838115156129d457fe5b06010260001b82179150600a818115156129ea57fe5b049050612986565b505b6060600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a8c5780601f10612a6157610100808354040283529160200191612a8c565b820191906000526020600020905b815481529060010190602001808311612a6f57829003601f168201915b505050505090506060602060ff168251016040519080825280601f01601f191660200182016040528015612acf5781602001600182028038833980820191505090505b50905060008060009050600091505b83518260ff161015612b5d57838260ff16815181101515612afb57fe5b90602001015160f81c60f81b838260ff16815181101515612b1857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150508180600101925050612ade565b600091505b602060ff168260ff161015612bdc57848260ff16602081101515612b8257fe5b1a60f81b838260ff16815181101515612b9757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150508180600101925050612b62565b8295505050505050919050565b612bf9612bf4613376565b612812565b1515612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b60008661ffff1614151515612ccd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6775696c64547970652030206973206e6f6775696c640000000000000000000081525060200191505060405180910390fd5b60008514151515612d46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f74616c566f6c756d65206d757374206e6f7420626520300000000000000081525060200191505060405180910390fd5b84612df6612d7960166000600161ffff1661ffff16815260200190815260200160002054846132a290919063ffffffff16565b612de8612dab60166000600261ffff1661ffff16815260200190815260200160002054876132a290919063ffffffff16565b612dda60166000600361ffff1661ffff16815260200190815260200160002054896132a290919063ffffffff16565b613a3f90919063ffffffff16565b613a3f90919063ffffffff16565b141515612e0257600080fd5b83612e2882612e1a8587613a3f90919063ffffffff16565b613a3f90919063ffffffff16565b141515612e3457600080fd5b84601060008861ffff1661ffff1681526020019081526020016000208190555083601160008861ffff1661ffff1681526020019081526020016000208190555082601260008861ffff1661ffff1681526020019081526020016000206000600361ffff1661ffff1681526020019081526020016000208190555081601260008861ffff1661ffff1681526020019081526020016000206000600261ffff1661ffff1681526020019081526020016000208190555080601260008861ffff1661ffff1681526020019081526020016000206000600161ffff1661ffff16815260200190815260200160002081905550505050505050565b6000601160008361ffff1661ffff168152602001908152602001600020549050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600181565b6000601060008361ffff1661ffff168152602001908152602001600020549050919050565b6000806103e861ffff1661303061271061ffff168561332c90919063ffffffff16565b81151561303957fe5b06905080915050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60006130c282611dd0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561314b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614c186021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661316a613376565b73ffffffffffffffffffffffffffffffffffffffff161480613199575061319881613193613376565b612f4f565b5b15156131f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180614a766038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000808314156132b55760009050613326565b600082840290508284828115156132c857fe5b04141515613321576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b806021913960400191505060405180910390fd5b809150505b92915050565b600061336e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ac9565b905092915050565b600033905090565b600061338982613045565b15156133e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a4a602c913960400191505060405180910390fd5b60006133eb83611dd0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061345a57508373ffffffffffffffffffffffffffffffffffffffff16613442846114a3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061346b575061346a8185612f4f565b5b91505092915050565b600e60009054906101000a900460ff161515156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b613504838383613b93565b505050565b6135138282613bb7565b61351d8282613dd3565b61352681613e9a565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614bcd6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61361e81600d613ee690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b600081600001549050919050565b61368681600d613fa590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b6136d68383613509565b6136e36000848484614082565b151561373a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806149c46032913960400191505060405180910390fd5b505050565b61375381600c613fa590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6137ad81600c613ee690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b61380d8282604051806020016040528060008152506136cc565b5050565b613819613376565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156138bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b80600460006138c9613376565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613976613376565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6139d6848484613474565b6139e284848484614082565b1515613a39576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806149c46032913960400191505060405180910390fd5b50505050565b6000808284019050838110151515613abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831182901515613b77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3c578082015181840152602081019050613b21565b50505050905090810190601f168015613b695780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385811515613b8557fe5b049050809150509392505050565b613b9e838383614274565b613ba883826144d3565b613bb28282613dd3565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613c5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b613c6581613045565b151515613cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613d73600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614677565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b613ef0828261352a565b1515613f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b316021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b613faf828261352a565b151515614024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006140a38473ffffffffffffffffffffffffffffffffffffffff1661468d565b15156140b2576001905061426c565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a026140d8613376565b8887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614194578082015181840152602081019050614179565b50505050905090810190601f1680156141c15780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156141e357600080fd5b505af11580156141f7573d6000803e3d6000fd5b505050506040513d602081101561420d57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661429482611dd0565b73ffffffffffffffffffffffffffffffffffffffff16141515614302576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614bef6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561438a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a266024913960400191505060405180910390fd5b614393816146d8565b6143da600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614798565b614421600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614677565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061452b6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506147bb90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114151561461e576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561459c57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156145f657fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036146709190614947565b5050505050565b6001816000016000828254019250508190555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156146cf5750808214155b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156147955760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6147b0600182600001546147bb90919063ffffffff16565b816000018190555050565b60006147fd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614805565b905092915050565b600083831115829015156148b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561487957808201518184015260208101905061485e565b50505050905090810190601f1680156148a65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061490857803560ff1916838001178555614936565b82800160010185558215614936579182015b8281111561493557823582559160200191906001019061491a565b5b5090506149439190614973565b5090565b81548183558181111561496e5781836000526020600020918201910161496d9190614973565b5b505050565b61499591905b80821115614991576000816000905550600101614979565b5090565b9056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65696e76616c69642073657269616c206775696c6454797065416e64526172697479546f53746f636b537570706c79536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a165627a7a723058208621c890ff02e1f83cda02751cfd862fe6da1477ae8f33196b2a6971360a18dc0029526f6c65733a206163636f756e7420697320746865207a65726f206164647265737368747470733a2f2f63727970746f7370656c6c732e6a702f6d657461646174612f6775696c642f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c806370a082311161019d578063a1448194116100e9578063c87b56dd116100a2578063e985e9c51161007c578063e985e9c514611262578063fbb7fc6c146112de578063fbba7b6214611304578063fc044eb21461134a576102f1565b8063c87b56dd14611111578063d908c2fd146111b8578063dfe9b31f1461121c576102f1565b8063a144819414610e51578063a22cb46514610eb7578063aa271e1a14610f07578063b88d4fde14610f63578063bd7c40c714611068578063c0ac99831461108e576102f1565b806395d89b411161015657806398650275116101305780639865027514610d42578063988e4e2214610d4c57806399e0dd7c14610d925780639cc19bfb14610e0b576102f1565b806395d89b4114610c2757806397b388df14610caa578063983b2d5614610cfe576102f1565b806370a0823114610a185780637f6cc1a314610a7057806382dc1ec414610abe5780638456cb5914610b025780638832e6e314610b0c5780638c75065f14610c09576102f1565b80633f4ba83a1161025c57806348758697116102155780635c975abb116101ef5780635c975abb146109585780636352211e1461097a5780636db27957146109e85780636ef8d66d14610a0e576102f1565b806348758697146108865780634bc3ffef146108d05780634f6ccce714610916576102f1565b80633f4ba83a146106975780633f6fcc59146106a157806340c10f19146106cf57806342842e0e1461073557806343ec1724146107a357806346fbf68e1461082a576102f1565b806318160ddd116102ae57806318160ddd146105145780631ea7aabf146105325780631ee2ec931461055857806323b872dd146105a157806324e7a8841461060f5780632f745c5914610635576102f1565b806301ffc9a7146102f65780630563bdc61461035b57806306fdde0314610381578063081812fc14610404578063095ea7b3146104725780630d49ac7a146104c0575b600080fd5b6103416004803603602081101561030c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611394565b604051808215151515815260200191505060405180910390f35b6103636113fb565b604051808261ffff1661ffff16815260200191505060405180910390f35b610389611401565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c95780820151818401526020810190506103ae565b50505050905090810190601f1680156103f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104306004803603602081101561041a57600080fd5b81019080803590602001909291905050506114a3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104be6004803603604081101561048857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611540565b005b6104fe600480360360408110156104d657600080fd5b81019080803561ffff169060200190929190803561ffff1690602001909291905050506115d3565b6040518082815260200191505060405180910390f35b61051c611612565b6040518082815260200191505060405180910390f35b61053a61161f565b604051808261ffff1661ffff16815260200191505060405180910390f35b6105846004803603602081101561056e57600080fd5b8101908080359060200190929190505050611625565b604051808381526020018281526020019250505060405180910390f35b61060d600480360360608110156105b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611687565b005b6106176116ff565b604051808261ffff1661ffff16815260200191505060405180910390f35b6106816004803603604081101561064b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611704565b6040518082815260200191505060405180910390f35b61069f6117c7565b005b6106cd600480360360208110156106b757600080fd5b8101908080359060200190929190505050611939565b005b61071b600480360360408110156106e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b9d565b604051808215151515815260200191505060405180910390f35b6107a16004803603606081101561074b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c1a565b005b6107d3600480360360208110156107b957600080fd5b81019080803561ffff169060200190929190505050611c3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108165780820151818401526020810190506107fb565b505050509050019250505060405180910390f35b61086c6004803603602081101561084057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cad565b604051808215151515815260200191505060405180910390f35b6108b26004803603602081101561089c57600080fd5b8101908080359060200190929190505050611cca565b604051808261ffff1661ffff16815260200191505060405180910390f35b610900600480360360208110156108e657600080fd5b81019080803561ffff169060200190929190505050611d10565b6040518082815260200191505060405180910390f35b6109426004803603602081101561092c57600080fd5b8101908080359060200190929190505050611d35565b6040518082815260200191505060405180910390f35b610960611db9565b604051808215151515815260200191505060405180910390f35b6109a66004803603602081101561099057600080fd5b8101908080359060200190929190505050611dd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109f0611e9a565b604051808261ffff1661ffff16815260200191505060405180910390f35b610a16611e9f565b005b610a5a60048036036020811015610a2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611eb1565b6040518082815260200191505060405180910390f35b610abc60048036036040811015610a8657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f88565b005b610b0060048036036020811015610ad457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612277565b005b610b0a6122ea565b005b610bef60048036036060811015610b2257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610b6957600080fd5b820183602082011115610b7b57600080fd5b80359060200191846001830284011164010000000083111715610b9d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061245d565b604051808215151515815260200191505060405180910390f35b610c116124dc565b6040518082815260200191505060405180910390f35b610c2f6124e8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c6f578082015181840152602081019050610c54565b50505050905090810190601f168015610c9c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ce860048036036040811015610cc057600080fd5b81019080803561ffff169060200190929190803561ffff16906020019092919050505061258a565b6040518082815260200191505060405180910390f35b610d4060048036036020811015610d1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125c9565b005b610d4a61263c565b005b610d7c60048036036020811015610d6257600080fd5b81019080803561ffff16906020019092919050505061264e565b6040518082815260200191505060405180910390f35b610e0960048036036020811015610da857600080fd5b8101908080359060200190640100000000811115610dc557600080fd5b820183602082011115610dd757600080fd5b80359060200191846001830284011164010000000083111715610df957600080fd5b9091929391929390505050612673565b005b610e3760048036036020811015610e2157600080fd5b81019080803590602001909291905050506126f0565b604051808215151515815260200191505060405180910390f35b610e9d60048036036040811015610e6757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612702565b604051808215151515815260200191505060405180910390f35b610f0560048036036040811015610ecd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061277f565b005b610f4960048036036020811015610f1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612812565b604051808215151515815260200191505060405180910390f35b61106660048036036080811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fe057600080fd5b820183602082011115610ff257600080fd5b8035906020019184600183028401116401000000008311171561101457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061282f565b005b6110706128a9565b604051808261ffff1661ffff16815260200191505060405180910390f35b6110966128ae565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110d65780820151818401526020810190506110bb565b50505050905090810190601f1680156111035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61113d6004803603602081101561112757600080fd5b810190808035906020019092919050505061294c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561117d578082015181840152602081019050611162565b50505050905090810190601f1680156111aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61121a600480360360c08110156111ce57600080fd5b81019080803561ffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612be9565b005b61124c6004803603602081101561123257600080fd5b81019080803561ffff169060200190929190505050612f2a565b6040518082815260200191505060405180910390f35b6112c46004803603604081101561127857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f4f565b604051808215151515815260200191505060405180910390f35b6112e6612fe3565b604051808261ffff1661ffff16815260200191505060405180910390f35b6113346004803603602081101561131a57600080fd5b81019080803561ffff169060200190929190505050612fe8565b6040518082815260200191505060405180910390f35b6113766004803603602081101561136057600080fd5b810190808035906020019092919050505061300d565b604051808261ffff1661ffff16815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6103e881565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114995780601f1061146e57610100808354040283529160200191611499565b820191906000526020600020905b81548152906001019060200180831161147c57829003601f168201915b5050505050905090565b60006114ae82613045565b1515611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614ba1602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60009054906101000a900460ff161515156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6115cf82826130b7565b5050565b6000601260008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff16815260200190815260200160002054905092915050565b6000600780549050905090565b61271081565b60008061167561163c6116378561300d565b612fe8565b611667670de0b6b3a764000061165961165488611cca565b611d10565b6132a290919063ffffffff16565b61332c90919063ffffffff16565b670de0b6b3a764000091509150915091565b611698611692613376565b8261337e565b15156116ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c396031913960400191505060405180910390fd5b6116fa838383613474565b505050565b600281565b600061170f83611eb1565b82101515611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614999602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156117b457fe5b9060005260206000200154905092915050565b6117d76117d2613376565b611cad565b151561182e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b600e60009054906101000a900460ff1615156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118f6613376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061194482611cca565b90506000601660008361ffff1661ffff168152602001908152602001600020541115156119d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f696e76616c696420726172697479546f53746f636b566f6c756d65000000000081525060200191505060405180910390fd5b60006119e48361300d565b90506000601060008361ffff1661ffff16815260200190815260200160002054111515611a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f696e76616c6964206775696c6454797065546f546f74616c566f6c756d65000081525060200191505060405180910390fd5b600061271061ffff1684811515611a8c57fe5b06905060008114151515611b08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c69642073657269616c207a65726f0000000000000000000000000081525060200191505060405180910390fd5b601260008361ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020548111151515611b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614b52602e913960400191505060405180910390fd5b50505050565b6000611baf611baa613376565b612812565b1515611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b611c108383613509565b6001905092915050565b611c358383836040518060200160405280600081525061282f565b505050565b6060601360008361ffff1661ffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611ca157602002820191906000526020600020905b815481526020019060010190808311611c8d575b50505050509050919050565b6000611cc382600d61352a90919063ffffffff16565b9050919050565b6000600a611cff6103e861ffff16611cf161271061ffff168661332c90919063ffffffff16565b61332c90919063ffffffff16565b811515611d0857fe5b069050919050565b6000601660008361ffff1661ffff168152602001908152602001600020549050919050565b6000611d3f611612565b82101515611d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614c6a602c913960400191505060405180910390fd5b600782815481101515611da757fe5b90600052602060002001549050919050565b6000600e60009054906101000a900460ff16905090565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ad86029913960400191505060405180910390fd5b80915050919050565b600081565b611eaf611eaa613376565b61360a565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614aae602a913960400191505060405180910390fd5b611f81600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613664565b9050919050565b611f98611f93613376565b612812565b1515611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b611ff8816126f0565b15151561206d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f697320416c7265616479204d696e74656400000000000000000000000000000081525060200191505060405180910390fd5b61207681611939565b60006120818261300d565b9050601160008261ffff1661ffff16815260200190815260200160002054601460008361ffff1661ffff168152602001908152602001600020541015156120c757600080fd5b60006120d283611cca565b9050601260008361ffff1661ffff16815260200190815260200160002060008261ffff1661ffff16815260200190815260200160002054601560008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff168152602001908152602001600020541015156121b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f737570706c79206f76657200000000000000000000000000000000000000000081525060200191505060405180910390fd5b6121bd8484613509565b601360008361ffff1661ffff168152602001908152602001600020839080600181540180825580915050906001820390600052602060002001600090919290919091505550601460008361ffff1661ffff16815260200190815260200160002060008154809291906001019190505550601560008361ffff1661ffff16815260200190815260200160002060008261ffff1661ffff1681526020019081526020016000206000815480929190600101919050555050505050565b612287612282613376565b611cad565b15156122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b6122e781613672565b50565b6122fa6122f5613376565b611cad565b1515612351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b600e60009054906101000a900460ff161515156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861241a613376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061246f61246a613376565b612812565b15156124c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b6124d18484846136cc565b600190509392505050565b670de0b6b3a764000081565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125805780601f1061255557610100808354040283529160200191612580565b820191906000526020600020905b81548152906001019060200180831161256357829003601f168201915b5050505050905090565b6000601560008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff16815260200190815260200160002054905092915050565b6125d96125d4613376565b612812565b1515612630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b6126398161373f565b50565b61264c612647613376565b613799565b565b6000601460008361ffff1661ffff168152602001908152602001600020549050919050565b61268361267e613376565b612812565b15156126da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b8181600f91906126eb9291906148c7565b505050565b60006126fb82613045565b9050919050565b600061271461270f613376565b612812565b151561276b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b61277583836137f3565b6001905092915050565b600e60009054906101000a900460ff16151515612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61280e8282613811565b5050565b600061282882600c61352a90919063ffffffff16565b9050919050565b61284061283a613376565b8361337e565b1515612897576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c396031913960400191505060405180910390fd5b6128a3848484846139cb565b50505050565b600381565b600f8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129445780601f1061291957610100808354040283529160200191612944565b820191906000526020600020905b81548152906001019060200180831161292757829003601f168201915b505050505081565b6060600080831415612980577f300000000000000000000000000000000000000000000000000000000000000090506129f4565b60008390505b60008111156129f2576101008260001c81151561299f57fe5b0460001b91507f01000000000000000000000000000000000000000000000000000000000000006030600a838115156129d457fe5b06010260001b82179150600a818115156129ea57fe5b049050612986565b505b6060600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a8c5780601f10612a6157610100808354040283529160200191612a8c565b820191906000526020600020905b815481529060010190602001808311612a6f57829003601f168201915b505050505090506060602060ff168251016040519080825280601f01601f191660200182016040528015612acf5781602001600182028038833980820191505090505b50905060008060009050600091505b83518260ff161015612b5d57838260ff16815181101515612afb57fe5b90602001015160f81c60f81b838260ff16815181101515612b1857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150508180600101925050612ade565b600091505b602060ff168260ff161015612bdc57848260ff16602081101515612b8257fe5b1a60f81b838260ff16815181101515612b9757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150508180600101925050612b62565b8295505050505050919050565b612bf9612bf4613376565b612812565b1515612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b60008661ffff1614151515612ccd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6775696c64547970652030206973206e6f6775696c640000000000000000000081525060200191505060405180910390fd5b60008514151515612d46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f74616c566f6c756d65206d757374206e6f7420626520300000000000000081525060200191505060405180910390fd5b84612df6612d7960166000600161ffff1661ffff16815260200190815260200160002054846132a290919063ffffffff16565b612de8612dab60166000600261ffff1661ffff16815260200190815260200160002054876132a290919063ffffffff16565b612dda60166000600361ffff1661ffff16815260200190815260200160002054896132a290919063ffffffff16565b613a3f90919063ffffffff16565b613a3f90919063ffffffff16565b141515612e0257600080fd5b83612e2882612e1a8587613a3f90919063ffffffff16565b613a3f90919063ffffffff16565b141515612e3457600080fd5b84601060008861ffff1661ffff1681526020019081526020016000208190555083601160008861ffff1661ffff1681526020019081526020016000208190555082601260008861ffff1661ffff1681526020019081526020016000206000600361ffff1661ffff1681526020019081526020016000208190555081601260008861ffff1661ffff1681526020019081526020016000206000600261ffff1661ffff1681526020019081526020016000208190555080601260008861ffff1661ffff1681526020019081526020016000206000600161ffff1661ffff16815260200190815260200160002081905550505050505050565b6000601160008361ffff1661ffff168152602001908152602001600020549050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600181565b6000601060008361ffff1661ffff168152602001908152602001600020549050919050565b6000806103e861ffff1661303061271061ffff168561332c90919063ffffffff16565b81151561303957fe5b06905080915050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60006130c282611dd0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561314b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614c186021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661316a613376565b73ffffffffffffffffffffffffffffffffffffffff161480613199575061319881613193613376565b612f4f565b5b15156131f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180614a766038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000808314156132b55760009050613326565b600082840290508284828115156132c857fe5b04141515613321576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b806021913960400191505060405180910390fd5b809150505b92915050565b600061336e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ac9565b905092915050565b600033905090565b600061338982613045565b15156133e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a4a602c913960400191505060405180910390fd5b60006133eb83611dd0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061345a57508373ffffffffffffffffffffffffffffffffffffffff16613442846114a3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061346b575061346a8185612f4f565b5b91505092915050565b600e60009054906101000a900460ff161515156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b613504838383613b93565b505050565b6135138282613bb7565b61351d8282613dd3565b61352681613e9a565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614bcd6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61361e81600d613ee690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b600081600001549050919050565b61368681600d613fa590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b6136d68383613509565b6136e36000848484614082565b151561373a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806149c46032913960400191505060405180910390fd5b505050565b61375381600c613fa590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6137ad81600c613ee690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b61380d8282604051806020016040528060008152506136cc565b5050565b613819613376565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156138bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b80600460006138c9613376565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613976613376565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6139d6848484613474565b6139e284848484614082565b1515613a39576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806149c46032913960400191505060405180910390fd5b50505050565b6000808284019050838110151515613abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831182901515613b77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3c578082015181840152602081019050613b21565b50505050905090810190601f168015613b695780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385811515613b8557fe5b049050809150509392505050565b613b9e838383614274565b613ba883826144d3565b613bb28282613dd3565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613c5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b613c6581613045565b151515613cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613d73600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614677565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b613ef0828261352a565b1515613f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b316021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b613faf828261352a565b151515614024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006140a38473ffffffffffffffffffffffffffffffffffffffff1661468d565b15156140b2576001905061426c565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a026140d8613376565b8887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614194578082015181840152602081019050614179565b50505050905090810190601f1680156141c15780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156141e357600080fd5b505af11580156141f7573d6000803e3d6000fd5b505050506040513d602081101561420d57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661429482611dd0565b73ffffffffffffffffffffffffffffffffffffffff16141515614302576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614bef6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561438a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a266024913960400191505060405180910390fd5b614393816146d8565b6143da600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614798565b614421600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614677565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061452b6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506147bb90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114151561461e576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561459c57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156145f657fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036146709190614947565b5050505050565b6001816000016000828254019250508190555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156146cf5750808214155b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156147955760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6147b0600182600001546147bb90919063ffffffff16565b816000018190555050565b60006147fd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614805565b905092915050565b600083831115829015156148b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561487957808201518184015260208101905061485e565b50505050905090810190601f1680156148a65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061490857803560ff1916838001178555614936565b82800160010185558215614936579182015b8281111561493557823582559160200191906001019061491a565b5b5090506149439190614973565b5090565b81548183558181111561496e5781836000526020600020918201910161496d9190614973565b5b505050565b61499591905b80821115614991576000816000905550600101614979565b5090565b9056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65696e76616c69642073657269616c206775696c6454797065416e64526172697479546f53746f636b537570706c79536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a165627a7a723058208621c890ff02e1f83cda02751cfd862fe6da1477ae8f33196b2a6971360a18dc0029
Deployed Bytecode Sourcemap
53483:8737:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53483:8737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16518:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16518:135:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53613:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;43535:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43535:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21488:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21488:204:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53001:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53001:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58526:173;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58526:173:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35160:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53558:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;59000:313;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59000:313:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;23171:292;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23171:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53779:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34769:232;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34769:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52610:120;;;:::i;:::-;;56910:592;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56910:592:0;;;;;;;;;;;;;;;;;:::i;:::-;;48507:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48507:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24125:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24125:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58707:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58707:147:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;58707:147:0;;;;;;;;;;;;;;;;;50081:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50081:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58011:169;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58011:169:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58862:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58862:130:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35602:199;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35602:199:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51817:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20111:228;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20111:228:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53873:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50298:79;;;:::i;:::-;;19674:211;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19674:211:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59960:875;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59960:875:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50198:92;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50198:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;52397:118;;;:::i;:::-;;49371:170;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;49371:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;49371:170:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;49371:170:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;49371:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;49371:170:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53669:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43735:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43735:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58336:182;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58336:182:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47585:92;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47585:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;47685:79;;;:::i;:::-;;58188:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58188:140:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59677:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59677:131:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;59677:131:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;59677:131:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;59677:131:0;;;;;;;;;;;;:::i;:::-;;56791:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56791:111:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;48898:143;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48898:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53121:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53121:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47468:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47468:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24996:272;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;24996:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;24996:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24996:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;24996:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;24996:272:0;;;;;;;;;;;;;;;:::i;:::-;;53729:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53917:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;53917:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61225:990;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61225:990:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;61225:990:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54880:1243;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;54880:1243:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57649:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57649:141:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22577:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22577:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53824:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57510:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57510:131:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57798:205;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57798:205:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16518:135;16588:4;16612:20;:33;16633:11;16612:33;;;;;;;;;;;;;;;;;;;;;;;;;;;16605:40;;16518:135;;;:::o;53613:49::-;53658:4;53613:49;:::o;43535:85::-;43574:13;43607:5;43600:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43535:85;:::o;21488:204::-;21547:7;21575:16;21583:7;21575;:16::i;:::-;21567:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21660:15;:24;21676:7;21660:24;;;;;;;;;;;;;;;;;;;;;21653:31;;21488:204;;;:::o;53001:112::-;52054:7;;;;;;;;;;;52053:8;52045:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53079:26;53093:2;53097:7;53079:13;:26::i;:::-;53001:112;;:::o;58526:173::-;58614:7;58639:31;:43;58671:10;58639:43;;;;;;;;;;;;;;;:52;58683:7;58639:52;;;;;;;;;;;;;;;;58632:59;;58526:173;;;;:::o;35160:96::-;35204:7;35231:10;:17;;;;35224:24;;35160:96;:::o;53558:48::-;53601:5;53558:48;:::o;59000:313::-;59077:7;59086;59122:145;59223:43;59238:27;59251:13;59238:12;:27::i;:::-;59223:14;:43::i;:::-;59122:84;53714:6;59122:48;59145:24;59155:13;59145:9;:24::i;:::-;59122:22;:48::i;:::-;:64;;:84;;;;:::i;:::-;:100;;:145;;;;:::i;:::-;53714:6;59104:201;;;;59000:313;;;:::o;23171:292::-;23315:41;23334:12;:10;:12::i;:::-;23348:7;23315:18;:41::i;:::-;23307:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23423:32;23437:4;23443:2;23447:7;23423:13;:32::i;:::-;23171:292;;;:::o;53779:38::-;53816:1;53779:38;:::o;34769:232::-;34849:7;34885:16;34895:5;34885:9;:16::i;:::-;34877:5;:24;34869:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34967:12;:19;34980:5;34967:19;;;;;;;;;;;;;;;34987:5;34967:26;;;;;;;;;;;;;;;;;;34960:33;;34769:232;;;;:::o;52610:120::-;49978:22;49987:12;:10;:12::i;:::-;49978:8;:22::i;:::-;49970:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52253:7;;;;;;;;;;;52245:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52679:5;52669:7;;:15;;;;;;;;;;;;;;;;;;52700:22;52709:12;:10;:12::i;:::-;52700:22;;;;;;;;;;;;;;;;;;;;;;52610:120::o;56910:592::-;56983:13;56999:24;57009:13;56999:9;:24::i;:::-;56983:40;;57071:1;57041:19;:27;57061:6;57041:27;;;;;;;;;;;;;;;;:31;57032:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57116:16;57135:27;57148:13;57135:12;:27::i;:::-;57116:46;;57216:1;57180:22;:33;57203:9;57180:33;;;;;;;;;;;;;;;;:37;57171:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57264:14;53601:5;57281:33;;:13;:33;;;;;;;;57264:50;;57341:1;57331:6;:11;;57323:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57393:31;:42;57425:9;57393:42;;;;;;;;;;;;;;;:50;57436:6;57393:50;;;;;;;;;;;;;;;;57383:6;:60;;57375:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56910:592;;;;:::o;48507:135::-;48577:4;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48594:18;48600:2;48604:7;48594:5;:18::i;:::-;48630:4;48623:11;;48507:135;;;;:::o;24125:134::-;24212:39;24229:4;24235:2;24239:7;24212:39;;;;;;;;;;;;:16;:39::i;:::-;24125:134;;;:::o;58707:147::-;58775:16;58809:25;:37;58835:10;58809:37;;;;;;;;;;;;;;;58802:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58707:147;;;:::o;50081:109::-;50137:4;50161:21;50174:7;50161:8;:12;;:21;;;;:::i;:::-;50154:28;;50081:109;;;:::o;58011:169::-;58074:6;58169:2;58105:61;53658:4;58105:61;;:36;53601:5;58105:36;;:13;:17;;:36;;;;:::i;:::-;:40;;:61;;;;:::i;:::-;:66;;;;;;;;58091:81;;58011:169;;;:::o;58862:130::-;58931:7;58956:19;:28;58976:7;58956:28;;;;;;;;;;;;;;;;58949:35;;58862:130;;;:::o;35602:199::-;35660:7;35696:13;:11;:13::i;:::-;35688:5;:21;35680:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35776:10;35787:5;35776:17;;;;;;;;;;;;;;;;;;35769:24;;35602:199;;;:::o;51817:78::-;51856:4;51880:7;;;;;;;;;;;51873:14;;51817:78;:::o;20111:228::-;20166:7;20186:13;20202:11;:20;20214:7;20202:20;;;;;;;;;;;;;;;;;;;;;20186:36;;20258:1;20241:19;;:5;:19;;;;20233:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20326:5;20319:12;;;20111:228;;;:::o;53873:35::-;53907:1;53873:35;:::o;50298:79::-;50342:27;50356:12;:10;:12::i;:::-;50342:13;:27::i;:::-;50298:79::o;19674:211::-;19729:7;19774:1;19757:19;;:5;:19;;;;19749:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19843:34;:17;:24;19861:5;19843:24;;;;;;;;;;;;;;;:32;:34::i;:::-;19836:41;;19674:211;;;:::o;59960:875::-;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60091:30;60107:13;60091:15;:30::i;:::-;60090:31;60082:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60198:32;60216:13;60198:17;:32::i;:::-;60271:17;60291:27;60304:13;60291:12;:27::i;:::-;60271:47;;60376:27;:39;60404:10;60376:39;;;;;;;;;;;;;;;;60335:26;:38;60362:10;60335:38;;;;;;;;;;;;;;;;:80;60327:89;;;;;;;;60425:13;60441:24;60451:13;60441:9;:24::i;:::-;60425:40;;60540:31;:43;60572:10;60540:43;;;;;;;;;;;;;;;:51;60584:6;60540:51;;;;;;;;;;;;;;;;60482:35;:47;60518:10;60482:47;;;;;;;;;;;;;;;:55;60530:6;60482:55;;;;;;;;;;;;;;;;:109;60474:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60618:28;60624:6;60632:13;60618:5;:28::i;:::-;60655:25;:37;60681:10;60655:37;;;;;;;;;;;;;;;60698:13;60655:57;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;60655:57:0;;;;;;;;;;;;;;;;;;;;;;60721:26;:38;60748:10;60721:38;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;60770:35;:47;60806:10;60770:47;;;;;;;;;;;;;;;:55;60818:6;60770:55;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;47451:1;;59960:875;;:::o;50198:92::-;49978:22;49987:12;:10;:12::i;:::-;49978:8;:22::i;:::-;49970:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50263:19;50274:7;50263:10;:19::i;:::-;50198:92;:::o;52397:118::-;49978:22;49987:12;:10;:12::i;:::-;49978:8;:22::i;:::-;49970:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52054:7;;;;;;;;;;;52053:8;52045:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52467:4;52457:7;;:14;;;;;;;;;;;;;;;;;;52487:20;52494:12;:10;:12::i;:::-;52487:20;;;;;;;;;;;;;;;;;;;;;;52397:118::o;49371:170::-;49465:4;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49482:29;49492:2;49496:7;49505:5;49482:9;:29::i;:::-;49529:4;49522:11;;49371:170;;;;;:::o;53669:51::-;53714:6;53669:51;:::o;43735:89::-;43776:13;43809:7;43802:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43735:89;:::o;58336:182::-;58429:7;58454:35;:47;58490:10;58454:47;;;;;;;;;;;;;;;:56;58502:7;58454:56;;;;;;;;;;;;;;;;58447:63;;58336:182;;;;:::o;47585:92::-;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47650:19;47661:7;47650:10;:19::i;:::-;47585:92;:::o;47685:79::-;47729:27;47743:12;:10;:12::i;:::-;47729:13;:27::i;:::-;47685:79::o;58188:140::-;58257:7;58282:26;:38;58309:10;58282:38;;;;;;;;;;;;;;;;58275:45;;58188:140;;;:::o;59677:131::-;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59785:15;;59768:14;:32;;;;;;;:::i;:::-;;59677:131;;:::o;56791:111::-;56855:4;56877:17;56885:8;56877:7;:17::i;:::-;56870:24;;56791:111;;;:::o;48898:143::-;48972:4;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48989:22;48999:2;49003:7;48989:9;:22::i;:::-;49029:4;49022:11;;48898:143;;;;:::o;53121:131::-;52054:7;;;;;;;;;;;52053:8;52045:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53207;53231:2;53235:8;53207:23;:37::i;:::-;53121:131;;:::o;47468:109::-;47524:4;47548:21;47561:7;47548:8;:12;;:21;;;;:::i;:::-;47541:28;;47468:109;;;:::o;24996:272::-;25111:41;25130:12;:10;:12::i;:::-;25144:7;25111:18;:41::i;:::-;25103:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25217:43;25235:4;25241:2;25245:7;25254:5;25217:17;:43::i;:::-;24996:272;;;;:::o;53729:43::-;53771:1;53729:43;:::o;53917:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61225:990::-;61281:13;61307:20;61353:1;61342:7;:12;61338:351;;;61371:18;;;61338:351;;;61422:13;61438:7;61422:23;;61460:218;61475:1;61467:5;:9;61460:218;;;61545:6;61528:12;61520:21;;:32;;;;;;;;61512:41;;61497:56;;61618:13;61612:2;61606;61598:5;:10;;;;;;;;61597:17;61596:35;61588:44;;61572:60;;;;61660:2;61651:11;;;;;;;;;;;61460:218;;;61338:351;;61701:24;61734:14;61701:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61760:26;61820:19;61799:40;;:11;:18;:40;61789:51;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;61789:51:0;;;;61760:80;;61853:7;61871:11;61885:1;61871:15;;61908:1;61904:5;;61899:127;61915:11;:18;61911:1;:22;;;61899:127;;;61978:11;61990:1;61978:14;;;;;;;;;;;;;;;;;;;;;61955:13;61969:5;61955:20;;;;;;;;;;;;;;;;:37;;;;;;;;;;;62007:7;;;;;;;61935:3;;;;;;;61899:127;;;62047:1;62043:5;;62038:129;62054:19;62050:23;;:1;:23;;;62038:129;;;62118:12;62131:1;62118:15;;;;;;;;;;;;;;62095:13;62109:5;62095:20;;;;;;;;;;;;;;;;:38;;;;;;;;;;;62148:7;;;;;;;62075:3;;;;;;;62038:129;;;62193:13;62179:28;;;;;;;61225:990;;;:::o;54880:1243::-;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55174:1;55160:10;:15;;;;55152:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55235:1;55219:12;:17;;55211:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55585:12;55382:190;55519:52;55536:19;:34;53863:1;55536:34;;;;;;;;;;;;;;;;55519:12;:16;;:52;;;;:::i;:::-;55382:122;55455:48;55470:19;:32;53816:1;55470:32;;;;;;;;;;;;;;;;55455:10;:14;;:48;;;;:::i;:::-;55382:58;55402:19;:37;53771:1;55402:37;;;;;;;;;;;;;;;;55382:15;:19;;:58;;;;:::i;:::-;:72;;:122;;;;:::i;:::-;:136;;:190;;;;:::i;:::-;:215;55364:242;;;;;;;;55715:17;55633:69;55689:12;55633:41;55663:10;55633:15;:29;;:41;;;;:::i;:::-;:55;;:69;;;;:::i;:::-;:99;55615:126;;;;;;;;55787:12;55750:22;:34;55773:10;55750:34;;;;;;;;;;;;;;;:49;;;;55850:17;55808:27;:39;55836:10;55808:39;;;;;;;;;;;;;;;:59;;;;55940:15;55876:31;:43;55908:10;55876:43;;;;;;;;;;;;;;;:61;53771:1;55876:61;;;;;;;;;;;;;;;:79;;;;56023:10;55964:31;:43;55996:10;55964:43;;;;;;;;;;;;;;;:56;53816:1;55964:56;;;;;;;;;;;;;;;:69;;;;56103:12;56042:31;:43;56074:10;56042:43;;;;;;;;;;;;;;;:58;53863:1;56042:58;;;;;;;;;;;;;;;:73;;;;54880:1243;;;;;;:::o;57649:141::-;57718:7;57743:27;:39;57771:10;57743:39;;;;;;;;;;;;;;;;57736:46;;57649:141;;;:::o;22577:147::-;22657:4;22681:18;:25;22700:5;22681:25;;;;;;;;;;;;;;;:35;22707:8;22681:35;;;;;;;;;;;;;;;;;;;;;;;;;22674:42;;22577:147;;;;:::o;53824:40::-;53863:1;53824:40;:::o;57510:131::-;57574:7;57599:22;:34;57622:10;57599:34;;;;;;;;;;;;;;;;57592:41;;57510:131;;;:::o;57798:205::-;57864:6;57881:17;53658:4;57908:60;;57909:36;53601:5;57909:36;;:13;:17;;:36;;;;:::i;:::-;57908:60;;;;;;;;57881:88;;57985:10;57978:17;;;57798:205;;;:::o;26461:155::-;26518:4;26535:13;26551:11;:20;26563:7;26551:20;;;;;;;;;;;;;;;;;;;;;26535:36;;26606:1;26589:19;;:5;:19;;;;26582:26;;;26461:155;;;:::o;20770:425::-;20834:13;20850:16;20858:7;20850;:16::i;:::-;20834:32;;20891:5;20885:11;;:2;:11;;;;20877:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20971:5;20955:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20980:37;20997:5;21004:12;:10;:12::i;:::-;20980:16;:37::i;:::-;20955:62;20947:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21141:2;21114:15;:24;21130:7;21114:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;21179:7;21175:2;21159:28;;21168:5;21159:28;;;;;;;;;;;;20770:425;;;:::o;7697:471::-;7755:7;8005:1;8000;:6;7996:47;;;8030:1;8023:8;;;;7996:47;8055:9;8071:1;8067;:5;8055:17;;8100:1;8095;8091;:5;;;;;;;;:10;8083:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8159:1;8152:8;;;7697:471;;;;;:::o;8636:132::-;8694:7;8721:39;8725:1;8728;8721:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8714:46;;8636:132;;;;:::o;866:98::-;911:15;946:10;939:17;;866:98;:::o;26986:333::-;27071:4;27096:16;27104:7;27096;:16::i;:::-;27088:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27172:13;27188:16;27196:7;27188;:16::i;:::-;27172:32;;27234:5;27223:16;;:7;:16;;;:51;;;;27267:7;27243:31;;:20;27255:7;27243:11;:20::i;:::-;:31;;;27223:51;:87;;;;27278:32;27295:5;27302:7;27278:16;:32::i;:::-;27223:87;27215:96;;;26986:333;;;;:::o;53260:146::-;52054:7;;;;;;;;;;;52053:8;52045:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53360:38;53380:4;53386:2;53390:7;53360:19;:38::i;:::-;53260:146;;;:::o;36695:202::-;36759:24;36771:2;36775:7;36759:11;:24::i;:::-;36796:40;36824:2;36828:7;36796:27;:40::i;:::-;36849;36881:7;36849:31;:40::i;:::-;36695:202;;:::o;46725:203::-;46797:4;46841:1;46822:21;;:7;:21;;;;46814:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46900:4;:11;;:20;46912:7;46900:20;;;;;;;;;;;;;;;;;;;;;;;;;46893:27;;46725:203;;;;:::o;50515:130::-;50575:24;50591:7;50575:8;:15;;:24;;;;:::i;:::-;50629:7;50615:22;;;;;;;;;;;;50515:130;:::o;15189:114::-;15254:7;15281;:14;;;15274:21;;15189:114;;;:::o;50385:122::-;50442:21;50455:7;50442:8;:12;;:21;;;;:::i;:::-;50491:7;50479:20;;;;;;;;;;;;50385:122;:::o;28576:242::-;28664:18;28670:2;28674:7;28664:5;:18::i;:::-;28701:54;28732:1;28736:2;28740:7;28749:5;28701:22;:54::i;:::-;28693:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28576:242;;;:::o;47772:122::-;47829:21;47842:7;47829:8;:12;;:21;;;;:::i;:::-;47878:7;47866:20;;;;;;;;;;;;47772:122;:::o;47902:130::-;47962:24;47978:7;47962:8;:15;;:24;;;;:::i;:::-;48016:7;48002:22;;;;;;;;;;;;47902:130;:::o;27860:102::-;27928:26;27938:2;27942:7;27928:26;;;;;;;;;;;;:9;:26::i;:::-;27860:102;;:::o;21993:254::-;22079:12;:10;:12::i;:::-;22073:18;;:2;:18;;;;22065:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22173:8;22134:18;:32;22153:12;:10;:12::i;:::-;22134:32;;;;;;;;;;;;;;;:36;22167:2;22134:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;22226:2;22197:42;;22212:12;:10;:12::i;:::-;22197:42;;;22230:8;22197:42;;;;;;;;;;;;;;;;;;;;;;21993:254;;:::o;25987:272::-;26097:32;26111:4;26117:2;26121:7;26097:13;:32::i;:::-;26148:48;26171:4;26177:2;26181:7;26190:5;26148:22;:48::i;:::-;26140:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25987:272;;;;:::o;6325:181::-;6383:7;6403:9;6419:1;6415;:5;6403:17;;6444:1;6439;:6;;6431:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6497:1;6490:8;;;6325:181;;;;:::o;9298:345::-;9384:7;9483:1;9479;:5;9486:12;9471:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9471:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9510:9;9526:1;9522;:5;;;;;;;;9510:17;;9634:1;9627:8;;;9298:345;;;;;:::o;36185:245::-;36271:38;36291:4;36297:2;36301:7;36271:19;:38::i;:::-;36322:47;36355:4;36361:7;36322:32;:47::i;:::-;36382:40;36410:2;36414:7;36382:27;:40::i;:::-;36185:245;;;:::o;29071:335::-;29157:1;29143:16;;:2;:16;;;;29135:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29216:16;29224:7;29216;:16::i;:::-;29215:17;29207:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29301:2;29278:11;:20;29290:7;29278:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;29314:33;:17;:21;29332:2;29314:21;;;;;;;;;;;;;;;:31;:33::i;:::-;29390:7;29386:2;29365:33;;29382:1;29365:33;;;;;;;;;;;;29071:335;;:::o;38192:186::-;38306:12;:16;38319:2;38306:16;;;;;;;;;;;;;;;:23;;;;38277:17;:26;38295:7;38277:26;;;;;;;;;;;:52;;;;38340:12;:16;38353:2;38340:16;;;;;;;;;;;;;;;38362:7;38340:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38340:30:0;;;;;;;;;;;;;;;;;;;;;;38192:186;;:::o;38579:164::-;38683:10;:17;;;;38656:15;:24;38672:7;38656:24;;;;;;;;;;;:44;;;;38711:10;38727:7;38711:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38711:24:0;;;;;;;;;;;;;;;;;;;;;;38579:164;:::o;46447:183::-;46527:18;46531:4;46537:7;46527:3;:18::i;:::-;46519:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46617:5;46594:4;:11;;:20;46606:7;46594:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;46447:183;;:::o;46189:178::-;46267:18;46271:4;46277:7;46267:3;:18::i;:::-;46266:19;46258:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46355:4;46332;:11;;:20;46344:7;46332:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;46189:178;;:::o;31743:358::-;31865:4;31892:15;:2;:13;;;:15::i;:::-;31891:16;31887:60;;;31931:4;31924:11;;;;31887:60;31959:13;31991:2;31975:36;;;32012:12;:10;:12::i;:::-;32026:4;32032:7;32041:5;31975:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31975:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31975:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31975:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31975:72:0;;;;;;;;;;;;;;;;31959:88;;17875:10;32076:16;;32066:26;;;:6;:26;;;;32058:35;;;31743:358;;;;;;;:::o;30682:459::-;30796:4;30776:24;;:16;30784:7;30776;:16::i;:::-;:24;;;30768:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30879:1;30865:16;;:2;:16;;;;30857:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30935:23;30950:7;30935:14;:23::i;:::-;30971:35;:17;:23;30989:4;30971:23;;;;;;;;;;;;;;;:33;:35::i;:::-;31017:33;:17;:21;31035:2;31017:21;;;;;;;;;;;;;;;:31;:33::i;:::-;31086:2;31063:11;:20;31075:7;31063:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;31125:7;31121:2;31106:27;;31115:4;31106:27;;;;;;;;;;;;30682:459;;;:::o;39370:1148::-;39636:22;39661:32;39691:1;39661:12;:18;39674:4;39661:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;39636:57;;39704:18;39725:17;:26;39743:7;39725:26;;;;;;;;;;;;39704:47;;39872:14;39858:10;:28;;39854:328;;;39903:19;39925:12;:18;39938:4;39925:18;;;;;;;;;;;;;;;39944:14;39925:34;;;;;;;;;;;;;;;;;;39903:56;;40009:11;39976:12;:18;39989:4;39976:18;;;;;;;;;;;;;;;39995:10;39976:30;;;;;;;;;;;;;;;;;:44;;;;40126:10;40093:17;:30;40111:11;40093:30;;;;;;;;;;;:43;;;;39854:328;;40271:12;:18;40284:4;40271:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;39370:1148;;;;:::o;15311:91::-;15393:1;15375:7;:14;;;:19;;;;;;;;;;;15311:91;:::o;11558:810::-;11618:4;12071:16;12098:19;12120:66;12098:88;;;;12289:7;12277:20;12265:32;;12329:3;12317:15;;:8;:15;;:42;;;;;12348:11;12336:8;:23;;12317:42;12309:51;;;;11558:810;;;:::o;32269:175::-;32369:1;32333:38;;:15;:24;32349:7;32333:24;;;;;;;;;;;;;;;;;;;;;:38;;;;32329:108;;;32423:1;32388:15;:24;32404:7;32388:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;32329:108;32269:175;:::o;15410:110::-;15491:21;15510:1;15491:7;:14;;;:18;;:21;;;;:::i;:::-;15474:7;:14;;:38;;;;15410:110;:::o;6781:136::-;6839:7;6866:43;6870:1;6873;6866:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6859:50;;6781:136;;;;:::o;7254:192::-;7340:7;7373:1;7368;:6;;7376:12;7360:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7360:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7400:9;7416:1;7412;:5;7400:17;;7437:1;7430:8;;;7254:192;;;;;:::o;53483:8737::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://8621c890ff02e1f83cda02751cfd862fe6da1477ae8f33196b2a6971360a18dc
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.