ERC-721
Overview
Max Total Supply
0 SPARC-E
Holders
105
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
SPARCECore
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-07 */ /** *Submitted for verification at Etherscan.io on 2022-09-02 */ pragma solidity 0.8.4; //SPDX-License-Identifier: UNLICENSED 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); } interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } interface IERC2981 { /// ERC165 bytes to add to interface array - set in parent contract /// implementing this standard /// /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /// _registerInterface(_INTERFACE_ID_ERC2981); /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _salePrice - the sale price of the NFT asset specified by _tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view returns ( address receiver, uint256 royaltyAmount ); } library Address { /** * @dev Returns true if `account` is 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. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Base URI string public baseURI; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_, string memory uri_) { _name = name_; _symbol = symbol_; baseURI = uri_; } modifier mustBeValidToken(uint256 _tokenId) { require(ownerOf(_tokenId) != address(0)); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI_ = _baseURI(); return bytes(baseURI_).length > 0 ? string(abi.encodePacked(baseURI_, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return baseURI; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.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" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), 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. * * @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 ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } interface SPARCESpawningManager { function isSpawningAllowed(uint256 _genes, address _owner) external view returns (bool); function isRebirthAllowed(uint256 _sparceId, uint256 _genes) external view returns (bool); } interface SPARCERetirementManager { function isRetirementAllowed(uint256 _sparceId, bool _rip) external view returns (bool); } interface SPARCEMarketplaceManager { function isTransferAllowed(address _from, address _to, uint256 _sparceId) external view returns (bool); } interface SPARCEGeneManager { function isEvolvementAllowed(uint256 _sparceId, uint256 _newGenes) external view returns (bool); } contract SPARCEDependency { address public whitelistSetterAddress; SPARCESpawningManager public spawningManager; SPARCERetirementManager public retirementManager; SPARCEMarketplaceManager public marketplaceManager; SPARCEGeneManager public geneManager; mapping (address => bool) public whitelistedSpawner; mapping (address => bool) public whitelistedByeSayer; mapping (address => bool) public whitelistedGeneScientist; mapping (address => bool) public whitelistedMarkets; constructor() { whitelistSetterAddress = msg.sender; } modifier onlyWhitelistSetter() { require(msg.sender == whitelistSetterAddress); _; } modifier whenSpawningAllowed(uint256 _genes, address _owner) { require( address(spawningManager) == address(0) || spawningManager.isSpawningAllowed(_genes, _owner) ); _; } modifier whenRebirthAllowed(uint256 _sparceId, uint256 _genes) { require( address(spawningManager) == address(0) || spawningManager.isRebirthAllowed(_sparceId, _genes) ); _; } modifier whenRetirementAllowed(uint256 _sparceId, bool _rip) { require( address(retirementManager) == address(0) || retirementManager.isRetirementAllowed(_sparceId, _rip) ); _; } modifier whenEvolvementAllowed(uint256 _sparceId, uint256 _newGenes) { require( address(geneManager) == address(0) || geneManager.isEvolvementAllowed(_sparceId, _newGenes) ); _; } modifier onlySpawner() { require(whitelistedSpawner[msg.sender]); _; } modifier onlyByeSayer() { require(whitelistedByeSayer[msg.sender]); _; } modifier onlyGeneScientist() { require(whitelistedGeneScientist[msg.sender]); _; } modifier onlyMarkets() { require(whitelistedMarkets[msg.sender]); _; } /* * @dev Setting the whitelist setter address to `address(0)` would be a irreversible process. * This is to lock changes to SPARC-E's contracts after their development is done. */ function setWhitelistSetter(address _newSetter) external onlyWhitelistSetter { whitelistSetterAddress = _newSetter; } function setSpawningManager(address _manager) external onlyWhitelistSetter { spawningManager = SPARCESpawningManager(_manager); } function setRetirementManager(address _manager) external onlyWhitelistSetter { retirementManager = SPARCERetirementManager(_manager); } function setGeneManager(address _manager) external onlyWhitelistSetter { geneManager = SPARCEGeneManager(_manager); } function setSpawner(address _spawner, bool _whitelisted) external onlyWhitelistSetter { require(whitelistedSpawner[_spawner] != _whitelisted); whitelistedSpawner[_spawner] = _whitelisted; } function setByeSayer(address _byeSayer, bool _whitelisted) external onlyWhitelistSetter { require(whitelistedByeSayer[_byeSayer] != _whitelisted); whitelistedByeSayer[_byeSayer] = _whitelisted; } function setGeneScientist(address _geneScientist, bool _whitelisted) external onlyWhitelistSetter { require(whitelistedGeneScientist[_geneScientist] != _whitelisted); whitelistedGeneScientist[_geneScientist] = _whitelisted; } function setMarkets(address _market, bool _whitelisted) external onlyWhitelistSetter { require(whitelistedMarkets[_market] != _whitelisted); whitelistedMarkets[_market] = _whitelisted; } } contract SPARCECore is ERC721, SPARCEDependency { struct SPARCE { uint256 genes; uint256 bornAt; address operator; bool isNewlyBorn; } SPARCE[] sparce; address owner; event SPARCESpawned(uint256 indexed _sparceId, address indexed _owner, uint256 _genes); event SPARCERebirthed(uint256 indexed _sparceId, uint256 _genes); event SPARCERetired(uint256 indexed _sparceId); event SPARCEEvolved(uint256 indexed _sparceId, uint256 _oldGenes, uint256 _newGenes); constructor() ERC721("SPARC-E", "SPARC-E", "https://ipfs.io/ipfs/") { owner = msg.sender; sparce.push(SPARCE(0, block.timestamp, msg.sender, true)); _spawnSparce(0, msg.sender); _spawnSparce(0, msg.sender); _spawnSparce(0, msg.sender); _spawnSparce(0, msg.sender); } modifier onlyOwner() { require(msg.sender == owner); _; } function setBaseURI( string memory _baseURI) external onlyOwner { baseURI = _baseURI; } function UpdateNewBornSparce( uint _sparceId) external onlyMarkets { require(sparce[_sparceId].isNewlyBorn == true); sparce[_sparceId].isNewlyBorn = false; } function getSparce( uint256 _sparceId ) external view mustBeValidToken(_sparceId) returns (uint256 /* _genes */, uint256 /* _bornAt */, address /* _operator */, bool /* _newlyBorn */) { SPARCE storage _sparce = sparce[_sparceId]; return (_sparce.genes, _sparce.bornAt, _sparce.operator, _sparce.isNewlyBorn); } function spawnSparce( uint256 _genes, address _owner ) external onlySpawner whenSpawningAllowed(_genes, _owner) returns (uint256) { return _spawnSparce(_genes, _owner); } function spawnMultipleSparce( uint256[] memory _genes ) external onlySpawner { require(_genes.length <= 30, "exceed array length"); for(uint i=0;i<_genes.length;i++) { require( address(spawningManager) == address(0) || spawningManager.isSpawningAllowed(_genes[i], owner), "spawning is not allowed" ); _spawnSparce(_genes[i], owner); } } function rebirthSparce( uint256 _sparceId, uint256 _genes ) external onlySpawner mustBeValidToken(_sparceId) whenRebirthAllowed(_sparceId, _genes) { SPARCE storage _sparce = sparce[_sparceId]; _sparce.genes = _genes; _sparce.bornAt = block.timestamp; emit SPARCERebirthed(_sparceId, _genes); } function retireSparce( uint256 _sparceId, bool _rip ) external onlyByeSayer whenRetirementAllowed(_sparceId, _rip) { _burn(_sparceId); if (_rip) { delete sparce[_sparceId]; } emit SPARCERetired(_sparceId); } function evolveSparce( uint256 _sparceId, uint256 _newGenes ) external onlyGeneScientist mustBeValidToken(_sparceId) whenEvolvementAllowed(_sparceId, _newGenes) { uint256 _oldGenes = sparce[_sparceId].genes; sparce[_sparceId].genes = _newGenes; emit SPARCEEvolved(_sparceId, _oldGenes, _newGenes); } function _spawnSparce(uint256 _genes, address _owner) private returns (uint256 _sparceId) { sparce.push(SPARCE(_genes, block.timestamp, msg.sender, true)); _sparceId = sparce.length-1; _mint(_owner, _sparceId); emit SPARCESpawned(_sparceId, _owner, _genes); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_sparceId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_oldGenes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newGenes","type":"uint256"}],"name":"SPARCEEvolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_sparceId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_genes","type":"uint256"}],"name":"SPARCERebirthed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_sparceId","type":"uint256"}],"name":"SPARCERetired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_sparceId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_genes","type":"uint256"}],"name":"SPARCESpawned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_sparceId","type":"uint256"}],"name":"UpdateNewBornSparce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sparceId","type":"uint256"},{"internalType":"uint256","name":"_newGenes","type":"uint256"}],"name":"evolveSparce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geneManager","outputs":[{"internalType":"contract SPARCEGeneManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sparceId","type":"uint256"}],"name":"getSparce","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketplaceManager","outputs":[{"internalType":"contract SPARCEMarketplaceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sparceId","type":"uint256"},{"internalType":"uint256","name":"_genes","type":"uint256"}],"name":"rebirthSparce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sparceId","type":"uint256"},{"internalType":"bool","name":"_rip","type":"bool"}],"name":"retireSparce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retirementManager","outputs":[{"internalType":"contract SPARCERetirementManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_byeSayer","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setByeSayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setGeneManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_geneScientist","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setGeneScientist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setMarkets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setRetirementManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spawner","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setSpawner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setSpawningManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSetter","type":"address"}],"name":"setWhitelistSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_genes","type":"uint256[]"}],"name":"spawnMultipleSparce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genes","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"name":"spawnSparce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spawningManager","outputs":[{"internalType":"contract SPARCESpawningManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSetterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedByeSayer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedGeneScientist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedMarkets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedSpawner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060408051808201825260078082526653504152432d4560c81b602080840182815285518087018752938452838201929092528451808601909552601585527f68747470733a2f2f697066732e696f2f697066732f000000000000000000000090850152825192939192620000899160009162000417565b5081516200009f90600190602085019062000417565b508051620000b590600290602084019062000417565b505060078054336001600160a01b03199182168117909255601180549091168217905560408051608081018252600080825242602083019081529282018481526001606084018181526010805492830181558452935160008051602062002c6f833981519152600390920291820155935160008051602062002c2f8339815191528501555160008051602062002c4f833981519152909301805492516001600160a01b039094166001600160a81b031990931692909217600160a01b931515939093029290921790556200018c93509150620001bd565b506200019a600033620001bd565b50620001a8600033620001bd565b50620001b6600033620001bd565b5062000545565b6040805160808101825283815242602082019081523392820192835260016060830181815260108054808401825560008281529551600390910260008051602062002c6f833981519152810191909155935160008051602062002c2f833981519152850155945160008051602062002c4f833981519152909301805491511515600160a01b026001600160a81b03199092166001600160a01b03949094169390931717909155915490916200027291620004d8565b9050620002808282620002cb565b816001600160a01b0316817f8ab40f177215f047f614dc6a44e252d61de624485b726775463f0f014c584b6185604051620002bd91815260200190565b60405180910390a392915050565b6001600160a01b038216620003275760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064015b60405180910390fd5b6000818152600360205260409020546001600160a01b0316156200038e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200031e565b6001600160a01b0382166000908152600460205260408120805460019290620003b9908490620004bd565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546200042590620004f2565b90600052602060002090601f01602090048101928262000449576000855562000494565b82601f106200046457805160ff191683800117855562000494565b8280016001018555821562000494579182015b828111156200049457825182559160200191906001019062000477565b50620004a2929150620004a6565b5090565b5b80821115620004a25760008155600101620004a7565b60008219821115620004d357620004d36200052f565b500190565b600082821015620004ed57620004ed6200052f565b500390565b600181811c908216806200050757607f821691505b602082108114156200052957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6126da80620005556000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806370c30a991161013b578063a22cb465116100b8578063c84c9e451161007c578063c84c9e4514610511578063c87b56dd14610534578063e68b495114610547578063e985e9c51461056a578063ea1f7141146105a657600080fd5b8063a22cb465146104b2578063aa80aa30146104c5578063af1d9eb1146104d8578063b88d4fde146104eb578063c75e17ef146104fe57600080fd5b806395d89b41116100ff57806395d89b411461043e5780639848146a1461044657806398f5ee5d1461046957806399165bf41461047c5780639f186edb1461049f57600080fd5b806370c30a99146103df57806380173a19146103f257806381b2dad9146104055780638c37e31e14610418578063927aaa7c1461042b57600080fd5b80631f8df2cd116101c957806355f804b31161018d57806355f804b31461037d5780635c6ed55b146103905780636352211e146103a35780636c0360eb146103b657806370a08231146103be57600080fd5b80631f8df2cd1461031e57806323b872dd1461033157806342842e0e1461034457806352ac882c14610357578063547a5eee1461036a57600080fd5b80630acbf420116102105780630acbf420146102bf5780630d7a5a0d146102d25780631412409a146102e55780631889500c146102f85780631a68b1a11461030b57600080fd5b806301ffc9a71461024257806306fdde031461026a578063081812fc1461027f578063095ea7b3146102aa575b600080fd5b6102556102503660046122e6565b6105ea565b60405190151581526020015b60405180910390f35b61027261063c565b604051610261919061247b565b61029261028d366004612364565b6106ce565b6040516001600160a01b039091168152602001610261565b6102bd6102b83660046121f9565b610768565b005b6102bd6102cd3660046121c3565b61087e565b6102bd6102e03660046123c2565b6108ec565b600754610292906001600160a01b031681565b600a54610292906001600160a01b031681565b6102bd6103193660046120c3565b610a47565b6102bd61032c3660046121c3565b610a80565b6102bd61033f36600461210f565b610aee565b6102bd61035236600461210f565b610b1f565b600954610292906001600160a01b031681565b6102bd6103783660046120c3565b610b3a565b6102bd61038b36600461231e565b610b73565b6102bd61039e36600461239e565b610ba1565b6102926103b1366004612364565b610cee565b610272610d65565b6103d16103cc3660046120c3565b610df3565b604051908152602001610261565b6102bd6103ed3660046123c2565b610e7a565b600b54610292906001600160a01b031681565b6102bd6104133660046121c3565b611002565b6102bd6104263660046120c3565b611070565b6102bd6104393660046120c3565b6110a9565b6102726110e2565b6102556104543660046120c3565b600d6020526000908152604090205460ff1681565b600854610292906001600160a01b031681565b61025561048a3660046120c3565b600e6020526000908152604090205460ff1681565b6102bd6104ad3660046121c3565b6110f1565b6102bd6104c03660046121c3565b61115f565b6103d16104d336600461237c565b611224565b6102bd6104e6366004612364565b6112f7565b6102bd6104f936600461214a565b6113b1565b6102bd61050c366004612222565b6113e9565b61025561051f3660046120c3565b600c6020526000908152604090205460ff1681565b610272610542366004612364565b6115cc565b6102556105553660046120c3565b600f6020526000908152604090205460ff1681565b6102556105783660046120dd565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6105b96105b4366004612364565b6116a7565b604051610261949392919093845260208401929092526001600160a01b031660408301521515606082015260800190565b60006001600160e01b031982166380ac58cd60e01b148061061b57506001600160e01b03198216635b5e139f60e01b145b8061063657506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461064b906125d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610677906125d1565b80156106c45780601f10610699576101008083540402835291602001916106c4565b820191906000526020600020905b8154815290600101906020018083116106a757829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661074c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061077382610cee565b9050806001600160a01b0316836001600160a01b031614156107e15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610743565b336001600160a01b03821614806107fd57506107fd8133610578565b61086f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610743565b610879838361172f565b505050565b6007546001600160a01b0316331461089557600080fd5b6001600160a01b0382166000908152600f602052604090205460ff16151581151514156108c157600080fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b336000908152600c602052604090205460ff1661090857600080fd5b81600061091482610cee565b6001600160a01b0316141561092857600080fd5b600854839083906001600160a01b031615806109c25750600854604051636a699f6760e11b815260048101849052602481018390526001600160a01b039091169063d4d33ece9060440160206040518083038186803b15801561098a57600080fd5b505afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c291906122ca565b6109cb57600080fd5b6000601086815481106109ee57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060039091020186815542600182015560405187815290925087917f80eb81c49f336a8bd6b331bc9b48fb0b5d01bb283e207a0adce38a10d232ee6e91015b60405180910390a2505050505050565b6007546001600160a01b03163314610a5e57600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314610a9757600080fd5b6001600160a01b0382166000908152600e602052604090205460ff1615158115151415610ac357600080fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b610af8338261179d565b610b145760405162461bcd60e51b8152600401610743906124e0565b610879838383611894565b610879838383604051806020016040528060008152506113b1565b6007546001600160a01b03163314610b5157600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b03163314610b8a57600080fd5b8051610b9d906002906020840190611fb6565b5050565b336000908152600d602052604090205460ff16610bbd57600080fd5b600954829082906001600160a01b03161580610c585750600954604051630c6e6fdf60e11b81526004810184905282151560248201526001600160a01b03909116906318dcdfbe9060440160206040518083038186803b158015610c2057600080fd5b505afa158015610c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5891906122ca565b610c6157600080fd5b610c6a84611a34565b8215610cbd5760108481548110610c9157634e487b7160e01b600052603260045260246000fd5b600091825260208220600390910201818155600181019190915560020180546001600160a81b03191690555b60405184907fe3ea6fb03dba40fb3ce6861e5dca2bc0dfa3676c35fca8ba323ad4e039d6100a90600090a250505050565b6000818152600360205260408120546001600160a01b0316806106365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610743565b60028054610d72906125d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9e906125d1565b8015610deb5780601f10610dc057610100808354040283529160200191610deb565b820191906000526020600020905b815481529060010190602001808311610dce57829003601f168201915b505050505081565b60006001600160a01b038216610e5e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610743565b506001600160a01b031660009081526004602052604090205490565b336000908152600e602052604090205460ff16610e9657600080fd5b816000610ea282610cee565b6001600160a01b03161415610eb657600080fd5b600b54839083906001600160a01b03161580610f505750600b546040516309613bc960e41b815260048101849052602481018390526001600160a01b0390911690639613bc909060440160206040518083038186803b158015610f1857600080fd5b505afa158015610f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5091906122ca565b610f5957600080fd5b600060108681548110610f7c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016000015490508460108781548110610fb257634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000181905550857f6b3be417448dc96ebc121bee60a79ea9dad3256d893d5fb7bd93aaf3fe3c3b6f8287604051610a37929190918252602082015260400190565b6007546001600160a01b0316331461101957600080fd5b6001600160a01b0382166000908152600d602052604090205460ff161515811515141561104557600080fd5b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6007546001600160a01b0316331461108757600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146110c057600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461064b906125d1565b6007546001600160a01b0316331461110857600080fd5b6001600160a01b0382166000908152600c602052604090205460ff161515811515141561113457600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6001600160a01b0382163314156111b85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610743565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600c602052604081205460ff1661124057600080fd5b600854839083906001600160a01b031615806112db5750600854604051630e97242160e01b8152600481018490526001600160a01b03838116602483015290911690630e9724219060440160206040518083038186803b1580156112a357600080fd5b505afa1580156112b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112db91906122ca565b6112e457600080fd5b6112ee8585611acf565b95945050505050565b336000908152600f602052604090205460ff1661131357600080fd5b6010818154811061133457634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020160149054906101000a900460ff161515600115151461136357600080fd5b60006010828154811061138657634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020160146101000a81548160ff02191690831515021790555050565b6113bb338361179d565b6113d75760405162461bcd60e51b8152600401610743906124e0565b6113e384848484611c0b565b50505050565b336000908152600c602052604090205460ff1661140557600080fd5b601e8151111561144d5760405162461bcd60e51b81526020600482015260136024820152720caf0c6cacac840c2e4e4c2f240d8cadccee8d606b1b6044820152606401610743565b60005b8151811015610b9d576008546001600160a01b0316158061152e575060085482516001600160a01b0390911690630e972421908490849081106114a357634e487b7160e01b600052603260045260246000fd5b602090810291909101015160115460405160e084901b6001600160e01b031916815260048101929092526001600160a01b0316602482015260440160206040518083038186803b1580156114f657600080fd5b505afa15801561150a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152e91906122ca565b61157a5760405162461bcd60e51b815260206004820152601760248201527f737061776e696e67206973206e6f7420616c6c6f7765640000000000000000006044820152606401610743565b6115b982828151811061159d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516011546001600160a01b0316611acf565b50806115c48161260c565b915050611450565b6000818152600360205260409020546060906001600160a01b031661164b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610743565b6000611655611c3e565b9050600081511161167557604051806020016040528060008152506116a0565b8061167f84611c4d565b60405160200161169092919061240f565b6040516020818303038152906040525b9392505050565b600080808084816116b782610cee565b6001600160a01b031614156116cb57600080fd5b6000601087815481106116ee57634e487b7160e01b600052603260045260246000fd5b600091825260209091206003909102018054600182015460029092015490999198506001600160a01b0381169750600160a01b900460ff1695509350505050565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061176482610cee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166118165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610743565b600061182183610cee565b9050806001600160a01b0316846001600160a01b0316148061185c5750836001600160a01b0316611851846106ce565b6001600160a01b0316145b8061188c57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118a782610cee565b6001600160a01b03161461190f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610743565b6001600160a01b0382166119715760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610743565b61197c60008261172f565b6001600160a01b03831660009081526004602052604081208054600192906119a590849061258e565b90915550506001600160a01b03821660009081526004602052604081208054600192906119d3908490612562565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611a3f82610cee565b9050611a4c60008361172f565b6001600160a01b0381166000908152600460205260408120805460019290611a7590849061258e565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516080810182528381524260208201908152339282019283526001606083018181526010805480840182556000828152955160039091027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67281019190915593517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67385015594517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae674909301805491511515600160a01b026001600160a81b03199092166001600160a01b0394909416939093171790915591549091611bb59161258e565b9050611bc18282611d67565b816001600160a01b0316817f8ab40f177215f047f614dc6a44e252d61de624485b726775463f0f014c584b6185604051611bfd91815260200190565b60405180910390a392915050565b611c16848484611894565b611c2284848484611ea9565b6113e35760405162461bcd60e51b81526004016107439061248e565b60606002805461064b906125d1565b606081611c715750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c9b5780611c858161260c565b9150611c949050600a8361257a565b9150611c75565b60008167ffffffffffffffff811115611cc457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611cee576020820181803683370190505b5090505b841561188c57611d0360018361258e565b9150611d10600a86612627565b611d1b906030612562565b60f81b818381518110611d3e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611d60600a8661257a565b9450611cf2565b6001600160a01b038216611dbd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610743565b6000818152600360205260409020546001600160a01b031615611e225760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610743565b6001600160a01b0382166000908152600460205260408120805460019290611e4b908490612562565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15611fab57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611eed90339089908890889060040161243e565b602060405180830381600087803b158015611f0757600080fd5b505af1925050508015611f37575060408051601f3d908101601f19168201909252611f3491810190612302565b60015b611f91573d808015611f65576040519150601f19603f3d011682016040523d82523d6000602084013e611f6a565b606091505b508051611f895760405162461bcd60e51b81526004016107439061248e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061188c565b506001949350505050565b828054611fc2906125d1565b90600052602060002090601f016020900481019282611fe4576000855561202a565b82601f10611ffd57805160ff191683800117855561202a565b8280016001018555821561202a579182015b8281111561202a57825182559160200191906001019061200f565b5061203692915061203a565b5090565b5b80821115612036576000815560010161203b565b600067ffffffffffffffff83111561206957612069612667565b61207c601f8401601f1916602001612531565b905082815283838301111561209057600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146120be57600080fd5b919050565b6000602082840312156120d4578081fd5b6116a0826120a7565b600080604083850312156120ef578081fd5b6120f8836120a7565b9150612106602084016120a7565b90509250929050565b600080600060608486031215612123578081fd5b61212c846120a7565b925061213a602085016120a7565b9150604084013590509250925092565b6000806000806080858703121561215f578081fd5b612168856120a7565b9350612176602086016120a7565b925060408501359150606085013567ffffffffffffffff811115612198578182fd5b8501601f810187136121a8578182fd5b6121b78782356020840161204f565b91505092959194509250565b600080604083850312156121d5578182fd5b6121de836120a7565b915060208301356121ee8161267d565b809150509250929050565b6000806040838503121561220b578182fd5b612214836120a7565b946020939093013593505050565b60006020808385031215612234578182fd5b823567ffffffffffffffff8082111561224b578384fd5b818501915085601f83011261225e578384fd5b81358181111561227057612270612667565b8060051b9150612281848301612531565b8181528481019084860184860187018a101561229b578788fd5b8795505b838610156122bd57803583526001959095019491860191860161229f565b5098975050505050505050565b6000602082840312156122db578081fd5b81516116a08161267d565b6000602082840312156122f7578081fd5b81356116a08161268e565b600060208284031215612313578081fd5b81516116a08161268e565b60006020828403121561232f578081fd5b813567ffffffffffffffff811115612345578182fd5b8201601f81018413612355578182fd5b61188c8482356020840161204f565b600060208284031215612375578081fd5b5035919050565b6000806040838503121561238e578182fd5b82359150612106602084016120a7565b600080604083850312156123b0578182fd5b8235915060208301356121ee8161267d565b600080604083850312156123d4578182fd5b50508035926020909101359150565b600081518084526123fb8160208601602086016125a5565b601f01601f19169290920160200192915050565b600083516124218184602088016125a5565b8351908301906124358183602088016125a5565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612471908301846123e3565b9695505050505050565b6020815260006116a060208301846123e3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561255a5761255a612667565b604052919050565b600082198211156125755761257561263b565b500190565b60008261258957612589612651565b500490565b6000828210156125a0576125a061263b565b500390565b60005b838110156125c05781810151838201526020016125a8565b838111156113e35750506000910152565b600181811c908216806125e557607f821691505b6020821081141561260657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126205761262061263b565b5060010190565b60008261263657612636612651565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461268b57600080fd5b50565b6001600160e01b03198116811461268b57600080fdfea26469706673582212209197e717927c994dd528566c23d22f67498566caf5fa06333a40e7607b6cb4bf64736f6c634300080400331b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6731b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6741b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c806370c30a991161013b578063a22cb465116100b8578063c84c9e451161007c578063c84c9e4514610511578063c87b56dd14610534578063e68b495114610547578063e985e9c51461056a578063ea1f7141146105a657600080fd5b8063a22cb465146104b2578063aa80aa30146104c5578063af1d9eb1146104d8578063b88d4fde146104eb578063c75e17ef146104fe57600080fd5b806395d89b41116100ff57806395d89b411461043e5780639848146a1461044657806398f5ee5d1461046957806399165bf41461047c5780639f186edb1461049f57600080fd5b806370c30a99146103df57806380173a19146103f257806381b2dad9146104055780638c37e31e14610418578063927aaa7c1461042b57600080fd5b80631f8df2cd116101c957806355f804b31161018d57806355f804b31461037d5780635c6ed55b146103905780636352211e146103a35780636c0360eb146103b657806370a08231146103be57600080fd5b80631f8df2cd1461031e57806323b872dd1461033157806342842e0e1461034457806352ac882c14610357578063547a5eee1461036a57600080fd5b80630acbf420116102105780630acbf420146102bf5780630d7a5a0d146102d25780631412409a146102e55780631889500c146102f85780631a68b1a11461030b57600080fd5b806301ffc9a71461024257806306fdde031461026a578063081812fc1461027f578063095ea7b3146102aa575b600080fd5b6102556102503660046122e6565b6105ea565b60405190151581526020015b60405180910390f35b61027261063c565b604051610261919061247b565b61029261028d366004612364565b6106ce565b6040516001600160a01b039091168152602001610261565b6102bd6102b83660046121f9565b610768565b005b6102bd6102cd3660046121c3565b61087e565b6102bd6102e03660046123c2565b6108ec565b600754610292906001600160a01b031681565b600a54610292906001600160a01b031681565b6102bd6103193660046120c3565b610a47565b6102bd61032c3660046121c3565b610a80565b6102bd61033f36600461210f565b610aee565b6102bd61035236600461210f565b610b1f565b600954610292906001600160a01b031681565b6102bd6103783660046120c3565b610b3a565b6102bd61038b36600461231e565b610b73565b6102bd61039e36600461239e565b610ba1565b6102926103b1366004612364565b610cee565b610272610d65565b6103d16103cc3660046120c3565b610df3565b604051908152602001610261565b6102bd6103ed3660046123c2565b610e7a565b600b54610292906001600160a01b031681565b6102bd6104133660046121c3565b611002565b6102bd6104263660046120c3565b611070565b6102bd6104393660046120c3565b6110a9565b6102726110e2565b6102556104543660046120c3565b600d6020526000908152604090205460ff1681565b600854610292906001600160a01b031681565b61025561048a3660046120c3565b600e6020526000908152604090205460ff1681565b6102bd6104ad3660046121c3565b6110f1565b6102bd6104c03660046121c3565b61115f565b6103d16104d336600461237c565b611224565b6102bd6104e6366004612364565b6112f7565b6102bd6104f936600461214a565b6113b1565b6102bd61050c366004612222565b6113e9565b61025561051f3660046120c3565b600c6020526000908152604090205460ff1681565b610272610542366004612364565b6115cc565b6102556105553660046120c3565b600f6020526000908152604090205460ff1681565b6102556105783660046120dd565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6105b96105b4366004612364565b6116a7565b604051610261949392919093845260208401929092526001600160a01b031660408301521515606082015260800190565b60006001600160e01b031982166380ac58cd60e01b148061061b57506001600160e01b03198216635b5e139f60e01b145b8061063657506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461064b906125d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610677906125d1565b80156106c45780601f10610699576101008083540402835291602001916106c4565b820191906000526020600020905b8154815290600101906020018083116106a757829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661074c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061077382610cee565b9050806001600160a01b0316836001600160a01b031614156107e15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610743565b336001600160a01b03821614806107fd57506107fd8133610578565b61086f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610743565b610879838361172f565b505050565b6007546001600160a01b0316331461089557600080fd5b6001600160a01b0382166000908152600f602052604090205460ff16151581151514156108c157600080fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b336000908152600c602052604090205460ff1661090857600080fd5b81600061091482610cee565b6001600160a01b0316141561092857600080fd5b600854839083906001600160a01b031615806109c25750600854604051636a699f6760e11b815260048101849052602481018390526001600160a01b039091169063d4d33ece9060440160206040518083038186803b15801561098a57600080fd5b505afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c291906122ca565b6109cb57600080fd5b6000601086815481106109ee57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060039091020186815542600182015560405187815290925087917f80eb81c49f336a8bd6b331bc9b48fb0b5d01bb283e207a0adce38a10d232ee6e91015b60405180910390a2505050505050565b6007546001600160a01b03163314610a5e57600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314610a9757600080fd5b6001600160a01b0382166000908152600e602052604090205460ff1615158115151415610ac357600080fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b610af8338261179d565b610b145760405162461bcd60e51b8152600401610743906124e0565b610879838383611894565b610879838383604051806020016040528060008152506113b1565b6007546001600160a01b03163314610b5157600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b03163314610b8a57600080fd5b8051610b9d906002906020840190611fb6565b5050565b336000908152600d602052604090205460ff16610bbd57600080fd5b600954829082906001600160a01b03161580610c585750600954604051630c6e6fdf60e11b81526004810184905282151560248201526001600160a01b03909116906318dcdfbe9060440160206040518083038186803b158015610c2057600080fd5b505afa158015610c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5891906122ca565b610c6157600080fd5b610c6a84611a34565b8215610cbd5760108481548110610c9157634e487b7160e01b600052603260045260246000fd5b600091825260208220600390910201818155600181019190915560020180546001600160a81b03191690555b60405184907fe3ea6fb03dba40fb3ce6861e5dca2bc0dfa3676c35fca8ba323ad4e039d6100a90600090a250505050565b6000818152600360205260408120546001600160a01b0316806106365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610743565b60028054610d72906125d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9e906125d1565b8015610deb5780601f10610dc057610100808354040283529160200191610deb565b820191906000526020600020905b815481529060010190602001808311610dce57829003601f168201915b505050505081565b60006001600160a01b038216610e5e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610743565b506001600160a01b031660009081526004602052604090205490565b336000908152600e602052604090205460ff16610e9657600080fd5b816000610ea282610cee565b6001600160a01b03161415610eb657600080fd5b600b54839083906001600160a01b03161580610f505750600b546040516309613bc960e41b815260048101849052602481018390526001600160a01b0390911690639613bc909060440160206040518083038186803b158015610f1857600080fd5b505afa158015610f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5091906122ca565b610f5957600080fd5b600060108681548110610f7c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016000015490508460108781548110610fb257634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000181905550857f6b3be417448dc96ebc121bee60a79ea9dad3256d893d5fb7bd93aaf3fe3c3b6f8287604051610a37929190918252602082015260400190565b6007546001600160a01b0316331461101957600080fd5b6001600160a01b0382166000908152600d602052604090205460ff161515811515141561104557600080fd5b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6007546001600160a01b0316331461108757600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146110c057600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461064b906125d1565b6007546001600160a01b0316331461110857600080fd5b6001600160a01b0382166000908152600c602052604090205460ff161515811515141561113457600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6001600160a01b0382163314156111b85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610743565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600c602052604081205460ff1661124057600080fd5b600854839083906001600160a01b031615806112db5750600854604051630e97242160e01b8152600481018490526001600160a01b03838116602483015290911690630e9724219060440160206040518083038186803b1580156112a357600080fd5b505afa1580156112b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112db91906122ca565b6112e457600080fd5b6112ee8585611acf565b95945050505050565b336000908152600f602052604090205460ff1661131357600080fd5b6010818154811061133457634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020160149054906101000a900460ff161515600115151461136357600080fd5b60006010828154811061138657634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020160146101000a81548160ff02191690831515021790555050565b6113bb338361179d565b6113d75760405162461bcd60e51b8152600401610743906124e0565b6113e384848484611c0b565b50505050565b336000908152600c602052604090205460ff1661140557600080fd5b601e8151111561144d5760405162461bcd60e51b81526020600482015260136024820152720caf0c6cacac840c2e4e4c2f240d8cadccee8d606b1b6044820152606401610743565b60005b8151811015610b9d576008546001600160a01b0316158061152e575060085482516001600160a01b0390911690630e972421908490849081106114a357634e487b7160e01b600052603260045260246000fd5b602090810291909101015160115460405160e084901b6001600160e01b031916815260048101929092526001600160a01b0316602482015260440160206040518083038186803b1580156114f657600080fd5b505afa15801561150a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152e91906122ca565b61157a5760405162461bcd60e51b815260206004820152601760248201527f737061776e696e67206973206e6f7420616c6c6f7765640000000000000000006044820152606401610743565b6115b982828151811061159d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516011546001600160a01b0316611acf565b50806115c48161260c565b915050611450565b6000818152600360205260409020546060906001600160a01b031661164b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610743565b6000611655611c3e565b9050600081511161167557604051806020016040528060008152506116a0565b8061167f84611c4d565b60405160200161169092919061240f565b6040516020818303038152906040525b9392505050565b600080808084816116b782610cee565b6001600160a01b031614156116cb57600080fd5b6000601087815481106116ee57634e487b7160e01b600052603260045260246000fd5b600091825260209091206003909102018054600182015460029092015490999198506001600160a01b0381169750600160a01b900460ff1695509350505050565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061176482610cee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166118165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610743565b600061182183610cee565b9050806001600160a01b0316846001600160a01b0316148061185c5750836001600160a01b0316611851846106ce565b6001600160a01b0316145b8061188c57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118a782610cee565b6001600160a01b03161461190f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610743565b6001600160a01b0382166119715760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610743565b61197c60008261172f565b6001600160a01b03831660009081526004602052604081208054600192906119a590849061258e565b90915550506001600160a01b03821660009081526004602052604081208054600192906119d3908490612562565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611a3f82610cee565b9050611a4c60008361172f565b6001600160a01b0381166000908152600460205260408120805460019290611a7590849061258e565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516080810182528381524260208201908152339282019283526001606083018181526010805480840182556000828152955160039091027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67281019190915593517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67385015594517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae674909301805491511515600160a01b026001600160a81b03199092166001600160a01b0394909416939093171790915591549091611bb59161258e565b9050611bc18282611d67565b816001600160a01b0316817f8ab40f177215f047f614dc6a44e252d61de624485b726775463f0f014c584b6185604051611bfd91815260200190565b60405180910390a392915050565b611c16848484611894565b611c2284848484611ea9565b6113e35760405162461bcd60e51b81526004016107439061248e565b60606002805461064b906125d1565b606081611c715750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c9b5780611c858161260c565b9150611c949050600a8361257a565b9150611c75565b60008167ffffffffffffffff811115611cc457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611cee576020820181803683370190505b5090505b841561188c57611d0360018361258e565b9150611d10600a86612627565b611d1b906030612562565b60f81b818381518110611d3e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611d60600a8661257a565b9450611cf2565b6001600160a01b038216611dbd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610743565b6000818152600360205260409020546001600160a01b031615611e225760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610743565b6001600160a01b0382166000908152600460205260408120805460019290611e4b908490612562565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15611fab57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611eed90339089908890889060040161243e565b602060405180830381600087803b158015611f0757600080fd5b505af1925050508015611f37575060408051601f3d908101601f19168201909252611f3491810190612302565b60015b611f91573d808015611f65576040519150601f19603f3d011682016040523d82523d6000602084013e611f6a565b606091505b508051611f895760405162461bcd60e51b81526004016107439061248e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061188c565b506001949350505050565b828054611fc2906125d1565b90600052602060002090601f016020900481019282611fe4576000855561202a565b82601f10611ffd57805160ff191683800117855561202a565b8280016001018555821561202a579182015b8281111561202a57825182559160200191906001019061200f565b5061203692915061203a565b5090565b5b80821115612036576000815560010161203b565b600067ffffffffffffffff83111561206957612069612667565b61207c601f8401601f1916602001612531565b905082815283838301111561209057600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146120be57600080fd5b919050565b6000602082840312156120d4578081fd5b6116a0826120a7565b600080604083850312156120ef578081fd5b6120f8836120a7565b9150612106602084016120a7565b90509250929050565b600080600060608486031215612123578081fd5b61212c846120a7565b925061213a602085016120a7565b9150604084013590509250925092565b6000806000806080858703121561215f578081fd5b612168856120a7565b9350612176602086016120a7565b925060408501359150606085013567ffffffffffffffff811115612198578182fd5b8501601f810187136121a8578182fd5b6121b78782356020840161204f565b91505092959194509250565b600080604083850312156121d5578182fd5b6121de836120a7565b915060208301356121ee8161267d565b809150509250929050565b6000806040838503121561220b578182fd5b612214836120a7565b946020939093013593505050565b60006020808385031215612234578182fd5b823567ffffffffffffffff8082111561224b578384fd5b818501915085601f83011261225e578384fd5b81358181111561227057612270612667565b8060051b9150612281848301612531565b8181528481019084860184860187018a101561229b578788fd5b8795505b838610156122bd57803583526001959095019491860191860161229f565b5098975050505050505050565b6000602082840312156122db578081fd5b81516116a08161267d565b6000602082840312156122f7578081fd5b81356116a08161268e565b600060208284031215612313578081fd5b81516116a08161268e565b60006020828403121561232f578081fd5b813567ffffffffffffffff811115612345578182fd5b8201601f81018413612355578182fd5b61188c8482356020840161204f565b600060208284031215612375578081fd5b5035919050565b6000806040838503121561238e578182fd5b82359150612106602084016120a7565b600080604083850312156123b0578182fd5b8235915060208301356121ee8161267d565b600080604083850312156123d4578182fd5b50508035926020909101359150565b600081518084526123fb8160208601602086016125a5565b601f01601f19169290920160200192915050565b600083516124218184602088016125a5565b8351908301906124358183602088016125a5565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612471908301846123e3565b9695505050505050565b6020815260006116a060208301846123e3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561255a5761255a612667565b604052919050565b600082198211156125755761257561263b565b500190565b60008261258957612589612651565b500490565b6000828210156125a0576125a061263b565b500390565b60005b838110156125c05781810151838201526020016125a8565b838111156113e35750506000910152565b600181811c908216806125e557607f821691505b6020821081141561260657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126205761262061263b565b5060010190565b60008261263657612636612651565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461268b57600080fd5b50565b6001600160e01b03198116811461268b57600080fdfea26469706673582212209197e717927c994dd528566c23d22f67498566caf5fa06333a40e7607b6cb4bf64736f6c63430008040033
Deployed Bytecode Sourcemap
35276:3487:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18954:305;;;;;;:::i;:::-;;:::i;:::-;;;7652:14:1;;7645:22;7627:41;;7615:2;7600:18;18954:305:0;;;;;;;;19899:100;;;:::i;:::-;;;;;;;:::i;21474:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6950:32:1;;;6932:51;;6920:2;6905:18;21474:221:0;6887:102:1;20997:411:0;;;;;;:::i;:::-;;:::i;:::-;;35070:199;;;;;;:::i;:::-;;:::i;37483:352::-;;;;;;:::i;:::-;;:::i;31772:37::-;;;;;-1:-1:-1;;;;;31772:37:0;;;31918:50;;;;;-1:-1:-1;;;;;31918:50:0;;;34124:143;;;;;;:::i;:::-;;:::i;34826:238::-;;;;;;:::i;:::-;;:::i;22364:339::-;;;;;;:::i;:::-;;:::i;22774:185::-;;;;;;:::i;:::-;;:::i;31865:48::-;;;;;-1:-1:-1;;;;;31865:48:0;;;33850:125;;;;;;:::i;:::-;;:::i;36169:97::-;;;;;;:::i;:::-;;:::i;37841:272::-;;;;;;:::i;:::-;;:::i;19593:239::-;;;;;;:::i;:::-;;:::i;18021:21::-;;;:::i;19323:208::-;;;;;;:::i;:::-;;:::i;:::-;;;15316:25:1;;;15304:2;15289:18;19323:208:0;15271:76:1;38119:353:0;;;;;;:::i;:::-;;:::i;31973:36::-;;;;;-1:-1:-1;;;;;31973:36:0;;;34612:208;;;;;;:::i;:::-;;:::i;33981:137::-;;;;;;:::i;:::-;;:::i;34273:125::-;;;;;;:::i;:::-;;:::i;20068:104::-;;;:::i;32072:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31816:44;;;;;-1:-1:-1;;;;;31816:44:0;;;32129:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;34404:202;;;;;;:::i;:::-;;:::i;21767:295::-;;;;;;:::i;:::-;;:::i;36812:214::-;;;;;;:::i;:::-;;:::i;36272:174::-;;;;;;:::i;:::-;;:::i;23030:328::-;;;;;;:::i;:::-;;:::i;37032:445::-;;;;;;:::i;:::-;;:::i;32016:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20243:337;;;;;;:::i;:::-;;:::i;32191:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22133:164;;;;;;:::i;:::-;-1:-1:-1;;;;;22254:25:0;;;22230:4;22254:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22133:164;36452:354;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;16372:25:1;;;16428:2;16413:18;;16406:34;;;;-1:-1:-1;;;;;16476:32:1;16471:2;16456:18;;16449:60;16552:14;16545:22;16540:2;16525:18;;16518:50;16359:3;16344:19;;16326:248;18954:305:0;19056:4;-1:-1:-1;;;;;;19093:40:0;;-1:-1:-1;;;19093:40:0;;:105;;-1:-1:-1;;;;;;;19150:48:0;;-1:-1:-1;;;19150:48:0;19093:105;:158;;;-1:-1:-1;;;;;;;;;;17711:40:0;;;19215:36;19073:178;18954:305;-1:-1:-1;;18954:305:0:o;19899:100::-;19953:13;19986:5;19979:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19899:100;:::o;21474:221::-;21550:7;24957:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24957:16:0;21570:73;;;;-1:-1:-1;;;21570:73:0;;12965:2:1;21570:73:0;;;12947:21:1;13004:2;12984:18;;;12977:30;13043:34;13023:18;;;13016:62;-1:-1:-1;;;13094:18:1;;;13087:42;13146:19;;21570:73:0;;;;;;;;;-1:-1:-1;21663:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;21663:24:0;;21474:221::o;20997:411::-;21078:13;21094:23;21109:7;21094:14;:23::i;:::-;21078:39;;21142:5;-1:-1:-1;;;;;21136:11:0;:2;-1:-1:-1;;;;;21136:11:0;;;21128:57;;;;-1:-1:-1;;;21128:57:0;;14204:2:1;21128:57:0;;;14186:21:1;14243:2;14223:18;;;14216:30;14282:34;14262:18;;;14255:62;-1:-1:-1;;;14333:18:1;;;14326:31;14374:19;;21128:57:0;14176:223:1;21128:57:0;15414:10;-1:-1:-1;;;;;21220:21:0;;;;:62;;-1:-1:-1;21245:37:0;21262:5;15414:10;22133:164;:::i;21245:37::-;21198:168;;;;-1:-1:-1;;;21198:168:0;;11358:2:1;21198:168:0;;;11340:21:1;11397:2;11377:18;;;11370:30;11436:34;11416:18;;;11409:62;11507:26;11487:18;;;11480:54;11551:19;;21198:168:0;11330:246:1;21198:168:0;21379:21;21388:2;21392:7;21379:8;:21::i;:::-;20997:411;;;:::o;35070:199::-;32377:22;;-1:-1:-1;;;;;32377:22:0;32363:10;:36;32355:45;;;;;;-1:-1:-1;;;;;35170:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;:43;;::::0;::::1;;;;35162:52;;;::::0;::::1;;-1:-1:-1::0;;;;;35221:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:42;;-1:-1:-1;;35221:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35070:199::o;37483:352::-;33340:10;33321:30;;;;:18;:30;;;;;;;;33313:39;;;;;;37609:9;18865:1:::1;18836:17;37609:9:::0;18836:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;18836:31:0::1;;;18828:40;;;::::0;::::1;;32725:15:::2;::::0;37644:9;;37655:6;;-1:-1:-1;;;;;32725:15:0::2;32717:38:::0;;:102:::2;;-1:-1:-1::0;32768:15:0::2;::::0;:51:::2;::::0;-1:-1:-1;;;32768:51:0;;::::2;::::0;::::2;16068:25:1::0;;;16109:18;;;16102:34;;;-1:-1:-1;;;;;32768:15:0;;::::2;::::0;:32:::2;::::0;16041:18:1;;32768:51:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32701:125;;;::::0;::::2;;37673:22:::3;37698:6;37705:9;37698:17;;;;;;-1:-1:-1::0;;;37698:17:0::3;;;;;;;;;;::::0;;;::::3;::::0;;;;::::3;::::0;;::::3;;37722:22:::0;;;37768:15:::3;37751:14;::::0;::::3;:32:::0;37795:34:::3;::::0;15316:25:1;;;37698:17:0;;-1:-1:-1;37811:9:0;;37795:34:::3;::::0;15289:18:1;37795:34:0::3;;;;;;;;32833:1;18875::::2;;33359::::1;37483:352:::0;;:::o;34124:143::-;32377:22;;-1:-1:-1;;;;;32377:22:0;32363:10;:36;32355:45;;;;;;34208:17:::1;:53:::0;;-1:-1:-1;;;;;;34208:53:0::1;-1:-1:-1::0;;;;;34208:53:0;;;::::1;::::0;;;::::1;::::0;;34124:143::o;34826:238::-;32377:22;;-1:-1:-1;;;;;32377:22:0;32363:10;:36;32355:45;;;;;;-1:-1:-1;;;;;34939:40:0;::::1;;::::0;;;:24:::1;:40;::::0;;;;;::::1;;:56;;::::0;::::1;;;;34931:65;;;::::0;::::1;;-1:-1:-1::0;;;;;35003:40:0;;;::::1;;::::0;;;:24:::1;:40;::::0;;;;:55;;-1:-1:-1;;35003:55:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34826:238::o;22364:339::-;22559:41;15414:10;22592:7;22559:18;:41::i;:::-;22551:103;;;;-1:-1:-1;;;22551:103:0;;;;;;;:::i;:::-;22667:28;22677:4;22683:2;22687:7;22667:9;:28::i;22774:185::-;22912:39;22929:4;22935:2;22939:7;22912:39;;;;;;;;;;;;:16;:39::i;33850:125::-;32377:22;;-1:-1:-1;;;;;32377:22:0;32363:10;:36;32355:45;;;;;;33934:22:::1;:35:::0;;-1:-1:-1;;;;;;33934:35:0::1;-1:-1:-1::0;;;;;33934:35:0;;;::::1;::::0;;;::::1;::::0;;33850:125::o;36169:97::-;36143:5;;-1:-1:-1;;;;;36143:5:0;36129:10;:19;36121:28;;;;;;36242:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;36169:97:::0;:::o;37841:272::-;33431:10;33411:31;;;;:19;:31;;;;;;;;33403:40;;;;;;32938:17:::1;::::0;37967:9;;37978:4;;-1:-1:-1;;;;;32938:17:0::1;32930:40:::0;;:107:::1;;-1:-1:-1::0;32983:17:0::1;::::0;:54:::1;::::0;-1:-1:-1;;;32983:54:0;;::::1;::::0;::::1;15799:25:1::0;;;15867:14;;15860:22;15840:18;;;15833:50;-1:-1:-1;;;;;32983:17:0;;::::1;::::0;:37:::1;::::0;15772:18:1;;32983:54:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32914:130;;;::::0;::::1;;37994:16:::2;38000:9;37994:5;:16::i;:::-;38023:4;38019:51;;;38045:6;38052:9;38045:17;;;;;;-1:-1:-1::0;;;38045:17:0::2;;;;;;;;;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;38038:24:::0;;;::::2;::::0;::::2;::::0;;;;::::2;;::::0;;-1:-1:-1;;;;;;38038:24:0;;;38019:51:::2;38083:24;::::0;38097:9;;38083:24:::2;::::0;;;::::2;33450:1:::1;;37841:272:::0;;:::o;19593:239::-;19665:7;19701:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19701:16:0;19736:19;19728:73;;;;-1:-1:-1;;;19728:73:0;;12194:2:1;19728:73:0;;;12176:21:1;12233:2;12213:18;;;12206:30;12272:34;12252:18;;;12245:62;-1:-1:-1;;;12323:18:1;;;12316:39;12372:19;;19728:73:0;12166:231:1;18021:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19323:208::-;19395:7;-1:-1:-1;;;;;19423:19:0;;19415:74;;;;-1:-1:-1;;;19415:74:0;;11783:2:1;19415:74:0;;;11765:21:1;11822:2;11802:18;;;11795:30;11861:34;11841:18;;;11834:62;-1:-1:-1;;;11912:18:1;;;11905:40;11962:19;;19415:74:0;11755:232:1;19415:74:0;-1:-1:-1;;;;;;19507:16:0;;;;;:9;:16;;;;;;;19323:208::o;38119:353::-;33532:10;33507:36;;;;:24;:36;;;;;;;;33499:45;;;;;;38253:9;18865:1:::1;18836:17;38253:9:::0;18836:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;18836:31:0::1;;;18828:40;;;::::0;::::1;;33164:11:::2;::::0;38291:9;;38302;;-1:-1:-1;;;;;33164:11:0::2;33156:34:::0;;:100:::2;;-1:-1:-1::0;33203:11:0::2;::::0;:53:::2;::::0;-1:-1:-1;;;33203:53:0;;::::2;::::0;::::2;16068:25:1::0;;;16109:18;;;16102:34;;;-1:-1:-1;;;;;33203:11:0;;::::2;::::0;:31:::2;::::0;16041:18:1;;33203:53:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33140:123;;;::::0;::::2;;38323:17:::3;38343:6;38350:9;38343:17;;;;;;-1:-1:-1::0;;;38343:17:0::3;;;;;;;;;;;;;;;;;;;:23;;;38323:43;;38399:9;38373:6;38380:9;38373:17;;;;;;-1:-1:-1::0;;;38373:17:0::3;;;;;;;;;;;;;;;;;;;:23;;:35;;;;38434:9;38420:46;38445:9;38456;38420:46;;;;;;16068:25:1::0;;;16124:2;16109:18;;16102:34;16056:2;16041:18;;16023:119;34612:208:0;32377:22;;-1:-1:-1;;;;;32377:22:0;32363:10;:36;32355:45;;;;;;-1:-1:-1;;;;;34715:30:0;::::1;;::::0;;;:19:::1;:30;::::0;;;;;::::1;;:46;;::::0;::::1;;;;34707:55;;;::::0;::::1;;-1:-1:-1::0;;;;;34769:30:0;;;::::1;;::::0;;;:19:::1;:30;::::0;;;;:45;;-1:-1:-1;;34769:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34612:208::o;33981:137::-;32377:22;;-1:-1:-1;;;;;32377:22:0;32363:10;:36;32355:45;;;;;;34063:15:::1;:49:::0;;-1:-1:-1;;;;;;34063:49:0::1;-1:-1:-1::0;;;;;34063:49:0;;;::::1;::::0;;;::::1;::::0;;33981:137::o;34273:125::-;32377:22;;-1:-1:-1;;;;;32377:22:0;32363:10;:36;32355:45;;;;;;34351:11:::1;:41:::0;;-1:-1:-1;;;;;;34351:41:0::1;-1:-1:-1::0;;;;;34351:41:0;;;::::1;::::0;;;::::1;::::0;;34273:125::o;20068:104::-;20124:13;20157:7;20150:14;;;;;:::i;34404:202::-;32377:22;;-1:-1:-1;;;;;32377:22:0;32363:10;:36;32355:45;;;;;;-1:-1:-1;;;;;34505:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;::::1;;:44;;::::0;::::1;;;;34497:53;;;::::0;::::1;;-1:-1:-1::0;;;;;34557:28:0;;;::::1;;::::0;;;:18:::1;:28;::::0;;;;:43;;-1:-1:-1;;34557:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34404:202::o;21767:295::-;-1:-1:-1;;;;;21870:24:0;;15414:10;21870:24;;21862:62;;;;-1:-1:-1;;;21862:62:0;;10591:2:1;21862:62:0;;;10573:21:1;10630:2;10610:18;;;10603:30;10669:27;10649:18;;;10642:55;10714:18;;21862:62:0;10563:175:1;21862:62:0;15414:10;21937:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;21937:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;21937:53:0;;;;;;;;;;22006:48;;7627:41:1;;;21937:42:0;;15414:10;22006:48;;7600:18:1;22006:48:0;;;;;;;21767:295;;:::o;36812:214::-;33340:10;36966:7;33321:30;;;:18;:30;;;;;;;;33313:39;;;;;;32512:15:::1;::::0;36936:6;;36944;;-1:-1:-1;;;;;32512:15:0::1;32504:38:::0;;:100:::1;;-1:-1:-1::0;32555:15:0::1;::::0;:49:::1;::::0;-1:-1:-1;;;32555:49:0;;::::1;::::0;::::1;15526:25:1::0;;;-1:-1:-1;;;;;15587:32:1;;;15567:18;;;15560:60;32555:15:0;;::::1;::::0;:33:::1;::::0;15499:18:1;;32555:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32488:123;;;::::0;::::1;;36992:28:::2;37005:6;37013;36992:12;:28::i;:::-;36985:35:::0;36812:214;-1:-1:-1;;;;;36812:214:0:o;36272:174::-;33621:10;33602:30;;;;:18;:30;;;;;;;;33594:39;;;;;;36356:6:::1;36363:9;36356:17;;;;;;-1:-1:-1::0;;;36356:17:0::1;;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;:37;;36389:4;36356:37;;;36348:46;;;::::0;::::1;;36435:5;36403:6;36410:9;36403:17;;;;;;-1:-1:-1::0;;;36403:17:0::1;;;;;;;;;;;;;;;;;;;:29;;;:37;;;;;;;;;;;;;;;;;;36272:174:::0;:::o;23030:328::-;23205:41;15414:10;23238:7;23205:18;:41::i;:::-;23197:103;;;;-1:-1:-1;;;23197:103:0;;;;;;;:::i;:::-;23311:39;23325:4;23331:2;23335:7;23344:5;23311:13;:39::i;:::-;23030:328;;;;:::o;37032:445::-;33340:10;33321:30;;;;:18;:30;;;;;;;;33313:39;;;;;;37162:2:::1;37145:6;:13;:19;;37137:51;;;::::0;-1:-1:-1;;;37137:51:0;;14606:2:1;37137:51:0::1;::::0;::::1;14588:21:1::0;14645:2;14625:18;;;14618:30;-1:-1:-1;;;14664:18:1;;;14657:49;14723:18;;37137:51:0::1;14578:169:1::0;37137:51:0::1;37199:6;37195:277;37210:6;:13;37208:1;:15;37195:277;;;37270:15;::::0;-1:-1:-1;;;;;37270:15:0::1;37262:38:::0;;:106:::1;;-1:-1:-1::0;37317:15:0::1;::::0;37351:9;;-1:-1:-1;;;;;37317:15:0;;::::1;::::0;:33:::1;::::0;37351:6;;37358:1;;37351:9;::::1;;;-1:-1:-1::0;;;37351:9:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;37362:5:::1;::::0;37317:51:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;;37317:51:0;;;::::1;::::0;::::1;15526:25:1::0;;;;-1:-1:-1;;;;;37362:5:0::1;15567:18:1::0;;;15560:60;15499:18;;37317:51:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37240:179;;;::::0;-1:-1:-1;;;37240:179:0;;9477:2:1;37240:179:0::1;::::0;::::1;9459:21:1::0;9516:2;9496:18;;;9489:30;9555:25;9535:18;;;9528:53;9598:18;;37240:179:0::1;9449:173:1::0;37240:179:0::1;37430:30;37443:6;37450:1;37443:9;;;;;;-1:-1:-1::0;;;37443:9:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;37454:5:::1;::::0;-1:-1:-1;;;;;37454:5:0::1;37430:12;:30::i;:::-;-1:-1:-1::0;37224:3:0;::::1;::::0;::::1;:::i;:::-;;;;37195:277;;20243:337:::0;24933:4;24957:16;;;:7;:16;;;;;;20316:13;;-1:-1:-1;;;;;24957:16:0;20342:76;;;;-1:-1:-1;;;20342:76:0;;13788:2:1;20342:76:0;;;13770:21:1;13827:2;13807:18;;;13800:30;13866:34;13846:18;;;13839:62;-1:-1:-1;;;13917:18:1;;;13910:45;13972:19;;20342:76:0;13760:237:1;20342:76:0;20431:22;20456:10;:8;:10::i;:::-;20431:35;;20509:1;20490:8;20484:22;:26;:88;;;;;;;;;;;;;;;;;20537:8;20547:18;:7;:16;:18::i;:::-;20520:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20484:88;20477:95;20243:337;-1:-1:-1;;;20243:337:0:o;36452:354::-;36571:7;;;;36546:9;36571:7;18836:17;36546:9;18836:7;:17::i;:::-;-1:-1:-1;;;;;18836:31:0;;;18828:40;;;;;;36674:22:::1;36699:6;36706:9;36699:17;;;;;;-1:-1:-1::0;;;36699:17:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;36731:13:::0;;36746:14:::1;::::0;::::1;::::0;36762:16:::1;::::0;;::::1;::::0;36731:13;;36746:14;;-1:-1:-1;;;;;;36762:16:0;::::1;::::0;-1:-1:-1;;;;36780:19:0;::::1;;;::::0;-1:-1:-1;36452:354:0;-1:-1:-1;;;;36452:354:0:o;28850:174::-;28925:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;28925:29:0;-1:-1:-1;;;;;28925:29:0;;;;;;;;:24;;28979:23;28925:24;28979:14;:23::i;:::-;-1:-1:-1;;;;;28970:46:0;;;;;;;;;;;28850:174;;:::o;25162:348::-;25255:4;24957:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24957:16:0;25272:73;;;;-1:-1:-1;;;25272:73:0;;10945:2:1;25272:73:0;;;10927:21:1;10984:2;10964:18;;;10957:30;11023:34;11003:18;;;10996:62;-1:-1:-1;;;11074:18:1;;;11067:42;11126:19;;25272:73:0;10917:234:1;25272:73:0;25356:13;25372:23;25387:7;25372:14;:23::i;:::-;25356:39;;25425:5;-1:-1:-1;;;;;25414:16:0;:7;-1:-1:-1;;;;;25414:16:0;;:51;;;;25458:7;-1:-1:-1;;;;;25434:31:0;:20;25446:7;25434:11;:20::i;:::-;-1:-1:-1;;;;;25434:31:0;;25414:51;:87;;;-1:-1:-1;;;;;;22254:25:0;;;22230:4;22254:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;25469:32;25406:96;25162:348;-1:-1:-1;;;;25162:348:0:o;28154:578::-;28313:4;-1:-1:-1;;;;;28286:31:0;:23;28301:7;28286:14;:23::i;:::-;-1:-1:-1;;;;;28286:31:0;;28278:85;;;;-1:-1:-1;;;28278:85:0;;13378:2:1;28278:85:0;;;13360:21:1;13417:2;13397:18;;;13390:30;13456:34;13436:18;;;13429:62;-1:-1:-1;;;13507:18:1;;;13500:39;13556:19;;28278:85:0;13350:231:1;28278:85:0;-1:-1:-1;;;;;28382:16:0;;28374:65;;;;-1:-1:-1;;;28374:65:0;;10186:2:1;28374:65:0;;;10168:21:1;10225:2;10205:18;;;10198:30;10264:34;10244:18;;;10237:62;-1:-1:-1;;;10315:18:1;;;10308:34;10359:19;;28374:65:0;10158:226:1;28374:65:0;28556:29;28573:1;28577:7;28556:8;:29::i;:::-;-1:-1:-1;;;;;28598:15:0;;;;;;:9;:15;;;;;:20;;28617:1;;28598:15;:20;;28617:1;;28598:20;:::i;:::-;;;;-1:-1:-1;;;;;;;28629:13:0;;;;;;:9;:13;;;;;:18;;28646:1;;28629:13;:18;;28646:1;;28629:18;:::i;:::-;;;;-1:-1:-1;;28658:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28658:21:0;-1:-1:-1;;;;;28658:21:0;;;;;;;;;28697:27;;28658:16;;28697:27;;;;;;;28154:578;;;:::o;27457:360::-;27517:13;27533:23;27548:7;27533:14;:23::i;:::-;27517:39;;27658:29;27675:1;27679:7;27658:8;:29::i;:::-;-1:-1:-1;;;;;27700:16:0;;;;;;:9;:16;;;;;:21;;27720:1;;27700:16;:21;;27720:1;;27700:21;:::i;:::-;;;;-1:-1:-1;;27739:16:0;;;;:7;:16;;;;;;27732:23;;-1:-1:-1;;;;;;27732:23:0;;;27773:36;27747:7;;27739:16;-1:-1:-1;;;;;27773:36:0;;;;;27739:16;;27773:36;27457:360;;:::o;38478:282::-;38587:49;;;;;;;;;;;38602:15;38587:49;;;;;;38619:10;38587:49;;;;;;38631:4;38587:49;;;;;;38575:6;:62;;;;;;;38549:17;38575:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38575:62:0;-1:-1:-1;;;;;;38575:62:0;;;-1:-1:-1;;;;;38575:62:0;;;;;;;;;;;;38656:13;;38549:17;;38656:15;;;:::i;:::-;38644:27;;38678:24;38684:6;38692:9;38678:5;:24::i;:::-;38739:6;-1:-1:-1;;;;;38714:40:0;38728:9;38714:40;38747:6;38714:40;;;;15316:25:1;;15304:2;15289:18;;15271:76;38714:40:0;;;;;;;;38478:282;;;;:::o;24240:315::-;24397:28;24407:4;24413:2;24417:7;24397:9;:28::i;:::-;24444:48;24467:4;24473:2;24477:7;24486:5;24444:22;:48::i;:::-;24436:111;;;;-1:-1:-1;;;24436:111:0;;;;;;;:::i;20836:99::-;20887:13;20920:7;20913:14;;;;;:::i;15736:723::-;15792:13;16013:10;16009:53;;-1:-1:-1;;16040:10:0;;;;;;;;;;;;-1:-1:-1;;;16040:10:0;;;;;15736:723::o;16009:53::-;16087:5;16072:12;16128:78;16135:9;;16128:78;;16161:8;;;;:::i;:::-;;-1:-1:-1;16184:10:0;;-1:-1:-1;16192:2:0;16184:10;;:::i;:::-;;;16128:78;;;16216:19;16248:6;16238:17;;;;;;-1:-1:-1;;;16238:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16238:17:0;;16216:39;;16266:154;16273:10;;16266:154;;16300:11;16310:1;16300:11;;:::i;:::-;;-1:-1:-1;16369:10:0;16377:2;16369:5;:10;:::i;:::-;16356:24;;:2;:24;:::i;:::-;16343:39;;16326:6;16333;16326:14;;;;;;-1:-1:-1;;;16326:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;16326:56:0;;;;;;;;-1:-1:-1;16397:11:0;16406:2;16397:11;;:::i;:::-;;;16266:154;;26846:382;-1:-1:-1;;;;;26926:16:0;;26918:61;;;;-1:-1:-1;;;26918:61:0;;12604:2:1;26918:61:0;;;12586:21:1;;;12623:18;;;12616:30;12682:34;12662:18;;;12655:62;12734:18;;26918:61:0;12576:182:1;26918:61:0;24933:4;24957:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24957:16:0;:30;26990:58;;;;-1:-1:-1;;;26990:58:0;;9829:2:1;26990:58:0;;;9811:21:1;9868:2;9848:18;;;9841:30;9907;9887:18;;;9880:58;9955:18;;26990:58:0;9801:178:1;26990:58:0;-1:-1:-1;;;;;27119:13:0;;;;;;:9;:13;;;;;:18;;27136:1;;27119:13;:18;;27136:1;;27119:18;:::i;:::-;;;;-1:-1:-1;;27148:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27148:21:0;-1:-1:-1;;;;;27148:21:0;;;;;;;;27187:33;;27148:16;;;27187:33;;27148:16;;27187:33;26846:382;;:::o;29589:799::-;29744:4;-1:-1:-1;;;;;29765:13:0;;8293:20;8341:8;29761:620;;29801:72;;-1:-1:-1;;;29801:72:0;;-1:-1:-1;;;;;29801:36:0;;;;;:72;;15414:10;;29852:4;;29858:7;;29867:5;;29801:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29801:72:0;;;;;;;;-1:-1:-1;;29801:72:0;;;;;;;;;;;;:::i;:::-;;;29797:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30043:13:0;;30039:272;;30086:60;;-1:-1:-1;;;30086:60:0;;;;;;;:::i;30039:272::-;30261:6;30255:13;30246:6;30242:2;30238:15;30231:38;29797:529;-1:-1:-1;;;;;;29924:51:0;-1:-1:-1;;;29924:51:0;;-1:-1:-1;29917:58:0;;29761:620;-1:-1:-1;30365:4:0;29589:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;522:2;474:124;;;:::o;603:196::-;662:6;715:2;703:9;694:7;690:23;686:32;683:2;;;736:6;728;721:22;683:2;764:29;783:9;764:29;:::i;804:270::-;872:6;880;933:2;921:9;912:7;908:23;904:32;901:2;;;954:6;946;939:22;901:2;982:29;1001:9;982:29;:::i;:::-;972:39;;1030:38;1064:2;1053:9;1049:18;1030:38;:::i;:::-;1020:48;;891:183;;;;;:::o;1079:338::-;1156:6;1164;1172;1225:2;1213:9;1204:7;1200:23;1196:32;1193:2;;;1246:6;1238;1231:22;1193:2;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1407:2;1396:9;1392:18;1379:32;1369:42;;1183:234;;;;;:::o;1422:696::-;1517:6;1525;1533;1541;1594:3;1582:9;1573:7;1569:23;1565:33;1562:2;;;1616:6;1608;1601:22;1562:2;1644:29;1663:9;1644:29;:::i;:::-;1634:39;;1692:38;1726:2;1715:9;1711:18;1692:38;:::i;:::-;1682:48;;1777:2;1766:9;1762:18;1749:32;1739:42;;1832:2;1821:9;1817:18;1804:32;1859:18;1851:6;1848:30;1845:2;;;1896:6;1888;1881:22;1845:2;1924:22;;1977:4;1969:13;;1965:27;-1:-1:-1;1955:2:1;;2011:6;2003;1996:22;1955:2;2039:73;2104:7;2099:2;2086:16;2081:2;2077;2073:11;2039:73;:::i;:::-;2029:83;;;1552:566;;;;;;;:::o;2123:325::-;2188:6;2196;2249:2;2237:9;2228:7;2224:23;2220:32;2217:2;;;2270:6;2262;2255:22;2217:2;2298:29;2317:9;2298:29;:::i;:::-;2288:39;;2377:2;2366:9;2362:18;2349:32;2390:28;2412:5;2390:28;:::i;:::-;2437:5;2427:15;;;2207:241;;;;;:::o;2453:264::-;2521:6;2529;2582:2;2570:9;2561:7;2557:23;2553:32;2550:2;;;2603:6;2595;2588:22;2550:2;2631:29;2650:9;2631:29;:::i;:::-;2621:39;2707:2;2692:18;;;;2679:32;;-1:-1:-1;;;2540:177:1:o;2722:1002::-;2806:6;2837:2;2880;2868:9;2859:7;2855:23;2851:32;2848:2;;;2901:6;2893;2886:22;2848:2;2946:9;2933:23;2975:18;3016:2;3008:6;3005:14;3002:2;;;3037:6;3029;3022:22;3002:2;3080:6;3069:9;3065:22;3055:32;;3125:7;3118:4;3114:2;3110:13;3106:27;3096:2;;3152:6;3144;3137:22;3096:2;3193;3180:16;3215:2;3211;3208:10;3205:2;;;3221:18;;:::i;:::-;3267:2;3264:1;3260:10;3250:20;;3290:28;3314:2;3310;3306:11;3290:28;:::i;:::-;3352:15;;;3383:12;;;;3415:11;;;3445;;;3441:20;;3438:33;-1:-1:-1;3435:2:1;;;3489:6;3481;3474:22;3435:2;3516:6;3507:15;;3531:163;3545:2;3542:1;3539:9;3531:163;;;3602:17;;3590:30;;3563:1;3556:9;;;;;3640:12;;;;3672;;3531:163;;;-1:-1:-1;3713:5:1;2817:907;-1:-1:-1;;;;;;;;2817:907:1:o;3729:255::-;3796:6;3849:2;3837:9;3828:7;3824:23;3820:32;3817:2;;;3870:6;3862;3855:22;3817:2;3907:9;3901:16;3926:28;3948:5;3926:28;:::i;3989:255::-;4047:6;4100:2;4088:9;4079:7;4075:23;4071:32;4068:2;;;4121:6;4113;4106:22;4068:2;4165:9;4152:23;4184:30;4208:5;4184:30;:::i;4249:259::-;4318:6;4371:2;4359:9;4350:7;4346:23;4342:32;4339:2;;;4392:6;4384;4377:22;4339:2;4429:9;4423:16;4448:30;4472:5;4448:30;:::i;4513:480::-;4582:6;4635:2;4623:9;4614:7;4610:23;4606:32;4603:2;;;4656:6;4648;4641:22;4603:2;4701:9;4688:23;4734:18;4726:6;4723:30;4720:2;;;4771:6;4763;4756:22;4720:2;4799:22;;4852:4;4844:13;;4840:27;-1:-1:-1;4830:2:1;;4886:6;4878;4871:22;4830:2;4914:73;4979:7;4974:2;4961:16;4956:2;4952;4948:11;4914:73;:::i;4998:190::-;5057:6;5110:2;5098:9;5089:7;5085:23;5081:32;5078:2;;;5131:6;5123;5116:22;5078:2;-1:-1:-1;5159:23:1;;5068:120;-1:-1:-1;5068:120:1:o;5193:264::-;5261:6;5269;5322:2;5310:9;5301:7;5297:23;5293:32;5290:2;;;5343:6;5335;5328:22;5290:2;5384:9;5371:23;5361:33;;5413:38;5447:2;5436:9;5432:18;5413:38;:::i;5462:319::-;5527:6;5535;5588:2;5576:9;5567:7;5563:23;5559:32;5556:2;;;5609:6;5601;5594:22;5556:2;5650:9;5637:23;5627:33;;5710:2;5699:9;5695:18;5682:32;5723:28;5745:5;5723:28;:::i;5786:258::-;5854:6;5862;5915:2;5903:9;5894:7;5890:23;5886:32;5883:2;;;5936:6;5928;5921:22;5883:2;-1:-1:-1;;5964:23:1;;;6034:2;6019:18;;;6006:32;;-1:-1:-1;5873:171:1:o;6049:257::-;6090:3;6128:5;6122:12;6155:6;6150:3;6143:19;6171:63;6227:6;6220:4;6215:3;6211:14;6204:4;6197:5;6193:16;6171:63;:::i;:::-;6288:2;6267:15;-1:-1:-1;;6263:29:1;6254:39;;;;6295:4;6250:50;;6098:208;-1:-1:-1;;6098:208:1:o;6311:470::-;6490:3;6528:6;6522:13;6544:53;6590:6;6585:3;6578:4;6570:6;6566:17;6544:53;:::i;:::-;6660:13;;6619:16;;;;6682:57;6660:13;6619:16;6716:4;6704:17;;6682:57;:::i;:::-;6755:20;;6498:283;-1:-1:-1;;;;6498:283:1:o;6994:488::-;-1:-1:-1;;;;;7263:15:1;;;7245:34;;7315:15;;7310:2;7295:18;;7288:43;7362:2;7347:18;;7340:34;;;7410:3;7405:2;7390:18;;7383:31;;;7188:4;;7431:45;;7456:19;;7448:6;7431:45;:::i;:::-;7423:53;7197:285;-1:-1:-1;;;;;;7197:285:1:o;8632:219::-;8781:2;8770:9;8763:21;8744:4;8801:44;8841:2;8830:9;8826:18;8818:6;8801:44;:::i;8856:414::-;9058:2;9040:21;;;9097:2;9077:18;;;9070:30;9136:34;9131:2;9116:18;;9109:62;-1:-1:-1;;;9202:2:1;9187:18;;9180:48;9260:3;9245:19;;9030:240::o;14752:413::-;14954:2;14936:21;;;14993:2;14973:18;;;14966:30;15032:34;15027:2;15012:18;;15005:62;-1:-1:-1;;;15098:2:1;15083:18;;15076:47;15155:3;15140:19;;14926:239::o;16579:275::-;16650:2;16644:9;16715:2;16696:13;;-1:-1:-1;;16692:27:1;16680:40;;16750:18;16735:34;;16771:22;;;16732:62;16729:2;;;16797:18;;:::i;:::-;16833:2;16826:22;16624:230;;-1:-1:-1;16624:230:1:o;16859:128::-;16899:3;16930:1;16926:6;16923:1;16920:13;16917:2;;;16936:18;;:::i;:::-;-1:-1:-1;16972:9:1;;16907:80::o;16992:120::-;17032:1;17058;17048:2;;17063:18;;:::i;:::-;-1:-1:-1;17097:9:1;;17038:74::o;17117:125::-;17157:4;17185:1;17182;17179:8;17176:2;;;17190:18;;:::i;:::-;-1:-1:-1;17227:9:1;;17166:76::o;17247:258::-;17319:1;17329:113;17343:6;17340:1;17337:13;17329:113;;;17419:11;;;17413:18;17400:11;;;17393:39;17365:2;17358:10;17329:113;;;17460:6;17457:1;17454:13;17451:2;;;-1:-1:-1;;17495:1:1;17477:16;;17470:27;17300:205::o;17510:380::-;17589:1;17585:12;;;;17632;;;17653:2;;17707:4;17699:6;17695:17;17685:27;;17653:2;17760;17752:6;17749:14;17729:18;17726:38;17723:2;;;17806:10;17801:3;17797:20;17794:1;17787:31;17841:4;17838:1;17831:15;17869:4;17866:1;17859:15;17723:2;;17565:325;;;:::o;17895:135::-;17934:3;-1:-1:-1;;17955:17:1;;17952:2;;;17975:18;;:::i;:::-;-1:-1:-1;18022:1:1;18011:13;;17942:88::o;18035:112::-;18067:1;18093;18083:2;;18098:18;;:::i;:::-;-1:-1:-1;18132:9:1;;18073:74::o;18152:127::-;18213:10;18208:3;18204:20;18201:1;18194:31;18244:4;18241:1;18234:15;18268:4;18265:1;18258:15;18284:127;18345:10;18340:3;18336:20;18333:1;18326:31;18376:4;18373:1;18366:15;18400:4;18397:1;18390:15;18416:127;18477:10;18472:3;18468:20;18465:1;18458:31;18508:4;18505:1;18498:15;18532:4;18529:1;18522:15;18548:118;18634:5;18627:13;18620:21;18613:5;18610:32;18600:2;;18656:1;18653;18646:12;18600:2;18590:76;:::o;18671:131::-;-1:-1:-1;;;;;;18745:32:1;;18735:43;;18725:2;;18792:1;18789;18782:12
Swarm Source
ipfs://9197e717927c994dd528566c23d22f67498566caf5fa06333a40e7607b6cb4bf
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.