ERC-721
NFT
Overview
Max Total Supply
2,829 HSI
Holders
1,045
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 HSILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
HEXStakeInstanceManager
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-20 */ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.9; /* This contract is a subsidiary of the Hedron contract. The Hedron * * contract can be found at 0x3819f64f282bf135d62168C1e513280dAF905e06. */ /* Hedron is a collection of Ethereum / PulseChain smart contracts that * * build upon the HEX smart contract to provide additional functionality */ /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ 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; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ 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); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ 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); } /** * @dev Collection of functions related to the address type */ 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); } } } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev String operations. */ 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); } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ 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; // 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_) { _name = name_; _symbol = symbol_; } /** * @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 ""; } /** * @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 { _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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 {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } } interface IHEX { event Approval( address indexed owner, address indexed spender, uint256 value ); event Claim( uint256 data0, uint256 data1, bytes20 indexed btcAddr, address indexed claimToAddr, address indexed referrerAddr ); event ClaimAssist( uint256 data0, uint256 data1, uint256 data2, address indexed senderAddr ); event DailyDataUpdate(uint256 data0, address indexed updaterAddr); event ShareRateChange(uint256 data0, uint40 indexed stakeId); event StakeEnd( uint256 data0, uint256 data1, address indexed stakerAddr, uint40 indexed stakeId ); event StakeGoodAccounting( uint256 data0, uint256 data1, address indexed stakerAddr, uint40 indexed stakeId, address indexed senderAddr ); event StakeStart( uint256 data0, address indexed stakerAddr, uint40 indexed stakeId ); event Transfer(address indexed from, address indexed to, uint256 value); event XfLobbyEnter( uint256 data0, address indexed memberAddr, uint256 indexed entryId, address indexed referrerAddr ); event XfLobbyExit( uint256 data0, address indexed memberAddr, uint256 indexed entryId, address indexed referrerAddr ); fallback() external payable; function allocatedSupply() external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function balanceOf(address account) external view returns (uint256); function btcAddressClaim( uint256 rawSatoshis, bytes32[] memory proof, address claimToAddr, bytes32 pubKeyX, bytes32 pubKeyY, uint8 claimFlags, uint8 v, bytes32 r, bytes32 s, uint256 autoStakeDays, address referrerAddr ) external returns (uint256); function btcAddressClaims(bytes20) external view returns (bool); function btcAddressIsClaimable( bytes20 btcAddr, uint256 rawSatoshis, bytes32[] memory proof ) external view returns (bool); function btcAddressIsValid( bytes20 btcAddr, uint256 rawSatoshis, bytes32[] memory proof ) external pure returns (bool); function claimMessageMatchesSignature( address claimToAddr, bytes32 claimParamHash, bytes32 pubKeyX, bytes32 pubKeyY, uint8 claimFlags, uint8 v, bytes32 r, bytes32 s ) external pure returns (bool); function currentDay() external view returns (uint256); function dailyData(uint256) external view returns ( uint72 dayPayoutTotal, uint72 dayStakeSharesTotal, uint56 dayUnclaimedSatoshisTotal ); function dailyDataRange(uint256 beginDay, uint256 endDay) external view returns (uint256[] memory list); function dailyDataUpdate(uint256 beforeDay) external; function decimals() external view returns (uint8); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); function globalInfo() external view returns (uint256[13] memory); function globals() external view returns ( uint72 lockedHeartsTotal, uint72 nextStakeSharesTotal, uint40 shareRate, uint72 stakePenaltyTotal, uint16 dailyDataCount, uint72 stakeSharesTotal, uint40 latestStakeId, uint128 claimStats ); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function merkleProofIsValid(bytes32 merkleLeaf, bytes32[] memory proof) external pure returns (bool); function name() external view returns (string memory); function pubKeyToBtcAddress( bytes32 pubKeyX, bytes32 pubKeyY, uint8 claimFlags ) external pure returns (bytes20); function pubKeyToEthAddress(bytes32 pubKeyX, bytes32 pubKeyY) external pure returns (address); function stakeCount(address stakerAddr) external view returns (uint256); function stakeEnd(uint256 stakeIndex, uint40 stakeIdParam) external; function stakeGoodAccounting( address stakerAddr, uint256 stakeIndex, uint40 stakeIdParam ) external; function stakeLists(address, uint256) external view returns ( uint40 stakeId, uint72 stakedHearts, uint72 stakeShares, uint16 lockedDay, uint16 stakedDays, uint16 unlockedDay, bool isAutoStake ); function stakeStart(uint256 newStakedHearts, uint256 newStakedDays) external; function symbol() external view returns (string memory); function totalSupply() external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function xfLobby(uint256) external view returns (uint256); function xfLobbyEnter(address referrerAddr) external payable; function xfLobbyEntry(address memberAddr, uint256 entryId) external view returns (uint256 rawAmount, address referrerAddr); function xfLobbyExit(uint256 enterDay, uint256 count) external; function xfLobbyFlush() external; function xfLobbyMembers(uint256, address) external view returns (uint40 headIndex, uint40 tailIndex); function xfLobbyPendingDays(address memberAddr) external view returns (uint256[2] memory words); function xfLobbyRange(uint256 beginDay, uint256 endDay) external view returns (uint256[] memory list); } struct HEXDailyData { uint72 dayPayoutTotal; uint72 dayStakeSharesTotal; uint56 dayUnclaimedSatoshisTotal; } struct HEXGlobals { uint72 lockedHeartsTotal; uint72 nextStakeSharesTotal; uint40 shareRate; uint72 stakePenaltyTotal; uint16 dailyDataCount; uint72 stakeSharesTotal; uint40 latestStakeId; uint128 claimStats; } struct HEXStake { uint40 stakeId; uint72 stakedHearts; uint72 stakeShares; uint16 lockedDay; uint16 stakedDays; uint16 unlockedDay; bool isAutoStake; } struct HEXStakeMinimal { uint40 stakeId; uint72 stakeShares; uint16 lockedDay; uint16 stakedDays; } struct ShareStore { HEXStakeMinimal stake; uint16 mintedDays; uint8 launchBonus; uint16 loanStart; uint16 loanedDays; uint32 interestRate; uint8 paymentsMade; bool isLoaned; } struct ShareCache { HEXStakeMinimal _stake; uint256 _mintedDays; uint256 _launchBonus; uint256 _loanStart; uint256 _loanedDays; uint256 _interestRate; uint256 _paymentsMade; bool _isLoaned; } address constant _hdrnSourceAddress = address(0x9d73Ced2e36C89E5d167151809eeE218a189f801); address constant _hdrnFlowAddress = address(0xF447BE386164dADfB5d1e7622613f289F17024D8); uint256 constant _hdrnLaunch = 1645833600; contract HEXStakeInstance { IHEX private _hx; address private _creator; ShareStore public share; /** * @dev Updates the HSI's internal HEX stake data. */ function _stakeDataUpdate( ) internal { uint40 stakeId; uint72 stakedHearts; uint72 stakeShares; uint16 lockedDay; uint16 stakedDays; uint16 unlockedDay; bool isAutoStake; (stakeId, stakedHearts, stakeShares, lockedDay, stakedDays, unlockedDay, isAutoStake ) = _hx.stakeLists(address(this), 0); share.stake.stakeId = stakeId; share.stake.stakeShares = stakeShares; share.stake.lockedDay = lockedDay; share.stake.stakedDays = stakedDays; } function initialize( address hexAddress ) external { require(_creator == address(0), "HSI: Initialization already performed"); /* _creator is not an admin key. It is set at contsruction to be a link to the parent contract. In this case HSIM */ _creator = msg.sender; // set HEX contract address _hx = IHEX(payable(hexAddress)); } /** * @dev Creates a new HEX stake using all HEX ERC20 tokens assigned * to the HSI's contract address. This is a privileged operation only * HEXStakeInstanceManager.sol can call. * @param stakeLength Number of days the HEX ERC20 tokens will be staked. */ function create( uint256 stakeLength ) external { uint256 hexBalance = _hx.balanceOf(address(this)); require(msg.sender == _creator, "HSI: Caller must be contract creator"); require(share.stake.stakedDays == 0, "HSI: Creation already performed"); require(hexBalance > 0, "HSI: Creation requires a non-zero HEX balance"); _hx.stakeStart( hexBalance, stakeLength ); _stakeDataUpdate(); } /** * @dev Calls the HEX function "stakeGoodAccounting" against the * HEX stake held within the HSI. */ function goodAccounting( ) external { require(share.stake.stakedDays > 0, "HSI: Creation not yet performed"); _hx.stakeGoodAccounting(address(this), 0, share.stake.stakeId); _stakeDataUpdate(); } /** * @dev Ends the HEX stake, approves the "_creator" address to transfer * all HEX ERC20 tokens, and self-destructs the HSI. This is a * privileged operation only HEXStakeInstanceManager.sol can call. */ function destroy( ) external { require(msg.sender == _creator, "HSI: Caller must be contract creator"); require(share.stake.stakedDays > 0, "HSI: Creation not yet performed"); _hx.stakeEnd(0, share.stake.stakeId); uint256 hexBalance = _hx.balanceOf(address(this)); if (_hx.approve(_creator, hexBalance)) { selfdestruct(payable(_creator)); } else { revert(); } } /** * @dev Updates the HSI's internal share data. This is a privileged * operation only HEXStakeInstanceManager.sol can call. * @param _share "ShareCache" object containing updated share data. */ function update( ShareCache memory _share ) external { require(msg.sender == _creator, "HSI: Caller must be contract creator"); share.mintedDays = uint16(_share._mintedDays); share.launchBonus = uint8 (_share._launchBonus); share.loanStart = uint16(_share._loanStart); share.loanedDays = uint16(_share._loanedDays); share.interestRate = uint32(_share._interestRate); share.paymentsMade = uint8 (_share._paymentsMade); share.isLoaned = _share._isLoaned; } /** * @dev Fetches stake data from the HEX contract. * @return A "HEXStake" object containg the HEX stake data. */ function stakeDataFetch( ) external view returns(HEXStake memory) { uint40 stakeId; uint72 stakedHearts; uint72 stakeShares; uint16 lockedDay; uint16 stakedDays; uint16 unlockedDay; bool isAutoStake; (stakeId, stakedHearts, stakeShares, lockedDay, stakedDays, unlockedDay, isAutoStake ) = _hx.stakeLists(address(this), 0); return HEXStake( stakeId, stakedHearts, stakeShares, lockedDay, stakedDays, unlockedDay, isAutoStake ); } } interface IHedron { event Approval( address indexed owner, address indexed spender, uint256 value ); event Claim(uint256 data, address indexed claimant, uint40 indexed stakeId); event LoanEnd( uint256 data, address indexed borrower, uint40 indexed stakeId ); event LoanLiquidateBid( uint256 data, address indexed bidder, uint40 indexed stakeId, uint40 indexed liquidationId ); event LoanLiquidateExit( uint256 data, address indexed liquidator, uint40 indexed stakeId, uint40 indexed liquidationId ); event LoanLiquidateStart( uint256 data, address indexed borrower, uint40 indexed stakeId, uint40 indexed liquidationId ); event LoanPayment( uint256 data, address indexed borrower, uint40 indexed stakeId ); event LoanStart( uint256 data, address indexed borrower, uint40 indexed stakeId ); event Mint(uint256 data, address indexed minter, uint40 indexed stakeId); event Transfer(address indexed from, address indexed to, uint256 value); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function balanceOf(address account) external view returns (uint256); function calcLoanPayment( address borrower, uint256 hsiIndex, address hsiAddress ) external view returns (uint256, uint256); function calcLoanPayoff( address borrower, uint256 hsiIndex, address hsiAddress ) external view returns (uint256, uint256); function claimInstanced( uint256 hsiIndex, address hsiAddress, address hsiStarterAddress ) external; function claimNative(uint256 stakeIndex, uint40 stakeId) external returns (uint256); function currentDay() external view returns (uint256); function dailyDataList(uint256) external view returns ( uint72 dayMintedTotal, uint72 dayLoanedTotal, uint72 dayBurntTotal, uint32 dayInterestRate, uint8 dayMintMultiplier ); function decimals() external view returns (uint8); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); function hsim() external view returns (address); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function liquidationList(uint256) external view returns ( uint256 liquidationStart, address hsiAddress, uint96 bidAmount, address liquidator, uint88 endOffset, bool isActive ); function loanInstanced(uint256 hsiIndex, address hsiAddress) external returns (uint256); function loanLiquidate( address owner, uint256 hsiIndex, address hsiAddress ) external returns (uint256); function loanLiquidateBid(uint256 liquidationId, uint256 liquidationBid) external returns (uint256); function loanLiquidateExit(uint256 hsiIndex, uint256 liquidationId) external returns (address); function loanPayment(uint256 hsiIndex, address hsiAddress) external returns (uint256); function loanPayoff(uint256 hsiIndex, address hsiAddress) external returns (uint256); function loanedSupply() external view returns (uint256); function mintInstanced(uint256 hsiIndex, address hsiAddress) external returns (uint256); function mintNative(uint256 stakeIndex, uint40 stakeId) external returns (uint256); function name() external view returns (string memory); function proofOfBenevolence(uint256 amount) external; function shareList(uint256) external view returns ( HEXStakeMinimal memory stake, uint16 mintedDays, uint8 launchBonus, uint16 loanStart, uint16 loanedDays, uint32 interestRate, uint8 paymentsMade, bool isLoaned ); function symbol() external view returns (string memory); function totalSupply() external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } library LibPart { bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)"); struct Part { address payable account; uint96 value; } function hash(Part memory part) internal pure returns (bytes32) { return keccak256(abi.encode(TYPE_HASH, part.account, part.value)); } } abstract contract AbstractRoyalties { mapping (uint256 => LibPart.Part[]) internal royalties; function _saveRoyalties(uint256 id, LibPart.Part[] memory _royalties) internal { uint256 totalValue; for (uint i = 0; i < _royalties.length; i++) { require(_royalties[i].account != address(0x0), "Recipient should be present"); require(_royalties[i].value != 0, "Royalty value should be positive"); totalValue += _royalties[i].value; royalties[id].push(_royalties[i]); } require(totalValue < 10000, "Royalty total value should be < 10000"); _onRoyaltiesSet(id, _royalties); } function _updateAccount(uint256 _id, address _from, address _to) internal { uint length = royalties[_id].length; for(uint i = 0; i < length; i++) { if (royalties[_id][i].account == _from) { royalties[_id][i].account = payable(address(uint160(_to))); } } } function _onRoyaltiesSet(uint256 id, LibPart.Part[] memory _royalties) virtual internal; } interface RoyaltiesV2 { event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties); function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory); } contract RoyaltiesV2Impl is AbstractRoyalties, RoyaltiesV2 { function getRaribleV2Royalties(uint256 id) override external view returns (LibPart.Part[] memory) { return royalties[id]; } function _onRoyaltiesSet(uint256 id, LibPart.Part[] memory _royalties) override internal { emit RoyaltiesSet(id, _royalties); } } library LibRoyaltiesV2 { /* * bytes4(keccak256('getRaribleV2Royalties(uint256)')) == 0xcad96cca */ bytes4 constant _INTERFACE_ID_ROYALTIES = 0xcad96cca; } contract HEXStakeInstanceManager is ERC721, ERC721Enumerable, RoyaltiesV2Impl { using Counters for Counters.Counter; bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; uint96 private constant _hsimRoyaltyBasis = 15; // Rarible V2 royalty basis string private constant _hostname = "https://api.hedron.pro/"; string private constant _endpoint = "/hsi/"; Counters.Counter private _tokenIds; address private _creator; IHEX private _hx; address private _hxAddress; address private _hsiImplementation; mapping(address => address[]) public hsiLists; mapping(uint256 => address) public hsiToken; constructor( address hexAddress ) ERC721("HEX Stake Instance", "HSI") { /* _creator is not an admin key. It is set at contsruction to be a link to the parent contract. In this case Hedron */ _creator = msg.sender; // set HEX contract address _hx = IHEX(payable(hexAddress)); _hxAddress = hexAddress; // create HSI implementation _hsiImplementation = address(new HEXStakeInstance()); // initialize the HSI just in case HEXStakeInstance hsi = HEXStakeInstance(_hsiImplementation); hsi.initialize(hexAddress); } function _baseURI( ) internal view virtual override returns (string memory) { string memory chainid = Strings.toString(block.chainid); return string(abi.encodePacked(_hostname, chainid, _endpoint)); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } event HSIStart( uint256 timestamp, address indexed hsiAddress, address indexed staker ); event HSIEnd( uint256 timestamp, address indexed hsiAddress, address indexed staker ); event HSITransfer( uint256 timestamp, address indexed hsiAddress, address indexed oldStaker, address indexed newStaker ); event HSITokenize( uint256 timestamp, uint256 indexed hsiTokenId, address indexed hsiAddress, address indexed staker ); event HSIDetokenize( uint256 timestamp, uint256 indexed hsiTokenId, address indexed hsiAddress, address indexed staker ); /** * @dev Removes a HEX stake instance (HSI) contract address from an address mapping. * @param hsiList A mapped list of HSI contract addresses. * @param hsiIndex The index of the HSI contract address which will be removed. */ function _pruneHSI( address[] storage hsiList, uint256 hsiIndex ) internal { uint256 lastIndex = hsiList.length - 1; if (hsiIndex != lastIndex) { hsiList[hsiIndex] = hsiList[lastIndex]; } hsiList.pop(); } /** * @dev Loads share data from a HEX stake instance (HSI) into a "ShareCache" object. * @param hsi A HSI contract object from which share data will be loaded. * @return "ShareCache" object containing the loaded share data. */ function _hsiLoad( HEXStakeInstance hsi ) internal view returns (ShareCache memory) { HEXStakeMinimal memory stake; uint16 mintedDays; uint8 launchBonus; uint16 loanStart; uint16 loanedDays; uint32 interestRate; uint8 paymentsMade; bool isLoaned; (stake, mintedDays, launchBonus, loanStart, loanedDays, interestRate, paymentsMade, isLoaned) = hsi.share(); return ShareCache( stake, mintedDays, launchBonus, loanStart, loanedDays, interestRate, paymentsMade, isLoaned ); } // Internal NFT Marketplace Glue /** @dev Sets the Rarible V2 royalties on a specific token * @param tokenId Unique ID of the HSI NFT token. */ function _setRoyalties( uint256 tokenId ) internal { LibPart.Part[] memory _royalties = new LibPart.Part[](1); _royalties[0].value = _hsimRoyaltyBasis; _royalties[0].account = payable(_hdrnFlowAddress); _saveRoyalties(tokenId, _royalties); } /** * @dev Retreives the number of HSI elements in an addresses HSI list. * @param user Address to retrieve the HSI list for. * @return Number of HSI elements found within the HSI list. */ function hsiCount( address user ) public view returns (uint256) { return hsiLists[user].length; } /** * @dev Wrapper function for hsiCount to allow HEX based applications to pull stake data. * @param user Address to retrieve the HSI list for. * @return Number of HSI elements found within the HSI list. */ function stakeCount( address user ) external view returns (uint256) { return hsiCount(user); } /** * @dev Wrapper function for hsiLists to allow HEX based applications to pull stake data. * @param user Address to retrieve the HSI list for. * @param hsiIndex The index of the HSI contract address which will returned. * @return "HEXStake" object containing HEX stake data. */ function stakeLists( address user, uint256 hsiIndex ) external view returns (HEXStake memory) { address[] storage hsiList = hsiLists[user]; HEXStakeInstance hsi = HEXStakeInstance(hsiList[hsiIndex]); return hsi.stakeDataFetch(); } /** * @dev Creates a new HEX stake instance (HSI), transfers HEX ERC20 tokens to the * HSI's contract address, and calls the "initialize" function. * @param amount Number of HEX ERC20 tokens to be staked. * @param length Number of days the HEX ERC20 tokens will be staked. * @return Address of the newly created HSI contract. */ function hexStakeStart ( uint256 amount, uint256 length ) external returns (address) { require(amount <= _hx.balanceOf(msg.sender), "HSIM: Insufficient HEX to facilitate stake"); address[] storage hsiList = hsiLists[msg.sender]; address hsiAddress = Clones.clone(_hsiImplementation); HEXStakeInstance hsi = HEXStakeInstance(hsiAddress); hsi.initialize(_hxAddress); hsiList.push(hsiAddress); uint256 hsiIndex = hsiList.length - 1; require(_hx.transferFrom(msg.sender, hsiAddress, amount), "HSIM: HEX transfer from message sender to HSIM failed"); hsi.create(length); IHedron hedron = IHedron(_creator); hedron.claimInstanced(hsiIndex, hsiAddress, msg.sender); emit HSIStart(block.timestamp, hsiAddress, msg.sender); return hsiAddress; } /** * @dev Calls the HEX stake instance (HSI) function "destroy", transfers HEX ERC20 tokens * from the HSI's contract address to the senders address. * @param hsiIndex Index of the HSI contract's address in the caller's HSI list. * @param hsiAddress Address of the HSI contract in which to call the "destroy" function. * @return Amount of HEX ERC20 tokens awarded via ending the HEX stake. */ function hexStakeEnd ( uint256 hsiIndex, address hsiAddress ) external returns (uint256) { address[] storage hsiList = hsiLists[msg.sender]; require(hsiAddress == hsiList[hsiIndex], "HSIM: HSI index address mismatch"); HEXStakeInstance hsi = HEXStakeInstance(hsiAddress); ShareCache memory share = _hsiLoad(hsi); require (share._isLoaned == false, "HSIM: Cannot call stakeEnd against a loaned stake"); hsi.destroy(); emit HSIEnd(block.timestamp, hsiAddress, msg.sender); uint256 hsiBalance = _hx.balanceOf(hsiAddress); if (hsiBalance > 0) { require(_hx.transferFrom(hsiAddress, msg.sender, hsiBalance), "HSIM: HEX transfer from HSI failed"); } _pruneHSI(hsiList, hsiIndex); return hsiBalance; } /** * @dev Converts a HEX stake instance (HSI) contract address mapping into a * HSI ERC721 token. * @param hsiIndex Index of the HSI contract's address in the caller's HSI list. * @param hsiAddress Address of the HSI contract to be converted. * @return Token ID of the newly minted HSI ERC721 token. */ function hexStakeTokenize ( uint256 hsiIndex, address hsiAddress ) external returns (uint256) { address[] storage hsiList = hsiLists[msg.sender]; require(hsiAddress == hsiList[hsiIndex], "HSIM: HSI index address mismatch"); HEXStakeInstance hsi = HEXStakeInstance(hsiAddress); ShareCache memory share = _hsiLoad(hsi); require (share._isLoaned == false, "HSIM: Cannot tokenize a loaned stake"); _tokenIds.increment(); uint256 newTokenId = _tokenIds.current(); _mint(msg.sender, newTokenId); hsiToken[newTokenId] = hsiAddress; _setRoyalties(newTokenId); _pruneHSI(hsiList, hsiIndex); emit HSITokenize( block.timestamp, newTokenId, hsiAddress, msg.sender ); return newTokenId; } /** * @dev Converts a HEX stake instance (HSI) ERC721 token into an address mapping. * @param tokenId ID of the HSI ERC721 token to be converted. * @return Address of the detokenized HSI contract. */ function hexStakeDetokenize ( uint256 tokenId ) external returns (address) { require(ownerOf(tokenId) == msg.sender, "HSIM: Detokenization requires token ownership"); address hsiAddress = hsiToken[tokenId]; address[] storage hsiList = hsiLists[msg.sender]; hsiList.push(hsiAddress); hsiToken[tokenId] = address(0); _burn(tokenId); emit HSIDetokenize( block.timestamp, tokenId, hsiAddress, msg.sender ); return hsiAddress; } /** * @dev Updates the share data of a HEX stake instance (HSI) contract. * This is a pivileged operation only Hedron.sol can call. * @param holder Address of the HSI contract owner. * @param hsiIndex Index of the HSI contract's address in the holder's HSI list. * @param hsiAddress Address of the HSI contract to be updated. * @param share "ShareCache" object containing updated share data. */ function hsiUpdate ( address holder, uint256 hsiIndex, address hsiAddress, ShareCache memory share ) external { require(msg.sender == _creator, "HSIM: Caller must be contract creator"); address[] storage hsiList = hsiLists[holder]; require(hsiAddress == hsiList[hsiIndex], "HSIM: HSI index address mismatch"); HEXStakeInstance hsi = HEXStakeInstance(hsiAddress); hsi.update(share); } /** * @dev Transfers ownership of a HEX stake instance (HSI) contract to a new address. * This is a pivileged operation only Hedron.sol can call. End users can use * the NFT tokenize / detokenize to handle HSI transfers. * @param currentHolder Address to transfer the HSI contract from. * @param hsiIndex Index of the HSI contract's address in the currentHolder's HSI list. * @param hsiAddress Address of the HSI contract to be transfered. * @param newHolder Address to transfer to HSI contract to. */ function hsiTransfer ( address currentHolder, uint256 hsiIndex, address hsiAddress, address newHolder ) external { require(msg.sender == _creator, "HSIM: Caller must be contract creator"); address[] storage hsiListCurrent = hsiLists[currentHolder]; address[] storage hsiListNew = hsiLists[newHolder]; require(hsiAddress == hsiListCurrent[hsiIndex], "HSIM: HSI index address mismatch"); hsiListNew.push(hsiAddress); _pruneHSI(hsiListCurrent, hsiIndex); emit HSITransfer( block.timestamp, hsiAddress, currentHolder, newHolder ); } // External NFT Marketplace Glue /** * @dev Implements ERC2981 royalty functionality. We just read the royalty data from * the Rarible V2 implementation. * @param tokenId Unique ID of the HSI NFT token. * @param salePrice Price the HSI NFT token was sold for. * @return receiver address to send the royalties to as well as the royalty amount. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount) { LibPart.Part[] memory _royalties = royalties[tokenId]; if (_royalties.length > 0) { return (_royalties[0].account, (salePrice * _royalties[0].value) / 10000); } return (address(0), 0); } /** * @dev returns _hdrnFlowAddress, needed for some NFT marketplaces. This is not * an admin key. * @return _hdrnFlowAddress */ function owner( ) external pure returns (address) { return _hdrnFlowAddress; } /** * @dev Adds Rarible V2 and ERC2981 interface support. * @param interfaceId Unique contract interface identifier. * @return True if the interface is supported, false if not. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { if (interfaceId == LibRoyaltiesV2._INTERFACE_ID_ROYALTIES) { return true; } if (interfaceId == _INTERFACE_ID_ERC2981) { return true; } return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"hexAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"hsiTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"hsiAddress","type":"address"},{"indexed":true,"internalType":"address","name":"staker","type":"address"}],"name":"HSIDetokenize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"hsiAddress","type":"address"},{"indexed":true,"internalType":"address","name":"staker","type":"address"}],"name":"HSIEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"hsiAddress","type":"address"},{"indexed":true,"internalType":"address","name":"staker","type":"address"}],"name":"HSIStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"hsiTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"hsiAddress","type":"address"},{"indexed":true,"internalType":"address","name":"staker","type":"address"}],"name":"HSITokenize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"hsiAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldStaker","type":"address"},{"indexed":true,"internalType":"address","name":"newStaker","type":"address"}],"name":"HSITransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"}],"name":"RoyaltiesSet","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":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRaribleV2Royalties","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hexStakeDetokenize","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"hsiIndex","type":"uint256"},{"internalType":"address","name":"hsiAddress","type":"address"}],"name":"hexStakeEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"hexStakeStart","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"hsiIndex","type":"uint256"},{"internalType":"address","name":"hsiAddress","type":"address"}],"name":"hexStakeTokenize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hsiCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"hsiLists","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hsiToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currentHolder","type":"address"},{"internalType":"uint256","name":"hsiIndex","type":"uint256"},{"internalType":"address","name":"hsiAddress","type":"address"},{"internalType":"address","name":"newHolder","type":"address"}],"name":"hsiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"hsiIndex","type":"uint256"},{"internalType":"address","name":"hsiAddress","type":"address"},{"components":[{"components":[{"internalType":"uint40","name":"stakeId","type":"uint40"},{"internalType":"uint72","name":"stakeShares","type":"uint72"},{"internalType":"uint16","name":"lockedDay","type":"uint16"},{"internalType":"uint16","name":"stakedDays","type":"uint16"}],"internalType":"struct HEXStakeMinimal","name":"_stake","type":"tuple"},{"internalType":"uint256","name":"_mintedDays","type":"uint256"},{"internalType":"uint256","name":"_launchBonus","type":"uint256"},{"internalType":"uint256","name":"_loanStart","type":"uint256"},{"internalType":"uint256","name":"_loanedDays","type":"uint256"},{"internalType":"uint256","name":"_interestRate","type":"uint256"},{"internalType":"uint256","name":"_paymentsMade","type":"uint256"},{"internalType":"bool","name":"_isLoaned","type":"bool"}],"internalType":"struct ShareCache","name":"share","type":"tuple"}],"name":"hsiUpdate","outputs":[],"stateMutability":"nonpayable","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","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":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"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":"address","name":"user","type":"address"}],"name":"stakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"hsiIndex","type":"uint256"}],"name":"stakeLists","outputs":[{"components":[{"internalType":"uint40","name":"stakeId","type":"uint40"},{"internalType":"uint72","name":"stakedHearts","type":"uint72"},{"internalType":"uint72","name":"stakeShares","type":"uint72"},{"internalType":"uint16","name":"lockedDay","type":"uint16"},{"internalType":"uint16","name":"stakedDays","type":"uint16"},{"internalType":"uint16","name":"unlockedDay","type":"uint16"},{"internalType":"bool","name":"isAutoStake","type":"bool"}],"internalType":"struct HEXStake","name":"","type":"tuple"}],"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200494238038062004942833981016040819052620000349162000233565b6040805180820182526012815271484558205374616b6520496e7374616e636560701b60208083019182528351808501909452600384526248534960e81b90840152815191929162000089916000916200017f565b5080516200009f9060019060208401906200017f565b5050600c80546001600160a01b03199081163317909155600d80546001600160a01b0385169083168117909155600e805490921617905550604051620000e5906200020e565b604051809103906000f08015801562000102573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b0392831690811790915560405163189acdbd60e31b8152918316600483015290819063c4d66de890602401600060405180830381600087803b1580156200015e57600080fd5b505af115801562000173573d6000803e3d6000fd5b505050505050620002a2565b8280546200018d9062000265565b90600052602060002090601f016020900481019282620001b15760008555620001fc565b82601f10620001cc57805160ff1916838001178555620001fc565b82800160010185558215620001fc579182015b82811115620001fc578251825591602001919060010190620001df565b506200020a9291506200021c565b5090565b610e948062003aae83390190565b5b808211156200020a57600081556001016200021d565b6000602082840312156200024657600080fd5b81516001600160a01b03811681146200025e57600080fd5b9392505050565b600181811c908216806200027a57607f821691505b602082108114156200029c57634e487b7160e01b600052602260045260246000fd5b50919050565b6137fc80620002b26000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e11610104578063b947e629116100a2578063ceca96e611610071578063ceca96e6146104cd578063e985e9c5146104e0578063ed0e43d11461051c578063f2b291411461052f57600080fd5b8063b947e6291461045e578063c5a05f3214610487578063c87b56dd1461049a578063cad96cca146104ad57600080fd5b806395d89b41116100de57806395d89b411461041d5780639875cc0514610425578063a22cb46514610438578063b88d4fde1461044b57600080fd5b80636352211e146103dd57806370a08231146103f05780638da5cb5b1461040357600080fd5b80632607443b1161017c57806333060d901161014b57806333060d901461039157806342842e0e146103a45780634f6ccce7146103b75780635e21bb45146103ca57600080fd5b80632607443b146102aa5780632a55205a146103395780632f745c591461036b578063317e2e631461037e57600080fd5b8063095ea7b3116101b8578063095ea7b3146102475780631322e1041461025c57806318160ddd1461028557806323b872dd1461029757600080fd5b806301ffc9a7146101df57806306fdde0314610207578063081812fc1461021c575b600080fd5b6101f26101ed366004612d9e565b610542565b60405190151581526020015b60405180910390f35b61020f610595565b6040516101fe9190612e13565b61022f61022a366004612e26565b610627565b6040516001600160a01b0390911681526020016101fe565b61025a610255366004612e56565b6106c1565b005b61022f61026a366004612e26565b6011602052600090815260409020546001600160a01b031681565b6008545b6040519081526020016101fe565b61025a6102a5366004612e80565b6107d7565b6102bd6102b8366004612e56565b610852565b6040516101fe9190600060e08201905064ffffffffff8351168252602083015168ffffffffffffffffff80821660208501528060408601511660408501525050606083015161ffff80821660608501528060808601511660808501528060a08601511660a0850152505060c0830151151560c083015292915050565b61034c610347366004612ebc565b610950565b604080516001600160a01b0390931683526020830191909152016101fe565b610289610379366004612e56565b610a56565b61025a61038c36600461302d565b610aec565b61028961039f3660046130ed565b610c4e565b61025a6103b2366004612e80565b610c6c565b6102896103c5366004612e26565b610c87565b61025a6103d8366004613108565b610d1a565b61022f6103eb366004612e26565b610eb1565b6102896103fe3660046130ed565b610f28565b73f447be386164dadfb5d1e7622613f289f17024d861022f565b61020f610faf565b610289610433366004613155565b610fbe565b61025a610446366004613181565b61116b565b61025a6104593660046131b8565b61117a565b61028961046c3660046130ed565b6001600160a01b031660009081526010602052604090205490565b61022f610495366004612e26565b6111fc565b61020f6104a8366004612e26565b611329565b6104c06104bb366004612e26565b611404565b6040516101fe91906132d0565b6102896104db366004613155565b611493565b6101f26104ee3660046132e3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61022f61052a366004612ebc565b6117a7565b61022f61053d366004612e56565b611b60565b60006001600160e01b0319821663656cb66560e11b141561056557506001919050565b6001600160e01b0319821663152a902d60e11b141561058657506001919050565b61058f82611b98565b92915050565b6060600080546105a49061330d565b80601f01602080910402602001604051908101604052809291908181526020018280546105d09061330d565b801561061d5780601f106105f25761010080835404028352916020019161061d565b820191906000526020600020905b81548152906001019060200180831161060057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106a55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106cc82610eb1565b9050806001600160a01b0316836001600160a01b0316141561073a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161069c565b336001600160a01b0382161480610756575061075681336104ee565b6107c85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161069c565b6107d28383611bbd565b505050565b6107e13382611c2b565b6108475760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161069c565b6107d2838383611d22565b6040805160e08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c083018290526001600160a01b0386168252601090529182208054919290918290859081106108b6576108b6613348565b9060005260206000200160009054906101000a90046001600160a01b03169050806001600160a01b031663acee069e6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561090f57600080fd5b505afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109479190613374565b95945050505050565b6000828152600a60209081526040808320805482518185028101850190935280835284938493929190849084015b828210156109cd57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b03168183015282526001909201910161097e565b505050509050600081511115610a4657806000815181106109f0576109f0613348565b60200260200101516000015161271082600081518110610a1257610a12613348565b6020026020010151602001516001600160601b031686610a329190613442565b610a3c9190613477565b9250925050610a4f565b60008092509250505b9250929050565b6000610a6183610f28565b8210610ac35760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161069c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600c546001600160a01b03163314610b545760405162461bcd60e51b815260206004820152602560248201527f4853494d3a2043616c6c6572206d75737420626520636f6e747261637420637260448201526432b0ba37b960d91b606482015260840161069c565b6001600160a01b03841660009081526010602052604090208054819085908110610b8057610b80613348565b6000918252602090912001546001600160a01b03848116911614610be65760405162461bcd60e51b815260206004820181905260248201527f4853494d3a2048534920696e6465782061646472657373206d69736d61746368604482015260640161069c565b604051637396ca6560e01b815283906001600160a01b03821690637396ca6590610c1490869060040161348b565b600060405180830381600087803b158015610c2e57600080fd5b505af1158015610c42573d6000803e3d6000fd5b50505050505050505050565b6001600160a01b03811660009081526010602052604081205461058f565b6107d28383836040518060200160405280600081525061117a565b6000610c9260085490565b8210610cf55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161069c565b60088281548110610d0857610d08613348565b90600052602060002001549050919050565b600c546001600160a01b03163314610d825760405162461bcd60e51b815260206004820152602560248201527f4853494d3a2043616c6c6572206d75737420626520636f6e747261637420637260448201526432b0ba37b960d91b606482015260840161069c565b6001600160a01b03808516600090815260106020526040808220928416825290208154829086908110610db757610db7613348565b6000918252602090912001546001600160a01b03858116911614610e1d5760405162461bcd60e51b815260206004820181905260248201527f4853494d3a2048534920696e6465782061646472657373206d69736d61746368604482015260640161069c565b80546001810182556000828152602090200180546001600160a01b0319166001600160a01b038616179055610e528286611ecd565b826001600160a01b0316866001600160a01b0316856001600160a01b03167fc24b27b33d05d2d17b1cf97ccbe0c85b21236ad0f06ba8359bf46f8e3b2749b642604051610ea191815260200190565b60405180910390a4505050505050565b6000818152600260205260408120546001600160a01b03168061058f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161069c565b60006001600160a01b038216610f935760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161069c565b506001600160a01b031660009081526003602052604090205490565b6060600180546105a49061330d565b3360009081526010602052604081208054819085908110610fe157610fe1613348565b6000918252602090912001546001600160a01b038481169116146110475760405162461bcd60e51b815260206004820181905260248201527f4853494d3a2048534920696e6465782061646472657373206d69736d61746368604482015260640161069c565b82600061105382611f8f565b60e0810151909150156110b45760405162461bcd60e51b8152602060048201526024808201527f4853494d3a2043616e6e6f7420746f6b656e697a652061206c6f616e6564207360448201526374616b6560e01b606482015260840161069c565b6110c2600b80546001019055565b60006110cd600b5490565b90506110d933826120f7565b600081815260116020526040902080546001600160a01b0319166001600160a01b03881617905561110981612245565b6111138488611ecd565b336001600160a01b0316866001600160a01b0316827fed10b8f4c54a638850d395c632b529baa72a9c68ee7ed868f15a0468405d51474260405161115991815260200190565b60405180910390a49695505050505050565b611176338383612308565b5050565b6111843383611c2b565b6111ea5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161069c565b6111f6848484846123d7565b50505050565b60003361120883610eb1565b6001600160a01b0316146112745760405162461bcd60e51b815260206004820152602d60248201527f4853494d3a204465746f6b656e697a6174696f6e20726571756972657320746f60448201526c06b656e206f776e65727368697609c1b606482015260840161069c565b600082815260116020818152604080842080543386526010845291852080546001810182558187528487200180546001600160a01b039094166001600160a01b03199485168117909155958890529390925281541690556112d484612455565b336001600160a01b0316826001600160a01b0316857f6bce622a5976965d5b72e030c8cab9696faae9e320a35bfd263b1681ae7f24904260405161131a91815260200190565b60405180910390a45092915050565b6000818152600260205260409020546060906001600160a01b03166113a85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161069c565b60006113b26124fc565b905060008151116113d257604051806020016040528060008152506113fd565b806113dc84612587565b6040516020016113ed92919061352e565b6040516020818303038152906040525b9392505050565b6060600a6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561148857600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611439565b505050509050919050565b33600090815260106020526040812080548190859081106114b6576114b6613348565b6000918252602090912001546001600160a01b0384811691161461151c5760405162461bcd60e51b815260206004820181905260248201527f4853494d3a2048534920696e6465782061646472657373206d69736d61746368604482015260640161069c565b82600061152882611f8f565b60e0810151909150156115975760405162461bcd60e51b815260206004820152603160248201527f4853494d3a2043616e6e6f742063616c6c207374616b65456e6420616761696e60448201527073742061206c6f616e6564207374616b6560781b606482015260840161069c565b816001600160a01b03166383197ef06040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115d257600080fd5b505af11580156115e6573d6000803e3d6000fd5b50506040514281523392506001600160a01b03881691507f14d0fe09f225917f351bd3b122714cfcc1c45015a67232167d4b561e186b26de9060200160405180910390a3600d546040516370a0823160e01b81526001600160a01b03878116600483015260009216906370a082319060240160206040518083038186803b15801561167057600080fd5b505afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a8919061355d565b9050801561179357600d546040516323b872dd60e01b81526001600160a01b03888116600483015233602483015260448201849052909116906323b872dd90606401602060405180830381600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190613576565b6117935760405162461bcd60e51b815260206004820152602260248201527f4853494d3a20484558207472616e736665722066726f6d20485349206661696c604482015261195960f21b606482015260840161069c565b61179d8488611ecd565b9695505050505050565b600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156117eb57600080fd5b505afa1580156117ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611823919061355d565b8311156118855760405162461bcd60e51b815260206004820152602a60248201527f4853494d3a20496e73756666696369656e742048455820746f20666163696c6960448201526974617465207374616b6560b01b606482015260840161069c565b336000908152601060205260408120600f549091906118ac906001600160a01b0316612685565b600e5460405163189acdbd60e31b81526001600160a01b03918216600482015291925082919082169063c4d66de890602401600060405180830381600087803b1580156118f857600080fd5b505af115801561190c573d6000803e3d6000fd5b505084546001808201875560008781526020812090920180546001600160a01b0319166001600160a01b038816179055865491935061194c925090613593565b600d546040516323b872dd60e01b81523360048201526001600160a01b038681166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b1580156119a257600080fd5b505af11580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190613576565b611a4c5760405162461bcd60e51b815260206004820152603560248201527f4853494d3a20484558207472616e736665722066726f6d206d6573736167652060448201527f73656e64657220746f204853494d206661696c65640000000000000000000000606482015260840161069c565b604051631e02403760e21b8152600481018790526001600160a01b0383169063780900dc90602401600060405180830381600087803b158015611a8e57600080fd5b505af1158015611aa2573d6000803e3d6000fd5b5050600c54604051638523c74560e01b8152600481018590526001600160a01b0387811660248301523360448301529091169250829150638523c74590606401600060405180830381600087803b158015611afc57600080fd5b505af1158015611b10573d6000803e3d6000fd5b50506040514281523392506001600160a01b03871691507fd680a9b62662668ffed760ca1d0741736980d08c278efca9e0c6dcc1a4c166ca9060200160405180910390a350919695505050505050565b60106020528160005260406000208181548110611b7c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b60006001600160e01b0319821663780e9d6360e01b148061058f575061058f82612732565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bf282610eb1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ca45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161069c565b6000611caf83610eb1565b9050806001600160a01b0316846001600160a01b03161480611cea5750836001600160a01b0316611cdf84610627565b6001600160a01b0316145b80611d1a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d3582610eb1565b6001600160a01b031614611d9d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161069c565b6001600160a01b038216611dff5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161069c565b611e0a838383612782565b611e15600082611bbd565b6001600160a01b0383166000908152600360205260408120805460019290611e3e908490613593565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e6c9084906135aa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8154600090611ede90600190613593565b9050808214611f5857828181548110611ef957611ef9613348565b9060005260206000200160009054906101000a90046001600160a01b0316838381548110611f2957611f29613348565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b82805480611f6857611f686135c2565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b611ffc6040805161018081019091526000610100820181815261012083018290526101408301829052610160830191909152819081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6040805160808101825260008082526020820181905291810182905260608101919091526000806000806000806000896001600160a01b031663a8d5fd656040518163ffffffff1660e01b81526004016101606040518083038186803b15801561206557600080fd5b505afa158015612079573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209d91906135fd565b604080516101008101825298895261ffff97881660208a015260ff96871690890152938616606088015294909116608086015263ffffffff1660a0850152911660c0830152151560e08201529a9950505050505050505050565b6001600160a01b03821661214d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161069c565b6000818152600260205260409020546001600160a01b0316156121b25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161069c565b6121be60008383612782565b6001600160a01b03821660009081526003602052604081208054600192906121e79084906135aa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161225c579050509050600f8160008151811061229a5761229a613348565b6020026020010151602001906001600160601b031690816001600160601b03168152505073f447be386164dadfb5d1e7622613f289f17024d8816000815181106122e6576122e6613348565b60209081029190910101516001600160a01b039091169052611176828261278d565b816001600160a01b0316836001600160a01b0316141561236a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161069c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6123e2848484611d22565b6123ee848484846129a8565b6111f65760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161069c565b600061246082610eb1565b905061246e81600084612782565b612479600083611bbd565b6001600160a01b03811660009081526003602052604081208054600192906124a2908490613593565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060600061250946612587565b90506040518060400160405280601781526020017f68747470733a2f2f6170692e686564726f6e2e70726f2f00000000000000000081525081604051806040016040528060058152602001642f6873692f60d81b815250604051602001612572939291906136ec565b60405160208183030381529060405291505090565b6060816125ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125d557806125bf8161372f565b91506125ce9050600a83613477565b91506125af565b60008167ffffffffffffffff8111156125f0576125f0612ede565b6040519080825280601f01601f19166020018201604052801561261a576020820181803683370190505b5090505b8415611d1a5761262f600183613593565b915061263c600a8661374a565b6126479060306135aa565b60f81b81838151811061265c5761265c613348565b60200101906001600160f81b031916908160001a90535061267e600a86613477565b945061261e565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b03811661272d5760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015260640161069c565b919050565b60006001600160e01b031982166380ac58cd60e01b148061276357506001600160e01b03198216635b5e139f60e01b145b8061058f57506301ffc9a760e01b6001600160e01b031983161461058f565b6107d2838383612b00565b6000805b825181101561293e5760006001600160a01b03168382815181106127b7576127b7613348565b6020026020010151600001516001600160a01b0316141561281a5760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e740000000000604482015260640161069c565b82818151811061282c5761282c613348565b6020026020010151602001516001600160601b0316600014156128915760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f736974697665604482015260640161069c565b8281815181106128a3576128a3613348565b6020026020010151602001516001600160601b0316826128c391906135aa565b9150600a60008581526020019081526020016000208382815181106128ea576128ea613348565b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b0390911617910155806129368161372f565b915050612791565b50612710811061299e5760405162461bcd60e51b815260206004820152602560248201527f526f79616c747920746f74616c2076616c75652073686f756c64206265203c20604482015264031303030360dc1b606482015260840161069c565b6107d28383612bb8565b60006001600160a01b0384163b15612af557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129ec90339089908890889060040161375e565b602060405180830381600087803b158015612a0657600080fd5b505af1925050508015612a36575060408051601f3d908101601f19168201909252612a3391810190613790565b60015b612adb573d808015612a64576040519150601f19603f3d011682016040523d82523d6000602084013e612a69565b606091505b508051612ad35760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161069c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d1a565b506001949350505050565b6001600160a01b038316612b5b57612b5681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b7e565b816001600160a01b0316836001600160a01b031614612b7e57612b7e8382612bf5565b6001600160a01b038216612b95576107d281612c92565b826001600160a01b0316826001600160a01b0316146107d2576107d28282612d41565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df8282604051612be99291906137ad565b60405180910390a15050565b60006001612c0284610f28565b612c0c9190613593565b600083815260076020526040902054909150808214612c5f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612ca490600190613593565b60008381526009602052604081205460088054939450909284908110612ccc57612ccc613348565b906000526020600020015490508060088381548110612ced57612ced613348565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612d2557612d256135c2565b6001900381819060005260206000200160009055905550505050565b6000612d4c83610f28565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114612d9b57600080fd5b50565b600060208284031215612db057600080fd5b81356113fd81612d85565b60005b83811015612dd6578181015183820152602001612dbe565b838111156111f65750506000910152565b60008151808452612dff816020860160208601612dbb565b601f01601f19169290920160200192915050565b6020815260006113fd6020830184612de7565b600060208284031215612e3857600080fd5b5035919050565b80356001600160a01b038116811461272d57600080fd5b60008060408385031215612e6957600080fd5b612e7283612e3f565b946020939093013593505050565b600080600060608486031215612e9557600080fd5b612e9e84612e3f565b9250612eac60208501612e3f565b9150604084013590509250925092565b60008060408385031215612ecf57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612f1757612f17612ede565b60405290565b604051610100810167ffffffffffffffff81118282101715612f1757612f17612ede565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f6a57612f6a612ede565b604052919050565b64ffffffffff81168114612d9b57600080fd5b68ffffffffffffffffff81168114612d9b57600080fd5b61ffff81168114612d9b57600080fd5b600060808284031215612fbe57600080fd5b612fc6612ef4565b90508135612fd381612f72565b81526020820135612fe381612f85565b60208201526040820135612ff681612f9c565b6040820152606082013561300981612f9c565b606082015292915050565b8015158114612d9b57600080fd5b803561272d81613014565b6000806000808486036101c081121561304557600080fd5b61304e86612e3f565b94506020860135935061306360408701612e3f565b925061016080605f198301121561307957600080fd5b613081612f1d565b91506130908860608901612fac565b825260e0870135602083015261010087013560408301526101208701356060830152610140870135608083015286013560a082015261018086013560c08201526130dd6101a08701613022565b60e0820152939692955090935050565b6000602082840312156130ff57600080fd5b6113fd82612e3f565b6000806000806080858703121561311e57600080fd5b61312785612e3f565b93506020850135925061313c60408601612e3f565b915061314a60608601612e3f565b905092959194509250565b6000806040838503121561316857600080fd5b8235915061317860208401612e3f565b90509250929050565b6000806040838503121561319457600080fd5b61319d83612e3f565b915060208301356131ad81613014565b809150509250929050565b600080600080608085870312156131ce57600080fd5b6131d785612e3f565b935060206131e6818701612e3f565b935060408601359250606086013567ffffffffffffffff8082111561320a57600080fd5b818801915088601f83011261321e57600080fd5b81358181111561323057613230612ede565b613242601f8201601f19168501612f41565b9150808252898482850101111561325857600080fd5b808484018584013760008482840101525080935050505092959194509250565b600081518084526020808501945080840160005b838110156132c557815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010161328c565b509495945050505050565b6020815260006113fd6020830184613278565b600080604083850312156132f657600080fd5b6132ff83612e3f565b915061317860208401612e3f565b600181811c9082168061332157607f821691505b6020821081141561334257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b805161272d81612f9c565b805161272d81613014565b600060e0828403121561338657600080fd5b60405160e0810181811067ffffffffffffffff821117156133a9576133a9612ede565b60405282516133b781612f72565b815260208301516133c781612f85565b602082015260408301516133da81612f85565b604082015260608301516133ed81612f9c565b60608201526133fe6080840161335e565b608082015261340f60a0840161335e565b60a082015261342060c08401613369565b60c08201529392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561345c5761345c61342c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261348657613486613461565b500490565b600061016082019050825164ffffffffff815116835268ffffffffffffffffff6020820151166020840152604081015161ffff808216604086015280606084015116606086015250505060208301516080830152604083015160a0830152606083015160c0830152608083015160e083015260a083015161010083015260c083015161012083015260e083015161352761014084018215159052565b5092915050565b60008351613540818460208801612dbb565b835190830190613554818360208801612dbb565b01949350505050565b60006020828403121561356f57600080fd5b5051919050565b60006020828403121561358857600080fd5b81516113fd81613014565b6000828210156135a5576135a561342c565b500390565b600082198211156135bd576135bd61342c565b500190565b634e487b7160e01b600052603160045260246000fd5b805160ff8116811461272d57600080fd5b805163ffffffff8116811461272d57600080fd5b600080600080600080600080888a0361016081121561361b57600080fd5b608081121561362957600080fd5b50613632612ef4565b895161363d81612f72565b815260208a015161364d81612f85565b602082015260408a015161366081612f9c565b604082015260608a015161367381612f9c565b6060820152975061368660808a0161335e565b965061369460a08a016135d8565b95506136a260c08a0161335e565b94506136b060e08a0161335e565b93506136bf6101008a016135e9565b92506136ce6101208a016135d8565b91506136dd6101408a01613369565b90509295985092959890939650565b600084516136fe818460208901612dbb565b845190830190613712818360208901612dbb565b8451910190613725818360208801612dbb565b0195945050505050565b60006000198214156137435761374361342c565b5060010190565b60008261375957613759613461565b500690565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261179d6080830184612de7565b6000602082840312156137a257600080fd5b81516113fd81612d85565b828152604060208201526000611d1a604083018461327856fea2646970667358221220190f74f6d37d6347cc990a86eabcba509094f51b095460f06bb88097c7a635f364736f6c63430008090033608060405234801561001057600080fd5b50610e74806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806383197ef01161005b57806383197ef0146100b2578063a8d5fd65146100ba578063acee069e146101ee578063c4d66de81461027257600080fd5b80634313ae42146100825780637396ca651461008c578063780900dc1461009f575b600080fd5b61008a610285565b005b61008a61009a366004610c61565b610361565b61008a6100ad366004610cdf565b610470565b61008a61064b565b6040805160808101825260025464ffffffffff811682526501000000000080820468ffffffffffffffffff166020840152600160701b820461ffff90811694840194909452600160801b9091048316606083015260035461015d938181169262010000830460ff908116936301000000810484169392810490921691670100000000000000810463ffffffff1691600160581b8204811691600160601b90041688565b60408051895164ffffffffff1681526020808b015168ffffffffffffffffff16908201528982015161ffff908116928201929092526060998a0151821699810199909952968716608089015260ff95861660a089015293861660c08801529490911660e086015263ffffffff1661010085015291166101208301521515610140820152610160015b60405180910390f35b6101f6610858565b6040516101e59190600060e08201905064ffffffffff8351168252602083015168ffffffffffffffffff80821660208501528060408601511660408501525050606083015161ffff80821660608501528060808601511660808501528060a08601511660a0850152505060c0830151151560c083015292915050565b61008a610280366004610cf8565b61097e565b600254600160801b900461ffff166102e45760405162461bcd60e51b815260206004820152601f60248201527f4853493a204372656174696f6e206e6f742079657420706572666f726d65640060448201526064015b60405180910390fd5b600080546002546040516332e7b8d960e11b8152306004820152602481019390935264ffffffffff1660448301526001600160a01b0316906365cf71b290606401600060405180830381600087803b15801561033f57600080fd5b505af1158015610353573d6000803e3d6000fd5b5050505061035f610a22565b565b6001546001600160a01b0316331461038b5760405162461bcd60e51b81526004016102db90610d28565b60208101516003805460408401516060850151608086015160a087015160c088015160e09098015161ffff97881662ffffff19909616959095176201000060ff958616021766ffffffff000000191663010000009388169390930266ffff0000000000191692909217650100000000009690911695909502949094176bffffffffff00000000000000191667010000000000000063ffffffff909516949094026bff0000000000000000000000191693909317600160581b9390941692909202929092176cff0000000000000000000000001916600160601b91151591909102179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156104b457600080fd5b505afa1580156104c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ec9190610d6c565b6001549091506001600160a01b031633146105195760405162461bcd60e51b81526004016102db90610d28565b600254600160801b900461ffff16156105745760405162461bcd60e51b815260206004820152601f60248201527f4853493a204372656174696f6e20616c726561647920706572666f726d65640060448201526064016102db565b600081116105da5760405162461bcd60e51b815260206004820152602d60248201527f4853493a204372656174696f6e2072657175697265732061206e6f6e2d7a657260448201526c6f204845582062616c616e636560981b60648201526084016102db565b600054604051630a54871760e31b815260048101839052602481018490526001600160a01b03909116906352a438b890604401600060405180830381600087803b15801561062757600080fd5b505af115801561063b573d6000803e3d6000fd5b50505050610647610a22565b5050565b6001546001600160a01b031633146106755760405162461bcd60e51b81526004016102db90610d28565b600254600160801b900461ffff166106cf5760405162461bcd60e51b815260206004820152601f60248201527f4853493a204372656174696f6e206e6f742079657420706572666f726d65640060448201526064016102db565b60008054600254604051631a1804d160e11b8152600481019390935264ffffffffff1660248301526001600160a01b03169063343009a290604401600060405180830381600087803b15801561072457600080fd5b505af1158015610738573d6000803e3d6000fd5b5050600080546040516370a0823160e01b81523060048201529193506001600160a01b031691506370a082319060240160206040518083038186803b15801561078057600080fd5b505afa158015610794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b89190610d6c565b60005460015460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b390604401602060405180830381600087803b15801561080a57600080fd5b505af115801561081e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108429190610d85565b1561007d576001546001600160a01b0316ff5b50565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260008054604051632607443b60e01b8152306004820152602481018390528291829182918291829182916001600160a01b0390911690632607443b9060440160e06040518083038186803b1580156108e857600080fd5b505afa1580156108fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109209190610da2565b6040805160e08101825264ffffffffff98909816885268ffffffffffffffffff9687166020890152949095169386019390935261ffff9182166060860152811660808501521660a0830152151560c082015298975050505050505050565b6001546001600160a01b0316156109e55760405162461bcd60e51b815260206004820152602560248201527f4853493a20496e697469616c697a6174696f6e20616c726561647920706572666044820152641bdc9b595960da1b60648201526084016102db565b600180543373ffffffffffffffffffffffffffffffffffffffff1991821617909155600080549091166001600160a01b0392909216919091179055565b60008054604051632607443b60e01b8152306004820152602481018390528291829182918291829182916001600160a01b0390911690632607443b9060440160e06040518083038186803b158015610a7957600080fd5b505afa158015610a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab19190610da2565b50506002805464ffffffffff969096166dffffffffffffffffffffffffffff19909616959095176501000000000068ffffffffffffffffff94909416939093029290921771ffffffff00000000000000000000000000001916600160701b61ffff9283160261ffff60801b191617600160801b9290911691909102179091555050505050505050565b604051610100810167ffffffffffffffff81118282101715610b6c57634e487b7160e01b600052604160045260246000fd5b60405290565b64ffffffffff8116811461085557600080fd5b68ffffffffffffffffff8116811461085557600080fd5b61ffff8116811461085557600080fd5b600060808284031215610bbe57600080fd5b6040516080810181811067ffffffffffffffff82111715610bef57634e487b7160e01b600052604160045260246000fd5b6040529050808235610c0081610b72565b81526020830135610c1081610b85565b60208201526040830135610c2381610b9c565b60408201526060830135610c3681610b9c565b6060919091015292915050565b801515811461085557600080fd5b8035610c5c81610c43565b919050565b60006101608284031215610c7457600080fd5b610c7c610b3a565b610c868484610bac565b81526080830135602082015260a0830135604082015260c0830135606082015260e0830135608082015261010083013560a082015261012083013560c0820152610cd36101408401610c51565b60e08201529392505050565b600060208284031215610cf157600080fd5b5035919050565b600060208284031215610d0a57600080fd5b81356001600160a01b0381168114610d2157600080fd5b9392505050565b60208082526024908201527f4853493a2043616c6c6572206d75737420626520636f6e74726163742063726560408201526330ba37b960e11b606082015260800190565b600060208284031215610d7e57600080fd5b5051919050565b600060208284031215610d9757600080fd5b8151610d2181610c43565b600080600080600080600060e0888a031215610dbd57600080fd5b8751610dc881610b72565b6020890151909750610dd981610b85565b6040890151909650610dea81610b85565b6060890151909550610dfb81610b9c565b6080890151909450610e0c81610b9c565b60a0890151909350610e1d81610b9c565b60c0890151909250610e2e81610c43565b809150509295989194975092955056fea264697066735822122055e7b705b10f2b2c963984150458d56028c6a362cfda89761c00dbc65cff4c5164736f6c634300080900330000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e11610104578063b947e629116100a2578063ceca96e611610071578063ceca96e6146104cd578063e985e9c5146104e0578063ed0e43d11461051c578063f2b291411461052f57600080fd5b8063b947e6291461045e578063c5a05f3214610487578063c87b56dd1461049a578063cad96cca146104ad57600080fd5b806395d89b41116100de57806395d89b411461041d5780639875cc0514610425578063a22cb46514610438578063b88d4fde1461044b57600080fd5b80636352211e146103dd57806370a08231146103f05780638da5cb5b1461040357600080fd5b80632607443b1161017c57806333060d901161014b57806333060d901461039157806342842e0e146103a45780634f6ccce7146103b75780635e21bb45146103ca57600080fd5b80632607443b146102aa5780632a55205a146103395780632f745c591461036b578063317e2e631461037e57600080fd5b8063095ea7b3116101b8578063095ea7b3146102475780631322e1041461025c57806318160ddd1461028557806323b872dd1461029757600080fd5b806301ffc9a7146101df57806306fdde0314610207578063081812fc1461021c575b600080fd5b6101f26101ed366004612d9e565b610542565b60405190151581526020015b60405180910390f35b61020f610595565b6040516101fe9190612e13565b61022f61022a366004612e26565b610627565b6040516001600160a01b0390911681526020016101fe565b61025a610255366004612e56565b6106c1565b005b61022f61026a366004612e26565b6011602052600090815260409020546001600160a01b031681565b6008545b6040519081526020016101fe565b61025a6102a5366004612e80565b6107d7565b6102bd6102b8366004612e56565b610852565b6040516101fe9190600060e08201905064ffffffffff8351168252602083015168ffffffffffffffffff80821660208501528060408601511660408501525050606083015161ffff80821660608501528060808601511660808501528060a08601511660a0850152505060c0830151151560c083015292915050565b61034c610347366004612ebc565b610950565b604080516001600160a01b0390931683526020830191909152016101fe565b610289610379366004612e56565b610a56565b61025a61038c36600461302d565b610aec565b61028961039f3660046130ed565b610c4e565b61025a6103b2366004612e80565b610c6c565b6102896103c5366004612e26565b610c87565b61025a6103d8366004613108565b610d1a565b61022f6103eb366004612e26565b610eb1565b6102896103fe3660046130ed565b610f28565b73f447be386164dadfb5d1e7622613f289f17024d861022f565b61020f610faf565b610289610433366004613155565b610fbe565b61025a610446366004613181565b61116b565b61025a6104593660046131b8565b61117a565b61028961046c3660046130ed565b6001600160a01b031660009081526010602052604090205490565b61022f610495366004612e26565b6111fc565b61020f6104a8366004612e26565b611329565b6104c06104bb366004612e26565b611404565b6040516101fe91906132d0565b6102896104db366004613155565b611493565b6101f26104ee3660046132e3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61022f61052a366004612ebc565b6117a7565b61022f61053d366004612e56565b611b60565b60006001600160e01b0319821663656cb66560e11b141561056557506001919050565b6001600160e01b0319821663152a902d60e11b141561058657506001919050565b61058f82611b98565b92915050565b6060600080546105a49061330d565b80601f01602080910402602001604051908101604052809291908181526020018280546105d09061330d565b801561061d5780601f106105f25761010080835404028352916020019161061d565b820191906000526020600020905b81548152906001019060200180831161060057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106a55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106cc82610eb1565b9050806001600160a01b0316836001600160a01b0316141561073a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161069c565b336001600160a01b0382161480610756575061075681336104ee565b6107c85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161069c565b6107d28383611bbd565b505050565b6107e13382611c2b565b6108475760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161069c565b6107d2838383611d22565b6040805160e08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c083018290526001600160a01b0386168252601090529182208054919290918290859081106108b6576108b6613348565b9060005260206000200160009054906101000a90046001600160a01b03169050806001600160a01b031663acee069e6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561090f57600080fd5b505afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109479190613374565b95945050505050565b6000828152600a60209081526040808320805482518185028101850190935280835284938493929190849084015b828210156109cd57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b03168183015282526001909201910161097e565b505050509050600081511115610a4657806000815181106109f0576109f0613348565b60200260200101516000015161271082600081518110610a1257610a12613348565b6020026020010151602001516001600160601b031686610a329190613442565b610a3c9190613477565b9250925050610a4f565b60008092509250505b9250929050565b6000610a6183610f28565b8210610ac35760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161069c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600c546001600160a01b03163314610b545760405162461bcd60e51b815260206004820152602560248201527f4853494d3a2043616c6c6572206d75737420626520636f6e747261637420637260448201526432b0ba37b960d91b606482015260840161069c565b6001600160a01b03841660009081526010602052604090208054819085908110610b8057610b80613348565b6000918252602090912001546001600160a01b03848116911614610be65760405162461bcd60e51b815260206004820181905260248201527f4853494d3a2048534920696e6465782061646472657373206d69736d61746368604482015260640161069c565b604051637396ca6560e01b815283906001600160a01b03821690637396ca6590610c1490869060040161348b565b600060405180830381600087803b158015610c2e57600080fd5b505af1158015610c42573d6000803e3d6000fd5b50505050505050505050565b6001600160a01b03811660009081526010602052604081205461058f565b6107d28383836040518060200160405280600081525061117a565b6000610c9260085490565b8210610cf55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161069c565b60088281548110610d0857610d08613348565b90600052602060002001549050919050565b600c546001600160a01b03163314610d825760405162461bcd60e51b815260206004820152602560248201527f4853494d3a2043616c6c6572206d75737420626520636f6e747261637420637260448201526432b0ba37b960d91b606482015260840161069c565b6001600160a01b03808516600090815260106020526040808220928416825290208154829086908110610db757610db7613348565b6000918252602090912001546001600160a01b03858116911614610e1d5760405162461bcd60e51b815260206004820181905260248201527f4853494d3a2048534920696e6465782061646472657373206d69736d61746368604482015260640161069c565b80546001810182556000828152602090200180546001600160a01b0319166001600160a01b038616179055610e528286611ecd565b826001600160a01b0316866001600160a01b0316856001600160a01b03167fc24b27b33d05d2d17b1cf97ccbe0c85b21236ad0f06ba8359bf46f8e3b2749b642604051610ea191815260200190565b60405180910390a4505050505050565b6000818152600260205260408120546001600160a01b03168061058f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161069c565b60006001600160a01b038216610f935760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161069c565b506001600160a01b031660009081526003602052604090205490565b6060600180546105a49061330d565b3360009081526010602052604081208054819085908110610fe157610fe1613348565b6000918252602090912001546001600160a01b038481169116146110475760405162461bcd60e51b815260206004820181905260248201527f4853494d3a2048534920696e6465782061646472657373206d69736d61746368604482015260640161069c565b82600061105382611f8f565b60e0810151909150156110b45760405162461bcd60e51b8152602060048201526024808201527f4853494d3a2043616e6e6f7420746f6b656e697a652061206c6f616e6564207360448201526374616b6560e01b606482015260840161069c565b6110c2600b80546001019055565b60006110cd600b5490565b90506110d933826120f7565b600081815260116020526040902080546001600160a01b0319166001600160a01b03881617905561110981612245565b6111138488611ecd565b336001600160a01b0316866001600160a01b0316827fed10b8f4c54a638850d395c632b529baa72a9c68ee7ed868f15a0468405d51474260405161115991815260200190565b60405180910390a49695505050505050565b611176338383612308565b5050565b6111843383611c2b565b6111ea5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161069c565b6111f6848484846123d7565b50505050565b60003361120883610eb1565b6001600160a01b0316146112745760405162461bcd60e51b815260206004820152602d60248201527f4853494d3a204465746f6b656e697a6174696f6e20726571756972657320746f60448201526c06b656e206f776e65727368697609c1b606482015260840161069c565b600082815260116020818152604080842080543386526010845291852080546001810182558187528487200180546001600160a01b039094166001600160a01b03199485168117909155958890529390925281541690556112d484612455565b336001600160a01b0316826001600160a01b0316857f6bce622a5976965d5b72e030c8cab9696faae9e320a35bfd263b1681ae7f24904260405161131a91815260200190565b60405180910390a45092915050565b6000818152600260205260409020546060906001600160a01b03166113a85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161069c565b60006113b26124fc565b905060008151116113d257604051806020016040528060008152506113fd565b806113dc84612587565b6040516020016113ed92919061352e565b6040516020818303038152906040525b9392505050565b6060600a6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561148857600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611439565b505050509050919050565b33600090815260106020526040812080548190859081106114b6576114b6613348565b6000918252602090912001546001600160a01b0384811691161461151c5760405162461bcd60e51b815260206004820181905260248201527f4853494d3a2048534920696e6465782061646472657373206d69736d61746368604482015260640161069c565b82600061152882611f8f565b60e0810151909150156115975760405162461bcd60e51b815260206004820152603160248201527f4853494d3a2043616e6e6f742063616c6c207374616b65456e6420616761696e60448201527073742061206c6f616e6564207374616b6560781b606482015260840161069c565b816001600160a01b03166383197ef06040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115d257600080fd5b505af11580156115e6573d6000803e3d6000fd5b50506040514281523392506001600160a01b03881691507f14d0fe09f225917f351bd3b122714cfcc1c45015a67232167d4b561e186b26de9060200160405180910390a3600d546040516370a0823160e01b81526001600160a01b03878116600483015260009216906370a082319060240160206040518083038186803b15801561167057600080fd5b505afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a8919061355d565b9050801561179357600d546040516323b872dd60e01b81526001600160a01b03888116600483015233602483015260448201849052909116906323b872dd90606401602060405180830381600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190613576565b6117935760405162461bcd60e51b815260206004820152602260248201527f4853494d3a20484558207472616e736665722066726f6d20485349206661696c604482015261195960f21b606482015260840161069c565b61179d8488611ecd565b9695505050505050565b600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156117eb57600080fd5b505afa1580156117ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611823919061355d565b8311156118855760405162461bcd60e51b815260206004820152602a60248201527f4853494d3a20496e73756666696369656e742048455820746f20666163696c6960448201526974617465207374616b6560b01b606482015260840161069c565b336000908152601060205260408120600f549091906118ac906001600160a01b0316612685565b600e5460405163189acdbd60e31b81526001600160a01b03918216600482015291925082919082169063c4d66de890602401600060405180830381600087803b1580156118f857600080fd5b505af115801561190c573d6000803e3d6000fd5b505084546001808201875560008781526020812090920180546001600160a01b0319166001600160a01b038816179055865491935061194c925090613593565b600d546040516323b872dd60e01b81523360048201526001600160a01b038681166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b1580156119a257600080fd5b505af11580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190613576565b611a4c5760405162461bcd60e51b815260206004820152603560248201527f4853494d3a20484558207472616e736665722066726f6d206d6573736167652060448201527f73656e64657220746f204853494d206661696c65640000000000000000000000606482015260840161069c565b604051631e02403760e21b8152600481018790526001600160a01b0383169063780900dc90602401600060405180830381600087803b158015611a8e57600080fd5b505af1158015611aa2573d6000803e3d6000fd5b5050600c54604051638523c74560e01b8152600481018590526001600160a01b0387811660248301523360448301529091169250829150638523c74590606401600060405180830381600087803b158015611afc57600080fd5b505af1158015611b10573d6000803e3d6000fd5b50506040514281523392506001600160a01b03871691507fd680a9b62662668ffed760ca1d0741736980d08c278efca9e0c6dcc1a4c166ca9060200160405180910390a350919695505050505050565b60106020528160005260406000208181548110611b7c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b60006001600160e01b0319821663780e9d6360e01b148061058f575061058f82612732565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bf282610eb1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ca45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161069c565b6000611caf83610eb1565b9050806001600160a01b0316846001600160a01b03161480611cea5750836001600160a01b0316611cdf84610627565b6001600160a01b0316145b80611d1a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d3582610eb1565b6001600160a01b031614611d9d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161069c565b6001600160a01b038216611dff5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161069c565b611e0a838383612782565b611e15600082611bbd565b6001600160a01b0383166000908152600360205260408120805460019290611e3e908490613593565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e6c9084906135aa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8154600090611ede90600190613593565b9050808214611f5857828181548110611ef957611ef9613348565b9060005260206000200160009054906101000a90046001600160a01b0316838381548110611f2957611f29613348565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b82805480611f6857611f686135c2565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b611ffc6040805161018081019091526000610100820181815261012083018290526101408301829052610160830191909152819081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6040805160808101825260008082526020820181905291810182905260608101919091526000806000806000806000896001600160a01b031663a8d5fd656040518163ffffffff1660e01b81526004016101606040518083038186803b15801561206557600080fd5b505afa158015612079573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209d91906135fd565b604080516101008101825298895261ffff97881660208a015260ff96871690890152938616606088015294909116608086015263ffffffff1660a0850152911660c0830152151560e08201529a9950505050505050505050565b6001600160a01b03821661214d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161069c565b6000818152600260205260409020546001600160a01b0316156121b25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161069c565b6121be60008383612782565b6001600160a01b03821660009081526003602052604081208054600192906121e79084906135aa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161225c579050509050600f8160008151811061229a5761229a613348565b6020026020010151602001906001600160601b031690816001600160601b03168152505073f447be386164dadfb5d1e7622613f289f17024d8816000815181106122e6576122e6613348565b60209081029190910101516001600160a01b039091169052611176828261278d565b816001600160a01b0316836001600160a01b0316141561236a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161069c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6123e2848484611d22565b6123ee848484846129a8565b6111f65760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161069c565b600061246082610eb1565b905061246e81600084612782565b612479600083611bbd565b6001600160a01b03811660009081526003602052604081208054600192906124a2908490613593565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060600061250946612587565b90506040518060400160405280601781526020017f68747470733a2f2f6170692e686564726f6e2e70726f2f00000000000000000081525081604051806040016040528060058152602001642f6873692f60d81b815250604051602001612572939291906136ec565b60405160208183030381529060405291505090565b6060816125ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125d557806125bf8161372f565b91506125ce9050600a83613477565b91506125af565b60008167ffffffffffffffff8111156125f0576125f0612ede565b6040519080825280601f01601f19166020018201604052801561261a576020820181803683370190505b5090505b8415611d1a5761262f600183613593565b915061263c600a8661374a565b6126479060306135aa565b60f81b81838151811061265c5761265c613348565b60200101906001600160f81b031916908160001a90535061267e600a86613477565b945061261e565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b03811661272d5760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015260640161069c565b919050565b60006001600160e01b031982166380ac58cd60e01b148061276357506001600160e01b03198216635b5e139f60e01b145b8061058f57506301ffc9a760e01b6001600160e01b031983161461058f565b6107d2838383612b00565b6000805b825181101561293e5760006001600160a01b03168382815181106127b7576127b7613348565b6020026020010151600001516001600160a01b0316141561281a5760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e740000000000604482015260640161069c565b82818151811061282c5761282c613348565b6020026020010151602001516001600160601b0316600014156128915760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f736974697665604482015260640161069c565b8281815181106128a3576128a3613348565b6020026020010151602001516001600160601b0316826128c391906135aa565b9150600a60008581526020019081526020016000208382815181106128ea576128ea613348565b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b0390911617910155806129368161372f565b915050612791565b50612710811061299e5760405162461bcd60e51b815260206004820152602560248201527f526f79616c747920746f74616c2076616c75652073686f756c64206265203c20604482015264031303030360dc1b606482015260840161069c565b6107d28383612bb8565b60006001600160a01b0384163b15612af557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129ec90339089908890889060040161375e565b602060405180830381600087803b158015612a0657600080fd5b505af1925050508015612a36575060408051601f3d908101601f19168201909252612a3391810190613790565b60015b612adb573d808015612a64576040519150601f19603f3d011682016040523d82523d6000602084013e612a69565b606091505b508051612ad35760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161069c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d1a565b506001949350505050565b6001600160a01b038316612b5b57612b5681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b7e565b816001600160a01b0316836001600160a01b031614612b7e57612b7e8382612bf5565b6001600160a01b038216612b95576107d281612c92565b826001600160a01b0316826001600160a01b0316146107d2576107d28282612d41565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df8282604051612be99291906137ad565b60405180910390a15050565b60006001612c0284610f28565b612c0c9190613593565b600083815260076020526040902054909150808214612c5f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612ca490600190613593565b60008381526009602052604081205460088054939450909284908110612ccc57612ccc613348565b906000526020600020015490508060088381548110612ced57612ced613348565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612d2557612d256135c2565b6001900381819060005260206000200160009055905550505050565b6000612d4c83610f28565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114612d9b57600080fd5b50565b600060208284031215612db057600080fd5b81356113fd81612d85565b60005b83811015612dd6578181015183820152602001612dbe565b838111156111f65750506000910152565b60008151808452612dff816020860160208601612dbb565b601f01601f19169290920160200192915050565b6020815260006113fd6020830184612de7565b600060208284031215612e3857600080fd5b5035919050565b80356001600160a01b038116811461272d57600080fd5b60008060408385031215612e6957600080fd5b612e7283612e3f565b946020939093013593505050565b600080600060608486031215612e9557600080fd5b612e9e84612e3f565b9250612eac60208501612e3f565b9150604084013590509250925092565b60008060408385031215612ecf57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612f1757612f17612ede565b60405290565b604051610100810167ffffffffffffffff81118282101715612f1757612f17612ede565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f6a57612f6a612ede565b604052919050565b64ffffffffff81168114612d9b57600080fd5b68ffffffffffffffffff81168114612d9b57600080fd5b61ffff81168114612d9b57600080fd5b600060808284031215612fbe57600080fd5b612fc6612ef4565b90508135612fd381612f72565b81526020820135612fe381612f85565b60208201526040820135612ff681612f9c565b6040820152606082013561300981612f9c565b606082015292915050565b8015158114612d9b57600080fd5b803561272d81613014565b6000806000808486036101c081121561304557600080fd5b61304e86612e3f565b94506020860135935061306360408701612e3f565b925061016080605f198301121561307957600080fd5b613081612f1d565b91506130908860608901612fac565b825260e0870135602083015261010087013560408301526101208701356060830152610140870135608083015286013560a082015261018086013560c08201526130dd6101a08701613022565b60e0820152939692955090935050565b6000602082840312156130ff57600080fd5b6113fd82612e3f565b6000806000806080858703121561311e57600080fd5b61312785612e3f565b93506020850135925061313c60408601612e3f565b915061314a60608601612e3f565b905092959194509250565b6000806040838503121561316857600080fd5b8235915061317860208401612e3f565b90509250929050565b6000806040838503121561319457600080fd5b61319d83612e3f565b915060208301356131ad81613014565b809150509250929050565b600080600080608085870312156131ce57600080fd5b6131d785612e3f565b935060206131e6818701612e3f565b935060408601359250606086013567ffffffffffffffff8082111561320a57600080fd5b818801915088601f83011261321e57600080fd5b81358181111561323057613230612ede565b613242601f8201601f19168501612f41565b9150808252898482850101111561325857600080fd5b808484018584013760008482840101525080935050505092959194509250565b600081518084526020808501945080840160005b838110156132c557815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010161328c565b509495945050505050565b6020815260006113fd6020830184613278565b600080604083850312156132f657600080fd5b6132ff83612e3f565b915061317860208401612e3f565b600181811c9082168061332157607f821691505b6020821081141561334257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b805161272d81612f9c565b805161272d81613014565b600060e0828403121561338657600080fd5b60405160e0810181811067ffffffffffffffff821117156133a9576133a9612ede565b60405282516133b781612f72565b815260208301516133c781612f85565b602082015260408301516133da81612f85565b604082015260608301516133ed81612f9c565b60608201526133fe6080840161335e565b608082015261340f60a0840161335e565b60a082015261342060c08401613369565b60c08201529392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561345c5761345c61342c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261348657613486613461565b500490565b600061016082019050825164ffffffffff815116835268ffffffffffffffffff6020820151166020840152604081015161ffff808216604086015280606084015116606086015250505060208301516080830152604083015160a0830152606083015160c0830152608083015160e083015260a083015161010083015260c083015161012083015260e083015161352761014084018215159052565b5092915050565b60008351613540818460208801612dbb565b835190830190613554818360208801612dbb565b01949350505050565b60006020828403121561356f57600080fd5b5051919050565b60006020828403121561358857600080fd5b81516113fd81613014565b6000828210156135a5576135a561342c565b500390565b600082198211156135bd576135bd61342c565b500190565b634e487b7160e01b600052603160045260246000fd5b805160ff8116811461272d57600080fd5b805163ffffffff8116811461272d57600080fd5b600080600080600080600080888a0361016081121561361b57600080fd5b608081121561362957600080fd5b50613632612ef4565b895161363d81612f72565b815260208a015161364d81612f85565b602082015260408a015161366081612f9c565b604082015260608a015161367381612f9c565b6060820152975061368660808a0161335e565b965061369460a08a016135d8565b95506136a260c08a0161335e565b94506136b060e08a0161335e565b93506136bf6101008a016135e9565b92506136ce6101208a016135d8565b91506136dd6101408a01613369565b90509295985092959890939650565b600084516136fe818460208901612dbb565b845190830190613712818360208901612dbb565b8451910190613725818360208801612dbb565b0195945050505050565b60006000198214156137435761374361342c565b5060010190565b60008261375957613759613461565b500690565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261179d6080830184612de7565b6000602082840312156137a257600080fd5b81516113fd81612d85565b828152604060208201526000611d1a604083018461327856fea2646970667358221220190f74f6d37d6347cc990a86eabcba509094f51b095460f06bb88097c7a635f364736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39
-----Decoded View---------------
Arg [0] : hexAddress (address): 0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39
Deployed Bytecode Sourcemap
65545:15386:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80482:446;;;;;;:::i;:::-;;:::i;:::-;;;661:14:1;;654:22;636:41;;624:2;609:18;80482:446:0;;;;;;;;21102:100;;;:::i;:::-;;;;;;;:::i;22661:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1788:55:1;;;1770:74;;1758:2;1743:18;22661:221:0;1624:226:1;22184:411:0;;;;;;:::i;:::-;;:::i;:::-;;66209:46;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;66209:46:0;;;34927:113;35015:10;:17;34927:113;;;2461:25:1;;;2449:2;2434:18;34927:113:0;2315:177:1;23411:339:0;;;;;;:::i;:::-;;:::i;71597:321::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;2974:4:1;3016:3;3005:9;3001:19;2993:27;;3066:12;3057:6;3051:13;3047:32;3036:9;3029:51;3127:4;3119:6;3115:17;3109:24;3152:20;3228:2;3214:12;3210:21;3203:4;3192:9;3188:20;3181:51;3300:2;3292:4;3284:6;3280:17;3274:24;3270:33;3263:4;3252:9;3248:20;3241:63;;;3353:4;3345:6;3341:17;3335:24;3378:6;3442:2;3426:14;3422:23;3415:4;3404:9;3400:20;3393:53;3514:2;3506:4;3498:6;3494:17;3488:24;3484:33;3477:4;3466:9;3462:20;3455:63;3586:2;3578:4;3570:6;3566:17;3560:24;3556:33;3549:4;3538:9;3534:20;3527:63;;;3660:4;3652:6;3648:17;3642:24;3635:32;3628:40;3621:4;3610:9;3606:20;3599:70;2830:845;;;;;79531:432:0;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4125:55:1;;;4107:74;;4212:2;4197:18;;4190:34;;;;4080:18;79531:432:0;3933:297:1;34595:256:0;;;;;;:::i;:::-;;:::i;77244:520::-;;;;;;:::i;:::-;;:::i;71118:154::-;;;;;;:::i;:::-;;:::i;23821:185::-;;;;;;:::i;:::-;;:::i;35117:233::-;;;;;;:::i;:::-;;:::i;78337:786::-;;;;;;:::i;:::-;;:::i;20796:239::-;;;;;;:::i;:::-;;:::i;20526:208::-;;;;;;:::i;:::-;;:::i;80135:130::-;53210:42;80135:130;;21271:104;;;:::i;74979:951::-;;;;;;:::i;:::-;;:::i;22954:155::-;;;;;;:::i;:::-;;:::i;24077:328::-;;;;;;:::i;:::-;;:::i;70715:157::-;;;;;;:::i;:::-;-1:-1:-1;;;;;70843:14:0;70811:7;70843:14;;;:8;:14;;;;;:21;;70715:157;76167:622;;;;;;:::i;:::-;;:::i;21446:334::-;;;;;;:::i;:::-;;:::i;65071:137::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;73694:927::-;;;;;;:::i;:::-;;:::i;23180:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23301:25:0;;;23277:4;23301:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23180:164;72301:945;;;;;;:::i;:::-;;:::i;66156:46::-;;;;;;:::i;:::-;;:::i;80482:446::-;80654:4;-1:-1:-1;;;;;;80680:53:0;;-1:-1:-1;;;80680:53:0;80676:97;;;-1:-1:-1;80757:4:0;;80482:446;-1:-1:-1;80482:446:0:o;80676:97::-;-1:-1:-1;;;;;;80789:36:0;;-1:-1:-1;;;80789:36:0;80785:80;;;-1:-1:-1;80849:4:0;;80482:446;-1:-1:-1;80482:446:0:o;80785:80::-;80884:36;80908:11;80884:23;:36::i;:::-;80877:43;80482:446;-1:-1:-1;;80482:446:0:o;21102:100::-;21156:13;21189:5;21182:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21102:100;:::o;22661:221::-;22737:7;26004:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26004:16:0;22757:73;;;;-1:-1:-1;;;22757:73:0;;11566:2:1;22757:73:0;;;11548:21:1;11605:2;11585:18;;;11578:30;11644:34;11624:18;;;11617:62;-1:-1:-1;;;11695:18:1;;;11688:42;11747:19;;22757:73:0;;;;;;;;;-1:-1:-1;22850:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22850:24:0;;22661:221::o;22184:411::-;22265:13;22281:23;22296:7;22281:14;:23::i;:::-;22265:39;;22329:5;-1:-1:-1;;;;;22323:11:0;:2;-1:-1:-1;;;;;22323:11:0;;;22315:57;;;;-1:-1:-1;;;22315:57:0;;11979:2:1;22315:57:0;;;11961:21:1;12018:2;11998:18;;;11991:30;12057:34;12037:18;;;12030:62;-1:-1:-1;;;12108:18:1;;;12101:31;12149:19;;22315:57:0;11777:397:1;22315:57:0;15949:10;-1:-1:-1;;;;;22407:21:0;;;;:62;;-1:-1:-1;22432:37:0;22449:5;15949:10;23180:164;:::i;22432:37::-;22385:168;;;;-1:-1:-1;;;22385:168:0;;12381:2:1;22385:168:0;;;12363:21:1;12420:2;12400:18;;;12393:30;12459:34;12439:18;;;12432:62;12530:26;12510:18;;;12503:54;12574:19;;22385:168:0;12179:420:1;22385:168:0;22566:21;22575:2;22579:7;22566:8;:21::i;:::-;22254:341;22184:411;;:::o;23411:339::-;23606:41;15949:10;23639:7;23606:18;:41::i;:::-;23598:103;;;;-1:-1:-1;;;23598:103:0;;12806:2:1;23598:103:0;;;12788:21:1;12845:2;12825:18;;;12818:30;12884:34;12864:18;;;12857:62;-1:-1:-1;;;12935:18:1;;;12928:47;12992:19;;23598:103:0;12604:413:1;23598:103:0;23714:28;23724:4;23730:2;23734:7;23714:9;:28::i;71597:321::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71785:14:0;;;;:8;:14;;;;;71852:17;;-1:-1:-1;;71785:14:0;;;;71860:8;;71852:17;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;71852:17:0;71812:58;;71890:3;-1:-1:-1;;;;;71890:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71883:27;71597:321;-1:-1:-1;;;;;71597:321:0:o;79531:432::-;79663:16;79755:18;;;:9;:18;;;;;;;;79720:53;;;;;;;;;;;;;;;;;79663:16;;;;79720:53;79755:18;79720:53;79663:16;;79720:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;79720:53:0;;;;-1:-1:-1;;;79720:53:0;;-1:-1:-1;;;;;79720:53:0;;;;;;;;;;;;;;;;;;;;;;79818:1;79798:10;:17;:21;79794:127;;;79844:10;79855:1;79844:13;;;;;;;;:::i;:::-;;;;;;;:21;;;79903:5;79880:10;79891:1;79880:13;;;;;;;;:::i;:::-;;;;;;;:19;;;-1:-1:-1;;;;;79868:31:0;:9;:31;;;;:::i;:::-;79867:41;;;;:::i;:::-;79836:73;;;;;;;79794:127;79949:1;79953;79933:22;;;;;79531:432;;;;;;:::o;34595:256::-;34692:7;34728:23;34745:5;34728:16;:23::i;:::-;34720:5;:31;34712:87;;;;-1:-1:-1;;;34712:87:0;;15355:2:1;34712:87:0;;;15337:21:1;15394:2;15374:18;;;15367:30;15433:34;15413:18;;;15406:62;-1:-1:-1;;;15484:18:1;;;15477:41;15535:19;;34712:87:0;15153:407:1;34712:87:0;-1:-1:-1;;;;;;34817:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34595:256::o;77244:520::-;77442:8;;-1:-1:-1;;;;;77442:8:0;77428:10;:22;77420:85;;;;-1:-1:-1;;;77420:85:0;;15767:2:1;77420:85:0;;;15749:21:1;15806:2;15786:18;;;15779:30;15845:34;15825:18;;;15818:62;-1:-1:-1;;;15896:18:1;;;15889:35;15941:19;;77420:85:0;15565:401:1;77420:85:0;-1:-1:-1;;;;;77546:16:0;;77518:25;77546:16;;;:8;:16;;;;;77597:17;;77546:16;;77605:8;;77597:17;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;77583:31:0;;;77597:17;;77583:31;77575:89;;;;-1:-1:-1;;;77575:89:0;;16173:2:1;77575:89:0;;;16155:21:1;;;16192:18;;;16185:30;16251:34;16231:18;;;16224:62;16303:18;;77575:89:0;15971:356:1;77575:89:0;77739:17;;-1:-1:-1;;;77739:17:0;;77717:10;;-1:-1:-1;;;;;77739:10:0;;;;;:17;;77750:5;;77739:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77409:355;;77244:520;;;;:::o;71118:154::-;-1:-1:-1;;;;;70843:14:0;;71218:7;70843:14;;;:8;:14;;;;;:21;71250:14;70715:157;23821:185;23959:39;23976:4;23982:2;23986:7;23959:39;;;;;;;;;;;;:16;:39::i;35117:233::-;35192:7;35228:30;35015:10;:17;;34927:113;35228:30;35220:5;:38;35212:95;;;;-1:-1:-1;;;35212:95:0;;17616:2:1;35212:95:0;;;17598:21:1;17655:2;17635:18;;;17628:30;17694:34;17674:18;;;17667:62;-1:-1:-1;;;17745:18:1;;;17738:42;17797:19;;35212:95:0;17414:408:1;35212:95:0;35325:10;35336:5;35325:17;;;;;;;;:::i;:::-;;;;;;;;;35318:24;;35117:233;;;:::o;78337:786::-;78538:8;;-1:-1:-1;;;;;78538:8:0;78524:10;:22;78516:85;;;;-1:-1:-1;;;78516:85:0;;15767:2:1;78516:85:0;;;15749:21:1;15806:2;15786:18;;;15779:30;15845:34;15825:18;;;15818:62;-1:-1:-1;;;15896:18:1;;;15889:35;15941:19;;78516:85:0;15565:401:1;78516:85:0;-1:-1:-1;;;;;78649:23:0;;;78614:32;78649:23;;;:8;:23;;;;;;78714:19;;;;;;;78768:24;;78649:23;;78783:8;;78768:24;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;78754:38:0;;;78768:24;;78754:38;78746:96;;;;-1:-1:-1;;;78746:96:0;;16173:2:1;78746:96:0;;;16155:21:1;;;16192:18;;;16185:30;16251:34;16231:18;;;16224:62;16303:18;;78746:96:0;15971:356:1;78746:96:0;78855:27;;;;;;;-1:-1:-1;78855:27:0;;;;;;;;;-1:-1:-1;;;;;;78855:27:0;-1:-1:-1;;;;;78855:27:0;;;;;78893:35;78903:14;78919:8;78893:9;:35::i;:::-;79087:9;-1:-1:-1;;;;;78946:169:0;79051:13;-1:-1:-1;;;;;78946:169:0;79018:10;-1:-1:-1;;;;;78946:169:0;;78980:15;78946:169;;;;2461:25:1;;2449:2;2434:18;;2315:177;78946:169:0;;;;;;;;78505:618;;78337:786;;;;:::o;20796:239::-;20868:7;20904:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20904:16:0;20939:19;20931:73;;;;-1:-1:-1;;;20931:73:0;;18029:2:1;20931:73:0;;;18011:21:1;18068:2;18048:18;;;18041:30;18107:34;18087:18;;;18080:62;-1:-1:-1;;;18158:18:1;;;18151:39;18207:19;;20931:73:0;17827:405:1;20526:208:0;20598:7;-1:-1:-1;;;;;20626:19:0;;20618:74;;;;-1:-1:-1;;;20618:74:0;;18439:2:1;20618:74:0;;;18421:21:1;18478:2;18458:18;;;18451:30;18517:34;18497:18;;;18490:62;-1:-1:-1;;;18568:18:1;;;18561:40;18618:19;;20618:74:0;18237:406:1;20618:74:0;-1:-1:-1;;;;;;20710:16:0;;;;;:9;:16;;;;;;;20526:208::o;21271:104::-;21327:13;21360:7;21353:14;;;;;:::i;74979:951::-;75167:10;75105:7;75158:20;;;:8;:20;;;;;75213:17;;75158:20;;75221:8;;75213:17;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;75199:31:0;;;75213:17;;75199:31;75191:89;;;;-1:-1:-1;;;75191:89:0;;16173:2:1;75191:89:0;;;16155:21:1;;;16192:18;;;16185:30;16251:34;16231:18;;;16224:62;16303:18;;75191:89:0;15971:356:1;75191:89:0;75333:10;75293:20;75381:13;75333:10;75381:8;:13::i;:::-;75416:15;;;;75355:39;;-1:-1:-1;75416:24:0;75407:87;;;;-1:-1:-1;;;75407:87:0;;18850:2:1;75407:87:0;;;18832:21:1;18889:2;18869:18;;;18862:30;18928:34;18908:18;;;18901:62;-1:-1:-1;;;18979:18:1;;;18972:34;19023:19;;75407:87:0;18648:400:1;75407:87:0;75507:21;:9;41377:19;;41395:1;41377:19;;;41288:127;75507:21;75541:18;75562:19;:9;41258:14;;41166:114;75562:19;75541:40;;75594:29;75600:10;75612;75594:5;:29::i;:::-;75635:20;;;;:8;:20;;;;;:33;;-1:-1:-1;;;;;;75635:33:0;-1:-1:-1;;;;;75635:33:0;;;;;75681:25;75635:20;75681:13;:25::i;:::-;75719:28;75729:7;75738:8;75719:9;:28::i;:::-;75871:10;-1:-1:-1;;;;;75765:127:0;75846:10;-1:-1:-1;;;;;75765:127:0;75821:10;75765:127;75791:15;75765:127;;;;2461:25:1;;2449:2;2434:18;;2315:177;75765:127:0;;;;;;;;75912:10;74979:951;-1:-1:-1;;;;;;74979:951:0:o;22954:155::-;23049:52;15949:10;23082:8;23092;23049:18;:52::i;:::-;22954:155;;:::o;24077:328::-;24252:41;15949:10;24285:7;24252:18;:41::i;:::-;24244:103;;;;-1:-1:-1;;;24244:103:0;;12806:2:1;24244:103:0;;;12788:21:1;12845:2;12825:18;;;12818:30;12884:34;12864:18;;;12857:62;-1:-1:-1;;;12935:18:1;;;12928:47;12992:19;;24244:103:0;12604:413:1;24244:103:0;24358:39;24372:4;24378:2;24382:7;24391:5;24358:13;:39::i;:::-;24077:328;;;;:::o;76167:622::-;76265:7;76318:10;76298:16;76306:7;76298;:16::i;:::-;-1:-1:-1;;;;;76298:30:0;;76290:101;;;;-1:-1:-1;;;76290:101:0;;19255:2:1;76290:101:0;;;19237:21:1;19294:2;19274:18;;;19267:30;19333:34;19313:18;;;19306:62;-1:-1:-1;;;19384:18:1;;;19377:43;19437:19;;76290:101:0;19053:409:1;76290:101:0;76404:18;76425:17;;;:8;:17;;;;;;;;;;76490:10;76481:20;;:8;:20;;;;;76514:24;;76425:17;76514:24;;;;;;;;;;;;;-1:-1:-1;;;;;76425:17:0;;;-1:-1:-1;;;;;;76514:24:0;;;;;;;;76549:17;;;;;;;;:30;;;;;76592:14;76425:17;76592:5;:14::i;:::-;76730:10;-1:-1:-1;;;;;76624:127:0;76705:10;-1:-1:-1;;;;;76624:127:0;76682:7;76624:127;76652:15;76624:127;;;;2461:25:1;;2449:2;2434:18;;2315:177;76624:127:0;;;;;;;;-1:-1:-1;76771:10:0;76167:622;-1:-1:-1;;76167:622:0:o;21446:334::-;25980:4;26004:16;;;:7;:16;;;;;;21519:13;;-1:-1:-1;;;;;26004:16:0;21545:76;;;;-1:-1:-1;;;21545:76:0;;19669:2:1;21545:76:0;;;19651:21:1;19708:2;19688:18;;;19681:30;19747:34;19727:18;;;19720:62;-1:-1:-1;;;19798:18:1;;;19791:45;19853:19;;21545:76:0;19467:411:1;21545:76:0;21634:21;21658:10;:8;:10::i;:::-;21634:34;;21710:1;21692:7;21686:21;:25;:86;;;;;;;;;;;;;;;;;21738:7;21747:18;:7;:16;:18::i;:::-;21721:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21686:86;21679:93;21446:334;-1:-1:-1;;;21446:334:0:o;65071:137::-;65146:21;65187:9;:13;65197:2;65187:13;;;;;;;;;;;65180:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65180:20:0;;;;-1:-1:-1;;;65180:20:0;;-1:-1:-1;;;;;65180:20:0;;;;;;;;;;;;;;;;;;;;;;65071:137;;;:::o;73694:927::-;73877:10;73815:7;73868:20;;;:8;:20;;;;;73923:17;;73868:20;;73931:8;;73923:17;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;73909:31:0;;;73923:17;;73909:31;73901:89;;;;-1:-1:-1;;;73901:89:0;;16173:2:1;73901:89:0;;;16155:21:1;;;16192:18;;;16185:30;16251:34;16231:18;;;16224:62;16303:18;;73901:89:0;15971:356:1;73901:89:0;74043:10;74003:20;74091:13;74043:10;74091:8;:13::i;:::-;74126:15;;;;74065:39;;-1:-1:-1;74126:24:0;74117:100;;;;-1:-1:-1;;;74117:100:0;;20560:2:1;74117:100:0;;;20542:21:1;20599:2;20579:18;;;20572:30;20638:34;20618:18;;;20611:62;-1:-1:-1;;;20689:18:1;;;20682:47;20746:19;;74117:100:0;20358:413:1;74117:100:0;74230:3;-1:-1:-1;;;;;74230:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74261:47:0;;74268:15;2461:25:1;;74297:10:0;;-1:-1:-1;;;;;;74261:47:0;;;-1:-1:-1;74261:47:0;;2449:2:1;2434:18;74261:47:0;;;;;;;74342:3;;:25;;-1:-1:-1;;;74342:25:0;;-1:-1:-1;;;;;1788:55:1;;;74342:25:0;;;1770:74:1;74321:18:0;;74342:3;;:13;;1743:18:1;;74342:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74321:46;-1:-1:-1;74384:14:0;;74380:163;;74423:3;;:52;;-1:-1:-1;;;74423:52:0;;-1:-1:-1;;;;;21246:15:1;;;74423:52:0;;;21228:34:1;74452:10:0;21278:18:1;;;21271:43;21330:18;;;21323:34;;;74423:3:0;;;;:16;;21140:18:1;;74423:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74415:116;;;;-1:-1:-1;;;74415:116:0;;21820:2:1;74415:116:0;;;21802:21:1;21859:2;21839:18;;;21832:30;21898:34;21878:18;;;21871:62;-1:-1:-1;;;21949:18:1;;;21942:32;21991:19;;74415:116:0;21618:398:1;74415:116:0;74555:28;74565:7;74574:8;74555:9;:28::i;:::-;74603:10;73694:927;-1:-1:-1;;;;;;73694:927:0:o;72301:945::-;72461:3;;:25;;-1:-1:-1;;;72461:25:0;;72475:10;72461:25;;;1770:74:1;72418:7:0;;-1:-1:-1;;;;;72461:3:0;;:13;;1743:18:1;;72461:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72451:6;:35;;72443:103;;;;-1:-1:-1;;;72443:103:0;;22223:2:1;72443:103:0;;;22205:21:1;22262:2;22242:18;;;22235:30;22301:34;22281:18;;;22274:62;-1:-1:-1;;;22352:18:1;;;22345:40;22402:19;;72443:103:0;22021:406:1;72443:103:0;72596:10;72559:25;72587:20;;;:8;:20;;;;;72654:18;;72587:20;;72559:25;72641:32;;-1:-1:-1;;;;;72654:18:0;72641:12;:32::i;:::-;72761:10;;72746:26;;-1:-1:-1;;;72746:26:0;;-1:-1:-1;;;;;72761:10:0;;;72746:26;;;1770:74:1;72620:53:0;;-1:-1:-1;72620:53:0;;72746:14;;;;;;1743:18:1;;72746:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72785:24:0;;;;;;;;-1:-1:-1;72785:24:0;;;;;;;;;;;-1:-1:-1;;;;;;72785:24:0;-1:-1:-1;;;;;72785:24:0;;;;;72839:14;;-1:-1:-1;;;72839:18:0;;-1:-1:-1;72785:24:0;72839:18;:::i;:::-;72878:3;;:48;;-1:-1:-1;;;72878:48:0;;72895:10;72878:48;;;21228:34:1;-1:-1:-1;;;;;21298:15:1;;;21278:18;;;21271:43;21330:18;;;21323:34;;;72820:37:0;;-1:-1:-1;72878:3:0;;;:16;;21140:18:1;;72878:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72870:127;;;;-1:-1:-1;;;72870:127:0;;22764:2:1;72870:127:0;;;22746:21:1;22803:2;22783:18;;;22776:30;22842:34;22822:18;;;22815:62;22913:23;22893:18;;;22886:51;22954:19;;72870:127:0;22562:417:1;72870:127:0;73010:18;;-1:-1:-1;;;73010:18:0;;;;;2461:25:1;;;-1:-1:-1;;;;;73010:10:0;;;;;2434:18:1;;73010::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73066:8:0;;73086:55;;-1:-1:-1;;;73086:55:0;;;;;23186:25:1;;;-1:-1:-1;;;;;23308:15:1;;;23288:18;;;23281:43;73130:10:0;23340:18:1;;;23333:43;73066:8:0;;;;-1:-1:-1;73066:8:0;;-1:-1:-1;73086:21:0;;23159:18:1;;73086:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73159:49:0;;73168:15;2461:25:1;;73197:10:0;;-1:-1:-1;;;;;;73159:49:0;;;-1:-1:-1;73159:49:0;;2449:2:1;2434:18;73159:49:0;;;;;;;-1:-1:-1;73228:10:0;;72301:945;-1:-1:-1;;;;;;72301:945:0:o;66156:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66156:46:0;;-1:-1:-1;66156:46:0;;-1:-1:-1;66156:46:0:o;34287:224::-;34389:4;-1:-1:-1;;;;;;34413:50:0;;-1:-1:-1;;;34413:50:0;;:90;;;34467:36;34491:11;34467:23;:36::i;29897:174::-;29972:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29972:29:0;-1:-1:-1;;;;;29972:29:0;;;;;;;;:24;;30026:23;29972:24;30026:14;:23::i;:::-;-1:-1:-1;;;;;30017:46:0;;;;;;;;;;;29897:174;;:::o;26209:348::-;26302:4;26004:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26004:16:0;26319:73;;;;-1:-1:-1;;;26319:73:0;;23589:2:1;26319:73:0;;;23571:21:1;23628:2;23608:18;;;23601:30;23667:34;23647:18;;;23640:62;-1:-1:-1;;;23718:18:1;;;23711:42;23770:19;;26319:73:0;23387:408:1;26319:73:0;26403:13;26419:23;26434:7;26419:14;:23::i;:::-;26403:39;;26472:5;-1:-1:-1;;;;;26461:16:0;:7;-1:-1:-1;;;;;26461:16:0;;:51;;;;26505:7;-1:-1:-1;;;;;26481:31:0;:20;26493:7;26481:11;:20::i;:::-;-1:-1:-1;;;;;26481:31:0;;26461:51;:87;;;-1:-1:-1;;;;;;23301:25:0;;;23277:4;23301:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26516:32;26453:96;26209:348;-1:-1:-1;;;;26209:348:0:o;29201:578::-;29360:4;-1:-1:-1;;;;;29333:31:0;:23;29348:7;29333:14;:23::i;:::-;-1:-1:-1;;;;;29333:31:0;;29325:85;;;;-1:-1:-1;;;29325:85:0;;24002:2:1;29325:85:0;;;23984:21:1;24041:2;24021:18;;;24014:30;24080:34;24060:18;;;24053:62;-1:-1:-1;;;24131:18:1;;;24124:39;24180:19;;29325:85:0;23800:405:1;29325:85:0;-1:-1:-1;;;;;29429:16:0;;29421:65;;;;-1:-1:-1;;;29421:65:0;;24412:2:1;29421:65:0;;;24394:21:1;24451:2;24431:18;;;24424:30;24490:34;24470:18;;;24463:62;-1:-1:-1;;;24541:18:1;;;24534:34;24585:19;;29421:65:0;24210:400:1;29421:65:0;29499:39;29520:4;29526:2;29530:7;29499:20;:39::i;:::-;29603:29;29620:1;29624:7;29603:8;:29::i;:::-;-1:-1:-1;;;;;29645:15:0;;;;;;:9;:15;;;;;:20;;29664:1;;29645:15;:20;;29664:1;;29645:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29676:13:0;;;;;;:9;:13;;;;;:18;;29693:1;;29676:13;:18;;29693:1;;29676:18;:::i;:::-;;;;-1:-1:-1;;29705:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29705:21:0;-1:-1:-1;;;;;29705:21:0;;;;;;;;;29744:27;;29705:16;;29744:27;;;;;;;29201:578;;;:::o;68522:299::-;68665:14;;68645:17;;68665:18;;68682:1;;68665:18;:::i;:::-;68645:38;;68712:9;68700:8;:21;68696:92;;68758:7;68766:9;68758:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68758:18:0;68738:7;68746:8;68738:17;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;;-1:-1:-1;;;;;68738:38:0;;;;;-1:-1:-1;;;;;68738:38:0;;;;;;68696:92;68800:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;68800:13:0;;;;;-1:-1:-1;;;;;;68800:13:0;;;;;;-1:-1:-1;;;68522:299:0:o;69086:916::-;69193:17;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69193:17:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69267:33:0;69311:34;69356:32;69399:33;69443:35;69489;69535:31;69745:3;-1:-1:-1;;;;;69745:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69776:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69086:916;-1:-1:-1;;;;;;;;;;69086:916:0:o;27893:382::-;-1:-1:-1;;;;;27973:16:0;;27965:61;;;;-1:-1:-1;;;27965:61:0;;26821:2:1;27965:61:0;;;26803:21:1;;;26840:18;;;26833:30;26899:34;26879:18;;;26872:62;26951:18;;27965:61:0;26619:356:1;27965:61:0;25980:4;26004:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26004:16:0;:30;28037:58;;;;-1:-1:-1;;;28037:58:0;;27182:2:1;28037:58:0;;;27164:21:1;27221:2;27201:18;;;27194:30;27260;27240:18;;;27233:58;27308:18;;28037:58:0;26980:352:1;28037:58:0;28108:45;28137:1;28141:2;28145:7;28108:20;:45::i;:::-;-1:-1:-1;;;;;28166:13:0;;;;;;:9;:13;;;;;:18;;28183:1;;28166:13;:18;;28183:1;;28166:18;:::i;:::-;;;;-1:-1:-1;;28195:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28195:21:0;-1:-1:-1;;;;;28195:21:0;;;;;;;;28234:33;;28195:16;;;28234:33;;28195:16;;28234:33;27893:382;;:::o;70179:310::-;70304:21;;;70323:1;70304:21;;;;;;;;;70269:32;;70304:21;;;;-1:-1:-1;;;;;;;;;;;;;;;;;70304:21:0;;;;;;;;;;;;;;;70269:56;;65785:2;70336:10;70347:1;70336:13;;;;;;;;:::i;:::-;;;;;;;:19;;:39;-1:-1:-1;;;;;70336:39:0;;;-1:-1:-1;;;;;70336:39:0;;;;;53210:42;70386:10;70397:1;70386:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;70386:49:0;;;;;70446:35;70461:7;70470:10;70446:14;:35::i;30213:315::-;30368:8;-1:-1:-1;;;;;30359:17:0;:5;-1:-1:-1;;;;;30359:17:0;;;30351:55;;;;-1:-1:-1;;;30351:55:0;;27539:2:1;30351:55:0;;;27521:21:1;27578:2;27558:18;;;27551:30;27617:27;27597:18;;;27590:55;27662:18;;30351:55:0;27337:349:1;30351:55:0;-1:-1:-1;;;;;30417:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30417:46:0;;;;;;;;;;30479:41;;636::1;;;30479::0;;609:18:1;30479:41:0;;;;;;;30213:315;;;:::o;25287:::-;25444:28;25454:4;25460:2;25464:7;25444:9;:28::i;:::-;25491:48;25514:4;25520:2;25524:7;25533:5;25491:22;:48::i;:::-;25483:111;;;;-1:-1:-1;;;25483:111:0;;27893:2:1;25483:111:0;;;27875:21:1;27932:2;27912:18;;;27905:30;27971:34;27951:18;;;27944:62;-1:-1:-1;;;28022:18:1;;;28015:48;28080:19;;25483:111:0;27691:414:1;28504:360:0;28564:13;28580:23;28595:7;28580:14;:23::i;:::-;28564:39;;28616:48;28637:5;28652:1;28656:7;28616:20;:48::i;:::-;28705:29;28722:1;28726:7;28705:8;:29::i;:::-;-1:-1:-1;;;;;28747:16:0;;;;;;:9;:16;;;;;:21;;28767:1;;28747:16;:21;;28767:1;;28747:21;:::i;:::-;;;;-1:-1:-1;;28786:16:0;;;;:7;:16;;;;;;28779:23;;-1:-1:-1;;;;;;28779:23:0;;;28820:36;28794:7;;28786:16;-1:-1:-1;;;;;28820:36:0;;;;;28786:16;;28820:36;28553:311;28504:360;:::o;66930:278::-;67041:13;67072:21;67096:31;67113:13;67096:16;:31::i;:::-;67072:55;;67169:9;;;;;;;;;;;;;;;;;67180:7;67189:9;;;;;;;;;;;;;-1:-1:-1;;;67189:9:0;;;67152:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67138:62;;;66930:278;:::o;16309:723::-;16365:13;16586:10;16582:53;;-1:-1:-1;;16613:10:0;;;;;;;;;;;;-1:-1:-1;;;16613:10:0;;;;;16309:723::o;16582:53::-;16660:5;16645:12;16701:78;16708:9;;16701:78;;16734:8;;;;:::i;:::-;;-1:-1:-1;16757:10:0;;-1:-1:-1;16765:2:0;16757:10;;:::i;:::-;;;16701:78;;;16789:19;16821:6;16811:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16811:17:0;;16789:39;;16839:154;16846:10;;16839:154;;16873:11;16883:1;16873:11;;:::i;:::-;;-1:-1:-1;16942:10:0;16950:2;16942:5;:10;:::i;:::-;16929:24;;:2;:24;:::i;:::-;16916:39;;16899:6;16906;16899:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16899:56:0;;;;;;;;-1:-1:-1;16970:11:0;16979:2;16970:11;;:::i;:::-;;;16839:154;;42626:524;42683:16;42753:4;42747:11;42784:66;42779:3;42772:79;42898:14;42892:4;42888:25;42881:4;42876:3;42872:14;42865:49;-1:-1:-1;;;42944:4:0;42939:3;42935:14;42928:90;43059:4;43054:3;43051:1;43044:20;43032:32;-1:-1:-1;;;;;;;43093:22:0;;43085:57;;;;-1:-1:-1;;;43085:57:0;;29238:2:1;43085:57:0;;;29220:21:1;29277:2;29257:18;;;29250:30;29316:24;29296:18;;;29289:52;29358:18;;43085:57:0;29036:346:1;43085:57:0;42626:524;;;:::o;20157:305::-;20259:4;-1:-1:-1;;;;;;20296:40:0;;-1:-1:-1;;;20296:40:0;;:105;;-1:-1:-1;;;;;;;20353:48:0;;-1:-1:-1;;;20353:48:0;20296:105;:158;;;-1:-1:-1;;;;;;;;;;18875:40:0;;;20418:36;18766:157;67216:239;67402:45;67429:4;67435:2;67439:7;67402:26;:45::i;63791:576::-;63881:18;;63910:329;63931:10;:17;63927:1;:21;63910:329;;;64011:3;-1:-1:-1;;;;;63978:37:0;:10;63989:1;63978:13;;;;;;;;:::i;:::-;;;;;;;:21;;;-1:-1:-1;;;;;63978:37:0;;;63970:77;;;;-1:-1:-1;;;63970:77:0;;29589:2:1;63970:77:0;;;29571:21:1;29628:2;29608:18;;;29601:30;29667:29;29647:18;;;29640:57;29714:18;;63970:77:0;29387:351:1;63970:77:0;64070:10;64081:1;64070:13;;;;;;;;:::i;:::-;;;;;;;:19;;;-1:-1:-1;;;;;64070:24:0;64093:1;64070:24;;64062:69;;;;-1:-1:-1;;;64062:69:0;;29945:2:1;64062:69:0;;;29927:21:1;;;29964:18;;;29957:30;30023:34;30003:18;;;29996:62;30075:18;;64062:69:0;29743:356:1;64062:69:0;64160:10;64171:1;64160:13;;;;;;;;:::i;:::-;;;;;;;:19;;;-1:-1:-1;;;;;64146:33:0;;;;;;:::i;:::-;;;64194:9;:13;64204:2;64194:13;;;;;;;;;;;64213:10;64224:1;64213:13;;;;;;;;:::i;:::-;;;;;;;;;;;;64194:33;;;;;;;-1:-1:-1;64194:33:0;;;;;;;;;;;;;;-1:-1:-1;;;;;64194:33:0;-1:-1:-1;;;64194:33:0;-1:-1:-1;;;;;64194:33:0;;;;;;;63950:3;;;;:::i;:::-;;;;63910:329;;;;64270:5;64257:10;:18;64249:68;;;;-1:-1:-1;;;64249:68:0;;30306:2:1;64249:68:0;;;30288:21:1;30345:2;30325:18;;;30318:30;30384:34;30364:18;;;30357:62;-1:-1:-1;;;30435:18:1;;;30428:35;30480:19;;64249:68:0;30104:401:1;64249:68:0;64328:31;64344:2;64348:10;64328:15;:31::i;31093:799::-;31248:4;-1:-1:-1;;;;;31269:13:0;;8321:20;8369:8;31265:620;;31305:72;;-1:-1:-1;;;31305:72:0;;-1:-1:-1;;;;;31305:36:0;;;;;:72;;15949:10;;31356:4;;31362:7;;31371:5;;31305:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31305:72:0;;;;;;;;-1:-1:-1;;31305:72:0;;;;;;;;;;;;:::i;:::-;;;31301:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31547:13:0;;31543:272;;31590:60;;-1:-1:-1;;;31590:60:0;;27893:2:1;31590:60:0;;;27875:21:1;27932:2;27912:18;;;27905:30;27971:34;27951:18;;;27944:62;-1:-1:-1;;;28022:18:1;;;28015:48;28080:19;;31590:60:0;27691:414:1;31543:272:0;31765:6;31759:13;31750:6;31746:2;31742:15;31735:38;31301:529;-1:-1:-1;;;;;;31428:51:0;-1:-1:-1;;;31428:51:0;;-1:-1:-1;31421:58:0;;31265:620;-1:-1:-1;31869:4:0;31093:799;;;;;;:::o;35963:589::-;-1:-1:-1;;;;;36169:18:0;;36165:187;;36204:40;36236:7;37379:10;:17;;37352:24;;;;:15;:24;;;;;:44;;;37407:24;;;;;;;;;;;;37275:164;36204:40;36165:187;;;36274:2;-1:-1:-1;;;;;36266:10:0;:4;-1:-1:-1;;;;;36266:10:0;;36262:90;;36293:47;36326:4;36332:7;36293:32;:47::i;:::-;-1:-1:-1;;;;;36366:16:0;;36362:183;;36399:45;36436:7;36399:36;:45::i;36362:183::-;36472:4;-1:-1:-1;;;;;36466:10:0;:2;-1:-1:-1;;;;;36466:10:0;;36462:83;;36493:40;36521:2;36525:7;36493:27;:40::i;65216:141::-;65321:28;65334:2;65338:10;65321:28;;;;;;;:::i;:::-;;;;;;;;65216:141;;:::o;38066:988::-;38332:22;38382:1;38357:22;38374:4;38357:16;:22::i;:::-;:26;;;;:::i;:::-;38394:18;38415:26;;;:17;:26;;;;;;38332:51;;-1:-1:-1;38548:28:0;;;38544:328;;-1:-1:-1;;;;;38615:18:0;;38593:19;38615:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38666:30;;;;;;:44;;;38783:30;;:17;:30;;;;;:43;;;38544:328;-1:-1:-1;38968:26:0;;;;:17;:26;;;;;;;;38961:33;;;-1:-1:-1;;;;;39012:18:0;;;;;:12;:18;;;;;:34;;;;;;;39005:41;38066:988::o;39349:1079::-;39627:10;:17;39602:22;;39627:21;;39647:1;;39627:21;:::i;:::-;39659:18;39680:24;;;:15;:24;;;;;;40053:10;:26;;39602:46;;-1:-1:-1;39680:24:0;;39602:46;;40053:26;;;;;;:::i;:::-;;;;;;;;;40031:48;;40117:11;40092:10;40103;40092:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40197:28;;;:15;:28;;;;;;;:41;;;40369:24;;;;;40362:31;40404:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39420:1008;;;39349:1079;:::o;36853:221::-;36938:14;36955:20;36972:2;36955:16;:20::i;:::-;-1:-1:-1;;;;;36986:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37031:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;36853:221:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;688:258::-;760:1;770:113;784:6;781:1;778:13;770:113;;;860:11;;;854:18;841:11;;;834:39;806:2;799:10;770:113;;;901:6;898:1;895:13;892:48;;;-1:-1:-1;;936:1:1;918:16;;911:27;688:258::o;951:::-;993:3;1031:5;1025:12;1058:6;1053:3;1046:19;1074:63;1130:6;1123:4;1118:3;1114:14;1107:4;1100:5;1096:16;1074:63;:::i;:::-;1191:2;1170:15;-1:-1:-1;;1166:29:1;1157:39;;;;1198:4;1153:50;;951:258;-1:-1:-1;;951:258:1:o;1214:220::-;1363:2;1352:9;1345:21;1326:4;1383:45;1424:2;1413:9;1409:18;1401:6;1383:45;:::i;1439:180::-;1498:6;1551:2;1539:9;1530:7;1526:23;1522:32;1519:52;;;1567:1;1564;1557:12;1519:52;-1:-1:-1;1590:23:1;;1439:180;-1:-1:-1;1439:180:1:o;1855:196::-;1923:20;;-1:-1:-1;;;;;1972:54:1;;1962:65;;1952:93;;2041:1;2038;2031:12;2056:254;2124:6;2132;2185:2;2173:9;2164:7;2160:23;2156:32;2153:52;;;2201:1;2198;2191:12;2153:52;2224:29;2243:9;2224:29;:::i;:::-;2214:39;2300:2;2285:18;;;;2272:32;;-1:-1:-1;;;2056:254:1:o;2497:328::-;2574:6;2582;2590;2643:2;2631:9;2622:7;2618:23;2614:32;2611:52;;;2659:1;2656;2649:12;2611:52;2682:29;2701:9;2682:29;:::i;:::-;2672:39;;2730:38;2764:2;2753:9;2749:18;2730:38;:::i;:::-;2720:48;;2815:2;2804:9;2800:18;2787:32;2777:42;;2497:328;;;;;:::o;3680:248::-;3748:6;3756;3809:2;3797:9;3788:7;3784:23;3780:32;3777:52;;;3825:1;3822;3815:12;3777:52;-1:-1:-1;;3848:23:1;;;3918:2;3903:18;;;3890:32;;-1:-1:-1;3680:248:1:o;4235:127::-;4296:10;4291:3;4287:20;4284:1;4277:31;4327:4;4324:1;4317:15;4351:4;4348:1;4341:15;4367:253;4439:2;4433:9;4481:4;4469:17;;4516:18;4501:34;;4537:22;;;4498:62;4495:88;;;4563:18;;:::i;:::-;4599:2;4592:22;4367:253;:::o;4625:255::-;4697:2;4691:9;4739:6;4727:19;;4776:18;4761:34;;4797:22;;;4758:62;4755:88;;;4823:18;;:::i;4885:275::-;4956:2;4950:9;5021:2;5002:13;;-1:-1:-1;;4998:27:1;4986:40;;5056:18;5041:34;;5077:22;;;5038:62;5035:88;;;5103:18;;:::i;:::-;5139:2;5132:22;4885:275;;-1:-1:-1;4885:275:1:o;5165:123::-;5250:12;5243:5;5239:24;5232:5;5229:35;5219:63;;5278:1;5275;5268:12;5293:131;5378:20;5371:5;5367:32;5360:5;5357:43;5347:71;;5414:1;5411;5404:12;5429:117;5514:6;5507:5;5503:18;5496:5;5493:29;5483:57;;5536:1;5533;5526:12;5551:708;5613:5;5661:4;5649:9;5644:3;5640:19;5636:30;5633:50;;;5679:1;5676;5669:12;5633:50;5701:22;;:::i;:::-;5692:31;;5760:9;5747:23;5779:32;5803:7;5779:32;:::i;:::-;5820:22;;5894:2;5879:18;;5866:32;5907;5866;5907;:::i;:::-;5966:2;5955:14;;5948:31;6031:2;6016:18;;6003:32;6044;6003;6044;:::i;:::-;6103:2;6092:14;;6085:31;6168:2;6153:18;;6140:32;6181;6140;6181;:::i;:::-;6240:2;6229:14;;6222:31;6233:5;5551:708;-1:-1:-1;;5551:708:1:o;6264:118::-;6350:5;6343:13;6336:21;6329:5;6326:32;6316:60;;6372:1;6369;6362:12;6387:128;6452:20;;6481:28;6452:20;6481:28;:::i;6520:1099::-;6634:6;6642;6650;6658;6702:9;6693:7;6689:23;6732:3;6728:2;6724:12;6721:32;;;6749:1;6746;6739:12;6721:32;6772:29;6791:9;6772:29;:::i;:::-;6762:39;;6848:2;6837:9;6833:18;6820:32;6810:42;;6871:38;6905:2;6894:9;6890:18;6871:38;:::i;:::-;6861:48;;6928:6;6968:2;6962;6958:7;6954:2;6950:16;6946:25;6943:45;;;6984:1;6981;6974:12;6943:45;7010:22;;:::i;:::-;6997:35;;7055:62;7109:7;7104:2;7093:9;7089:18;7055:62;:::i;:::-;7041:77;;7178:3;7163:19;;7150:33;7145:2;7134:14;;7127:57;7244:6;7229:22;;7216:36;7211:2;7200:14;;7193:60;7313:3;7298:19;;7285:33;7280:2;7269:14;;7262:57;7380:3;7365:19;;7352:33;7346:3;7335:15;;7328:58;7432:18;;7419:32;7413:3;7402:15;;7395:57;7513:3;7498:19;;7485:33;7479:3;7468:15;;7461:58;7552:36;7583:3;7568:19;;7552:36;:::i;:::-;7546:3;7535:15;;7528:61;6520:1099;;;;-1:-1:-1;6520:1099:1;;-1:-1:-1;;6520:1099:1:o;7624:186::-;7683:6;7736:2;7724:9;7715:7;7711:23;7707:32;7704:52;;;7752:1;7749;7742:12;7704:52;7775:29;7794:9;7775:29;:::i;7815:403::-;7901:6;7909;7917;7925;7978:3;7966:9;7957:7;7953:23;7949:33;7946:53;;;7995:1;7992;7985:12;7946:53;8018:29;8037:9;8018:29;:::i;:::-;8008:39;;8094:2;8083:9;8079:18;8066:32;8056:42;;8117:38;8151:2;8140:9;8136:18;8117:38;:::i;:::-;8107:48;;8174:38;8208:2;8197:9;8193:18;8174:38;:::i;:::-;8164:48;;7815:403;;;;;;;:::o;8223:254::-;8291:6;8299;8352:2;8340:9;8331:7;8327:23;8323:32;8320:52;;;8368:1;8365;8358:12;8320:52;8404:9;8391:23;8381:33;;8433:38;8467:2;8456:9;8452:18;8433:38;:::i;:::-;8423:48;;8223:254;;;;;:::o;8482:315::-;8547:6;8555;8608:2;8596:9;8587:7;8583:23;8579:32;8576:52;;;8624:1;8621;8614:12;8576:52;8647:29;8666:9;8647:29;:::i;:::-;8637:39;;8726:2;8715:9;8711:18;8698:32;8739:28;8761:5;8739:28;:::i;:::-;8786:5;8776:15;;;8482:315;;;;;:::o;8802:980::-;8897:6;8905;8913;8921;8974:3;8962:9;8953:7;8949:23;8945:33;8942:53;;;8991:1;8988;8981:12;8942:53;9014:29;9033:9;9014:29;:::i;:::-;9004:39;;9062:2;9083:38;9117:2;9106:9;9102:18;9083:38;:::i;:::-;9073:48;;9168:2;9157:9;9153:18;9140:32;9130:42;;9223:2;9212:9;9208:18;9195:32;9246:18;9287:2;9279:6;9276:14;9273:34;;;9303:1;9300;9293:12;9273:34;9341:6;9330:9;9326:22;9316:32;;9386:7;9379:4;9375:2;9371:13;9367:27;9357:55;;9408:1;9405;9398:12;9357:55;9444:2;9431:16;9466:2;9462;9459:10;9456:36;;;9472:18;;:::i;:::-;9514:53;9557:2;9538:13;;-1:-1:-1;;9534:27:1;9530:36;;9514:53;:::i;:::-;9501:66;;9590:2;9583:5;9576:17;9630:7;9625:2;9620;9616;9612:11;9608:20;9605:33;9602:53;;;9651:1;9648;9641:12;9602:53;9706:2;9701;9697;9693:11;9688:2;9681:5;9677:14;9664:45;9750:1;9745:2;9740;9733:5;9729:14;9725:23;9718:34;;9771:5;9761:15;;;;;8802:980;;;;;;;:::o;9787:608::-;9844:3;9882:5;9876:12;9909:6;9904:3;9897:19;9935:4;9964:2;9959:3;9955:12;9948:19;;10001:2;9994:5;9990:14;10022:1;10032:338;10046:6;10043:1;10040:13;10032:338;;;10105:13;;10147:9;;-1:-1:-1;;;;;10143:58:1;10131:71;;10246:11;;10240:18;-1:-1:-1;;;;;10236:51:1;10222:12;;;10215:73;10317:4;10308:14;;;;10345:15;;;;10068:1;10061:9;10032:338;;;-1:-1:-1;10386:3:1;;9787:608;-1:-1:-1;;;;;9787:608:1:o;10400:309::-;10623:2;10612:9;10605:21;10586:4;10643:60;10699:2;10688:9;10684:18;10676:6;10643:60;:::i;10714:260::-;10782:6;10790;10843:2;10831:9;10822:7;10818:23;10814:32;10811:52;;;10859:1;10856;10849:12;10811:52;10882:29;10901:9;10882:29;:::i;:::-;10872:39;;10930:38;10964:2;10953:9;10949:18;10930:38;:::i;10979:380::-;11058:1;11054:12;;;;11101;;;11122:61;;11176:4;11168:6;11164:17;11154:27;;11122:61;11229:2;11221:6;11218:14;11198:18;11195:38;11192:161;;;11275:10;11270:3;11266:20;11263:1;11256:31;11310:4;11307:1;11300:15;11338:4;11335:1;11328:15;11192:161;;10979:380;;;:::o;13022:127::-;13083:10;13078:3;13074:20;13071:1;13064:31;13114:4;13111:1;13104:15;13138:4;13135:1;13128:15;13154:136;13232:13;;13254:30;13232:13;13254:30;:::i;13295:132::-;13371:13;;13393:28;13371:13;13393:28;:::i;13432:1154::-;13528:6;13581:3;13569:9;13560:7;13556:23;13552:33;13549:53;;;13598:1;13595;13588:12;13549:53;13631:2;13625:9;13673:3;13665:6;13661:16;13743:6;13731:10;13728:22;13707:18;13695:10;13692:34;13689:62;13686:88;;;13754:18;;:::i;:::-;13790:2;13783:22;13827:16;;13852:30;13827:16;13852:30;:::i;:::-;13891:21;;13957:2;13942:18;;13936:25;13970:32;13936:25;13970:32;:::i;:::-;14030:2;14018:15;;14011:32;14088:2;14073:18;;14067:25;14101:32;14067:25;14101:32;:::i;:::-;14161:2;14149:15;;14142:32;14219:2;14204:18;;14198:25;14232:32;14198:25;14232:32;:::i;:::-;14292:2;14280:15;;14273:32;14339:49;14383:3;14368:19;;14339:49;:::i;:::-;14333:3;14325:6;14321:16;14314:75;14423:49;14467:3;14456:9;14452:19;14423:49;:::i;:::-;14417:3;14409:6;14405:16;14398:75;14507:47;14549:3;14538:9;14534:19;14507:47;:::i;:::-;14501:3;14489:16;;14482:73;14493:6;13432:1154;-1:-1:-1;;;13432:1154:1:o;14591:127::-;14652:10;14647:3;14643:20;14640:1;14633:31;14683:4;14680:1;14673:15;14707:4;14704:1;14697:15;14723:168;14763:7;14829:1;14825;14821:6;14817:14;14814:1;14811:21;14806:1;14799:9;14792:17;14788:45;14785:71;;;14836:18;;:::i;:::-;-1:-1:-1;14876:9:1;;14723:168::o;14896:127::-;14957:10;14952:3;14948:20;14945:1;14938:31;14988:4;14985:1;14978:15;15012:4;15009:1;15002:15;15028:120;15068:1;15094;15084:35;;15099:18;;:::i;:::-;-1:-1:-1;15133:9:1;;15028:120::o;16332:1077::-;16480:4;16522:3;16511:9;16507:19;16499:27;;16551:6;16545:13;16600:12;16595:2;16589:9;16585:28;16574:9;16567:47;16678:20;16670:4;16666:2;16662:13;16656:20;16652:47;16645:4;16634:9;16630:20;16623:77;16743:4;16739:2;16735:13;16729:20;16768:6;16830:2;16816:12;16812:21;16805:4;16794:9;16790:20;16783:51;16898:2;16890:4;16886:2;16882:13;16876:20;16872:29;16865:4;16854:9;16850:20;16843:59;;;;16958:4;16950:6;16946:17;16940:24;16933:4;16922:9;16918:20;16911:54;17021:4;17013:6;17009:17;17003:24;16996:4;16985:9;16981:20;16974:54;17084:4;17076:6;17072:17;17066:24;17059:4;17048:9;17044:20;17037:54;17147:4;17139:6;17135:17;17129:24;17122:4;17111:9;17107:20;17100:54;17212:4;17204:6;17200:17;17194:24;17185:6;17174:9;17170:22;17163:56;17277:4;17269:6;17265:17;17259:24;17250:6;17239:9;17235:22;17228:56;17333:4;17325:6;17321:17;17315:24;17348:55;17395:6;17384:9;17380:22;17364:14;470:13;463:21;451:34;;400:91;17348:55;;16332:1077;;;;:::o;19883:470::-;20062:3;20100:6;20094:13;20116:53;20162:6;20157:3;20150:4;20142:6;20138:17;20116:53;:::i;:::-;20232:13;;20191:16;;;;20254:57;20232:13;20191:16;20288:4;20276:17;;20254:57;:::i;:::-;20327:20;;19883:470;-1:-1:-1;;;;19883:470:1:o;20776:184::-;20846:6;20899:2;20887:9;20878:7;20874:23;20870:32;20867:52;;;20915:1;20912;20905:12;20867:52;-1:-1:-1;20938:16:1;;20776:184;-1:-1:-1;20776:184:1:o;21368:245::-;21435:6;21488:2;21476:9;21467:7;21463:23;21459:32;21456:52;;;21504:1;21501;21494:12;21456:52;21536:9;21530:16;21555:28;21577:5;21555:28;:::i;22432:125::-;22472:4;22500:1;22497;22494:8;22491:34;;;22505:18;;:::i;:::-;-1:-1:-1;22542:9:1;;22432:125::o;24615:128::-;24655:3;24686:1;24682:6;24679:1;24676:13;24673:39;;;24692:18;;:::i;:::-;-1:-1:-1;24728:9:1;;24615:128::o;24748:127::-;24809:10;24804:3;24800:20;24797:1;24790:31;24840:4;24837:1;24830:15;24864:4;24861:1;24854:15;24880:160;24957:13;;25010:4;24999:16;;24989:27;;24979:55;;25030:1;25027;25020:12;25045:167;25123:13;;25176:10;25165:22;;25155:33;;25145:61;;25202:1;25199;25192:12;25217:1397;25372:6;25380;25388;25396;25404;25412;25420;25428;25472:9;25463:7;25459:23;25502:3;25498:2;25494:12;25491:32;;;25519:1;25516;25509:12;25491:32;25543:4;25539:2;25535:13;25532:33;;;25561:1;25558;25551:12;25532:33;;25587:22;;:::i;:::-;25639:9;25633:16;25658:32;25682:7;25658:32;:::i;:::-;25699:22;;25766:2;25751:18;;25745:25;25779:32;25745:25;25779:32;:::i;:::-;25838:2;25827:14;;25820:31;25896:2;25881:18;;25875:25;25909:32;25875:25;25909:32;:::i;:::-;25968:2;25957:14;;25950:31;26026:2;26011:18;;26005:25;26039:32;26005:25;26039:32;:::i;:::-;26098:2;26087:14;;26080:31;26091:5;-1:-1:-1;26154:50:1;26198:4;26183:20;;26154:50;:::i;:::-;26144:60;;26223:48;26266:3;26255:9;26251:19;26223:48;:::i;:::-;26213:58;;26290:49;26334:3;26323:9;26319:19;26290:49;:::i;:::-;26280:59;;26358:49;26402:3;26391:9;26387:19;26358:49;:::i;:::-;26348:59;;26426:49;26470:3;26459:9;26455:19;26426:49;:::i;:::-;26416:59;;26494:48;26537:3;26526:9;26522:19;26494:48;:::i;:::-;26484:58;;26561:47;26603:3;26592:9;26588:19;26561:47;:::i;:::-;26551:57;;25217:1397;;;;;;;;;;;:::o;28110:664::-;28337:3;28375:6;28369:13;28391:53;28437:6;28432:3;28425:4;28417:6;28413:17;28391:53;:::i;:::-;28507:13;;28466:16;;;;28529:57;28507:13;28466:16;28563:4;28551:17;;28529:57;:::i;:::-;28653:13;;28608:20;;;28675:57;28653:13;28608:20;28709:4;28697:17;;28675:57;:::i;:::-;28748:20;;28110:664;-1:-1:-1;;;;;28110:664:1:o;28779:135::-;28818:3;-1:-1:-1;;28839:17:1;;28836:43;;;28859:18;;:::i;:::-;-1:-1:-1;28906:1:1;28895:13;;28779:135::o;28919:112::-;28951:1;28977;28967:35;;28982:18;;:::i;:::-;-1:-1:-1;29016:9:1;;28919:112::o;30510:512::-;30704:4;-1:-1:-1;;;;;30814:2:1;30806:6;30802:15;30791:9;30784:34;30866:2;30858:6;30854:15;30849:2;30838:9;30834:18;30827:43;;30906:6;30901:2;30890:9;30886:18;30879:34;30949:3;30944:2;30933:9;30929:18;30922:31;30970:46;31011:3;31000:9;30996:19;30988:6;30970:46;:::i;31027:249::-;31096:6;31149:2;31137:9;31128:7;31124:23;31120:32;31117:52;;;31165:1;31162;31155:12;31117:52;31197:9;31191:16;31216:30;31240:5;31216:30;:::i;31281:380::-;31532:6;31521:9;31514:25;31575:2;31570;31559:9;31555:18;31548:30;31495:4;31595:60;31651:2;31640:9;31636:18;31628:6;31595:60;:::i
Swarm Source
ipfs://55e7b705b10f2b2c963984150458d56028c6a362cfda89761c00dbc65cff4c51
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.