ERC-721
NFT
Overview
Max Total Supply
10,000 ICON
Holders
3,190
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ICONLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Incognito
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-13 */ // File: @openzeppelin/contracts/access/Ownable.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @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; } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).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 {} } // File: Nico/Incognito/index-prod.sol pragma solidity ^0.8.0; /** * @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(); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @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); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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); } } } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; contract Incognito is ERC721, ERC721Enumerable, Ownable { // Provenance string public INCOGNITO_HASH = ""; // Price & Supply uint256 public constant NFT_PRICE = 85000000000000000; //0.085 ETH uint public constant MAX_SUPPLY = 10000; // Internals string private _baseTokenURI; uint256 public startingIndexBlock; uint256 public startingIndex; // Sale bool public hasSaleStarted = false; uint private constant MAX_MINT_PER_CALL = 15; // Pre-Sale bool public hasPreSaleStarted = false; uint public constant MAX_PRESALE_SUPPLY = 1777; constructor(string memory baseURI) ERC721("Incognito", "ICON") { setBaseURI(baseURI); } function _baseURI() internal view override(ERC721) returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function getBaseURI() external view returns(string memory) { return _baseTokenURI; } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function mintPreSale() public payable { require(hasPreSaleStarted, "Presale has not started"); require(msg.value >= NFT_PRICE, "Incorrect ether value"); require(totalSupply() < MAX_PRESALE_SUPPLY, "Presale has ended"); uint mintIndex = totalSupply() + 1; // +1 so it doesn't start on index 0. _safeMint(msg.sender, mintIndex); // If we haven't set the starting index and this is either 1) the last saleable token or 2) the first token to be sold after // the end of pre-sale, set the starting index block if (startingIndexBlock == 0 && (totalSupply() == MAX_SUPPLY)) { startingIndexBlock = block.number; } } function mint(uint256 numNFTs) public payable { require(hasSaleStarted, "Sale has not started"); require(MAX_SUPPLY > totalSupply(), "Sale has ended"); require(numNFTs > 0 && numNFTs <= MAX_MINT_PER_CALL, "Exceeds MAX_MINT_PER_CALL"); require(MAX_SUPPLY >= totalSupply() + numNFTs, "Exceeds MAX_SUPPLY"); require(msg.value >= NFT_PRICE * numNFTs, "Incorrect ether value"); for (uint i = 0; i < numNFTs; i++) { uint mintIndex = totalSupply() + 1; // +1 so it doesn't start on index 0. _safeMint(msg.sender, mintIndex); } // If we haven't set the starting index and this is either 1) the last saleable token or 2) the first token to be sold after // the end of pre-sale, set the starting index block if (startingIndexBlock == 0 && (totalSupply() == MAX_SUPPLY)) { startingIndexBlock = block.number; } } function flipSaleState() public onlyOwner { hasSaleStarted = !hasSaleStarted; } function flipPreSaleState() public onlyOwner { hasPreSaleStarted = !hasPreSaleStarted; } function withdraw() public onlyOwner { require(payable(msg.sender).send(address(this).balance)); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function setStartingIndex() public { require(startingIndex == 0, "Starting index is already set"); require(startingIndexBlock != 0, "Starting index block must be set"); startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY; // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes) if (block.number - startingIndexBlock > 255) { startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY; } // Prevent default sequence if (startingIndex == 0) { startingIndex = startingIndex + 1; } } function emergencySetStartingIndexBlock() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); startingIndexBlock = block.number; } function setProvenanceHash(string memory provenanceHash) public onlyOwner { INCOGNITO_HASH = provenanceHash; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":[],"name":"INCOGNITO_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPreSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numNFTs","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPreSale","outputs":[],"stateMutability":"payable","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":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b92919062000310565b506000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055503480156200006f57600080fd5b506040516200502a3803806200502a833981810160405281019062000095919062000432565b6040518060400160405280600981526020017f496e636f676e69746f00000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f49434f4e0000000000000000000000000000000000000000000000000000000081525081600090805190602001906200011992919062000310565b5080600190805190602001906200013292919062000310565b50505062000155620001496200016d60201b60201c565b6200017560201b60201c565b62000166816200023b60201b60201c565b506200066a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024b6200016d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000271620002e660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c1906200049e565b60405180910390fd5b80600c9080519060200190620002e292919062000310565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200031e9062000566565b90600052602060002090601f0160209004810192826200034257600085556200038e565b82601f106200035d57805160ff19168380011785556200038e565b828001600101855582156200038e579182015b828111156200038d57825182559160200191906001019062000370565b5b5090506200039d9190620003a1565b5090565b5b80821115620003bc576000816000905550600101620003a2565b5090565b6000620003d7620003d184620004e9565b620004c0565b905082815260208101848484011115620003f057600080fd5b620003fd84828562000530565b509392505050565b600082601f8301126200041757600080fd5b815162000429848260208601620003c0565b91505092915050565b6000602082840312156200044557600080fd5b600082015167ffffffffffffffff8111156200046057600080fd5b6200046e8482850162000405565b91505092915050565b6000620004866020836200051f565b9150620004938262000641565b602082019050919050565b60006020820190508181036000830152620004b98162000477565b9050919050565b6000620004cc620004df565b9050620004da82826200059c565b919050565b6000604051905090565b600067ffffffffffffffff82111562000507576200050662000601565b5b620005128262000630565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200055057808201518184015260208101905062000533565b8381111562000560576000848401525b50505050565b600060028204905060018216806200057f57607f821691505b60208210811415620005965762000595620005d2565b5b50919050565b620005a78262000630565b810181811067ffffffffffffffff82111715620005c957620005c862000601565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6149b0806200067a6000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063a22cb465116100ab578063e6b922e81161006f578063e6b922e8146107d8578063e985e9c5146107e2578063e98665501461081f578063f032554914610836578063f2fde38b1461084d57610225565b8063a22cb465146106f3578063b88d4fde1461071c578063c87b56dd14610745578063cb774d4714610782578063e36d6498146107ad57610225565b80637d17fcbe116100f25780637d17fcbe1461062d5780638462151c146106445780638da5cb5b1461068157806395d89b41146106ac578063a0712d68146106d757610225565b806370a0823114610583578063714c5398146105c0578063715018a6146105eb578063780d74b91461060257610225565b806332cb6b0c116101b157806355f804b31161017557806355f804b31461049c5780636352211e146104c5578063676dd563146105025780636a5928f51461052d5780636b8dc3551461055857610225565b806332cb6b0c146103dd57806334918dfd146104085780633ccfd60b1461041f57806342842e0e146104365780634f6ccce71461045f57610225565b806310969523116101f857806310969523146102f857806318160ddd146103215780631c8b232d1461034c57806323b872dd146103775780632f745c59146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613418565b610876565b60405161025e9190613a87565b60405180910390f35b34801561027357600080fd5b5061027c610888565b6040516102899190613aa2565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906134ab565b61091a565b6040516102c691906139fe565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906133dc565b61099f565b005b34801561030457600080fd5b5061031f600480360381019061031a919061346a565b610ab7565b005b34801561032d57600080fd5b50610336610b4d565b6040516103439190613e24565b60405180910390f35b34801561035857600080fd5b50610361610b5a565b60405161036e9190613a87565b60405180910390f35b34801561038357600080fd5b5061039e600480360381019061039991906132d6565b610b6d565b005b3480156103ac57600080fd5b506103c760048036038101906103c291906133dc565b610bcd565b6040516103d49190613e24565b60405180910390f35b3480156103e957600080fd5b506103f2610c72565b6040516103ff9190613e24565b60405180910390f35b34801561041457600080fd5b5061041d610c78565b005b34801561042b57600080fd5b50610434610d20565b005b34801561044257600080fd5b5061045d600480360381019061045891906132d6565b610ddc565b005b34801561046b57600080fd5b50610486600480360381019061048191906134ab565b610dfc565b6040516104939190613e24565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be919061346a565b610e93565b005b3480156104d157600080fd5b506104ec60048036038101906104e791906134ab565b610f29565b6040516104f991906139fe565b60405180910390f35b34801561050e57600080fd5b50610517610fdb565b6040516105249190613e24565b60405180910390f35b34801561053957600080fd5b50610542610fe7565b60405161054f9190613a87565b60405180910390f35b34801561056457600080fd5b5061056d610ffa565b60405161057a9190613e24565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613271565b611000565b6040516105b79190613e24565b60405180910390f35b3480156105cc57600080fd5b506105d56110b8565b6040516105e29190613aa2565b60405180910390f35b3480156105f757600080fd5b5061060061114a565b005b34801561060e57600080fd5b506106176111d2565b6040516106249190613aa2565b60405180910390f35b34801561063957600080fd5b50610642611260565b005b34801561065057600080fd5b5061066b60048036038101906106669190613271565b61132a565b6040516106789190613a65565b60405180910390f35b34801561068d57600080fd5b506106966114a6565b6040516106a391906139fe565b60405180910390f35b3480156106b857600080fd5b506106c16114d0565b6040516106ce9190613aa2565b60405180910390f35b6106f160048036038101906106ec91906134ab565b611562565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906133a0565b611765565b005b34801561072857600080fd5b50610743600480360381019061073e9190613325565b6118e6565b005b34801561075157600080fd5b5061076c600480360381019061076791906134ab565b611948565b6040516107799190613aa2565b60405180910390f35b34801561078e57600080fd5b5061079761195a565b6040516107a49190613e24565b60405180910390f35b3480156107b957600080fd5b506107c2611960565b6040516107cf9190613e24565b60405180910390f35b6107e0611966565b005b3480156107ee57600080fd5b506108096004803603810190610804919061329a565b611a97565b6040516108169190613a87565b60405180910390f35b34801561082b57600080fd5b50610834611b2b565b005b34801561084257600080fd5b5061084b611c2e565b005b34801561085957600080fd5b50610874600480360381019061086f9190613271565b611cd6565b005b600061088182611dce565b9050919050565b6060600080546108979061410d565b80601f01602080910402602001604051908101604052809291908181526020018280546108c39061410d565b80156109105780601f106108e557610100808354040283529160200191610910565b820191906000526020600020905b8154815290600101906020018083116108f357829003601f168201915b5050505050905090565b600061092582611e48565b610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b90613cc4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109aa82610f29565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1290613d64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3a611eb4565b73ffffffffffffffffffffffffffffffffffffffff161480610a695750610a6881610a63611eb4565b611a97565b5b610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90613c24565b60405180910390fd5b610ab28383611ebc565b505050565b610abf611eb4565b73ffffffffffffffffffffffffffffffffffffffff16610add6114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90613ce4565b60405180910390fd5b80600b9080519060200190610b49929190613095565b5050565b6000600880549050905090565b600f60009054906101000a900460ff1681565b610b7e610b78611eb4565b82611f75565b610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb490613da4565b60405180910390fd5b610bc8838383612053565b505050565b6000610bd883611000565b8210610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090613b04565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610c80611eb4565b73ffffffffffffffffffffffffffffffffffffffff16610c9e6114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613ce4565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610d28611eb4565b73ffffffffffffffffffffffffffffffffffffffff16610d466114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390613ce4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610dda57600080fd5b565b610df7838383604051806020016040528060008152506118e6565b505050565b6000610e06610b4d565b8210610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e90613dc4565b60405180910390fd5b60088281548110610e81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e9b611eb4565b73ffffffffffffffffffffffffffffffffffffffff16610eb96114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690613ce4565b60405180910390fd5b80600c9080519060200190610f25929190613095565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990613c64565b60405180910390fd5b80915050919050565b67012dfb0cb5e8800081565b600f60019054906101000a900460ff1681565b6106f181565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613c44565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600c80546110c79061410d565b80601f01602080910402602001604051908101604052809291908181526020018280546110f39061410d565b80156111405780601f1061111557610100808354040283529160200191611140565b820191906000526020600020905b81548152906001019060200180831161112357829003601f168201915b5050505050905090565b611152611eb4565b73ffffffffffffffffffffffffffffffffffffffff166111706114a6565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90613ce4565b60405180910390fd5b6111d060006122af565b565b600b80546111df9061410d565b80601f016020809104026020016040519081016040528092919081815260200182805461120b9061410d565b80156112585780601f1061122d57610100808354040283529160200191611258565b820191906000526020600020905b81548152906001019060200180831161123b57829003601f168201915b505050505081565b611268611eb4565b73ffffffffffffffffffffffffffffffffffffffff166112866114a6565b73ffffffffffffffffffffffffffffffffffffffff16146112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390613ce4565b60405180910390fd5b6000600e5414611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890613c04565b60405180910390fd5b43600d81905550565b6060600061133783611000565b905060008114156113ba57600067ffffffffffffffff811115611383577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156113b15781602001602082028036833780820191505090505b509150506114a1565b60008167ffffffffffffffff8111156113fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561142a5781602001602082028036833780820191505090505b50905060005b8281101561149a576114428582610bcd565b82828151811061147b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061149290614170565b915050611430565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114df9061410d565b80601f016020809104026020016040519081016040528092919081815260200182805461150b9061410d565b80156115585780601f1061152d57610100808354040283529160200191611558565b820191906000526020600020905b81548152906001019060200180831161153b57829003601f168201915b5050505050905090565b600f60009054906101000a900460ff166115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890613e04565b60405180910390fd5b6115b9610b4d565b612710116115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f390613b84565b60405180910390fd5b60008111801561160d5750600f8111155b61164c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164390613c84565b60405180910390fd5b80611655610b4d565b61165f9190613f42565b61271010156116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90613d44565b60405180910390fd5b8067012dfb0cb5e880006116b79190613fc9565b3410156116f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f090613de4565b60405180910390fd5b60005b8181101561173a5760006001611710610b4d565b61171a9190613f42565b90506117263382612375565b50808061173290614170565b9150506116fc565b506000600d541480156117555750612710611753610b4d565b145b156117625743600d819055505b50565b61176d611eb4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290613bc4565b60405180910390fd5b80600560006117e8611eb4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611895611eb4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118da9190613a87565b60405180910390a35050565b6118f76118f1611eb4565b83611f75565b611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90613da4565b60405180910390fd5b61194284848484612393565b50505050565b6060611953826123ef565b9050919050565b600e5481565b600d5481565b600f60019054906101000a900460ff166119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac90613ae4565b60405180910390fd5b67012dfb0cb5e88000341015611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790613de4565b60405180910390fd5b6106f1611a0b610b4d565b10611a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4290613ac4565b60405180910390fd5b60006001611a57610b4d565b611a619190613f42565b9050611a6d3382612375565b6000600d54148015611a875750612710611a85610b4d565b145b15611a945743600d819055505b50565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e5414611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6790613c04565b60405180910390fd5b6000600d541415611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad90613d84565b60405180910390fd5b612710600d544060001c611bca91906141b9565b600e8190555060ff600d5443611be09190614023565b1115611c0b57612710600143611bf69190614023565b4060001c611c0491906141b9565b600e819055505b6000600e541415611c2c576001600e54611c259190613f42565b600e819055505b565b611c36611eb4565b73ffffffffffffffffffffffffffffffffffffffff16611c546114a6565b73ffffffffffffffffffffffffffffffffffffffff1614611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190613ce4565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b611cde611eb4565b73ffffffffffffffffffffffffffffffffffffffff16611cfc6114a6565b73ffffffffffffffffffffffffffffffffffffffff1614611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4990613ce4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990613b44565b60405180910390fd5b611dcb816122af565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e415750611e4082612496565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f2f83610f29565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f8082611e48565b611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690613be4565b60405180910390fd5b6000611fca83610f29565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061203957508373ffffffffffffffffffffffffffffffffffffffff166120218461091a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061204a57506120498185611a97565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661207382610f29565b73ffffffffffffffffffffffffffffffffffffffff16146120c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c090613d04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213090613ba4565b60405180910390fd5b612144838383612578565b61214f600082611ebc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461219f9190614023565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f69190613f42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61238f828260405180602001604052806000815250612588565b5050565b61239e848484612053565b6123aa848484846125e3565b6123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090613b24565b60405180910390fd5b50505050565b60606123fa82611e48565b612439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243090613d24565b60405180910390fd5b600061244361277a565b90506000815111612463576040518060200160405280600081525061248e565b8061246d8461280c565b60405160200161247e9291906139da565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061256157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125715750612570826129b9565b5b9050919050565b612583838383612a23565b505050565b6125928383612b37565b61259f60008484846125e3565b6125de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d590613b24565b60405180910390fd5b505050565b60006126048473ffffffffffffffffffffffffffffffffffffffff16612d05565b1561276d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261262d611eb4565b8786866040518563ffffffff1660e01b815260040161264f9493929190613a19565b602060405180830381600087803b15801561266957600080fd5b505af192505050801561269a57506040513d601f19601f820116820180604052508101906126979190613441565b60015b61271d573d80600081146126ca576040519150601f19603f3d011682016040523d82523d6000602084013e6126cf565b606091505b50600081511415612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c90613b24565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612772565b600190505b949350505050565b6060600c80546127899061410d565b80601f01602080910402602001604051908101604052809291908181526020018280546127b59061410d565b80156128025780601f106127d757610100808354040283529160200191612802565b820191906000526020600020905b8154815290600101906020018083116127e557829003601f168201915b5050505050905090565b60606000821415612854576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129b4565b600082905060005b6000821461288657808061286f90614170565b915050600a8261287f9190613f98565b915061285c565b60008167ffffffffffffffff8111156128c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128fa5781602001600182028036833780820191505090505b5090505b600085146129ad576001826129139190614023565b9150600a8561292291906141b9565b603061292e9190613f42565b60f81b81838151811061296a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129a69190613f98565b94506128fe565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a2e838383612d18565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a7157612a6c81612d1d565b612ab0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aaf57612aae8382612d66565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af357612aee81612ed3565b612b32565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b3157612b308282613016565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e90613ca4565b60405180910390fd5b612bb081611e48565b15612bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be790613b64565b60405180910390fd5b612bfc60008383612578565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c4c9190613f42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d7384611000565b612d7d9190614023565b9050600060076000848152602001908152602001600020549050818114612e62576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ee79190614023565b9050600060096000848152602001908152602001600020549050600060088381548110612f3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ffa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061302183611000565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546130a19061410d565b90600052602060002090601f0160209004810192826130c3576000855561310a565b82601f106130dc57805160ff191683800117855561310a565b8280016001018555821561310a579182015b828111156131095782518255916020019190600101906130ee565b5b509050613117919061311b565b5090565b5b8082111561313457600081600090555060010161311c565b5090565b600061314b61314684613e64565b613e3f565b90508281526020810184848401111561316357600080fd5b61316e8482856140cb565b509392505050565b600061318961318484613e95565b613e3f565b9050828152602081018484840111156131a157600080fd5b6131ac8482856140cb565b509392505050565b6000813590506131c38161491e565b92915050565b6000813590506131d881614935565b92915050565b6000813590506131ed8161494c565b92915050565b6000815190506132028161494c565b92915050565b600082601f83011261321957600080fd5b8135613229848260208601613138565b91505092915050565b600082601f83011261324357600080fd5b8135613253848260208601613176565b91505092915050565b60008135905061326b81614963565b92915050565b60006020828403121561328357600080fd5b6000613291848285016131b4565b91505092915050565b600080604083850312156132ad57600080fd5b60006132bb858286016131b4565b92505060206132cc858286016131b4565b9150509250929050565b6000806000606084860312156132eb57600080fd5b60006132f9868287016131b4565b935050602061330a868287016131b4565b925050604061331b8682870161325c565b9150509250925092565b6000806000806080858703121561333b57600080fd5b6000613349878288016131b4565b945050602061335a878288016131b4565b935050604061336b8782880161325c565b925050606085013567ffffffffffffffff81111561338857600080fd5b61339487828801613208565b91505092959194509250565b600080604083850312156133b357600080fd5b60006133c1858286016131b4565b92505060206133d2858286016131c9565b9150509250929050565b600080604083850312156133ef57600080fd5b60006133fd858286016131b4565b925050602061340e8582860161325c565b9150509250929050565b60006020828403121561342a57600080fd5b6000613438848285016131de565b91505092915050565b60006020828403121561345357600080fd5b6000613461848285016131f3565b91505092915050565b60006020828403121561347c57600080fd5b600082013567ffffffffffffffff81111561349657600080fd5b6134a284828501613232565b91505092915050565b6000602082840312156134bd57600080fd5b60006134cb8482850161325c565b91505092915050565b60006134e083836139bc565b60208301905092915050565b6134f581614057565b82525050565b600061350682613ed6565b6135108185613f04565b935061351b83613ec6565b8060005b8381101561354c57815161353388826134d4565b975061353e83613ef7565b92505060018101905061351f565b5085935050505092915050565b61356281614069565b82525050565b600061357382613ee1565b61357d8185613f15565b935061358d8185602086016140da565b613596816142a6565b840191505092915050565b60006135ac82613eec565b6135b68185613f26565b93506135c68185602086016140da565b6135cf816142a6565b840191505092915050565b60006135e582613eec565b6135ef8185613f37565b93506135ff8185602086016140da565b80840191505092915050565b6000613618601183613f26565b9150613623826142b7565b602082019050919050565b600061363b601783613f26565b9150613646826142e0565b602082019050919050565b600061365e602b83613f26565b915061366982614309565b604082019050919050565b6000613681603283613f26565b915061368c82614358565b604082019050919050565b60006136a4602683613f26565b91506136af826143a7565b604082019050919050565b60006136c7601c83613f26565b91506136d2826143f6565b602082019050919050565b60006136ea600e83613f26565b91506136f58261441f565b602082019050919050565b600061370d602483613f26565b915061371882614448565b604082019050919050565b6000613730601983613f26565b915061373b82614497565b602082019050919050565b6000613753602c83613f26565b915061375e826144c0565b604082019050919050565b6000613776601d83613f26565b91506137818261450f565b602082019050919050565b6000613799603883613f26565b91506137a482614538565b604082019050919050565b60006137bc602a83613f26565b91506137c782614587565b604082019050919050565b60006137df602983613f26565b91506137ea826145d6565b604082019050919050565b6000613802601983613f26565b915061380d82614625565b602082019050919050565b6000613825602083613f26565b91506138308261464e565b602082019050919050565b6000613848602c83613f26565b915061385382614677565b604082019050919050565b600061386b602083613f26565b9150613876826146c6565b602082019050919050565b600061388e602983613f26565b9150613899826146ef565b604082019050919050565b60006138b1602f83613f26565b91506138bc8261473e565b604082019050919050565b60006138d4601283613f26565b91506138df8261478d565b602082019050919050565b60006138f7602183613f26565b9150613902826147b6565b604082019050919050565b600061391a602083613f26565b915061392582614805565b602082019050919050565b600061393d603183613f26565b91506139488261482e565b604082019050919050565b6000613960602c83613f26565b915061396b8261487d565b604082019050919050565b6000613983601583613f26565b915061398e826148cc565b602082019050919050565b60006139a6601483613f26565b91506139b1826148f5565b602082019050919050565b6139c5816140c1565b82525050565b6139d4816140c1565b82525050565b60006139e682856135da565b91506139f282846135da565b91508190509392505050565b6000602082019050613a1360008301846134ec565b92915050565b6000608082019050613a2e60008301876134ec565b613a3b60208301866134ec565b613a4860408301856139cb565b8181036060830152613a5a8184613568565b905095945050505050565b60006020820190508181036000830152613a7f81846134fb565b905092915050565b6000602082019050613a9c6000830184613559565b92915050565b60006020820190508181036000830152613abc81846135a1565b905092915050565b60006020820190508181036000830152613add8161360b565b9050919050565b60006020820190508181036000830152613afd8161362e565b9050919050565b60006020820190508181036000830152613b1d81613651565b9050919050565b60006020820190508181036000830152613b3d81613674565b9050919050565b60006020820190508181036000830152613b5d81613697565b9050919050565b60006020820190508181036000830152613b7d816136ba565b9050919050565b60006020820190508181036000830152613b9d816136dd565b9050919050565b60006020820190508181036000830152613bbd81613700565b9050919050565b60006020820190508181036000830152613bdd81613723565b9050919050565b60006020820190508181036000830152613bfd81613746565b9050919050565b60006020820190508181036000830152613c1d81613769565b9050919050565b60006020820190508181036000830152613c3d8161378c565b9050919050565b60006020820190508181036000830152613c5d816137af565b9050919050565b60006020820190508181036000830152613c7d816137d2565b9050919050565b60006020820190508181036000830152613c9d816137f5565b9050919050565b60006020820190508181036000830152613cbd81613818565b9050919050565b60006020820190508181036000830152613cdd8161383b565b9050919050565b60006020820190508181036000830152613cfd8161385e565b9050919050565b60006020820190508181036000830152613d1d81613881565b9050919050565b60006020820190508181036000830152613d3d816138a4565b9050919050565b60006020820190508181036000830152613d5d816138c7565b9050919050565b60006020820190508181036000830152613d7d816138ea565b9050919050565b60006020820190508181036000830152613d9d8161390d565b9050919050565b60006020820190508181036000830152613dbd81613930565b9050919050565b60006020820190508181036000830152613ddd81613953565b9050919050565b60006020820190508181036000830152613dfd81613976565b9050919050565b60006020820190508181036000830152613e1d81613999565b9050919050565b6000602082019050613e3960008301846139cb565b92915050565b6000613e49613e5a565b9050613e55828261413f565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7f57613e7e614277565b5b613e88826142a6565b9050602081019050919050565b600067ffffffffffffffff821115613eb057613eaf614277565b5b613eb9826142a6565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f4d826140c1565b9150613f58836140c1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f8d57613f8c6141ea565b5b828201905092915050565b6000613fa3826140c1565b9150613fae836140c1565b925082613fbe57613fbd614219565b5b828204905092915050565b6000613fd4826140c1565b9150613fdf836140c1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614018576140176141ea565b5b828202905092915050565b600061402e826140c1565b9150614039836140c1565b92508282101561404c5761404b6141ea565b5b828203905092915050565b6000614062826140a1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140f85780820151818401526020810190506140dd565b83811115614107576000848401525b50505050565b6000600282049050600182168061412557607f821691505b6020821081141561413957614138614248565b5b50919050565b614148826142a6565b810181811067ffffffffffffffff8211171561416757614166614277565b5b80604052505050565b600061417b826140c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ae576141ad6141ea565b5b600182019050919050565b60006141c4826140c1565b91506141cf836140c1565b9250826141df576141de614219565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f50726573616c652068617320656e646564000000000000000000000000000000600082015250565b7f50726573616c6520686173206e6f742073746172746564000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c652068617320656e646564000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45786365656473204d41585f4d494e545f5045525f43414c4c00000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473204d41585f535550504c590000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e636f72726563742065746865722076616c75650000000000000000000000600082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b61492781614057565b811461493257600080fd5b50565b61493e81614069565b811461494957600080fd5b50565b61495581614075565b811461496057600080fd5b50565b61496c816140c1565b811461497757600080fd5b5056fea264697066735822122090417bd9979134238cb73bedaf013e94207eeb8b41d08bdcee0d204b541af21264736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544b51714b6f6631775a6b336443536f4d365a43705a61534257633942714c52713438385231776b773177692f00000000000000000000
Deployed Bytecode
0x6080604052600436106102255760003560e01c806370a0823111610123578063a22cb465116100ab578063e6b922e81161006f578063e6b922e8146107d8578063e985e9c5146107e2578063e98665501461081f578063f032554914610836578063f2fde38b1461084d57610225565b8063a22cb465146106f3578063b88d4fde1461071c578063c87b56dd14610745578063cb774d4714610782578063e36d6498146107ad57610225565b80637d17fcbe116100f25780637d17fcbe1461062d5780638462151c146106445780638da5cb5b1461068157806395d89b41146106ac578063a0712d68146106d757610225565b806370a0823114610583578063714c5398146105c0578063715018a6146105eb578063780d74b91461060257610225565b806332cb6b0c116101b157806355f804b31161017557806355f804b31461049c5780636352211e146104c5578063676dd563146105025780636a5928f51461052d5780636b8dc3551461055857610225565b806332cb6b0c146103dd57806334918dfd146104085780633ccfd60b1461041f57806342842e0e146104365780634f6ccce71461045f57610225565b806310969523116101f857806310969523146102f857806318160ddd146103215780631c8b232d1461034c57806323b872dd146103775780632f745c59146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613418565b610876565b60405161025e9190613a87565b60405180910390f35b34801561027357600080fd5b5061027c610888565b6040516102899190613aa2565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906134ab565b61091a565b6040516102c691906139fe565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906133dc565b61099f565b005b34801561030457600080fd5b5061031f600480360381019061031a919061346a565b610ab7565b005b34801561032d57600080fd5b50610336610b4d565b6040516103439190613e24565b60405180910390f35b34801561035857600080fd5b50610361610b5a565b60405161036e9190613a87565b60405180910390f35b34801561038357600080fd5b5061039e600480360381019061039991906132d6565b610b6d565b005b3480156103ac57600080fd5b506103c760048036038101906103c291906133dc565b610bcd565b6040516103d49190613e24565b60405180910390f35b3480156103e957600080fd5b506103f2610c72565b6040516103ff9190613e24565b60405180910390f35b34801561041457600080fd5b5061041d610c78565b005b34801561042b57600080fd5b50610434610d20565b005b34801561044257600080fd5b5061045d600480360381019061045891906132d6565b610ddc565b005b34801561046b57600080fd5b50610486600480360381019061048191906134ab565b610dfc565b6040516104939190613e24565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be919061346a565b610e93565b005b3480156104d157600080fd5b506104ec60048036038101906104e791906134ab565b610f29565b6040516104f991906139fe565b60405180910390f35b34801561050e57600080fd5b50610517610fdb565b6040516105249190613e24565b60405180910390f35b34801561053957600080fd5b50610542610fe7565b60405161054f9190613a87565b60405180910390f35b34801561056457600080fd5b5061056d610ffa565b60405161057a9190613e24565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613271565b611000565b6040516105b79190613e24565b60405180910390f35b3480156105cc57600080fd5b506105d56110b8565b6040516105e29190613aa2565b60405180910390f35b3480156105f757600080fd5b5061060061114a565b005b34801561060e57600080fd5b506106176111d2565b6040516106249190613aa2565b60405180910390f35b34801561063957600080fd5b50610642611260565b005b34801561065057600080fd5b5061066b60048036038101906106669190613271565b61132a565b6040516106789190613a65565b60405180910390f35b34801561068d57600080fd5b506106966114a6565b6040516106a391906139fe565b60405180910390f35b3480156106b857600080fd5b506106c16114d0565b6040516106ce9190613aa2565b60405180910390f35b6106f160048036038101906106ec91906134ab565b611562565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906133a0565b611765565b005b34801561072857600080fd5b50610743600480360381019061073e9190613325565b6118e6565b005b34801561075157600080fd5b5061076c600480360381019061076791906134ab565b611948565b6040516107799190613aa2565b60405180910390f35b34801561078e57600080fd5b5061079761195a565b6040516107a49190613e24565b60405180910390f35b3480156107b957600080fd5b506107c2611960565b6040516107cf9190613e24565b60405180910390f35b6107e0611966565b005b3480156107ee57600080fd5b506108096004803603810190610804919061329a565b611a97565b6040516108169190613a87565b60405180910390f35b34801561082b57600080fd5b50610834611b2b565b005b34801561084257600080fd5b5061084b611c2e565b005b34801561085957600080fd5b50610874600480360381019061086f9190613271565b611cd6565b005b600061088182611dce565b9050919050565b6060600080546108979061410d565b80601f01602080910402602001604051908101604052809291908181526020018280546108c39061410d565b80156109105780601f106108e557610100808354040283529160200191610910565b820191906000526020600020905b8154815290600101906020018083116108f357829003601f168201915b5050505050905090565b600061092582611e48565b610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b90613cc4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109aa82610f29565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1290613d64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3a611eb4565b73ffffffffffffffffffffffffffffffffffffffff161480610a695750610a6881610a63611eb4565b611a97565b5b610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90613c24565b60405180910390fd5b610ab28383611ebc565b505050565b610abf611eb4565b73ffffffffffffffffffffffffffffffffffffffff16610add6114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90613ce4565b60405180910390fd5b80600b9080519060200190610b49929190613095565b5050565b6000600880549050905090565b600f60009054906101000a900460ff1681565b610b7e610b78611eb4565b82611f75565b610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb490613da4565b60405180910390fd5b610bc8838383612053565b505050565b6000610bd883611000565b8210610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090613b04565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610c80611eb4565b73ffffffffffffffffffffffffffffffffffffffff16610c9e6114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613ce4565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610d28611eb4565b73ffffffffffffffffffffffffffffffffffffffff16610d466114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390613ce4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610dda57600080fd5b565b610df7838383604051806020016040528060008152506118e6565b505050565b6000610e06610b4d565b8210610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e90613dc4565b60405180910390fd5b60088281548110610e81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e9b611eb4565b73ffffffffffffffffffffffffffffffffffffffff16610eb96114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690613ce4565b60405180910390fd5b80600c9080519060200190610f25929190613095565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990613c64565b60405180910390fd5b80915050919050565b67012dfb0cb5e8800081565b600f60019054906101000a900460ff1681565b6106f181565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613c44565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600c80546110c79061410d565b80601f01602080910402602001604051908101604052809291908181526020018280546110f39061410d565b80156111405780601f1061111557610100808354040283529160200191611140565b820191906000526020600020905b81548152906001019060200180831161112357829003601f168201915b5050505050905090565b611152611eb4565b73ffffffffffffffffffffffffffffffffffffffff166111706114a6565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90613ce4565b60405180910390fd5b6111d060006122af565b565b600b80546111df9061410d565b80601f016020809104026020016040519081016040528092919081815260200182805461120b9061410d565b80156112585780601f1061122d57610100808354040283529160200191611258565b820191906000526020600020905b81548152906001019060200180831161123b57829003601f168201915b505050505081565b611268611eb4565b73ffffffffffffffffffffffffffffffffffffffff166112866114a6565b73ffffffffffffffffffffffffffffffffffffffff16146112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390613ce4565b60405180910390fd5b6000600e5414611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890613c04565b60405180910390fd5b43600d81905550565b6060600061133783611000565b905060008114156113ba57600067ffffffffffffffff811115611383577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156113b15781602001602082028036833780820191505090505b509150506114a1565b60008167ffffffffffffffff8111156113fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561142a5781602001602082028036833780820191505090505b50905060005b8281101561149a576114428582610bcd565b82828151811061147b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061149290614170565b915050611430565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114df9061410d565b80601f016020809104026020016040519081016040528092919081815260200182805461150b9061410d565b80156115585780601f1061152d57610100808354040283529160200191611558565b820191906000526020600020905b81548152906001019060200180831161153b57829003601f168201915b5050505050905090565b600f60009054906101000a900460ff166115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890613e04565b60405180910390fd5b6115b9610b4d565b612710116115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f390613b84565b60405180910390fd5b60008111801561160d5750600f8111155b61164c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164390613c84565b60405180910390fd5b80611655610b4d565b61165f9190613f42565b61271010156116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90613d44565b60405180910390fd5b8067012dfb0cb5e880006116b79190613fc9565b3410156116f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f090613de4565b60405180910390fd5b60005b8181101561173a5760006001611710610b4d565b61171a9190613f42565b90506117263382612375565b50808061173290614170565b9150506116fc565b506000600d541480156117555750612710611753610b4d565b145b156117625743600d819055505b50565b61176d611eb4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290613bc4565b60405180910390fd5b80600560006117e8611eb4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611895611eb4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118da9190613a87565b60405180910390a35050565b6118f76118f1611eb4565b83611f75565b611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90613da4565b60405180910390fd5b61194284848484612393565b50505050565b6060611953826123ef565b9050919050565b600e5481565b600d5481565b600f60019054906101000a900460ff166119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac90613ae4565b60405180910390fd5b67012dfb0cb5e88000341015611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790613de4565b60405180910390fd5b6106f1611a0b610b4d565b10611a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4290613ac4565b60405180910390fd5b60006001611a57610b4d565b611a619190613f42565b9050611a6d3382612375565b6000600d54148015611a875750612710611a85610b4d565b145b15611a945743600d819055505b50565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e5414611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6790613c04565b60405180910390fd5b6000600d541415611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad90613d84565b60405180910390fd5b612710600d544060001c611bca91906141b9565b600e8190555060ff600d5443611be09190614023565b1115611c0b57612710600143611bf69190614023565b4060001c611c0491906141b9565b600e819055505b6000600e541415611c2c576001600e54611c259190613f42565b600e819055505b565b611c36611eb4565b73ffffffffffffffffffffffffffffffffffffffff16611c546114a6565b73ffffffffffffffffffffffffffffffffffffffff1614611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190613ce4565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b611cde611eb4565b73ffffffffffffffffffffffffffffffffffffffff16611cfc6114a6565b73ffffffffffffffffffffffffffffffffffffffff1614611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4990613ce4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990613b44565b60405180910390fd5b611dcb816122af565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e415750611e4082612496565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f2f83610f29565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f8082611e48565b611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690613be4565b60405180910390fd5b6000611fca83610f29565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061203957508373ffffffffffffffffffffffffffffffffffffffff166120218461091a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061204a57506120498185611a97565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661207382610f29565b73ffffffffffffffffffffffffffffffffffffffff16146120c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c090613d04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213090613ba4565b60405180910390fd5b612144838383612578565b61214f600082611ebc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461219f9190614023565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f69190613f42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61238f828260405180602001604052806000815250612588565b5050565b61239e848484612053565b6123aa848484846125e3565b6123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090613b24565b60405180910390fd5b50505050565b60606123fa82611e48565b612439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243090613d24565b60405180910390fd5b600061244361277a565b90506000815111612463576040518060200160405280600081525061248e565b8061246d8461280c565b60405160200161247e9291906139da565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061256157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125715750612570826129b9565b5b9050919050565b612583838383612a23565b505050565b6125928383612b37565b61259f60008484846125e3565b6125de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d590613b24565b60405180910390fd5b505050565b60006126048473ffffffffffffffffffffffffffffffffffffffff16612d05565b1561276d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261262d611eb4565b8786866040518563ffffffff1660e01b815260040161264f9493929190613a19565b602060405180830381600087803b15801561266957600080fd5b505af192505050801561269a57506040513d601f19601f820116820180604052508101906126979190613441565b60015b61271d573d80600081146126ca576040519150601f19603f3d011682016040523d82523d6000602084013e6126cf565b606091505b50600081511415612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c90613b24565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612772565b600190505b949350505050565b6060600c80546127899061410d565b80601f01602080910402602001604051908101604052809291908181526020018280546127b59061410d565b80156128025780601f106127d757610100808354040283529160200191612802565b820191906000526020600020905b8154815290600101906020018083116127e557829003601f168201915b5050505050905090565b60606000821415612854576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129b4565b600082905060005b6000821461288657808061286f90614170565b915050600a8261287f9190613f98565b915061285c565b60008167ffffffffffffffff8111156128c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128fa5781602001600182028036833780820191505090505b5090505b600085146129ad576001826129139190614023565b9150600a8561292291906141b9565b603061292e9190613f42565b60f81b81838151811061296a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129a69190613f98565b94506128fe565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a2e838383612d18565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a7157612a6c81612d1d565b612ab0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aaf57612aae8382612d66565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af357612aee81612ed3565b612b32565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b3157612b308282613016565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e90613ca4565b60405180910390fd5b612bb081611e48565b15612bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be790613b64565b60405180910390fd5b612bfc60008383612578565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c4c9190613f42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d7384611000565b612d7d9190614023565b9050600060076000848152602001908152602001600020549050818114612e62576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ee79190614023565b9050600060096000848152602001908152602001600020549050600060088381548110612f3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ffa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061302183611000565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546130a19061410d565b90600052602060002090601f0160209004810192826130c3576000855561310a565b82601f106130dc57805160ff191683800117855561310a565b8280016001018555821561310a579182015b828111156131095782518255916020019190600101906130ee565b5b509050613117919061311b565b5090565b5b8082111561313457600081600090555060010161311c565b5090565b600061314b61314684613e64565b613e3f565b90508281526020810184848401111561316357600080fd5b61316e8482856140cb565b509392505050565b600061318961318484613e95565b613e3f565b9050828152602081018484840111156131a157600080fd5b6131ac8482856140cb565b509392505050565b6000813590506131c38161491e565b92915050565b6000813590506131d881614935565b92915050565b6000813590506131ed8161494c565b92915050565b6000815190506132028161494c565b92915050565b600082601f83011261321957600080fd5b8135613229848260208601613138565b91505092915050565b600082601f83011261324357600080fd5b8135613253848260208601613176565b91505092915050565b60008135905061326b81614963565b92915050565b60006020828403121561328357600080fd5b6000613291848285016131b4565b91505092915050565b600080604083850312156132ad57600080fd5b60006132bb858286016131b4565b92505060206132cc858286016131b4565b9150509250929050565b6000806000606084860312156132eb57600080fd5b60006132f9868287016131b4565b935050602061330a868287016131b4565b925050604061331b8682870161325c565b9150509250925092565b6000806000806080858703121561333b57600080fd5b6000613349878288016131b4565b945050602061335a878288016131b4565b935050604061336b8782880161325c565b925050606085013567ffffffffffffffff81111561338857600080fd5b61339487828801613208565b91505092959194509250565b600080604083850312156133b357600080fd5b60006133c1858286016131b4565b92505060206133d2858286016131c9565b9150509250929050565b600080604083850312156133ef57600080fd5b60006133fd858286016131b4565b925050602061340e8582860161325c565b9150509250929050565b60006020828403121561342a57600080fd5b6000613438848285016131de565b91505092915050565b60006020828403121561345357600080fd5b6000613461848285016131f3565b91505092915050565b60006020828403121561347c57600080fd5b600082013567ffffffffffffffff81111561349657600080fd5b6134a284828501613232565b91505092915050565b6000602082840312156134bd57600080fd5b60006134cb8482850161325c565b91505092915050565b60006134e083836139bc565b60208301905092915050565b6134f581614057565b82525050565b600061350682613ed6565b6135108185613f04565b935061351b83613ec6565b8060005b8381101561354c57815161353388826134d4565b975061353e83613ef7565b92505060018101905061351f565b5085935050505092915050565b61356281614069565b82525050565b600061357382613ee1565b61357d8185613f15565b935061358d8185602086016140da565b613596816142a6565b840191505092915050565b60006135ac82613eec565b6135b68185613f26565b93506135c68185602086016140da565b6135cf816142a6565b840191505092915050565b60006135e582613eec565b6135ef8185613f37565b93506135ff8185602086016140da565b80840191505092915050565b6000613618601183613f26565b9150613623826142b7565b602082019050919050565b600061363b601783613f26565b9150613646826142e0565b602082019050919050565b600061365e602b83613f26565b915061366982614309565b604082019050919050565b6000613681603283613f26565b915061368c82614358565b604082019050919050565b60006136a4602683613f26565b91506136af826143a7565b604082019050919050565b60006136c7601c83613f26565b91506136d2826143f6565b602082019050919050565b60006136ea600e83613f26565b91506136f58261441f565b602082019050919050565b600061370d602483613f26565b915061371882614448565b604082019050919050565b6000613730601983613f26565b915061373b82614497565b602082019050919050565b6000613753602c83613f26565b915061375e826144c0565b604082019050919050565b6000613776601d83613f26565b91506137818261450f565b602082019050919050565b6000613799603883613f26565b91506137a482614538565b604082019050919050565b60006137bc602a83613f26565b91506137c782614587565b604082019050919050565b60006137df602983613f26565b91506137ea826145d6565b604082019050919050565b6000613802601983613f26565b915061380d82614625565b602082019050919050565b6000613825602083613f26565b91506138308261464e565b602082019050919050565b6000613848602c83613f26565b915061385382614677565b604082019050919050565b600061386b602083613f26565b9150613876826146c6565b602082019050919050565b600061388e602983613f26565b9150613899826146ef565b604082019050919050565b60006138b1602f83613f26565b91506138bc8261473e565b604082019050919050565b60006138d4601283613f26565b91506138df8261478d565b602082019050919050565b60006138f7602183613f26565b9150613902826147b6565b604082019050919050565b600061391a602083613f26565b915061392582614805565b602082019050919050565b600061393d603183613f26565b91506139488261482e565b604082019050919050565b6000613960602c83613f26565b915061396b8261487d565b604082019050919050565b6000613983601583613f26565b915061398e826148cc565b602082019050919050565b60006139a6601483613f26565b91506139b1826148f5565b602082019050919050565b6139c5816140c1565b82525050565b6139d4816140c1565b82525050565b60006139e682856135da565b91506139f282846135da565b91508190509392505050565b6000602082019050613a1360008301846134ec565b92915050565b6000608082019050613a2e60008301876134ec565b613a3b60208301866134ec565b613a4860408301856139cb565b8181036060830152613a5a8184613568565b905095945050505050565b60006020820190508181036000830152613a7f81846134fb565b905092915050565b6000602082019050613a9c6000830184613559565b92915050565b60006020820190508181036000830152613abc81846135a1565b905092915050565b60006020820190508181036000830152613add8161360b565b9050919050565b60006020820190508181036000830152613afd8161362e565b9050919050565b60006020820190508181036000830152613b1d81613651565b9050919050565b60006020820190508181036000830152613b3d81613674565b9050919050565b60006020820190508181036000830152613b5d81613697565b9050919050565b60006020820190508181036000830152613b7d816136ba565b9050919050565b60006020820190508181036000830152613b9d816136dd565b9050919050565b60006020820190508181036000830152613bbd81613700565b9050919050565b60006020820190508181036000830152613bdd81613723565b9050919050565b60006020820190508181036000830152613bfd81613746565b9050919050565b60006020820190508181036000830152613c1d81613769565b9050919050565b60006020820190508181036000830152613c3d8161378c565b9050919050565b60006020820190508181036000830152613c5d816137af565b9050919050565b60006020820190508181036000830152613c7d816137d2565b9050919050565b60006020820190508181036000830152613c9d816137f5565b9050919050565b60006020820190508181036000830152613cbd81613818565b9050919050565b60006020820190508181036000830152613cdd8161383b565b9050919050565b60006020820190508181036000830152613cfd8161385e565b9050919050565b60006020820190508181036000830152613d1d81613881565b9050919050565b60006020820190508181036000830152613d3d816138a4565b9050919050565b60006020820190508181036000830152613d5d816138c7565b9050919050565b60006020820190508181036000830152613d7d816138ea565b9050919050565b60006020820190508181036000830152613d9d8161390d565b9050919050565b60006020820190508181036000830152613dbd81613930565b9050919050565b60006020820190508181036000830152613ddd81613953565b9050919050565b60006020820190508181036000830152613dfd81613976565b9050919050565b60006020820190508181036000830152613e1d81613999565b9050919050565b6000602082019050613e3960008301846139cb565b92915050565b6000613e49613e5a565b9050613e55828261413f565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7f57613e7e614277565b5b613e88826142a6565b9050602081019050919050565b600067ffffffffffffffff821115613eb057613eaf614277565b5b613eb9826142a6565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f4d826140c1565b9150613f58836140c1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f8d57613f8c6141ea565b5b828201905092915050565b6000613fa3826140c1565b9150613fae836140c1565b925082613fbe57613fbd614219565b5b828204905092915050565b6000613fd4826140c1565b9150613fdf836140c1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614018576140176141ea565b5b828202905092915050565b600061402e826140c1565b9150614039836140c1565b92508282101561404c5761404b6141ea565b5b828203905092915050565b6000614062826140a1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140f85780820151818401526020810190506140dd565b83811115614107576000848401525b50505050565b6000600282049050600182168061412557607f821691505b6020821081141561413957614138614248565b5b50919050565b614148826142a6565b810181811067ffffffffffffffff8211171561416757614166614277565b5b80604052505050565b600061417b826140c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ae576141ad6141ea565b5b600182019050919050565b60006141c4826140c1565b91506141cf836140c1565b9250826141df576141de614219565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f50726573616c652068617320656e646564000000000000000000000000000000600082015250565b7f50726573616c6520686173206e6f742073746172746564000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c652068617320656e646564000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45786365656473204d41585f4d494e545f5045525f43414c4c00000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473204d41585f535550504c590000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e636f72726563742065746865722076616c75650000000000000000000000600082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b61492781614057565b811461493257600080fd5b50565b61493e81614069565b811461494957600080fd5b50565b61495581614075565b811461496057600080fd5b50565b61496c816140c1565b811461497757600080fd5b5056fea264697066735822122090417bd9979134238cb73bedaf013e94207eeb8b41d08bdcee0d204b541af21264736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544b51714b6f6631775a6b336443536f4d365a43705a61534257633942714c52713438385231776b773177692f00000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmTKQqKof1wZk3dCSoM6ZCpZaSBWc9BqLRq488R1wkw1wi/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d544b51714b6f6631775a6b336443536f4d365a43705a61
Arg [3] : 534257633942714c52713438385231776b773177692f00000000000000000000
Deployed Bytecode Sourcemap
43037:4933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46851:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13729:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15288:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14811:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47849:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26440:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43431:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16178:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26108:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43250:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46095:87;;;;;;;;;;;;;:::i;:::-;;46292:106;;;;;;;;;;;;;:::i;:::-;;16588:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26630:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43854:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13423:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43180:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43536:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43578:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13153:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43954:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2514:94;;;;;;;;;;;;;:::i;:::-;;43119:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47671:172;;;;;;;;;;;;;:::i;:::-;;44054:472;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1863:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13898:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45205:884;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15581:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16844:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46693:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43383:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43345:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44532:667;;;:::i;:::-;;15947:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47045:620;;;;;;;;;;;;;:::i;:::-;;46188:96;;;;;;;;;;;;;:::i;:::-;;2763:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46851:188;46974:4;46997:36;47021:11;46997:23;:36::i;:::-;46990:43;;46851:188;;;:::o;13729:100::-;13783:13;13816:5;13809:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13729:100;:::o;15288:221::-;15364:7;15392:16;15400:7;15392;:16::i;:::-;15384:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15477:15;:24;15493:7;15477:24;;;;;;;;;;;;;;;;;;;;;15470:31;;15288:221;;;:::o;14811:411::-;14892:13;14908:23;14923:7;14908:14;:23::i;:::-;14892:39;;14956:5;14950:11;;:2;:11;;;;14942:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;15050:5;15034:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;15059:37;15076:5;15083:12;:10;:12::i;:::-;15059:16;:37::i;:::-;15034:62;15012:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;15193:21;15202:2;15206:7;15193:8;:21::i;:::-;14811:411;;;:::o;47849:118::-;2094:12;:10;:12::i;:::-;2083:23;;:7;:5;:7::i;:::-;:23;;;2075:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47947:14:::1;47930;:31;;;;;;;;;;;;:::i;:::-;;47849:118:::0;:::o;26440:113::-;26501:7;26528:10;:17;;;;26521:24;;26440:113;:::o;43431:34::-;;;;;;;;;;;;;:::o;16178:339::-;16373:41;16392:12;:10;:12::i;:::-;16406:7;16373:18;:41::i;:::-;16365:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;16481:28;16491:4;16497:2;16501:7;16481:9;:28::i;:::-;16178:339;;;:::o;26108:256::-;26205:7;26241:23;26258:5;26241:16;:23::i;:::-;26233:5;:31;26225:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;26330:12;:19;26343:5;26330:19;;;;;;;;;;;;;;;:26;26350:5;26330:26;;;;;;;;;;;;26323:33;;26108:256;;;;:::o;43250:39::-;43284:5;43250:39;:::o;46095:87::-;2094:12;:10;:12::i;:::-;2083:23;;:7;:5;:7::i;:::-;:23;;;2075:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46162:14:::1;;;;;;;;;;;46161:15;46144:14;;:32;;;;;;;;;;;;;;;;;;46095:87::o:0;46292:106::-;2094:12;:10;:12::i;:::-;2083:23;;:7;:5;:7::i;:::-;:23;;;2075:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46352:10:::1;46344:24;;:47;46369:21;46344:47;;;;;;;;;;;;;;;;;;;;;;;46336:56;;;::::0;::::1;;46292:106::o:0;16588:185::-;16726:39;16743:4;16749:2;16753:7;16726:39;;;;;;;;;;;;:16;:39::i;:::-;16588:185;;;:::o;26630:233::-;26705:7;26741:30;:28;:30::i;:::-;26733:5;:38;26725:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;26838:10;26849:5;26838:17;;;;;;;;;;;;;;;;;;;;;;;;26831:24;;26630:233;;;:::o;43854:96::-;2094:12;:10;:12::i;:::-;2083:23;;:7;:5;:7::i;:::-;:23;;;2075:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43937:7:::1;43921:13;:23;;;;;;;;;;;;:::i;:::-;;43854:96:::0;:::o;13423:239::-;13495:7;13515:13;13531:7;:16;13539:7;13531:16;;;;;;;;;;;;;;;;;;;;;13515:32;;13583:1;13566:19;;:5;:19;;;;13558:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13649:5;13642:12;;;13423:239;;;:::o;43180:53::-;43216:17;43180:53;:::o;43536:37::-;;;;;;;;;;;;;:::o;43578:46::-;43620:4;43578:46;:::o;13153:208::-;13225:7;13270:1;13253:19;;:5;:19;;;;13245:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;13337:9;:16;13347:5;13337:16;;;;;;;;;;;;;;;;13330:23;;13153:208;;;:::o;43954:92::-;43998:13;44027;44020:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43954:92;:::o;2514:94::-;2094:12;:10;:12::i;:::-;2083:23;;:7;:5;:7::i;:::-;:23;;;2075:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2579:21:::1;2597:1;2579:9;:21::i;:::-;2514:94::o:0;43119:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47671:172::-;2094:12;:10;:12::i;:::-;2083:23;;:7;:5;:7::i;:::-;:23;;;2075:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47762:1:::1;47745:13;;:18;47737:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;47825:12;47804:18;:33;;;;47671:172::o:0;44054:472::-;44115:16;44141:18;44162:17;44172:6;44162:9;:17::i;:::-;44141:38;;44204:1;44190:10;:15;44186:335;;;44269:1;44255:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44248:23;;;;;44186:335;44294:23;44334:10;44320:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44294:51;;44354:13;44376:116;44400:10;44392:5;:18;44376:116;;;44448:34;44468:6;44476:5;44448:19;:34::i;:::-;44432:6;44439:5;44432:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;44412:7;;;;;:::i;:::-;;;;44376:116;;;44507:6;44500:13;;;;;44054:472;;;;:::o;1863:87::-;1909:7;1936:6;;;;;;;;;;;1929:13;;1863:87;:::o;13898:104::-;13954:13;13987:7;13980:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13898:104;:::o;45205:884::-;45266:14;;;;;;;;;;;45258:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;45333:13;:11;:13::i;:::-;43284:5;45320:26;45312:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;45390:1;45380:7;:11;:43;;;;;43512:2;45395:7;:28;;45380:43;45372:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45498:7;45482:13;:11;:13::i;:::-;:23;;;;:::i;:::-;43284:5;45468:37;;45460:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45568:7;43216:17;45556:19;;;;:::i;:::-;45543:9;:32;;45535:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45615:6;45610:165;45631:7;45627:1;:11;45610:165;;;45654:14;45687:1;45671:13;:11;:13::i;:::-;:17;;;;:::i;:::-;45654:34;;45735:32;45745:10;45757:9;45735;:32::i;:::-;45610:165;45640:3;;;;;:::i;:::-;;;;45610:165;;;;45997:1;45975:18;;:23;:56;;;;;43284:5;46003:13;:11;:13::i;:::-;:27;45975:56;45971:112;;;46063:12;46042:18;:33;;;;45971:112;45205:884;:::o;15581:295::-;15696:12;:10;:12::i;:::-;15684:24;;:8;:24;;;;15676:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;15796:8;15751:18;:32;15770:12;:10;:12::i;:::-;15751:32;;;;;;;;;;;;;;;:42;15784:8;15751:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;15849:8;15820:48;;15835:12;:10;:12::i;:::-;15820:48;;;15859:8;15820:48;;;;;;:::i;:::-;;;;;;;;15581:295;;:::o;16844:328::-;17019:41;17038:12;:10;:12::i;:::-;17052:7;17019:18;:41::i;:::-;17011:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;17125:39;17139:4;17145:2;17149:7;17158:5;17125:13;:39::i;:::-;16844:328;;;;:::o;46693:154::-;46786:13;46818:23;46833:7;46818:14;:23::i;:::-;46811:30;;46693:154;;;:::o;43383:28::-;;;;:::o;43345:33::-;;;;:::o;44532:667::-;44585:17;;;;;;;;;;;44577:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43216:17;44645:9;:22;;44637:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;43620:4;44708:13;:11;:13::i;:::-;:34;44700:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44773:14;44806:1;44790:13;:11;:13::i;:::-;:17;;;;:::i;:::-;44773:34;;44852:32;44862:10;44874:9;44852;:32::i;:::-;45107:1;45085:18;;:23;:56;;;;;43284:5;45113:13;:11;:13::i;:::-;:27;45085:56;45081:112;;;45173:12;45152:18;:33;;;;45081:112;44532:667;:::o;15947:164::-;16044:4;16068:18;:25;16087:5;16068:25;;;;;;;;;;;;;;;:35;16094:8;16068:35;;;;;;;;;;;;;;;;;;;;;;;;;16061:42;;15947:164;;;;:::o;47045:620::-;47112:1;47095:13;;:18;47087:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;47184:1;47162:18;;:23;;47154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43284:5;47266:18;;47256:29;47251:35;;:48;;;;:::i;:::-;47235:13;:64;;;;47463:3;47442:18;;47427:12;:33;;;;:::i;:::-;:39;47423:124;;;43284:5;47523:1;47508:12;:16;;;;:::i;:::-;47498:27;47493:33;;:46;;;;:::i;:::-;47477:13;:62;;;;47423:124;47607:1;47590:13;;:18;47586:74;;;47651:1;47635:13;;:17;;;;:::i;:::-;47619:13;:33;;;;47586:74;47045:620::o;46188:96::-;2094:12;:10;:12::i;:::-;2083:23;;:7;:5;:7::i;:::-;:23;;;2075:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46261:17:::1;;;;;;;;;;;46260:18;46240:17;;:38;;;;;;;;;;;;;;;;;;46188:96::o:0;2763:192::-;2094:12;:10;:12::i;:::-;2083:23;;:7;:5;:7::i;:::-;:23;;;2075:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2872:1:::1;2852:22;;:8;:22;;;;2844:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2928:19;2938:8;2928:9;:19::i;:::-;2763:192:::0;:::o;25800:224::-;25902:4;25941:35;25926:50;;;:11;:50;;;;:90;;;;25980:36;26004:11;25980:23;:36::i;:::-;25926:90;25919:97;;25800:224;;;:::o;18682:127::-;18747:4;18799:1;18771:30;;:7;:16;18779:7;18771:16;;;;;;;;;;;;;;;;;;;;;:30;;;;18764:37;;18682:127;;;:::o;656:98::-;709:7;736:10;729:17;;656:98;:::o;22664:174::-;22766:2;22739:15;:24;22755:7;22739:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22822:7;22818:2;22784:46;;22793:23;22808:7;22793:14;:23::i;:::-;22784:46;;;;;;;;;;;;22664:174;;:::o;18976:348::-;19069:4;19094:16;19102:7;19094;:16::i;:::-;19086:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19170:13;19186:23;19201:7;19186:14;:23::i;:::-;19170:39;;19239:5;19228:16;;:7;:16;;;:51;;;;19272:7;19248:31;;:20;19260:7;19248:11;:20::i;:::-;:31;;;19228:51;:87;;;;19283:32;19300:5;19307:7;19283:16;:32::i;:::-;19228:87;19220:96;;;18976:348;;;;:::o;21968:578::-;22127:4;22100:31;;:23;22115:7;22100:14;:23::i;:::-;:31;;;22092:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;22210:1;22196:16;;:2;:16;;;;22188:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;22266:39;22287:4;22293:2;22297:7;22266:20;:39::i;:::-;22370:29;22387:1;22391:7;22370:8;:29::i;:::-;22431:1;22412:9;:15;22422:4;22412:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;22460:1;22443:9;:13;22453:2;22443:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;22491:2;22472:7;:16;22480:7;22472:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;22530:7;22526:2;22511:27;;22520:4;22511:27;;;;;;;;;;;;21968:578;;;:::o;2963:173::-;3019:16;3038:6;;;;;;;;;;;3019:25;;3064:8;3055:6;;:17;;;;;;;;;;;;;;;;;;3119:8;3088:40;;3109:8;3088:40;;;;;;;;;;;;2963:173;;:::o;19666:110::-;19742:26;19752:2;19756:7;19742:26;;;;;;;;;;;;:9;:26::i;:::-;19666:110;;:::o;18054:315::-;18211:28;18221:4;18227:2;18231:7;18211:9;:28::i;:::-;18258:48;18281:4;18287:2;18291:7;18300:5;18258:22;:48::i;:::-;18250:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;18054:315;;;;:::o;14073:334::-;14146:13;14180:16;14188:7;14180;:16::i;:::-;14172:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;14261:21;14285:10;:8;:10::i;:::-;14261:34;;14337:1;14319:7;14313:21;:25;:86;;;;;;;;;;;;;;;;;14365:7;14374:18;:7;:16;:18::i;:::-;14348:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14313:86;14306:93;;;14073:334;;;:::o;12784:305::-;12886:4;12938:25;12923:40;;;:11;:40;;;;:105;;;;12995:33;12980:48;;;:11;:48;;;;12923:105;:158;;;;13045:36;13069:11;13045:23;:36::i;:::-;12923:158;12903:178;;12784:305;;;:::o;46402:188::-;46539:45;46566:4;46572:2;46576:7;46539:26;:45::i;:::-;46402:188;;;:::o;20003:321::-;20133:18;20139:2;20143:7;20133:5;:18::i;:::-;20184:54;20215:1;20219:2;20223:7;20232:5;20184:22;:54::i;:::-;20162:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;20003:321;;;:::o;23403:803::-;23558:4;23579:15;:2;:13;;;:15::i;:::-;23575:624;;;23631:2;23615:36;;;23652:12;:10;:12::i;:::-;23666:4;23672:7;23681:5;23615:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23611:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23878:1;23861:6;:13;:18;23857:272;;;23904:60;;;;;;;;;;:::i;:::-;;;;;;;;23857:272;24079:6;24073:13;24064:6;24060:2;24056:15;24049:38;23611:533;23748:45;;;23738:55;;;:6;:55;;;;23731:62;;;;;23575:624;24183:4;24176:11;;23403:803;;;;;;;:::o;43732:116::-;43792:13;43829;43822:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43732:116;:::o;32280:723::-;32336:13;32566:1;32557:5;:10;32553:53;;;32584:10;;;;;;;;;;;;;;;;;;;;;32553:53;32616:12;32631:5;32616:20;;32647:14;32672:78;32687:1;32679:4;:9;32672:78;;32705:8;;;;;:::i;:::-;;;;32736:2;32728:10;;;;;:::i;:::-;;;32672:78;;;32760:19;32792:6;32782:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32760:39;;32810:154;32826:1;32817:5;:10;32810:154;;32854:1;32844:11;;;;;:::i;:::-;;;32921:2;32913:5;:10;;;;:::i;:::-;32900:2;:24;;;;:::i;:::-;32887:39;;32870:6;32877;32870:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;32950:2;32941:11;;;;;:::i;:::-;;;32810:154;;;32988:6;32974:21;;;;;32280:723;;;;:::o;10580:157::-;10665:4;10704:25;10689:40;;;:11;:40;;;;10682:47;;10580:157;;;:::o;27476:589::-;27620:45;27647:4;27653:2;27657:7;27620:26;:45::i;:::-;27698:1;27682:18;;:4;:18;;;27678:187;;;27717:40;27749:7;27717:31;:40::i;:::-;27678:187;;;27787:2;27779:10;;:4;:10;;;27775:90;;27806:47;27839:4;27845:7;27806:32;:47::i;:::-;27775:90;27678:187;27893:1;27879:16;;:2;:16;;;27875:183;;;27912:45;27949:7;27912:36;:45::i;:::-;27875:183;;;27985:4;27979:10;;:2;:10;;;27975:83;;28006:40;28034:2;28038:7;28006:27;:40::i;:::-;27975:83;27875:183;27476:589;;;:::o;20660:382::-;20754:1;20740:16;;:2;:16;;;;20732:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;20813:16;20821:7;20813;:16::i;:::-;20812:17;20804:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;20875:45;20904:1;20908:2;20912:7;20875:20;:45::i;:::-;20950:1;20933:9;:13;20943:2;20933:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;20981:2;20962:7;:16;20970:7;20962:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;21026:7;21022:2;21001:33;;21018:1;21001:33;;;;;;;;;;;;20660:382;;:::o;34813:387::-;34873:4;35081:12;35148:7;35136:20;35128:28;;35191:1;35184:4;:8;35177:15;;;34813:387;;;:::o;24778:126::-;;;;:::o;28788:164::-;28892:10;:17;;;;28865:15;:24;28881:7;28865:24;;;;;;;;;;;:44;;;;28920:10;28936:7;28920:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28788:164;:::o;29579:988::-;29845:22;29895:1;29870:22;29887:4;29870:16;:22::i;:::-;:26;;;;:::i;:::-;29845:51;;29907:18;29928:17;:26;29946:7;29928:26;;;;;;;;;;;;29907:47;;30075:14;30061:10;:28;30057:328;;30106:19;30128:12;:18;30141:4;30128:18;;;;;;;;;;;;;;;:34;30147:14;30128:34;;;;;;;;;;;;30106:56;;30212:11;30179:12;:18;30192:4;30179:18;;;;;;;;;;;;;;;:30;30198:10;30179:30;;;;;;;;;;;:44;;;;30329:10;30296:17;:30;30314:11;30296:30;;;;;;;;;;;:43;;;;30057:328;;30481:17;:26;30499:7;30481:26;;;;;;;;;;;30474:33;;;30525:12;:18;30538:4;30525:18;;;;;;;;;;;;;;;:34;30544:14;30525:34;;;;;;;;;;;30518:41;;;29579:988;;;;:::o;30862:1079::-;31115:22;31160:1;31140:10;:17;;;;:21;;;;:::i;:::-;31115:46;;31172:18;31193:15;:24;31209:7;31193:24;;;;;;;;;;;;31172:45;;31544:19;31566:10;31577:14;31566:26;;;;;;;;;;;;;;;;;;;;;;;;31544:48;;31630:11;31605:10;31616;31605:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;31741:10;31710:15;:28;31726:11;31710:28;;;;;;;;;;;:41;;;;31882:15;:24;31898:7;31882:24;;;;;;;;;;;31875:31;;;31917:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30862:1079;;;;:::o;28366:221::-;28451:14;28468:20;28485:2;28468:16;:20::i;:::-;28451:37;;28526:7;28499:12;:16;28512:2;28499:16;;;;;;;;;;;;;;;:24;28516:6;28499:24;;;;;;;;;;;:34;;;;28573:6;28544:17;:26;28562:7;28544:26;;;;;;;;;;;:35;;;;28366:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:179::-;6155:10;6176:46;6218:3;6210:6;6176:46;:::i;:::-;6254:4;6249:3;6245:14;6231:28;;6166:99;;;;:::o;6271:118::-;6358:24;6376:5;6358:24;:::i;:::-;6353:3;6346:37;6336:53;;:::o;6425:732::-;6544:3;6573:54;6621:5;6573:54;:::i;:::-;6643:86;6722:6;6717:3;6643:86;:::i;:::-;6636:93;;6753:56;6803:5;6753:56;:::i;:::-;6832:7;6863:1;6848:284;6873:6;6870:1;6867:13;6848:284;;;6949:6;6943:13;6976:63;7035:3;7020:13;6976:63;:::i;:::-;6969:70;;7062:60;7115:6;7062:60;:::i;:::-;7052:70;;6908:224;6895:1;6892;6888:9;6883:14;;6848:284;;;6852:14;7148:3;7141:10;;6549:608;;;;;;;:::o;7163:109::-;7244:21;7259:5;7244:21;:::i;:::-;7239:3;7232:34;7222:50;;:::o;7278:360::-;7364:3;7392:38;7424:5;7392:38;:::i;:::-;7446:70;7509:6;7504:3;7446:70;:::i;:::-;7439:77;;7525:52;7570:6;7565:3;7558:4;7551:5;7547:16;7525:52;:::i;:::-;7602:29;7624:6;7602:29;:::i;:::-;7597:3;7593:39;7586:46;;7368:270;;;;;:::o;7644:364::-;7732:3;7760:39;7793:5;7760:39;:::i;:::-;7815:71;7879:6;7874:3;7815:71;:::i;:::-;7808:78;;7895:52;7940:6;7935:3;7928:4;7921:5;7917:16;7895:52;:::i;:::-;7972:29;7994:6;7972:29;:::i;:::-;7967:3;7963:39;7956:46;;7736:272;;;;;:::o;8014:377::-;8120:3;8148:39;8181:5;8148:39;:::i;:::-;8203:89;8285:6;8280:3;8203:89;:::i;:::-;8196:96;;8301:52;8346:6;8341:3;8334:4;8327:5;8323:16;8301:52;:::i;:::-;8378:6;8373:3;8369:16;8362:23;;8124:267;;;;;:::o;8397:366::-;8539:3;8560:67;8624:2;8619:3;8560:67;:::i;:::-;8553:74;;8636:93;8725:3;8636:93;:::i;:::-;8754:2;8749:3;8745:12;8738:19;;8543:220;;;:::o;8769:366::-;8911:3;8932:67;8996:2;8991:3;8932:67;:::i;:::-;8925:74;;9008:93;9097:3;9008:93;:::i;:::-;9126:2;9121:3;9117:12;9110:19;;8915:220;;;:::o;9141:366::-;9283:3;9304:67;9368:2;9363:3;9304:67;:::i;:::-;9297:74;;9380:93;9469:3;9380:93;:::i;:::-;9498:2;9493:3;9489:12;9482:19;;9287:220;;;:::o;9513:366::-;9655:3;9676:67;9740:2;9735:3;9676:67;:::i;:::-;9669:74;;9752:93;9841:3;9752:93;:::i;:::-;9870:2;9865:3;9861:12;9854:19;;9659:220;;;:::o;9885:366::-;10027:3;10048:67;10112:2;10107:3;10048:67;:::i;:::-;10041:74;;10124:93;10213:3;10124:93;:::i;:::-;10242:2;10237:3;10233:12;10226:19;;10031:220;;;:::o;10257:366::-;10399:3;10420:67;10484:2;10479:3;10420:67;:::i;:::-;10413:74;;10496:93;10585:3;10496:93;:::i;:::-;10614:2;10609:3;10605:12;10598:19;;10403:220;;;:::o;10629:366::-;10771:3;10792:67;10856:2;10851:3;10792:67;:::i;:::-;10785:74;;10868:93;10957:3;10868:93;:::i;:::-;10986:2;10981:3;10977:12;10970:19;;10775:220;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11147:220;;;:::o;11373:366::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11519:220;;;:::o;11745:366::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11891:220;;;:::o;12117:366::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12263:220;;;:::o;12489:366::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12635:220;;;:::o;12861:366::-;13003:3;13024:67;13088:2;13083:3;13024:67;:::i;:::-;13017:74;;13100:93;13189:3;13100:93;:::i;:::-;13218:2;13213:3;13209:12;13202:19;;13007:220;;;:::o;13233:366::-;13375:3;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13472:93;13561:3;13472:93;:::i;:::-;13590:2;13585:3;13581:12;13574:19;;13379:220;;;:::o;13605:366::-;13747:3;13768:67;13832:2;13827:3;13768:67;:::i;:::-;13761:74;;13844:93;13933:3;13844:93;:::i;:::-;13962:2;13957:3;13953:12;13946:19;;13751:220;;;:::o;13977:366::-;14119:3;14140:67;14204:2;14199:3;14140:67;:::i;:::-;14133:74;;14216:93;14305:3;14216:93;:::i;:::-;14334:2;14329:3;14325:12;14318:19;;14123:220;;;:::o;14349:366::-;14491:3;14512:67;14576:2;14571:3;14512:67;:::i;:::-;14505:74;;14588:93;14677:3;14588:93;:::i;:::-;14706:2;14701:3;14697:12;14690:19;;14495:220;;;:::o;14721:366::-;14863:3;14884:67;14948:2;14943:3;14884:67;:::i;:::-;14877:74;;14960:93;15049:3;14960:93;:::i;:::-;15078:2;15073:3;15069:12;15062:19;;14867:220;;;:::o;15093:366::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15239:220;;;:::o;15465:366::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15611:220;;;:::o;15837:366::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15983:220;;;:::o;16209:366::-;16351:3;16372:67;16436:2;16431:3;16372:67;:::i;:::-;16365:74;;16448:93;16537:3;16448:93;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16355:220;;;:::o;16581:366::-;16723:3;16744:67;16808:2;16803:3;16744:67;:::i;:::-;16737:74;;16820:93;16909:3;16820:93;:::i;:::-;16938:2;16933:3;16929:12;16922:19;;16727:220;;;:::o;16953:366::-;17095:3;17116:67;17180:2;17175:3;17116:67;:::i;:::-;17109:74;;17192:93;17281:3;17192:93;:::i;:::-;17310:2;17305:3;17301:12;17294:19;;17099:220;;;:::o;17325:366::-;17467:3;17488:67;17552:2;17547:3;17488:67;:::i;:::-;17481:74;;17564:93;17653:3;17564:93;:::i;:::-;17682:2;17677:3;17673:12;17666:19;;17471:220;;;:::o;17697:366::-;17839:3;17860:67;17924:2;17919:3;17860:67;:::i;:::-;17853:74;;17936:93;18025:3;17936:93;:::i;:::-;18054:2;18049:3;18045:12;18038:19;;17843:220;;;:::o;18069:366::-;18211:3;18232:67;18296:2;18291:3;18232:67;:::i;:::-;18225:74;;18308:93;18397:3;18308:93;:::i;:::-;18426:2;18421:3;18417:12;18410:19;;18215:220;;;:::o;18441:108::-;18518:24;18536:5;18518:24;:::i;:::-;18513:3;18506:37;18496:53;;:::o;18555:118::-;18642:24;18660:5;18642:24;:::i;:::-;18637:3;18630:37;18620:53;;:::o;18679:435::-;18859:3;18881:95;18972:3;18963:6;18881:95;:::i;:::-;18874:102;;18993:95;19084:3;19075:6;18993:95;:::i;:::-;18986:102;;19105:3;19098:10;;18863:251;;;;;:::o;19120:222::-;19213:4;19251:2;19240:9;19236:18;19228:26;;19264:71;19332:1;19321:9;19317:17;19308:6;19264:71;:::i;:::-;19218:124;;;;:::o;19348:640::-;19543:4;19581:3;19570:9;19566:19;19558:27;;19595:71;19663:1;19652:9;19648:17;19639:6;19595:71;:::i;:::-;19676:72;19744:2;19733:9;19729:18;19720:6;19676:72;:::i;:::-;19758;19826:2;19815:9;19811:18;19802:6;19758:72;:::i;:::-;19877:9;19871:4;19867:20;19862:2;19851:9;19847:18;19840:48;19905:76;19976:4;19967:6;19905:76;:::i;:::-;19897:84;;19548:440;;;;;;;:::o;19994:373::-;20137:4;20175:2;20164:9;20160:18;20152:26;;20224:9;20218:4;20214:20;20210:1;20199:9;20195:17;20188:47;20252:108;20355:4;20346:6;20252:108;:::i;:::-;20244:116;;20142:225;;;;:::o;20373:210::-;20460:4;20498:2;20487:9;20483:18;20475:26;;20511:65;20573:1;20562:9;20558:17;20549:6;20511:65;:::i;:::-;20465:118;;;;:::o;20589:313::-;20702:4;20740:2;20729:9;20725:18;20717:26;;20789:9;20783:4;20779:20;20775:1;20764:9;20760:17;20753:47;20817:78;20890:4;20881:6;20817:78;:::i;:::-;20809:86;;20707:195;;;;:::o;20908:419::-;21074:4;21112:2;21101:9;21097:18;21089:26;;21161:9;21155:4;21151:20;21147:1;21136:9;21132:17;21125:47;21189:131;21315:4;21189:131;:::i;:::-;21181:139;;21079:248;;;:::o;21333:419::-;21499:4;21537:2;21526:9;21522:18;21514:26;;21586:9;21580:4;21576:20;21572:1;21561:9;21557:17;21550:47;21614:131;21740:4;21614:131;:::i;:::-;21606:139;;21504:248;;;:::o;21758:419::-;21924:4;21962:2;21951:9;21947:18;21939:26;;22011:9;22005:4;22001:20;21997:1;21986:9;21982:17;21975:47;22039:131;22165:4;22039:131;:::i;:::-;22031:139;;21929:248;;;:::o;22183:419::-;22349:4;22387:2;22376:9;22372:18;22364:26;;22436:9;22430:4;22426:20;22422:1;22411:9;22407:17;22400:47;22464:131;22590:4;22464:131;:::i;:::-;22456:139;;22354:248;;;:::o;22608:419::-;22774:4;22812:2;22801:9;22797:18;22789:26;;22861:9;22855:4;22851:20;22847:1;22836:9;22832:17;22825:47;22889:131;23015:4;22889:131;:::i;:::-;22881:139;;22779:248;;;:::o;23033:419::-;23199:4;23237:2;23226:9;23222:18;23214:26;;23286:9;23280:4;23276:20;23272:1;23261:9;23257:17;23250:47;23314:131;23440:4;23314:131;:::i;:::-;23306:139;;23204:248;;;:::o;23458:419::-;23624:4;23662:2;23651:9;23647:18;23639:26;;23711:9;23705:4;23701:20;23697:1;23686:9;23682:17;23675:47;23739:131;23865:4;23739:131;:::i;:::-;23731:139;;23629:248;;;:::o;23883:419::-;24049:4;24087:2;24076:9;24072:18;24064:26;;24136:9;24130:4;24126:20;24122:1;24111:9;24107:17;24100:47;24164:131;24290:4;24164:131;:::i;:::-;24156:139;;24054:248;;;:::o;24308:419::-;24474:4;24512:2;24501:9;24497:18;24489:26;;24561:9;24555:4;24551:20;24547:1;24536:9;24532:17;24525:47;24589:131;24715:4;24589:131;:::i;:::-;24581:139;;24479:248;;;:::o;24733:419::-;24899:4;24937:2;24926:9;24922:18;24914:26;;24986:9;24980:4;24976:20;24972:1;24961:9;24957:17;24950:47;25014:131;25140:4;25014:131;:::i;:::-;25006:139;;24904:248;;;:::o;25158:419::-;25324:4;25362:2;25351:9;25347:18;25339:26;;25411:9;25405:4;25401:20;25397:1;25386:9;25382:17;25375:47;25439:131;25565:4;25439:131;:::i;:::-;25431:139;;25329:248;;;:::o;25583:419::-;25749:4;25787:2;25776:9;25772:18;25764:26;;25836:9;25830:4;25826:20;25822:1;25811:9;25807:17;25800:47;25864:131;25990:4;25864:131;:::i;:::-;25856:139;;25754:248;;;:::o;26008:419::-;26174:4;26212:2;26201:9;26197:18;26189:26;;26261:9;26255:4;26251:20;26247:1;26236:9;26232:17;26225:47;26289:131;26415:4;26289:131;:::i;:::-;26281:139;;26179:248;;;:::o;26433:419::-;26599:4;26637:2;26626:9;26622:18;26614:26;;26686:9;26680:4;26676:20;26672:1;26661:9;26657:17;26650:47;26714:131;26840:4;26714:131;:::i;:::-;26706:139;;26604:248;;;:::o;26858:419::-;27024:4;27062:2;27051:9;27047:18;27039:26;;27111:9;27105:4;27101:20;27097:1;27086:9;27082:17;27075:47;27139:131;27265:4;27139:131;:::i;:::-;27131:139;;27029:248;;;:::o;27283:419::-;27449:4;27487:2;27476:9;27472:18;27464:26;;27536:9;27530:4;27526:20;27522:1;27511:9;27507:17;27500:47;27564:131;27690:4;27564:131;:::i;:::-;27556:139;;27454:248;;;:::o;27708:419::-;27874:4;27912:2;27901:9;27897:18;27889:26;;27961:9;27955:4;27951:20;27947:1;27936:9;27932:17;27925:47;27989:131;28115:4;27989:131;:::i;:::-;27981:139;;27879:248;;;:::o;28133:419::-;28299:4;28337:2;28326:9;28322:18;28314:26;;28386:9;28380:4;28376:20;28372:1;28361:9;28357:17;28350:47;28414:131;28540:4;28414:131;:::i;:::-;28406:139;;28304:248;;;:::o;28558:419::-;28724:4;28762:2;28751:9;28747:18;28739:26;;28811:9;28805:4;28801:20;28797:1;28786:9;28782:17;28775:47;28839:131;28965:4;28839:131;:::i;:::-;28831:139;;28729:248;;;:::o;28983:419::-;29149:4;29187:2;29176:9;29172:18;29164:26;;29236:9;29230:4;29226:20;29222:1;29211:9;29207:17;29200:47;29264:131;29390:4;29264:131;:::i;:::-;29256:139;;29154:248;;;:::o;29408:419::-;29574:4;29612:2;29601:9;29597:18;29589:26;;29661:9;29655:4;29651:20;29647:1;29636:9;29632:17;29625:47;29689:131;29815:4;29689:131;:::i;:::-;29681:139;;29579:248;;;:::o;29833:419::-;29999:4;30037:2;30026:9;30022:18;30014:26;;30086:9;30080:4;30076:20;30072:1;30061:9;30057:17;30050:47;30114:131;30240:4;30114:131;:::i;:::-;30106:139;;30004:248;;;:::o;30258:419::-;30424:4;30462:2;30451:9;30447:18;30439:26;;30511:9;30505:4;30501:20;30497:1;30486:9;30482:17;30475:47;30539:131;30665:4;30539:131;:::i;:::-;30531:139;;30429:248;;;:::o;30683:419::-;30849:4;30887:2;30876:9;30872:18;30864:26;;30936:9;30930:4;30926:20;30922:1;30911:9;30907:17;30900:47;30964:131;31090:4;30964:131;:::i;:::-;30956:139;;30854:248;;;:::o;31108:419::-;31274:4;31312:2;31301:9;31297:18;31289:26;;31361:9;31355:4;31351:20;31347:1;31336:9;31332:17;31325:47;31389:131;31515:4;31389:131;:::i;:::-;31381:139;;31279:248;;;:::o;31533:419::-;31699:4;31737:2;31726:9;31722:18;31714:26;;31786:9;31780:4;31776:20;31772:1;31761:9;31757:17;31750:47;31814:131;31940:4;31814:131;:::i;:::-;31806:139;;31704:248;;;:::o;31958:419::-;32124:4;32162:2;32151:9;32147:18;32139:26;;32211:9;32205:4;32201:20;32197:1;32186:9;32182:17;32175:47;32239:131;32365:4;32239:131;:::i;:::-;32231:139;;32129:248;;;:::o;32383:222::-;32476:4;32514:2;32503:9;32499:18;32491:26;;32527:71;32595:1;32584:9;32580:17;32571:6;32527:71;:::i;:::-;32481:124;;;;:::o;32611:129::-;32645:6;32672:20;;:::i;:::-;32662:30;;32701:33;32729:4;32721:6;32701:33;:::i;:::-;32652:88;;;:::o;32746:75::-;32779:6;32812:2;32806:9;32796:19;;32786:35;:::o;32827:307::-;32888:4;32978:18;32970:6;32967:30;32964:2;;;33000:18;;:::i;:::-;32964:2;33038:29;33060:6;33038:29;:::i;:::-;33030:37;;33122:4;33116;33112:15;33104:23;;32893:241;;;:::o;33140:308::-;33202:4;33292:18;33284:6;33281:30;33278:2;;;33314:18;;:::i;:::-;33278:2;33352:29;33374:6;33352:29;:::i;:::-;33344:37;;33436:4;33430;33426:15;33418:23;;33207:241;;;:::o;33454:132::-;33521:4;33544:3;33536:11;;33574:4;33569:3;33565:14;33557:22;;33526:60;;;:::o;33592:114::-;33659:6;33693:5;33687:12;33677:22;;33666:40;;;:::o;33712:98::-;33763:6;33797:5;33791:12;33781:22;;33770:40;;;:::o;33816:99::-;33868:6;33902:5;33896:12;33886:22;;33875:40;;;:::o;33921:113::-;33991:4;34023;34018:3;34014:14;34006:22;;33996:38;;;:::o;34040:184::-;34139:11;34173:6;34168:3;34161:19;34213:4;34208:3;34204:14;34189:29;;34151:73;;;;:::o;34230:168::-;34313:11;34347:6;34342:3;34335:19;34387:4;34382:3;34378:14;34363:29;;34325:73;;;;:::o;34404:169::-;34488:11;34522:6;34517:3;34510:19;34562:4;34557:3;34553:14;34538:29;;34500:73;;;;:::o;34579:148::-;34681:11;34718:3;34703:18;;34693:34;;;;:::o;34733:305::-;34773:3;34792:20;34810:1;34792:20;:::i;:::-;34787:25;;34826:20;34844:1;34826:20;:::i;:::-;34821:25;;34980:1;34912:66;34908:74;34905:1;34902:81;34899:2;;;34986:18;;:::i;:::-;34899:2;35030:1;35027;35023:9;35016:16;;34777:261;;;;:::o;35044:185::-;35084:1;35101:20;35119:1;35101:20;:::i;:::-;35096:25;;35135:20;35153:1;35135:20;:::i;:::-;35130:25;;35174:1;35164:2;;35179:18;;:::i;:::-;35164:2;35221:1;35218;35214:9;35209:14;;35086:143;;;;:::o;35235:348::-;35275:7;35298:20;35316:1;35298:20;:::i;:::-;35293:25;;35332:20;35350:1;35332:20;:::i;:::-;35327:25;;35520:1;35452:66;35448:74;35445:1;35442:81;35437:1;35430:9;35423:17;35419:105;35416:2;;;35527:18;;:::i;:::-;35416:2;35575:1;35572;35568:9;35557:20;;35283:300;;;;:::o;35589:191::-;35629:4;35649:20;35667:1;35649:20;:::i;:::-;35644:25;;35683:20;35701:1;35683:20;:::i;:::-;35678:25;;35722:1;35719;35716:8;35713:2;;;35727:18;;:::i;:::-;35713:2;35772:1;35769;35765:9;35757:17;;35634:146;;;;:::o;35786:96::-;35823:7;35852:24;35870:5;35852:24;:::i;:::-;35841:35;;35831:51;;;:::o;35888:90::-;35922:7;35965:5;35958:13;35951:21;35940:32;;35930:48;;;:::o;35984:149::-;36020:7;36060:66;36053:5;36049:78;36038:89;;36028:105;;;:::o;36139:126::-;36176:7;36216:42;36209:5;36205:54;36194:65;;36184:81;;;:::o;36271:77::-;36308:7;36337:5;36326:16;;36316:32;;;:::o;36354:154::-;36438:6;36433:3;36428;36415:30;36500:1;36491:6;36486:3;36482:16;36475:27;36405:103;;;:::o;36514:307::-;36582:1;36592:113;36606:6;36603:1;36600:13;36592:113;;;36691:1;36686:3;36682:11;36676:18;36672:1;36667:3;36663:11;36656:39;36628:2;36625:1;36621:10;36616:15;;36592:113;;;36723:6;36720:1;36717:13;36714:2;;;36803:1;36794:6;36789:3;36785:16;36778:27;36714:2;36563:258;;;;:::o;36827:320::-;36871:6;36908:1;36902:4;36898:12;36888:22;;36955:1;36949:4;36945:12;36976:18;36966:2;;37032:4;37024:6;37020:17;37010:27;;36966:2;37094;37086:6;37083:14;37063:18;37060:38;37057:2;;;37113:18;;:::i;:::-;37057:2;36878:269;;;;:::o;37153:281::-;37236:27;37258:4;37236:27;:::i;:::-;37228:6;37224:40;37366:6;37354:10;37351:22;37330:18;37318:10;37315:34;37312:62;37309:2;;;37377:18;;:::i;:::-;37309:2;37417:10;37413:2;37406:22;37196:238;;;:::o;37440:233::-;37479:3;37502:24;37520:5;37502:24;:::i;:::-;37493:33;;37548:66;37541:5;37538:77;37535:2;;;37618:18;;:::i;:::-;37535:2;37665:1;37658:5;37654:13;37647:20;;37483:190;;;:::o;37679:176::-;37711:1;37728:20;37746:1;37728:20;:::i;:::-;37723:25;;37762:20;37780:1;37762:20;:::i;:::-;37757:25;;37801:1;37791:2;;37806:18;;:::i;:::-;37791:2;37847:1;37844;37840:9;37835:14;;37713:142;;;;:::o;37861:180::-;37909:77;37906:1;37899:88;38006:4;38003:1;37996:15;38030:4;38027:1;38020:15;38047:180;38095:77;38092:1;38085:88;38192:4;38189:1;38182:15;38216:4;38213:1;38206:15;38233:180;38281:77;38278:1;38271:88;38378:4;38375:1;38368:15;38402:4;38399:1;38392:15;38419:180;38467:77;38464:1;38457:88;38564:4;38561:1;38554:15;38588:4;38585:1;38578:15;38605:102;38646:6;38697:2;38693:7;38688:2;38681:5;38677:14;38673:28;38663:38;;38653:54;;;:::o;38713:167::-;38853:19;38849:1;38841:6;38837:14;38830:43;38819:61;:::o;38886:173::-;39026:25;39022:1;39014:6;39010:14;39003:49;38992:67;:::o;39065:230::-;39205:34;39201:1;39193:6;39189:14;39182:58;39274:13;39269:2;39261:6;39257:15;39250:38;39171:124;:::o;39301:237::-;39441:34;39437:1;39429:6;39425:14;39418:58;39510:20;39505:2;39497:6;39493:15;39486:45;39407:131;:::o;39544:225::-;39684:34;39680:1;39672:6;39668:14;39661:58;39753:8;39748:2;39740:6;39736:15;39729:33;39650:119;:::o;39775:178::-;39915:30;39911:1;39903:6;39899:14;39892:54;39881:72;:::o;39959:164::-;40099:16;40095:1;40087:6;40083:14;40076:40;40065:58;:::o;40129:223::-;40269:34;40265:1;40257:6;40253:14;40246:58;40338:6;40333:2;40325:6;40321:15;40314:31;40235:117;:::o;40358:175::-;40498:27;40494:1;40486:6;40482:14;40475:51;40464:69;:::o;40539:231::-;40679:34;40675:1;40667:6;40663:14;40656:58;40748:14;40743:2;40735:6;40731:15;40724:39;40645:125;:::o;40776:179::-;40916:31;40912:1;40904:6;40900:14;40893:55;40882:73;:::o;40961:243::-;41101:34;41097:1;41089:6;41085:14;41078:58;41170:26;41165:2;41157:6;41153:15;41146:51;41067:137;:::o;41210:229::-;41350:34;41346:1;41338:6;41334:14;41327:58;41419:12;41414:2;41406:6;41402:15;41395:37;41316:123;:::o;41445:228::-;41585:34;41581:1;41573:6;41569:14;41562:58;41654:11;41649:2;41641:6;41637:15;41630:36;41551:122;:::o;41679:175::-;41819:27;41815:1;41807:6;41803:14;41796:51;41785:69;:::o;41860:182::-;42000:34;41996:1;41988:6;41984:14;41977:58;41966:76;:::o;42048:231::-;42188:34;42184:1;42176:6;42172:14;42165:58;42257:14;42252:2;42244:6;42240:15;42233:39;42154:125;:::o;42285:182::-;42425:34;42421:1;42413:6;42409:14;42402:58;42391:76;:::o;42473:228::-;42613:34;42609:1;42601:6;42597:14;42590:58;42682:11;42677:2;42669:6;42665:15;42658:36;42579:122;:::o;42707:234::-;42847:34;42843:1;42835:6;42831:14;42824:58;42916:17;42911:2;42903:6;42899:15;42892:42;42813:128;:::o;42947:168::-;43087:20;43083:1;43075:6;43071:14;43064:44;43053:62;:::o;43121:220::-;43261:34;43257:1;43249:6;43245:14;43238:58;43330:3;43325:2;43317:6;43313:15;43306:28;43227:114;:::o;43347:182::-;43487:34;43483:1;43475:6;43471:14;43464:58;43453:76;:::o;43535:236::-;43675:34;43671:1;43663:6;43659:14;43652:58;43744:19;43739:2;43731:6;43727:15;43720:44;43641:130;:::o;43777:231::-;43917:34;43913:1;43905:6;43901:14;43894:58;43986:14;43981:2;43973:6;43969:15;43962:39;43883:125;:::o;44014:171::-;44154:23;44150:1;44142:6;44138:14;44131:47;44120:65;:::o;44191:170::-;44331:22;44327:1;44319:6;44315:14;44308:46;44297:64;:::o;44367:122::-;44440:24;44458:5;44440:24;:::i;:::-;44433:5;44430:35;44420:2;;44479:1;44476;44469:12;44420:2;44410:79;:::o;44495:116::-;44565:21;44580:5;44565:21;:::i;:::-;44558:5;44555:32;44545:2;;44601:1;44598;44591:12;44545:2;44535:76;:::o;44617:120::-;44689:23;44706:5;44689:23;:::i;:::-;44682:5;44679:34;44669:2;;44727:1;44724;44717:12;44669:2;44659:78;:::o;44743:122::-;44816:24;44834:5;44816:24;:::i;:::-;44809:5;44806:35;44796:2;;44855:1;44852;44845:12;44796:2;44786:79;:::o
Swarm Source
ipfs://90417bd9979134238cb73bedaf013e94207eeb8b41d08bdcee0d204b541af212
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.