Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
348 Verbs
Holders
124
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 VerbsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
VerbsToken
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-14 */ // SPDX-License-Identifier: MIT 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); } 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; } 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); } 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; } } 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); } } } } 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); } 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); } 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; } } // LICENSE // ERC721.sol modifies OpenZeppelin's ERC721.sol: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/6618f9f18424ade44116d0221719f4c93be6a078/contracts/token/ERC721/ERC721.sol // // ERC721.sol source code copyright OpenZeppelin licensed under the MIT License. // pragma solidity ^0.8.6; /** * @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`, 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`, transfers it to `to`, and emits a log event * 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 {} } // LICENSE // ERC721.sol modifies OpenZeppelin's ERC721Enumerable.sol: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/6618f9f18424ade44116d0221719f4c93be6a078/contracts/token/ERC721/extensions/ERC721Enumerable.sol // // ERC721Enumerable.sol source code copyright OpenZeppelin licensed under the MIT License. // With modifications by REDACTED // // MODIFICATIONS: // Consumes modified `ERC721` contract. See notes in `ERC721.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(); } } pragma solidity ^0.8.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } 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); } } pragma solidity ^0.8.6; interface IProxyRegistry { function proxies(address) external view returns (address); } pragma solidity ^0.8.6; interface IVerbsToken is IERC721 { event VerbCreated(uint256 indexed tokenId, IVerbsSeeder.Seed seed); event VerbBurned(uint256 indexed tokenId); function mint(uint256 num_tokens) external payable; function burn(uint256 tokenId) external; function setDescriptor(IVerbsDescriptor descriptor) external; function lockDescriptor() external; function setSeeder(IVerbsSeeder seeder) external; function lockSeeder() external; function setNounsContract(NounsContract nouns) external; } pragma solidity ^0.8.6; interface IVerbsSeeder { struct Seed { uint48 background; uint48 body; uint48 accessory; uint48 head; uint48 glasses; } function generateSeed(uint256 VerbId, IVerbsDescriptor descriptor) external view returns (Seed memory); } pragma solidity ^0.8.6; abstract contract NounsContract is IERC721Enumerable{ // The noun seeds mapping(uint256 => IVerbsSeeder.Seed) public seeds; } pragma solidity ^0.8.6; interface IVerbsDescriptor { event PartsLocked(); event DataURIToggled(bool enabled); event BaseURIUpdated(string baseURI); function arePartsLocked() external returns (bool); function isDataURIEnabled() external returns (bool); function baseURI() external returns (string memory); function palettes(uint8 paletteIndex, uint256 colorIndex) external view returns (string memory); function backgrounds(uint256 index) external view returns (string memory); function bodies(uint256 index) external view returns (bytes memory); function accessories(uint256 index) external view returns (bytes memory); function heads(uint256 index) external view returns (bytes memory); function glasses(uint256 index) external view returns (bytes memory); function backgroundCount() external view returns (uint256); function bodyCount() external view returns (uint256); function accessoryCount() external view returns (uint256); function headCount() external view returns (uint256); function glassesCount() external view returns (uint256); function addManyColorsToPalette(uint8 paletteIndex, string[] calldata newColors) external; function addManyBackgrounds(string[] calldata backgrounds) external; function addManyBodies(bytes[] calldata bodies) external; function addManyAccessories(bytes[] calldata accessories) external; function addManyHeads(bytes[] calldata heads) external; function addManyGlasses(bytes[] calldata glasses) external; function addColorToPalette(uint8 paletteIndex, string calldata color) external; function addBackground(string calldata background) external; function addBody(bytes calldata body) external; function addAccessory(bytes calldata accessory) external; function addHead(bytes calldata head) external; function addGlasses(bytes calldata glasses) external; function lockParts() external; function toggleDataURIEnabled() external; function setBaseURI(string calldata baseURI) external; function tokenURI(uint256 tokenId, IVerbsSeeder.Seed memory seed) external view returns (string memory); function dataURI(uint256 tokenId, IVerbsSeeder.Seed memory seed) external view returns (string memory); function genericDataURI( string calldata name, string calldata description, IVerbsSeeder.Seed memory seed ) external view returns (string memory); function generateSVGImage(IVerbsSeeder.Seed memory seed) external view returns (string memory); } 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); } } /* Verb Troop: Goofy Oversized Optics People Verb Troop project source code is derivative of the Nouns project token (0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03) by Nouns DAO, which is licensed under GPL-3.0. */ pragma solidity ^0.8.6; contract VerbsToken is IVerbsToken, Ownable, ERC721Enumerable { using Strings for uint256; event Mint( address indexed _to, uint256 indexed _tokenId ); // Price and maximum number of Verbs uint256 public price = 20000000000000000; uint256 public mint_limit= 30; // Store custom descriptions for Verbs mapping (uint => string) public customDescription; // The Verbs token URI descriptor IVerbsDescriptor public descriptor; // The Verbs token seeder IVerbsSeeder public seeder; // Whether the descriptor can be updated bool public isDescriptorLocked; // Whether the seeder can be updated bool public isSeederLocked; // The Verb seeds mapping(uint256 => IVerbsSeeder.Seed) public seeds; // The internal Verb ID tracker uint256 public currentVerbId = 0; string public script = ""; string public projectBaseURI = ""; mapping(uint256 => bytes32[]) internal tokenIdToHashes; NounsContract public nounsContract; mapping(uint256 => bool) public nounClaimed; ERC721Enumerable public kinesisContract; mapping(uint256 => bool) public tokenIdClaimed; // OpenSea's Proxy Registry IProxyRegistry public immutable proxyRegistry; // Withdraw Addresses address kinesis; // Sale Status bool public active =false; bool public nounClaimingOpen =true; bool public kinesisClaimingOpen =true; bool public publicSaleOpen =false; uint256 public numClaimed = 0; uint256 public numNounsClaimed = 0; /** * @notice Require that the descriptor has not been locked. */ modifier whenDescriptorNotLocked() { require(!isDescriptorLocked, 'Descriptor is locked'); _; } /** * @notice Require that the seeder has not been locked. */ modifier whenSeederNotLocked() { require(!isSeederLocked, 'Seeder is locked'); _; } function setProjectScript(string memory _script) onlyOwner external { script = _script; } function updateProjectBaseURI(string memory _newBaseURI) onlyOwner external { projectBaseURI = _newBaseURI; } constructor() ERC721('Verbs', 'Verbs') { descriptor = IVerbsDescriptor(0x0Cfdb3Ba1694c2bb2CFACB0339ad7b1Ae5932B63); seeder = IVerbsSeeder(0xCC8a0FB5ab3C7132c1b2A0109142Fb112c4Ce515); nounsContract = NounsContract(0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03); proxyRegistry = IProxyRegistry(0xa5409ec958C83C3f309868babACA7c86DCB077c1); kinesis = msg.sender; kinesisContract = ERC721Enumerable(0xeb113c5d09bfc3a7b27A75Da4432FB3484f90c6A); } function toggleActive() external onlyOwner { active=!active; } function toggleKinesisClaim() external onlyOwner { kinesisClaimingOpen=!kinesisClaimingOpen; } function toggleNounClaim() external onlyOwner { nounClaimingOpen=!nounClaimingOpen; } function togglePublicSale() external onlyOwner { publicSaleOpen=!publicSaleOpen; } function updateKinesisAddress(address payable _kinesisAddress) public onlyOwner { kinesis = _kinesisAddress; } function showTokenHashes(uint _tokenId) public view returns (bytes32[] memory){ return tokenIdToHashes[_tokenId]; } /** * @notice Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) public view override(IERC721, ERC721) returns (bool) { // Whitelist OpenSea proxy contract for easy trading. if (proxyRegistry.proxies(owner) == operator) { return true; } return super.isApprovedForAll(owner, operator); } /// @notice Claim Verb for given Kinesis token /// @param tokenId The tokenId of the Kinesis NFT function claimById(uint256 tokenId) external { // Check that the msgSender owns the token that is being claimed require( active, "Project not active!" ); require( _msgSender() == kinesisContract.ownerOf(tokenId), "MUST_OWN_TOKEN_ID" ); require( kinesisClaimingOpen, "Kinesis claiming is closed!" ); require( !tokenIdClaimed[tokenId], "TOKEN_ALREADY_CLAIMED" ); tokenIdClaimed[tokenId] = true; _claim(_msgSender()); } /// @notice Claim Verb for all Kinesis tokens owned by the sender function claimAllForOwner() external { require( active, "Project not active!" ); require( kinesisClaimingOpen, "Kinesis claiming is closed!" ); uint256 tokenBalanceOwner = kinesisContract.balanceOf(_msgSender()); // Checks require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED"); uint256 tokenId; for (uint256 i = 0; i < tokenBalanceOwner; i++) { tokenId = kinesisContract.tokenOfOwnerByIndex(_msgSender(), i); require( !tokenIdClaimed[tokenId], "TOKEN_ALREADY_CLAIMED" ); tokenIdClaimed[tokenId] = true; _claim(_msgSender()); } } function claimForNoun(uint256 nounId) external { require( active, "Project not active!" ); require( nounClaimingOpen, "Noun claiming is closed!" ); require( _msgSender() == nounsContract.ownerOf(nounId), "MUST_OWN_NOUN_ID" ); // Check that Verb has not already been claimed for a given tokenId require( !nounClaimed[nounId], "TOKEN_ALREADY_CLAIMED_FOR_NOUN" ); nounClaimed[nounId] = true; uint256 verbId =currentVerbId; currentVerbId = currentVerbId + 1; bytes32 hash = keccak256(abi.encodePacked(verbId, block.number, msg.sender)); tokenIdToHashes[verbId].push(hash); (uint48 background,uint48 body,uint48 accessory,uint48 head,uint48 glasses) = nounsContract.seeds(nounId); seeds[verbId] = IVerbsSeeder.Seed(background, body, accessory, head, glasses); numNounsClaimed = numNounsClaimed + 1; _safeMint(msg.sender, verbId); } /// @dev Internal function to mint Verb upon claiming function _claim(address tokenOwner) internal { uint256 verbId = currentVerbId; currentVerbId = currentVerbId + 1; numClaimed = numClaimed + 1; _mintTo(tokenOwner, verbId); } /** * @notice Mint Verbs to sender */ function mint(uint256 num_tokens) public override payable { require (active,"sale not active"); require (publicSaleOpen, "public sale not open"); require (num_tokens<=mint_limit,"minted too many"); require(msg.value>=num_tokens*price,"not enough ethers sent"); payable(kinesis).transfer(msg.value); for (uint256 x=0;x<num_tokens;x++) { _mintTo(msg.sender, currentVerbId); currentVerbId = currentVerbId + 1; } } /** * @notice Mint a Verb with `VerbId` to the provided `to` address */ function _mintTo(address to, uint256 VerbId) internal returns (uint256) { bytes32 hash = keccak256(abi.encodePacked(VerbId, block.number, msg.sender)); seeds[VerbId] = seeder.generateSeed(VerbId, descriptor); tokenIdToHashes[VerbId].push(hash); _safeMint(to, VerbId); emit Mint(to, VerbId); return VerbId; } function updatePricePerTokenInWei(uint256 _pricePerTokenInWei) onlyOwner external { price = _pricePerTokenInWei; } /** * @notice Burn a Verb. */ function burn(uint256 VerbId) public override onlyOwner { _burn(VerbId); emit VerbBurned(VerbId); } /** * @notice A distinct Uniform Resource Identifier (URI) for a given asset. * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'VerbsToken: URI query for nonexistent token'); return string(abi.encodePacked(projectBaseURI, Strings.toString(_tokenId))); } function getImageData(uint256 tokenId) public view returns (string memory) { require(_exists(tokenId), 'VerbsToken: URI query for nonexistent token'); string memory VerbId = tokenId.toString(); string memory name = string(abi.encodePacked('Verb ', VerbId)); string memory description=string(abi.encodePacked('Verb ', VerbId, ' is an animated homage to the Noun, created by grant.oe for the Kinesis Art platform')); return descriptor.genericDataURI(name, description, seeds[tokenId]); } /** * @notice Set the token URI descriptor. * @dev Only callable by the owner when not locked. */ function setDescriptor(IVerbsDescriptor _descriptor) external override onlyOwner whenDescriptorNotLocked { descriptor = _descriptor; } /** * @notice Lock the descriptor. * @dev This cannot be reversed and is only callable by the owner when not locked. */ function lockDescriptor() external override onlyOwner whenDescriptorNotLocked { isDescriptorLocked = true; } /** * @notice Set the token seeder. * @dev Only callable by the owner when not locked. */ function setSeeder(IVerbsSeeder _seeder) external override onlyOwner whenSeederNotLocked { seeder = _seeder; } /** * @notice Lock the seeder. * @dev This cannot be reversed and is only callable by the owner when not locked. */ function lockSeeder() external override onlyOwner whenSeederNotLocked { isSeederLocked = true; } function setNounsContract(NounsContract nouns) external override onlyOwner { nounsContract = nouns; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"VerbBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"glasses","type":"uint48"}],"indexed":false,"internalType":"struct IVerbsSeeder.Seed","name":"seed","type":"tuple"}],"name":"VerbCreated","type":"event"},{"inputs":[],"name":"active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"VerbId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAllForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nounId","type":"uint256"}],"name":"claimForNoun","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentVerbId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"customDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract IVerbsDescriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getImageData","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDescriptorLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSeederLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kinesisClaimingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kinesisContract","outputs":[{"internalType":"contract ERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockSeeder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num_tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint_limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nounClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nounClaimingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nounsContract","outputs":[{"internalType":"contract NounsContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numNounsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistry","outputs":[{"internalType":"contract IProxyRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"script","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seeder","outputs":[{"internalType":"contract IVerbsSeeder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seeds","outputs":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"glasses","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVerbsDescriptor","name":"_descriptor","type":"address"}],"name":"setDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract NounsContract","name":"nouns","type":"address"}],"name":"setNounsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_script","type":"string"}],"name":"setProjectScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVerbsSeeder","name":"_seeder","type":"address"}],"name":"setSeeder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"showTokenHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"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":[],"name":"toggleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleKinesisClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleNounClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_kinesisAddress","type":"address"}],"name":"updateKinesisAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"updatePricePerTokenInWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"updateProjectBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
66470de4df820000600b55601e600c556000601181905560c0604081905260a082905262000031916012919062000212565b50604080516020810191829052600090819052620000529160139162000212565b506019805463ffffffff60a01b191661010160a81b1790556000601a819055601b553480156200008157600080fd5b5060405180604001604052806005815260200164566572627360d81b81525060405180604001604052806005815260200164566572627360d81b815250620000d8620000d2620001be60201b60201c565b620001c2565b8151620000ed90600190602085019062000212565b5080516200010390600290602084019062000212565b5050600e80546001600160a01b0319908116730cfdb3ba1694c2bb2cfacb0339ad7b1ae5932b6317909155600f8054821673cc8a0fb5ab3c7132c1b2a0109142fb112c4ce515179055601580548216739c8ff314c9bc7f6e59a9d9225fb22946427edc031790557fa5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000608052601980548216331790556017805490911673eb113c5d09bfc3a7b27a75da4432fb3484f90c6a17905550620002f5565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200022090620002b8565b90600052602060002090601f0160209004810192826200024457600085556200028f565b82601f106200025f57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028f57825182559160200191906001019062000272565b506200029d929150620002a1565b5090565b5b808211156200029d5760008155600101620002a2565b600181811c90821680620002cd57607f821691505b60208210811415620002ef57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c613c4a6200031b600039600081816108aa01526122ff0152613c4a6000f3fe6080604052600436106103a25760003560e01c8063715018a6116101e7578063c797bac91161010d578063e985e9c5116100a0578063efd99e1e1161006f578063efd99e1e14610a92578063f0503e8014610aa7578063f2fde38b14610b42578063f9e2379914610b6257600080fd5b8063e985e9c514610a1d578063ead55e2414610a3d578063ebe9eb9f14610a5d578063ed1c4ec414610a7257600080fd5b8063d0aad196116100dc578063d0aad19614610998578063d50b31eb146109b8578063d8fb80e5146109d8578063e222c7f914610a0857600080fd5b8063c797bac91461092d578063c87b56dd14610942578063c8fc0c2314610962578063cbf0b2761461098357600080fd5b8063a035b1fe11610185578063b50cbd9f11610154578063b50cbd9f14610898578063b88d4fde146108cc578063becf7741146108ec578063c1b8e4e11461090c57600080fd5b8063a035b1fe1461082f578063a0712d6814610845578063a22cb46514610858578063b25e48ee1461087857600080fd5b80638bb0f82d116101c15780638bb0f82d146107c55780638da5cb5b146107e657806395d89b41146108045780639c2f2a421461081957600080fd5b8063715018a6146107705780637ed230cc146107855780638123d8cc146107a557600080fd5b80632f745c59116102cc578063529ca2071161026a578063684931ed11610239578063684931ed146106f057806369a19cfe14610710578063701fd0ca1461073057806370a082311461075057600080fd5b8063529ca2071461067b57806359ed36171461069b5780635f295a67146106bb5780636352211e146106d057600080fd5b806342842e0e116102a657806342842e0e1461060557806342966c681461062557806344d6f5c9146106455780634f6ccce71461065b57600080fd5b80632f745c59146105b0578063303e74df146105d057806341b5d0de146105f057600080fd5b80630a76bf141161034457806318160ddd1161031357806318160ddd1461053957806323b872dd1461054e578063271aaab41461056e57806329c68dc11461059b57600080fd5b80630a76bf14146104c9578063106f24f0146104ed578063114e31011461050e57806315640f981461052457600080fd5b806303ae53781161038057806303ae53781461041f57806306fdde031461044f578063081812fc14610471578063095ea7b3146104a957600080fd5b806301b9a397146103a757806301ffc9a7146103c957806302fb0c5e146103fe575b600080fd5b3480156103b357600080fd5b506103c76103c2366004613284565b610b83565b005b3480156103d557600080fd5b506103e96103e4366004613417565b610c29565b60405190151581526020015b60405180910390f35b34801561040a57600080fd5b506019546103e990600160a01b900460ff1681565b34801561042b57600080fd5b506103e961043a366004613596565b60166020526000908152604090205460ff1681565b34801561045b57600080fd5b50610464610c54565b6040516103f59190613858565b34801561047d57600080fd5b5061049161048c366004613596565b610ce6565b6040516001600160a01b0390911681526020016103f5565b3480156104b557600080fd5b506103c76104c43660046133eb565b610d7b565b3480156104d557600080fd5b506104df60115481565b6040519081526020016103f5565b3480156104f957600080fd5b506019546103e990600160b01b900460ff1681565b34801561051a57600080fd5b506104df600c5481565b34801561053057600080fd5b506103c7610e91565b34801561054557600080fd5b506009546104df565b34801561055a57600080fd5b506103c76105693660046132f7565b610edc565b34801561057a57600080fd5b5061058e610589366004613596565b610f0d565b6040516103f59190613814565b3480156105a757600080fd5b506103c7610f6f565b3480156105bc57600080fd5b506104df6105cb3660046133eb565b610fba565b3480156105dc57600080fd5b50600e54610491906001600160a01b031681565b3480156105fc57600080fd5b506103c7611050565b34801561061157600080fd5b506103c76106203660046132f7565b6110e0565b34801561063157600080fd5b506103c7610640366004613596565b6110fb565b34801561065157600080fd5b506104df601b5481565b34801561066757600080fd5b506104df610676366004613596565b61115c565b34801561068757600080fd5b50610464610696366004613596565b6111ef565b3480156106a757600080fd5b506103c76106b6366004613451565b611317565b3480156106c757600080fd5b506103c7611358565b3480156106dc57600080fd5b506104916106eb366004613596565b6113e4565b3480156106fc57600080fd5b50600f54610491906001600160a01b031681565b34801561071c57600080fd5b50601554610491906001600160a01b031681565b34801561073c57600080fd5b506103c761074b366004613451565b61145b565b34801561075c57600080fd5b506104df61076b366004613284565b611498565b34801561077c57600080fd5b506103c761151f565b34801561079157600080fd5b506103c76107a0366004613284565b611555565b3480156107b157600080fd5b506104646107c0366004613596565b6115a1565b3480156107d157600080fd5b506019546103e990600160a81b900460ff1681565b3480156107f257600080fd5b506000546001600160a01b0316610491565b34801561081057600080fd5b5061046461163b565b34801561082557600080fd5b506104df601a5481565b34801561083b57600080fd5b506104df600b5481565b6103c7610853366004613596565b61164a565b34801561086457600080fd5b506103c76108733660046133b8565b6117f3565b34801561088457600080fd5b50601754610491906001600160a01b031681565b3480156108a457600080fd5b506104917f000000000000000000000000000000000000000000000000000000000000000081565b3480156108d857600080fd5b506103c76108e7366004613338565b6118b8565b3480156108f857600080fd5b506103c7610907366004613596565b6118f0565b34801561091857600080fd5b50600f546103e990600160a01b900460ff1681565b34801561093957600080fd5b50610464611ac4565b34801561094e57600080fd5b5061046461095d366004613596565b611ad1565b34801561096e57600080fd5b50600f546103e990600160a81b900460ff1681565b34801561098f57600080fd5b506103c7611b3a565b3480156109a457600080fd5b506103c76109b3366004613596565b611db7565b3480156109c457600080fd5b506103c76109d3366004613284565b6121f5565b3480156109e457600080fd5b506103e96109f3366004613596565b60186020526000908152604090205460ff1681565b348015610a1457600080fd5b506103c761228e565b348015610a2957600080fd5b506103e9610a383660046132be565b6122d9565b348015610a4957600080fd5b506103c7610a58366004613284565b6123c1565b348015610a6957600080fd5b5061046461240d565b348015610a7e57600080fd5b506103c7610a8d366004613596565b61241a565b348015610a9e57600080fd5b506103c7612449565b348015610ab357600080fd5b50610b09610ac2366004613596565b60106020526000908152604090205465ffffffffffff8082169166010000000000008104821691600160601b8204811691600160901b8104821691600160c01b9091041685565b6040805165ffffffffffff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016103f5565b348015610b4e57600080fd5b506103c7610b5d366004613284565b612494565b348015610b6e57600080fd5b506019546103e990600160b81b900460ff1681565b6000546001600160a01b03163314610bb65760405162461bcd60e51b8152600401610bad90613959565b60405180910390fd5b600f54600160a01b900460ff1615610c075760405162461bcd60e51b815260206004820152601460248201527311195cd8dc9a5c1d1bdc881a5cc81b1bd8dad95960621b6044820152606401610bad565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b0319821663780e9d6360e01b1480610c4e5750610c4e8261252c565b92915050565b606060018054610c6390613b11565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8f90613b11565b8015610cdc5780601f10610cb157610100808354040283529160200191610cdc565b820191906000526020600020905b815481529060010190602001808311610cbf57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610d5f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bad565b506000908152600560205260409020546001600160a01b031690565b6000610d86826113e4565b9050806001600160a01b0316836001600160a01b03161415610df45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bad565b336001600160a01b0382161480610e105750610e1081336122d9565b610e825760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bad565b610e8c838361257c565b505050565b6000546001600160a01b03163314610ebb5760405162461bcd60e51b8152600401610bad90613959565b6019805460ff60b01b198116600160b01b9182900460ff1615909102179055565b610ee633826125ea565b610f025760405162461bcd60e51b8152600401610bad906139d9565b610e8c8383836126c1565b600081815260146020908152604091829020805483518184028101840190945280845260609392830182828015610f6357602002820191906000526020600020905b815481526020019060010190808311610f4f575b50505050509050919050565b6000546001600160a01b03163314610f995760405162461bcd60e51b8152600401610bad90613959565b6019805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6000610fc583611498565b82106110275760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610bad565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b0316331461107a5760405162461bcd60e51b8152600401610bad90613959565b600f54600160a01b900460ff16156110cb5760405162461bcd60e51b815260206004820152601460248201527311195cd8dc9a5c1d1bdc881a5cc81b1bd8dad95960621b6044820152606401610bad565b600f805460ff60a01b1916600160a01b179055565b610e8c838383604051806020016040528060008152506118b8565b6000546001600160a01b031633146111255760405162461bcd60e51b8152600401610bad90613959565b61112e8161286c565b60405181907f58a581a1fc8e6c8475bed8f58a53e3a04184e0b331d24d5d6237250f525eb8f490600090a250565b600061116760095490565b82106111ca5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610bad565b600982815481106111dd576111dd613bbd565b90600052602060002001549050919050565b6000818152600360205260409020546060906001600160a01b03166112265760405162461bcd60e51b8152600401610bad9061398e565b600061123183612913565b90506000816040516020016112469190613713565b604051602081830303815290604052905060008260405160200161126a9190613740565b60408051601f19818403018152828252600e5460008981526010602052929092206387db11bd60e01b84529093506001600160a01b03909116916387db11bd916112ba918691869160040161386b565b60006040518083038186803b1580156112d257600080fd5b505afa1580156112e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261130e919081019061349a565b95945050505050565b6000546001600160a01b031633146113415760405162461bcd60e51b8152600401610bad90613959565b8051611354906012906020840190613192565b5050565b6000546001600160a01b031633146113825760405162461bcd60e51b8152600401610bad90613959565b600f54600160a81b900460ff16156113cf5760405162461bcd60e51b815260206004820152601060248201526f14d95959195c881a5cc81b1bd8dad95960821b6044820152606401610bad565b600f805460ff60a81b1916600160a81b179055565b6000818152600360205260408120546001600160a01b031680610c4e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bad565b6000546001600160a01b031633146114855760405162461bcd60e51b8152600401610bad90613959565b8051611354906013906020840190613192565b60006001600160a01b0382166115035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bad565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146115495760405162461bcd60e51b8152600401610bad90613959565b6115536000612a11565b565b6000546001600160a01b0316331461157f5760405162461bcd60e51b8152600401610bad90613959565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b600d60205260009081526040902080546115ba90613b11565b80601f01602080910402602001604051908101604052809291908181526020018280546115e690613b11565b80156116335780601f1061160857610100808354040283529160200191611633565b820191906000526020600020905b81548152906001019060200180831161161657829003601f168201915b505050505081565b606060028054610c6390613b11565b601954600160a01b900460ff166116955760405162461bcd60e51b815260206004820152600f60248201526e73616c65206e6f742061637469766560881b6044820152606401610bad565b601954600160b81b900460ff166116e55760405162461bcd60e51b8152602060048201526014602482015273383ab13634b19039b0b632903737ba1037b832b760611b6044820152606401610bad565b600c548111156117295760405162461bcd60e51b815260206004820152600f60248201526e6d696e74656420746f6f206d616e7960881b6044820152606401610bad565b600b546117369082613aaf565b34101561177e5760405162461bcd60e51b81526020600482015260166024820152751b9bdd08195b9bdd59da08195d1a195c9cc81cd95b9d60521b6044820152606401610bad565b6019546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156117b7573d6000803e3d6000fd5b5060005b81811015611354576117cf33601154612a61565b506011546117de906001613a83565b601155806117eb81613b4c565b9150506117bb565b6001600160a01b03821633141561184c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bad565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118c233836125ea565b6118de5760405162461bcd60e51b8152600401610bad906139d9565b6118ea84848484612c43565b50505050565b601954600160a01b900460ff166119195760405162461bcd60e51b8152600401610bad9061392c565b6017546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561195d57600080fd5b505afa158015611971573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199591906132a1565b6001600160a01b0316336001600160a01b0316146119e95760405162461bcd60e51b8152602060048201526011602482015270135554d517d3d5d397d513d2d15397d251607a1b6044820152606401610bad565b601954600160b01b900460ff16611a425760405162461bcd60e51b815260206004820152601b60248201527f4b696e6573697320636c61696d696e6720697320636c6f7365642100000000006044820152606401610bad565b60008181526018602052604090205460ff1615611a995760405162461bcd60e51b81526020600482015260156024820152741513d2d15397d053149150511657d0d31052535151605a1b6044820152606401610bad565b6000818152601860205260409020805460ff19166001179055611ac1611abc3390565b612c76565b50565b601380546115ba90613b11565b6000818152600360205260409020546060906001600160a01b0316611b085760405162461bcd60e51b8152600401610bad9061398e565b6013611b1383612913565b604051602001611b24929190613675565b6040516020818303038152906040529050919050565b601954600160a01b900460ff16611b635760405162461bcd60e51b8152600401610bad9061392c565b601954600160b01b900460ff16611bbc5760405162461bcd60e51b815260206004820152601b60248201527f4b696e6573697320636c61696d696e6720697320636c6f7365642100000000006044820152606401610bad565b6017546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611c1057600080fd5b505afa158015611c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4891906135af565b905060008111611c8c5760405162461bcd60e51b815260206004820152600f60248201526e1393d7d513d2d15394d7d3d5d39151608a1b6044820152606401610bad565b6000805b82811015610e8c576017546001600160a01b0316632f745c59336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024810184905260440160206040518083038186803b158015611cf057600080fd5b505afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906135af565b60008181526018602052604090205490925060ff1615611d825760405162461bcd60e51b81526020600482015260156024820152741513d2d15397d053149150511657d0d31052535151605a1b6044820152606401610bad565b6000828152601860205260409020805460ff19166001179055611da5611abc3390565b80611daf81613b4c565b915050611c90565b601954600160a01b900460ff16611de05760405162461bcd60e51b8152600401610bad9061392c565b601954600160a81b900460ff16611e395760405162461bcd60e51b815260206004820152601860248201527f4e6f756e20636c61696d696e6720697320636c6f7365642100000000000000006044820152606401610bad565b6015546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e9060240160206040518083038186803b158015611e7d57600080fd5b505afa158015611e91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb591906132a1565b6001600160a01b0316336001600160a01b031614611f085760405162461bcd60e51b815260206004820152601060248201526f135554d517d3d5d397d393d55397d25160821b6044820152606401610bad565b60008181526016602052604090205460ff1615611f675760405162461bcd60e51b815260206004820152601e60248201527f544f4b454e5f414c52454144595f434c41494d45445f464f525f4e4f554e00006044820152606401610bad565b6000818152601660205260409020805460ff1916600190811790915560115490611f92908290613a83565b601155604051600090611fcb90839043903390602001928352602083019190915260601b6001600160601b031916604082015260540190565b60408051808303601f19018152828252805160209182012060008681526014835292832080546001810182559084529183209091018190556015546301e0a07d60e71b845260048401879052909350909182918291829182916001600160a01b039091169063f0503e809060240160a06040518083038186803b15801561205157600080fd5b505afa158015612065573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208991906135c8565b945094509450945094506040518060a001604052808665ffffffffffff1681526020018565ffffffffffff1681526020018465ffffffffffff1681526020018365ffffffffffff1681526020018265ffffffffffff168152506010600089815260200190815260200160002060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548165ffffffffffff021916908365ffffffffffff16021790555060608201518160000160126101000a81548165ffffffffffff021916908365ffffffffffff16021790555060808201518160000160186101000a81548165ffffffffffff021916908365ffffffffffff160217905550905050601b5460016121de9190613a83565b601b556121eb3388612ca2565b5050505050505050565b6000546001600160a01b0316331461221f5760405162461bcd60e51b8152600401610bad90613959565b600f54600160a81b900460ff161561226c5760405162461bcd60e51b815260206004820152601060248201526f14d95959195c881a5cc81b1bd8dad95960821b6044820152606401610bad565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146122b85760405162461bcd60e51b8152600401610bad90613959565b6019805460ff60b81b198116600160b81b9182900460ff1615909102179055565b60405163c455279160e01b81526001600160a01b038381166004830152600091818416917f0000000000000000000000000000000000000000000000000000000000000000169063c45527919060240160206040518083038186803b15801561234157600080fd5b505afa158015612355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237991906132a1565b6001600160a01b0316141561239057506001610c4e565b6001600160a01b0380841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b6000546001600160a01b031633146123eb5760405162461bcd60e51b8152600401610bad90613959565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b601280546115ba90613b11565b6000546001600160a01b031633146124445760405162461bcd60e51b8152600401610bad90613959565b600b55565b6000546001600160a01b031633146124735760405162461bcd60e51b8152600401610bad90613959565b6019805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000546001600160a01b031633146124be5760405162461bcd60e51b8152600401610bad90613959565b6001600160a01b0381166125235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bad565b611ac181612a11565b60006001600160e01b031982166380ac58cd60e01b148061255d57506001600160e01b03198216635b5e139f60e01b145b80610c4e57506301ffc9a760e01b6001600160e01b0319831614610c4e565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125b1826113e4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166126635760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bad565b600061266e836113e4565b9050806001600160a01b0316846001600160a01b031614806126a95750836001600160a01b031661269e84610ce6565b6001600160a01b0316145b806126b957506126b981856122d9565b949350505050565b826001600160a01b03166126d4826113e4565b6001600160a01b03161461273c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bad565b6001600160a01b03821661279e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bad565b6127a9838383612cbc565b6127b460008261257c565b6001600160a01b03831660009081526004602052604081208054600192906127dd908490613ace565b90915550506001600160a01b038216600090815260046020526040812080546001929061280b908490613a83565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612877826113e4565b905061288581600084612cbc565b61289060008361257c565b6001600160a01b03811660009081526004602052604081208054600192906128b9908490613ace565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060816129375750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612961578061294b81613b4c565b915061295a9050600a83613a9b565b915061293b565b60008167ffffffffffffffff81111561297c5761297c613bd3565b6040519080825280601f01601f1916602001820160405280156129a6576020820181803683370190505b5090505b84156126b9576129bb600183613ace565b91506129c8600a86613b67565b6129d3906030613a83565b60f81b8183815181106129e8576129e8613bbd565b60200101906001600160f81b031916908160001a905350612a0a600a86613a9b565b94506129aa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080824333604051602001612a9793929190928352602083019190915260601b6001600160601b031916604082015260540190565b60408051808303601f19018152908290528051602090910120600f54600e5463422e2e9960e01b8452600484018790526001600160a01b039081166024850152919350169063422e2e999060440160a06040518083038186803b158015612afd57600080fd5b505afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613508565b6000848152601060209081526040808320845181548685015187850151606089015160809099015165ffffffffffff9485166001600160601b031990941693909317660100000000000092851692909202919091176bffffffffffffffffffffffff60601b1916600160601b9184169190910265ffffffffffff60901b191617600160901b978316979097029690961765ffffffffffff60c01b1916600160c01b91909616029490941790935560148152918120805460018101825590825291902001819055612c058484612ca2565b60405183906001600160a01b038616907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a3509092915050565b612c4e8484846126c1565b612c5a84848484612d74565b6118ea5760405162461bcd60e51b8152600401610bad906138da565b601154612c84816001613a83565b601155601a54612c95906001613a83565b601a55610e8c8282612a61565b611354828260405180602001604052806000815250612e81565b6001600160a01b038316612d1757612d1281600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612d3a565b816001600160a01b0316836001600160a01b031614612d3a57612d3a8382612eb4565b6001600160a01b038216612d5157610e8c81612f51565b826001600160a01b0316826001600160a01b031614610e8c57610e8c8282613000565b60006001600160a01b0384163b15612e7657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612db89033908990889088906004016137d7565b602060405180830381600087803b158015612dd257600080fd5b505af1925050508015612e02575060408051601f3d908101601f19168201909252612dff91810190613434565b60015b612e5c573d808015612e30576040519150601f19603f3d011682016040523d82523d6000602084013e612e35565b606091505b508051612e545760405162461bcd60e51b8152600401610bad906138da565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126b9565b506001949350505050565b612e8b8383613044565b612e986000848484612d74565b610e8c5760405162461bcd60e51b8152600401610bad906138da565b60006001612ec184611498565b612ecb9190613ace565b600083815260086020526040902054909150808214612f1e576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090612f6390600190613ace565b6000838152600a602052604081205460098054939450909284908110612f8b57612f8b613bbd565b906000526020600020015490508060098381548110612fac57612fac613bbd565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480612fe457612fe4613ba7565b6001900381819060005260206000200160009055905550505050565b600061300b83611498565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b03821661309a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bad565b6000818152600360205260409020546001600160a01b0316156130ff5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bad565b61310b60008383612cbc565b6001600160a01b0382166000908152600460205260408120805460019290613134908490613a83565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461319e90613b11565b90600052602060002090601f0160209004810192826131c05760008555613206565b82601f106131d957805160ff1916838001178555613206565b82800160010185558215613206579182015b828111156132065782518255916020019190600101906131eb565b50613212929150613216565b5090565b5b808211156132125760008155600101613217565b600061323e61323984613a5b565b613a2a565b905082815283838301111561325257600080fd5b828260208301376000602084830101529392505050565b805165ffffffffffff8116811461327f57600080fd5b919050565b60006020828403121561329657600080fd5b81356123ba81613be9565b6000602082840312156132b357600080fd5b81516123ba81613be9565b600080604083850312156132d157600080fd5b82356132dc81613be9565b915060208301356132ec81613be9565b809150509250929050565b60008060006060848603121561330c57600080fd5b833561331781613be9565b9250602084013561332781613be9565b929592945050506040919091013590565b6000806000806080858703121561334e57600080fd5b843561335981613be9565b9350602085013561336981613be9565b925060408501359150606085013567ffffffffffffffff81111561338c57600080fd5b8501601f8101871361339d57600080fd5b6133ac8782356020840161322b565b91505092959194509250565b600080604083850312156133cb57600080fd5b82356133d681613be9565b9150602083013580151581146132ec57600080fd5b600080604083850312156133fe57600080fd5b823561340981613be9565b946020939093013593505050565b60006020828403121561342957600080fd5b81356123ba81613bfe565b60006020828403121561344657600080fd5b81516123ba81613bfe565b60006020828403121561346357600080fd5b813567ffffffffffffffff81111561347a57600080fd5b8201601f8101841361348b57600080fd5b6126b98482356020840161322b565b6000602082840312156134ac57600080fd5b815167ffffffffffffffff8111156134c357600080fd5b8201601f810184136134d457600080fd5b80516134e261323982613a5b565b8181528560208385010111156134f757600080fd5b61130e826020830160208601613ae5565b600060a0828403121561351a57600080fd5b60405160a0810181811067ffffffffffffffff8211171561353d5761353d613bd3565b60405261354983613269565b815261355760208401613269565b602082015261356860408401613269565b604082015261357960608401613269565b606082015261358a60808401613269565b60808201529392505050565b6000602082840312156135a857600080fd5b5035919050565b6000602082840312156135c157600080fd5b5051919050565b600080600080600060a086880312156135e057600080fd5b6135e986613269565b94506135f760208701613269565b935061360560408701613269565b925061361360608701613269565b915061362160808701613269565b90509295509295909350565b60008151808452613645816020860160208601613ae5565b601f01601f19169290920160200192915050565b6000815161366b818560208601613ae5565b9290920192915050565b600080845481600182811c91508083168061369157607f831692505b60208084108214156136b157634e487b7160e01b86526022600452602486fd5b8180156136c557600181146136d657613703565b60ff19861689528489019650613703565b60008b81526020902060005b868110156136fb5781548b8201529085019083016136e2565b505084890196505b50505050505061130e8185613659565b6402b32b931160dd1b815260008251613733816005850160208701613ae5565b9190910160050192915050565b6402b32b931160dd1b815260008251613760816005850160208701613ae5565b7f20697320616e20616e696d6174656420686f6d61676520746f20746865204e6f60059390910192830152507f756e2c2063726561746564206279206772616e742e6f6520666f7220746865206025820152734b696e657369732041727420706c6174666f726d60601b6045820152605901919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061380a9083018461362d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561384c57835183529284019291840191600101613830565b50909695505050505050565b6020815260006123ba602083018461362d565b60e08152600061387e60e083018661362d565b8281036020840152613890818661362d565b915050825465ffffffffffff8082166040850152808260301c166060850152808260601c166080850152808260901c1660a0850152808260c01c1660c08501525050949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526013908201527250726f6a656374206e6f74206163746976652160681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f5665726273546f6b656e3a2055524920717565727920666f72206e6f6e65786960408201526a39ba32b73a103a37b5b2b760a91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a5357613a53613bd3565b604052919050565b600067ffffffffffffffff821115613a7557613a75613bd3565b50601f01601f191660200190565b60008219821115613a9657613a96613b7b565b500190565b600082613aaa57613aaa613b91565b500490565b6000816000190483118215151615613ac957613ac9613b7b565b500290565b600082821015613ae057613ae0613b7b565b500390565b60005b83811015613b00578181015183820152602001613ae8565b838111156118ea5750506000910152565b600181811c90821680613b2557607f821691505b60208210811415613b4657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613b6057613b60613b7b565b5060010190565b600082613b7657613b76613b91565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ac157600080fd5b6001600160e01b031981168114611ac157600080fdfea26469706673582212209d6a45d2a0e342299c5b31053bdbd86d740341b8387a5b56fe69bb62492807a064736f6c63430008070033
Deployed Bytecode
0x6080604052600436106103a25760003560e01c8063715018a6116101e7578063c797bac91161010d578063e985e9c5116100a0578063efd99e1e1161006f578063efd99e1e14610a92578063f0503e8014610aa7578063f2fde38b14610b42578063f9e2379914610b6257600080fd5b8063e985e9c514610a1d578063ead55e2414610a3d578063ebe9eb9f14610a5d578063ed1c4ec414610a7257600080fd5b8063d0aad196116100dc578063d0aad19614610998578063d50b31eb146109b8578063d8fb80e5146109d8578063e222c7f914610a0857600080fd5b8063c797bac91461092d578063c87b56dd14610942578063c8fc0c2314610962578063cbf0b2761461098357600080fd5b8063a035b1fe11610185578063b50cbd9f11610154578063b50cbd9f14610898578063b88d4fde146108cc578063becf7741146108ec578063c1b8e4e11461090c57600080fd5b8063a035b1fe1461082f578063a0712d6814610845578063a22cb46514610858578063b25e48ee1461087857600080fd5b80638bb0f82d116101c15780638bb0f82d146107c55780638da5cb5b146107e657806395d89b41146108045780639c2f2a421461081957600080fd5b8063715018a6146107705780637ed230cc146107855780638123d8cc146107a557600080fd5b80632f745c59116102cc578063529ca2071161026a578063684931ed11610239578063684931ed146106f057806369a19cfe14610710578063701fd0ca1461073057806370a082311461075057600080fd5b8063529ca2071461067b57806359ed36171461069b5780635f295a67146106bb5780636352211e146106d057600080fd5b806342842e0e116102a657806342842e0e1461060557806342966c681461062557806344d6f5c9146106455780634f6ccce71461065b57600080fd5b80632f745c59146105b0578063303e74df146105d057806341b5d0de146105f057600080fd5b80630a76bf141161034457806318160ddd1161031357806318160ddd1461053957806323b872dd1461054e578063271aaab41461056e57806329c68dc11461059b57600080fd5b80630a76bf14146104c9578063106f24f0146104ed578063114e31011461050e57806315640f981461052457600080fd5b806303ae53781161038057806303ae53781461041f57806306fdde031461044f578063081812fc14610471578063095ea7b3146104a957600080fd5b806301b9a397146103a757806301ffc9a7146103c957806302fb0c5e146103fe575b600080fd5b3480156103b357600080fd5b506103c76103c2366004613284565b610b83565b005b3480156103d557600080fd5b506103e96103e4366004613417565b610c29565b60405190151581526020015b60405180910390f35b34801561040a57600080fd5b506019546103e990600160a01b900460ff1681565b34801561042b57600080fd5b506103e961043a366004613596565b60166020526000908152604090205460ff1681565b34801561045b57600080fd5b50610464610c54565b6040516103f59190613858565b34801561047d57600080fd5b5061049161048c366004613596565b610ce6565b6040516001600160a01b0390911681526020016103f5565b3480156104b557600080fd5b506103c76104c43660046133eb565b610d7b565b3480156104d557600080fd5b506104df60115481565b6040519081526020016103f5565b3480156104f957600080fd5b506019546103e990600160b01b900460ff1681565b34801561051a57600080fd5b506104df600c5481565b34801561053057600080fd5b506103c7610e91565b34801561054557600080fd5b506009546104df565b34801561055a57600080fd5b506103c76105693660046132f7565b610edc565b34801561057a57600080fd5b5061058e610589366004613596565b610f0d565b6040516103f59190613814565b3480156105a757600080fd5b506103c7610f6f565b3480156105bc57600080fd5b506104df6105cb3660046133eb565b610fba565b3480156105dc57600080fd5b50600e54610491906001600160a01b031681565b3480156105fc57600080fd5b506103c7611050565b34801561061157600080fd5b506103c76106203660046132f7565b6110e0565b34801561063157600080fd5b506103c7610640366004613596565b6110fb565b34801561065157600080fd5b506104df601b5481565b34801561066757600080fd5b506104df610676366004613596565b61115c565b34801561068757600080fd5b50610464610696366004613596565b6111ef565b3480156106a757600080fd5b506103c76106b6366004613451565b611317565b3480156106c757600080fd5b506103c7611358565b3480156106dc57600080fd5b506104916106eb366004613596565b6113e4565b3480156106fc57600080fd5b50600f54610491906001600160a01b031681565b34801561071c57600080fd5b50601554610491906001600160a01b031681565b34801561073c57600080fd5b506103c761074b366004613451565b61145b565b34801561075c57600080fd5b506104df61076b366004613284565b611498565b34801561077c57600080fd5b506103c761151f565b34801561079157600080fd5b506103c76107a0366004613284565b611555565b3480156107b157600080fd5b506104646107c0366004613596565b6115a1565b3480156107d157600080fd5b506019546103e990600160a81b900460ff1681565b3480156107f257600080fd5b506000546001600160a01b0316610491565b34801561081057600080fd5b5061046461163b565b34801561082557600080fd5b506104df601a5481565b34801561083b57600080fd5b506104df600b5481565b6103c7610853366004613596565b61164a565b34801561086457600080fd5b506103c76108733660046133b8565b6117f3565b34801561088457600080fd5b50601754610491906001600160a01b031681565b3480156108a457600080fd5b506104917f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c181565b3480156108d857600080fd5b506103c76108e7366004613338565b6118b8565b3480156108f857600080fd5b506103c7610907366004613596565b6118f0565b34801561091857600080fd5b50600f546103e990600160a01b900460ff1681565b34801561093957600080fd5b50610464611ac4565b34801561094e57600080fd5b5061046461095d366004613596565b611ad1565b34801561096e57600080fd5b50600f546103e990600160a81b900460ff1681565b34801561098f57600080fd5b506103c7611b3a565b3480156109a457600080fd5b506103c76109b3366004613596565b611db7565b3480156109c457600080fd5b506103c76109d3366004613284565b6121f5565b3480156109e457600080fd5b506103e96109f3366004613596565b60186020526000908152604090205460ff1681565b348015610a1457600080fd5b506103c761228e565b348015610a2957600080fd5b506103e9610a383660046132be565b6122d9565b348015610a4957600080fd5b506103c7610a58366004613284565b6123c1565b348015610a6957600080fd5b5061046461240d565b348015610a7e57600080fd5b506103c7610a8d366004613596565b61241a565b348015610a9e57600080fd5b506103c7612449565b348015610ab357600080fd5b50610b09610ac2366004613596565b60106020526000908152604090205465ffffffffffff8082169166010000000000008104821691600160601b8204811691600160901b8104821691600160c01b9091041685565b6040805165ffffffffffff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016103f5565b348015610b4e57600080fd5b506103c7610b5d366004613284565b612494565b348015610b6e57600080fd5b506019546103e990600160b81b900460ff1681565b6000546001600160a01b03163314610bb65760405162461bcd60e51b8152600401610bad90613959565b60405180910390fd5b600f54600160a01b900460ff1615610c075760405162461bcd60e51b815260206004820152601460248201527311195cd8dc9a5c1d1bdc881a5cc81b1bd8dad95960621b6044820152606401610bad565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b0319821663780e9d6360e01b1480610c4e5750610c4e8261252c565b92915050565b606060018054610c6390613b11565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8f90613b11565b8015610cdc5780601f10610cb157610100808354040283529160200191610cdc565b820191906000526020600020905b815481529060010190602001808311610cbf57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610d5f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bad565b506000908152600560205260409020546001600160a01b031690565b6000610d86826113e4565b9050806001600160a01b0316836001600160a01b03161415610df45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bad565b336001600160a01b0382161480610e105750610e1081336122d9565b610e825760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bad565b610e8c838361257c565b505050565b6000546001600160a01b03163314610ebb5760405162461bcd60e51b8152600401610bad90613959565b6019805460ff60b01b198116600160b01b9182900460ff1615909102179055565b610ee633826125ea565b610f025760405162461bcd60e51b8152600401610bad906139d9565b610e8c8383836126c1565b600081815260146020908152604091829020805483518184028101840190945280845260609392830182828015610f6357602002820191906000526020600020905b815481526020019060010190808311610f4f575b50505050509050919050565b6000546001600160a01b03163314610f995760405162461bcd60e51b8152600401610bad90613959565b6019805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6000610fc583611498565b82106110275760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610bad565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b0316331461107a5760405162461bcd60e51b8152600401610bad90613959565b600f54600160a01b900460ff16156110cb5760405162461bcd60e51b815260206004820152601460248201527311195cd8dc9a5c1d1bdc881a5cc81b1bd8dad95960621b6044820152606401610bad565b600f805460ff60a01b1916600160a01b179055565b610e8c838383604051806020016040528060008152506118b8565b6000546001600160a01b031633146111255760405162461bcd60e51b8152600401610bad90613959565b61112e8161286c565b60405181907f58a581a1fc8e6c8475bed8f58a53e3a04184e0b331d24d5d6237250f525eb8f490600090a250565b600061116760095490565b82106111ca5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610bad565b600982815481106111dd576111dd613bbd565b90600052602060002001549050919050565b6000818152600360205260409020546060906001600160a01b03166112265760405162461bcd60e51b8152600401610bad9061398e565b600061123183612913565b90506000816040516020016112469190613713565b604051602081830303815290604052905060008260405160200161126a9190613740565b60408051601f19818403018152828252600e5460008981526010602052929092206387db11bd60e01b84529093506001600160a01b03909116916387db11bd916112ba918691869160040161386b565b60006040518083038186803b1580156112d257600080fd5b505afa1580156112e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261130e919081019061349a565b95945050505050565b6000546001600160a01b031633146113415760405162461bcd60e51b8152600401610bad90613959565b8051611354906012906020840190613192565b5050565b6000546001600160a01b031633146113825760405162461bcd60e51b8152600401610bad90613959565b600f54600160a81b900460ff16156113cf5760405162461bcd60e51b815260206004820152601060248201526f14d95959195c881a5cc81b1bd8dad95960821b6044820152606401610bad565b600f805460ff60a81b1916600160a81b179055565b6000818152600360205260408120546001600160a01b031680610c4e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bad565b6000546001600160a01b031633146114855760405162461bcd60e51b8152600401610bad90613959565b8051611354906013906020840190613192565b60006001600160a01b0382166115035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bad565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146115495760405162461bcd60e51b8152600401610bad90613959565b6115536000612a11565b565b6000546001600160a01b0316331461157f5760405162461bcd60e51b8152600401610bad90613959565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b600d60205260009081526040902080546115ba90613b11565b80601f01602080910402602001604051908101604052809291908181526020018280546115e690613b11565b80156116335780601f1061160857610100808354040283529160200191611633565b820191906000526020600020905b81548152906001019060200180831161161657829003601f168201915b505050505081565b606060028054610c6390613b11565b601954600160a01b900460ff166116955760405162461bcd60e51b815260206004820152600f60248201526e73616c65206e6f742061637469766560881b6044820152606401610bad565b601954600160b81b900460ff166116e55760405162461bcd60e51b8152602060048201526014602482015273383ab13634b19039b0b632903737ba1037b832b760611b6044820152606401610bad565b600c548111156117295760405162461bcd60e51b815260206004820152600f60248201526e6d696e74656420746f6f206d616e7960881b6044820152606401610bad565b600b546117369082613aaf565b34101561177e5760405162461bcd60e51b81526020600482015260166024820152751b9bdd08195b9bdd59da08195d1a195c9cc81cd95b9d60521b6044820152606401610bad565b6019546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156117b7573d6000803e3d6000fd5b5060005b81811015611354576117cf33601154612a61565b506011546117de906001613a83565b601155806117eb81613b4c565b9150506117bb565b6001600160a01b03821633141561184c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bad565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118c233836125ea565b6118de5760405162461bcd60e51b8152600401610bad906139d9565b6118ea84848484612c43565b50505050565b601954600160a01b900460ff166119195760405162461bcd60e51b8152600401610bad9061392c565b6017546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561195d57600080fd5b505afa158015611971573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199591906132a1565b6001600160a01b0316336001600160a01b0316146119e95760405162461bcd60e51b8152602060048201526011602482015270135554d517d3d5d397d513d2d15397d251607a1b6044820152606401610bad565b601954600160b01b900460ff16611a425760405162461bcd60e51b815260206004820152601b60248201527f4b696e6573697320636c61696d696e6720697320636c6f7365642100000000006044820152606401610bad565b60008181526018602052604090205460ff1615611a995760405162461bcd60e51b81526020600482015260156024820152741513d2d15397d053149150511657d0d31052535151605a1b6044820152606401610bad565b6000818152601860205260409020805460ff19166001179055611ac1611abc3390565b612c76565b50565b601380546115ba90613b11565b6000818152600360205260409020546060906001600160a01b0316611b085760405162461bcd60e51b8152600401610bad9061398e565b6013611b1383612913565b604051602001611b24929190613675565b6040516020818303038152906040529050919050565b601954600160a01b900460ff16611b635760405162461bcd60e51b8152600401610bad9061392c565b601954600160b01b900460ff16611bbc5760405162461bcd60e51b815260206004820152601b60248201527f4b696e6573697320636c61696d696e6720697320636c6f7365642100000000006044820152606401610bad565b6017546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611c1057600080fd5b505afa158015611c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4891906135af565b905060008111611c8c5760405162461bcd60e51b815260206004820152600f60248201526e1393d7d513d2d15394d7d3d5d39151608a1b6044820152606401610bad565b6000805b82811015610e8c576017546001600160a01b0316632f745c59336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024810184905260440160206040518083038186803b158015611cf057600080fd5b505afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906135af565b60008181526018602052604090205490925060ff1615611d825760405162461bcd60e51b81526020600482015260156024820152741513d2d15397d053149150511657d0d31052535151605a1b6044820152606401610bad565b6000828152601860205260409020805460ff19166001179055611da5611abc3390565b80611daf81613b4c565b915050611c90565b601954600160a01b900460ff16611de05760405162461bcd60e51b8152600401610bad9061392c565b601954600160a81b900460ff16611e395760405162461bcd60e51b815260206004820152601860248201527f4e6f756e20636c61696d696e6720697320636c6f7365642100000000000000006044820152606401610bad565b6015546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e9060240160206040518083038186803b158015611e7d57600080fd5b505afa158015611e91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb591906132a1565b6001600160a01b0316336001600160a01b031614611f085760405162461bcd60e51b815260206004820152601060248201526f135554d517d3d5d397d393d55397d25160821b6044820152606401610bad565b60008181526016602052604090205460ff1615611f675760405162461bcd60e51b815260206004820152601e60248201527f544f4b454e5f414c52454144595f434c41494d45445f464f525f4e4f554e00006044820152606401610bad565b6000818152601660205260409020805460ff1916600190811790915560115490611f92908290613a83565b601155604051600090611fcb90839043903390602001928352602083019190915260601b6001600160601b031916604082015260540190565b60408051808303601f19018152828252805160209182012060008681526014835292832080546001810182559084529183209091018190556015546301e0a07d60e71b845260048401879052909350909182918291829182916001600160a01b039091169063f0503e809060240160a06040518083038186803b15801561205157600080fd5b505afa158015612065573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208991906135c8565b945094509450945094506040518060a001604052808665ffffffffffff1681526020018565ffffffffffff1681526020018465ffffffffffff1681526020018365ffffffffffff1681526020018265ffffffffffff168152506010600089815260200190815260200160002060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548165ffffffffffff021916908365ffffffffffff16021790555060608201518160000160126101000a81548165ffffffffffff021916908365ffffffffffff16021790555060808201518160000160186101000a81548165ffffffffffff021916908365ffffffffffff160217905550905050601b5460016121de9190613a83565b601b556121eb3388612ca2565b5050505050505050565b6000546001600160a01b0316331461221f5760405162461bcd60e51b8152600401610bad90613959565b600f54600160a81b900460ff161561226c5760405162461bcd60e51b815260206004820152601060248201526f14d95959195c881a5cc81b1bd8dad95960821b6044820152606401610bad565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146122b85760405162461bcd60e51b8152600401610bad90613959565b6019805460ff60b81b198116600160b81b9182900460ff1615909102179055565b60405163c455279160e01b81526001600160a01b038381166004830152600091818416917f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1169063c45527919060240160206040518083038186803b15801561234157600080fd5b505afa158015612355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237991906132a1565b6001600160a01b0316141561239057506001610c4e565b6001600160a01b0380841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b6000546001600160a01b031633146123eb5760405162461bcd60e51b8152600401610bad90613959565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b601280546115ba90613b11565b6000546001600160a01b031633146124445760405162461bcd60e51b8152600401610bad90613959565b600b55565b6000546001600160a01b031633146124735760405162461bcd60e51b8152600401610bad90613959565b6019805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000546001600160a01b031633146124be5760405162461bcd60e51b8152600401610bad90613959565b6001600160a01b0381166125235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bad565b611ac181612a11565b60006001600160e01b031982166380ac58cd60e01b148061255d57506001600160e01b03198216635b5e139f60e01b145b80610c4e57506301ffc9a760e01b6001600160e01b0319831614610c4e565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125b1826113e4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166126635760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bad565b600061266e836113e4565b9050806001600160a01b0316846001600160a01b031614806126a95750836001600160a01b031661269e84610ce6565b6001600160a01b0316145b806126b957506126b981856122d9565b949350505050565b826001600160a01b03166126d4826113e4565b6001600160a01b03161461273c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bad565b6001600160a01b03821661279e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bad565b6127a9838383612cbc565b6127b460008261257c565b6001600160a01b03831660009081526004602052604081208054600192906127dd908490613ace565b90915550506001600160a01b038216600090815260046020526040812080546001929061280b908490613a83565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612877826113e4565b905061288581600084612cbc565b61289060008361257c565b6001600160a01b03811660009081526004602052604081208054600192906128b9908490613ace565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060816129375750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612961578061294b81613b4c565b915061295a9050600a83613a9b565b915061293b565b60008167ffffffffffffffff81111561297c5761297c613bd3565b6040519080825280601f01601f1916602001820160405280156129a6576020820181803683370190505b5090505b84156126b9576129bb600183613ace565b91506129c8600a86613b67565b6129d3906030613a83565b60f81b8183815181106129e8576129e8613bbd565b60200101906001600160f81b031916908160001a905350612a0a600a86613a9b565b94506129aa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080824333604051602001612a9793929190928352602083019190915260601b6001600160601b031916604082015260540190565b60408051808303601f19018152908290528051602090910120600f54600e5463422e2e9960e01b8452600484018790526001600160a01b039081166024850152919350169063422e2e999060440160a06040518083038186803b158015612afd57600080fd5b505afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613508565b6000848152601060209081526040808320845181548685015187850151606089015160809099015165ffffffffffff9485166001600160601b031990941693909317660100000000000092851692909202919091176bffffffffffffffffffffffff60601b1916600160601b9184169190910265ffffffffffff60901b191617600160901b978316979097029690961765ffffffffffff60c01b1916600160c01b91909616029490941790935560148152918120805460018101825590825291902001819055612c058484612ca2565b60405183906001600160a01b038616907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a3509092915050565b612c4e8484846126c1565b612c5a84848484612d74565b6118ea5760405162461bcd60e51b8152600401610bad906138da565b601154612c84816001613a83565b601155601a54612c95906001613a83565b601a55610e8c8282612a61565b611354828260405180602001604052806000815250612e81565b6001600160a01b038316612d1757612d1281600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612d3a565b816001600160a01b0316836001600160a01b031614612d3a57612d3a8382612eb4565b6001600160a01b038216612d5157610e8c81612f51565b826001600160a01b0316826001600160a01b031614610e8c57610e8c8282613000565b60006001600160a01b0384163b15612e7657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612db89033908990889088906004016137d7565b602060405180830381600087803b158015612dd257600080fd5b505af1925050508015612e02575060408051601f3d908101601f19168201909252612dff91810190613434565b60015b612e5c573d808015612e30576040519150601f19603f3d011682016040523d82523d6000602084013e612e35565b606091505b508051612e545760405162461bcd60e51b8152600401610bad906138da565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126b9565b506001949350505050565b612e8b8383613044565b612e986000848484612d74565b610e8c5760405162461bcd60e51b8152600401610bad906138da565b60006001612ec184611498565b612ecb9190613ace565b600083815260086020526040902054909150808214612f1e576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090612f6390600190613ace565b6000838152600a602052604081205460098054939450909284908110612f8b57612f8b613bbd565b906000526020600020015490508060098381548110612fac57612fac613bbd565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480612fe457612fe4613ba7565b6001900381819060005260206000200160009055905550505050565b600061300b83611498565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b03821661309a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bad565b6000818152600360205260409020546001600160a01b0316156130ff5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bad565b61310b60008383612cbc565b6001600160a01b0382166000908152600460205260408120805460019290613134908490613a83565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461319e90613b11565b90600052602060002090601f0160209004810192826131c05760008555613206565b82601f106131d957805160ff1916838001178555613206565b82800160010185558215613206579182015b828111156132065782518255916020019190600101906131eb565b50613212929150613216565b5090565b5b808211156132125760008155600101613217565b600061323e61323984613a5b565b613a2a565b905082815283838301111561325257600080fd5b828260208301376000602084830101529392505050565b805165ffffffffffff8116811461327f57600080fd5b919050565b60006020828403121561329657600080fd5b81356123ba81613be9565b6000602082840312156132b357600080fd5b81516123ba81613be9565b600080604083850312156132d157600080fd5b82356132dc81613be9565b915060208301356132ec81613be9565b809150509250929050565b60008060006060848603121561330c57600080fd5b833561331781613be9565b9250602084013561332781613be9565b929592945050506040919091013590565b6000806000806080858703121561334e57600080fd5b843561335981613be9565b9350602085013561336981613be9565b925060408501359150606085013567ffffffffffffffff81111561338c57600080fd5b8501601f8101871361339d57600080fd5b6133ac8782356020840161322b565b91505092959194509250565b600080604083850312156133cb57600080fd5b82356133d681613be9565b9150602083013580151581146132ec57600080fd5b600080604083850312156133fe57600080fd5b823561340981613be9565b946020939093013593505050565b60006020828403121561342957600080fd5b81356123ba81613bfe565b60006020828403121561344657600080fd5b81516123ba81613bfe565b60006020828403121561346357600080fd5b813567ffffffffffffffff81111561347a57600080fd5b8201601f8101841361348b57600080fd5b6126b98482356020840161322b565b6000602082840312156134ac57600080fd5b815167ffffffffffffffff8111156134c357600080fd5b8201601f810184136134d457600080fd5b80516134e261323982613a5b565b8181528560208385010111156134f757600080fd5b61130e826020830160208601613ae5565b600060a0828403121561351a57600080fd5b60405160a0810181811067ffffffffffffffff8211171561353d5761353d613bd3565b60405261354983613269565b815261355760208401613269565b602082015261356860408401613269565b604082015261357960608401613269565b606082015261358a60808401613269565b60808201529392505050565b6000602082840312156135a857600080fd5b5035919050565b6000602082840312156135c157600080fd5b5051919050565b600080600080600060a086880312156135e057600080fd5b6135e986613269565b94506135f760208701613269565b935061360560408701613269565b925061361360608701613269565b915061362160808701613269565b90509295509295909350565b60008151808452613645816020860160208601613ae5565b601f01601f19169290920160200192915050565b6000815161366b818560208601613ae5565b9290920192915050565b600080845481600182811c91508083168061369157607f831692505b60208084108214156136b157634e487b7160e01b86526022600452602486fd5b8180156136c557600181146136d657613703565b60ff19861689528489019650613703565b60008b81526020902060005b868110156136fb5781548b8201529085019083016136e2565b505084890196505b50505050505061130e8185613659565b6402b32b931160dd1b815260008251613733816005850160208701613ae5565b9190910160050192915050565b6402b32b931160dd1b815260008251613760816005850160208701613ae5565b7f20697320616e20616e696d6174656420686f6d61676520746f20746865204e6f60059390910192830152507f756e2c2063726561746564206279206772616e742e6f6520666f7220746865206025820152734b696e657369732041727420706c6174666f726d60601b6045820152605901919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061380a9083018461362d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561384c57835183529284019291840191600101613830565b50909695505050505050565b6020815260006123ba602083018461362d565b60e08152600061387e60e083018661362d565b8281036020840152613890818661362d565b915050825465ffffffffffff8082166040850152808260301c166060850152808260601c166080850152808260901c1660a0850152808260c01c1660c08501525050949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526013908201527250726f6a656374206e6f74206163746976652160681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f5665726273546f6b656e3a2055524920717565727920666f72206e6f6e65786960408201526a39ba32b73a103a37b5b2b760a91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a5357613a53613bd3565b604052919050565b600067ffffffffffffffff821115613a7557613a75613bd3565b50601f01601f191660200190565b60008219821115613a9657613a96613b7b565b500190565b600082613aaa57613aaa613b91565b500490565b6000816000190483118215151615613ac957613ac9613b7b565b500290565b600082821015613ae057613ae0613b7b565b500390565b60005b83811015613b00578181015183820152602001613ae8565b838111156118ea5750506000910152565b600181811c90821680613b2557607f821691505b60208210811415613b4657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613b6057613b60613b7b565b5060010190565b600082613b7657613b76613b91565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ac157600080fd5b6001600160e01b031981168114611ac157600080fdfea26469706673582212209d6a45d2a0e342299c5b31053bdbd86d740341b8387a5b56fe69bb62492807a064736f6c63430008070033
Deployed Bytecode Sourcemap
49316:10373:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58634:148;;;;;;;;;;-1:-1:-1;58634:148:0;;;;;:::i;:::-;;:::i;:::-;;32507:224;;;;;;;;;;-1:-1:-1;32507:224:0;;;;;:::i;:::-;;:::i;:::-;;;12767:14:1;;12760:22;12742:41;;12730:2;12715:18;32507:224:0;;;;;;;;50715:25;;;;;;;;;;-1:-1:-1;50715:25:0;;;;-1:-1:-1;;;50715:25:0;;;;;;50394:43;;;;;;;;;;-1:-1:-1;50394:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19975:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21534:221::-;;;;;;;;;;-1:-1:-1;21534:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11149:32:1;;;11131:51;;11119:2;11104:18;21534:221:0;10985:203:1;21057:411:0;;;;;;;;;;-1:-1:-1;21057:411:0;;;;;:::i;:::-;;:::i;50173:32::-;;;;;;;;;;;;;;;;;;;27251:25:1;;;27239:2;27224:18;50173:32:0;27105:177:1;50788:37:0;;;;;;;;;;-1:-1:-1;50788:37:0;;;;-1:-1:-1;;;50788:37:0;;;;;;49603:29;;;;;;;;;;;;;;;;52183:108;;;;;;;;;;;;;:::i;33147:113::-;;;;;;;;;;-1:-1:-1;33235:10:0;:17;33147:113;;22424:339;;;;;;;;;;-1:-1:-1;22424:339:0;;;;;:::i;:::-;;:::i;52636:129::-;;;;;;;;;;-1:-1:-1;52636:129:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52101:76::-;;;;;;;;;;;;;:::i;32815:256::-;;;;;;;;;;-1:-1:-1;32815:256:0;;;;;:::i;:::-;;:::i;49783:34::-;;;;;;;;;;-1:-1:-1;49783:34:0;;;;-1:-1:-1;;;;;49783:34:0;;;58933:122;;;;;;;;;;;;;:::i;22834:185::-;;;;;;;;;;-1:-1:-1;22834:185:0;;;;;:::i;:::-;;:::i;57421:122::-;;;;;;;;;;-1:-1:-1;57421:122:0;;;;;:::i;:::-;;:::i;50908:34::-;;;;;;;;;;;;;;;;33337:233;;;;;;;;;;-1:-1:-1;33337:233:0;;;;;:::i;:::-;;:::i;57969:536::-;;;;;;;;;;-1:-1:-1;57969:536:0;;;;;:::i;:::-;;:::i;51351:103::-;;;;;;;;;;-1:-1:-1;51351:103:0;;;;;:::i;:::-;;:::i;59447:110::-;;;;;;;;;;;;;:::i;19669:239::-;;;;;;;;;;-1:-1:-1;19669:239:0;;;;;:::i;:::-;;:::i;49857:26::-;;;;;;;;;;-1:-1:-1;49857:26:0;;;;-1:-1:-1;;;;;49857:26:0;;;50353:34;;;;;;;;;;-1:-1:-1;50353:34:0;;;;-1:-1:-1;;;;;50353:34:0;;;51462:123;;;;;;;;;;-1:-1:-1;51462:123:0;;;;;:::i;:::-;;:::i;19399:208::-;;;;;;;;;;-1:-1:-1;19399:208:0;;;;;:::i;:::-;;:::i;48436:94::-;;;;;;;;;;;;;:::i;52506:124::-;;;;;;;;;;-1:-1:-1;52506:124:0;;;;;:::i;:::-;;:::i;49685:49::-;;;;;;;;;;-1:-1:-1;49685:49:0;;;;;:::i;:::-;;:::i;50747:34::-;;;;;;;;;;-1:-1:-1;50747:34:0;;;;-1:-1:-1;;;50747:34:0;;;;;;47785:87;;;;;;;;;;-1:-1:-1;47831:7:0;47858:6;-1:-1:-1;;;;;47858:6:0;47785:87;;20144:104;;;;;;;;;;;;;:::i;50872:29::-;;;;;;;;;;;;;;;;49556:40;;;;;;;;;;;;;;;;56230:533;;;;;;:::i;:::-;;:::i;21827:295::-;;;;;;;;;;-1:-1:-1;21827:295:0;;;;;:::i;:::-;;:::i;50450:39::-;;;;;;;;;;-1:-1:-1;50450:39:0;;;;-1:-1:-1;;;;;50450:39:0;;;50588:45;;;;;;;;;;;;;;;23090:328;;;;;;;;;;-1:-1:-1;23090:328:0;;;;;:::i;:::-;;:::i;53352:598::-;;;;;;;;;;-1:-1:-1;53352:598:0;;;;;:::i;:::-;;:::i;49938:30::-;;;;;;;;;;-1:-1:-1;49938:30:0;;;;-1:-1:-1;;;49938:30:0;;;;;;50246:33;;;;;;;;;;;;;:::i;57694:267::-;;;;;;;;;;-1:-1:-1;57694:267:0;;;;;:::i;:::-;;:::i;50019:26::-;;;;;;;;;;-1:-1:-1;50019:26:0;;;;-1:-1:-1;;;50019:26:0;;;;;;54033:746;;;;;;;;;;;;;:::i;54785:1105::-;;;;;;;;;;-1:-1:-1;54785:1105:0;;;;;:::i;:::-;;:::i;59176:124::-;;;;;;;;;;-1:-1:-1;59176:124:0;;;;;:::i;:::-;;:::i;50496:46::-;;;;;;;;;;-1:-1:-1;50496:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;52402:96;;;;;;;;;;;;;:::i;52903:334::-;;;;;;;;;;-1:-1:-1;52903:334:0;;;;;:::i;:::-;;:::i;59565:115::-;;;;;;;;;;-1:-1:-1;59565:115:0;;;;;:::i;:::-;;:::i;50214:25::-;;;;;;;;;;;;;:::i;57238:128::-;;;;;;;;;;-1:-1:-1;57238:128:0;;;;;:::i;:::-;;:::i;52297:99::-;;;;;;;;;;;;;:::i;50077:50::-;;;;;;;;;;-1:-1:-1;50077:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50077:50:0;;;;;-1:-1:-1;;;50077:50:0;;;;;-1:-1:-1;;;50077:50:0;;;;;;;;;;27850:14:1;27891:15;;;27873:34;;27943:15;;;27938:2;27923:18;;27916:43;27995:15;;;27975:18;;;27968:43;;;;28047:15;;28042:2;28027:18;;28020:43;28100:15;;;28094:3;28079:19;;28072:44;27827:3;27812:19;50077:50:0;27591:531:1;48685:192:0;;;;;;;;;;-1:-1:-1;48685:192:0;;;;;:::i;:::-;;:::i;50832:33::-;;;;;;;;;;-1:-1:-1;50832:33:0;;;;-1:-1:-1;;;50832:33:0;;;;;;58634:148;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;;;;;;;;;51087:18:::1;::::0;-1:-1:-1;;;51087:18:0;::::1;;;51086:19;51078:52;;;::::0;-1:-1:-1;;;51078:52:0;;15221:2:1;51078:52:0::1;::::0;::::1;15203:21:1::0;15260:2;15240:18;;;15233:30;-1:-1:-1;;;15279:18:1;;;15272:50;15339:18;;51078:52:0::1;15019:344:1::0;51078:52:0::1;58750:10:::2;:24:::0;;-1:-1:-1;;;;;;58750:24:0::2;-1:-1:-1::0;;;;;58750:24:0;;;::::2;::::0;;;::::2;::::0;;58634:148::o;32507:224::-;32609:4;-1:-1:-1;;;;;;32633:50:0;;-1:-1:-1;;;32633:50:0;;:90;;;32687:36;32711:11;32687:23;:36::i;:::-;32626:97;32507:224;-1:-1:-1;;32507:224:0:o;19975:100::-;20029:13;20062:5;20055:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19975:100;:::o;21534:221::-;21610:7;25017:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25017:16:0;21630:73;;;;-1:-1:-1;;;21630:73:0;;22740:2:1;21630:73:0;;;22722:21:1;22779:2;22759:18;;;22752:30;22818:34;22798:18;;;22791:62;-1:-1:-1;;;22869:18:1;;;22862:42;22921:19;;21630:73:0;22538:408:1;21630:73:0;-1:-1:-1;21723:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;21723:24:0;;21534:221::o;21057:411::-;21138:13;21154:23;21169:7;21154:14;:23::i;:::-;21138:39;;21202:5;-1:-1:-1;;;;;21196:11:0;:2;-1:-1:-1;;;;;21196:11:0;;;21188:57;;;;-1:-1:-1;;;21188:57:0;;24685:2:1;21188:57:0;;;24667:21:1;24724:2;24704:18;;;24697:30;24763:34;24743:18;;;24736:62;-1:-1:-1;;;24814:18:1;;;24807:31;24855:19;;21188:57:0;24483:397:1;21188:57:0;17346:10;-1:-1:-1;;;;;21280:21:0;;;;:62;;-1:-1:-1;21305:37:0;21322:5;17346:10;52903:334;:::i;21305:37::-;21258:168;;;;-1:-1:-1;;;21258:168:0;;19728:2:1;21258:168:0;;;19710:21:1;19767:2;19747:18;;;19740:30;19806:34;19786:18;;;19779:62;19877:26;19857:18;;;19850:54;19921:19;;21258:168:0;19526:420:1;21258:168:0;21439:21;21448:2;21452:7;21439:8;:21::i;:::-;21127:341;21057:411;;:::o;52183:108::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;52264:19:::1;::::0;;-1:-1:-1;;;;52243:40:0;::::1;-1:-1:-1::0;;;52264:19:0;;;::::1;;;52263:20;52243:40:::0;;::::1;;::::0;;52183:108::o;22424:339::-;22619:41;17346:10;22652:7;22619:18;:41::i;:::-;22611:103;;;;-1:-1:-1;;;22611:103:0;;;;;;;:::i;:::-;22727:28;22737:4;22743:2;22747:7;22727:9;:28::i;52636:129::-;52732:25;;;;:15;:25;;;;;;;;;52725:32;;;;;;;;;;;;;;;;;52697:16;;52725:32;;;52732:25;52725:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52636:129;;;:::o;52101:76::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;52163:6:::1;::::0;;-1:-1:-1;;;;52155:14:0;::::1;-1:-1:-1::0;;;52163:6:0;;;::::1;;;52162:7;52155:14:::0;;::::1;;::::0;;52101:76::o;32815:256::-;32912:7;32948:23;32965:5;32948:16;:23::i;:::-;32940:5;:31;32932:87;;;;-1:-1:-1;;;32932:87:0;;15926:2:1;32932:87:0;;;15908:21:1;15965:2;15945:18;;;15938:30;16004:34;15984:18;;;15977:62;-1:-1:-1;;;16055:18:1;;;16048:41;16106:19;;32932:87:0;15724:407:1;32932:87:0;-1:-1:-1;;;;;;33037:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;32815:256::o;58933:122::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;51087:18:::1;::::0;-1:-1:-1;;;51087:18:0;::::1;;;51086:19;51078:52;;;::::0;-1:-1:-1;;;51078:52:0;;15221:2:1;51078:52:0::1;::::0;::::1;15203:21:1::0;15260:2;15240:18;;;15233:30;-1:-1:-1;;;15279:18:1;;;15272:50;15339:18;;51078:52:0::1;15019:344:1::0;51078:52:0::1;59022:18:::2;:25:::0;;-1:-1:-1;;;;59022:25:0::2;-1:-1:-1::0;;;59022:25:0::2;::::0;;58933:122::o;22834:185::-;22972:39;22989:4;22995:2;22999:7;22972:39;;;;;;;;;;;;:16;:39::i;57421:122::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;57488:13:::1;57494:6;57488:5;:13::i;:::-;57517:18;::::0;57528:6;;57517:18:::1;::::0;;;::::1;57421:122:::0;:::o;33337:233::-;33412:7;33448:30;33235:10;:17;;33147:113;33448:30;33440:5;:38;33432:95;;;;-1:-1:-1;;;33432:95:0;;26199:2:1;33432:95:0;;;26181:21:1;26238:2;26218:18;;;26211:30;26277:34;26257:18;;;26250:62;-1:-1:-1;;;26328:18:1;;;26321:42;26380:19;;33432:95:0;25997:408:1;33432:95:0;33545:10;33556:5;33545:17;;;;;;;;:::i;:::-;;;;;;;;;33538:24;;33337:233;;;:::o;57969:536::-;24993:4;25017:16;;;:7;:16;;;;;;58029:13;;-1:-1:-1;;;;;25017:16:0;58055:72;;;;-1:-1:-1;;;58055:72:0;;;;;;;:::i;:::-;58138:20;58161:18;:7;:16;:18::i;:::-;58138:41;;58190:18;58244:6;58218:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;58190:62;;58264:25;58323:6;58297:121;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58297:121:0;;;;;;;;;58437:10;;;58482:14;;;:5;58297:121;58482:14;;;;;-1:-1:-1;;;58437:60:0;;58297:121;;-1:-1:-1;;;;;;58437:10:0;;;;:25;;:60;;58463:4;;58297:121;;58437:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58437:60:0;;;;;;;;;;;;:::i;:::-;58430:67;57969:536;-1:-1:-1;;;;;57969:536:0:o;51351:103::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;51430:16;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51351:103:::0;:::o;59447:110::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;51288:14:::1;::::0;-1:-1:-1;;;51288:14:0;::::1;;;51287:15;51279:44;;;::::0;-1:-1:-1;;;51279:44:0;;22395:2:1;51279:44:0::1;::::0;::::1;22377:21:1::0;22434:2;22414:18;;;22407:30;-1:-1:-1;;;22453:18:1;;;22446:46;22509:18;;51279:44:0::1;22193:340:1::0;51279:44:0::1;59528:14:::2;:21:::0;;-1:-1:-1;;;;59528:21:0::2;-1:-1:-1::0;;;59528:21:0::2;::::0;;59447:110::o;19669:239::-;19741:7;19777:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19777:16:0;19812:19;19804:73;;;;-1:-1:-1;;;19804:73:0;;20923:2:1;19804:73:0;;;20905:21:1;20962:2;20942:18;;;20935:30;21001:34;20981:18;;;20974:62;-1:-1:-1;;;21052:18:1;;;21045:39;21101:19;;19804:73:0;20721:405:1;51462:123:0;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;51549:28;;::::1;::::0;:14:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;19399:208::-:0;19471:7;-1:-1:-1;;;;;19499:19:0;;19491:74;;;;-1:-1:-1;;;19491:74:0;;20512:2:1;19491:74:0;;;20494:21:1;20551:2;20531:18;;;20524:30;20590:34;20570:18;;;20563:62;-1:-1:-1;;;20641:18:1;;;20634:40;20691:19;;19491:74:0;20310:406:1;19491:74:0;-1:-1:-1;;;;;;19583:16:0;;;;;:9;:16;;;;;;;19399:208::o;48436:94::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;48501:21:::1;48519:1;48501:9;:21::i;:::-;48436:94::o:0;52506:124::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;52597:7:::1;:25:::0;;-1:-1:-1;;;;;;52597:25:0::1;-1:-1:-1::0;;;;;52597:25:0;;;::::1;::::0;;;::::1;::::0;;52506:124::o;49685:49::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20144:104::-;20200:13;20233:7;20226:14;;;;;:::i;56230:533::-;56310:6;;-1:-1:-1;;;56310:6:0;;;;56301:34;;;;-1:-1:-1;;;56301:34:0;;17866:2:1;56301:34:0;;;17848:21:1;17905:2;17885:18;;;17878:30;-1:-1:-1;;;17924:18:1;;;17917:45;17979:18;;56301:34:0;17664:339:1;56301:34:0;56357:14;;-1:-1:-1;;;56357:14:0;;;;56348:48;;;;-1:-1:-1;;;56348:48:0;;23153:2:1;56348:48:0;;;23135:21:1;23192:2;23172:18;;;23165:30;-1:-1:-1;;;23211:18:1;;;23204:50;23271:18;;56348:48:0;22951:344:1;56348:48:0;56430:10;;56418;:22;;56409:50;;;;-1:-1:-1;;;56409:50:0;;25855:2:1;56409:50:0;;;25837:21:1;25894:2;25874:18;;;25867:30;-1:-1:-1;;;25913:18:1;;;25906:45;25968:18;;56409:50:0;25653:339:1;56409:50:0;56502:5;;56491:16;;:10;:16;:::i;:::-;56480:9;:27;;56472:61;;;;-1:-1:-1;;;56472:61:0;;26956:2:1;56472:61:0;;;26938:21:1;26995:2;26975:18;;;26968:30;-1:-1:-1;;;27014:18:1;;;27007:52;27076:18;;56472:61:0;26754:346:1;56472:61:0;56554:7;;56546:36;;-1:-1:-1;;;;;56554:7:0;;;;56572:9;56546:36;;;;;56554:7;56546:36;56554:7;56546:36;56572:9;56554:7;56546:36;;;;;;;;;;;;;;;;;;;;;56608:9;56603:153;56622:10;56620:1;:12;56603:153;;;56662:34;56670:10;56682:13;;56662:7;:34::i;:::-;-1:-1:-1;56727:13:0;;:17;;56743:1;56727:17;:::i;:::-;56711:13;:33;56633:3;;;;:::i;:::-;;;;56603:153;;21827:295;-1:-1:-1;;;;;21930:24:0;;17346:10;21930:24;;21922:62;;;;-1:-1:-1;;;21922:62:0;;18615:2:1;21922:62:0;;;18597:21:1;18654:2;18634:18;;;18627:30;18693:27;18673:18;;;18666:55;18738:18;;21922:62:0;18413:349:1;21922:62:0;17346:10;21997:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;21997:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;21997:53:0;;;;;;;;;;22066:48;;12742:41:1;;;21997:42:0;;17346:10;22066:48;;12715:18:1;22066:48:0;;;;;;;21827:295;;:::o;23090:328::-;23265:41;17346:10;23298:7;23265:18;:41::i;:::-;23257:103;;;;-1:-1:-1;;;23257:103:0;;;;;;;:::i;:::-;23371:39;23385:4;23391:2;23395:7;23404:5;23371:13;:39::i;:::-;23090:328;;;;:::o;53352:598::-;53504:6;;-1:-1:-1;;;53504:6:0;;;;53482:62;;;;-1:-1:-1;;;53482:62:0;;;;;;;:::i;:::-;53593:15;;:32;;-1:-1:-1;;;53593:32:0;;;;;27251:25:1;;;-1:-1:-1;;;;;53593:15:0;;;;:23;;27224:18:1;;53593:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53577:48:0;17346:10;-1:-1:-1;;;;;53577:48:0;;53555:115;;;;-1:-1:-1;;;53555:115:0;;19382:2:1;53555:115:0;;;19364:21:1;19421:2;19401:18;;;19394:30;-1:-1:-1;;;19440:18:1;;;19433:47;19497:18;;53555:115:0;19180:341:1;53555:115:0;53703:19;;-1:-1:-1;;;53703:19:0;;;;53681:83;;;;-1:-1:-1;;;53681:83:0;;15570:2:1;53681:83:0;;;15552:21:1;15609:2;15589:18;;;15582:30;15648:29;15628:18;;;15621:57;15695:18;;53681:83:0;15368:351:1;53681:83:0;53798:23;;;;:14;:23;;;;;;;;53797:24;53775:95;;;;-1:-1:-1;;;53775:95:0;;25087:2:1;53775:95:0;;;25069:21:1;25126:2;25106:18;;;25099:30;-1:-1:-1;;;25145:18:1;;;25138:51;25206:18;;53775:95:0;24885:345:1;53775:95:0;53881:23;;;;:14;:23;;;;;:30;;-1:-1:-1;;53881:30:0;53907:4;53881:30;;;53922:20;53929:12;17346:10;;17266:98;53929:12;53922:6;:20::i;:::-;53352:598;:::o;50246:33::-;;;;;;;:::i;57694:267::-;24993:4;25017:16;;;:7;:16;;;;;;57768:13;;-1:-1:-1;;;;;25017:16:0;57794:73;;;;-1:-1:-1;;;57794:73:0;;;;;;;:::i;:::-;57909:14;57925:26;57942:8;57925:16;:26::i;:::-;57892:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57878:75;;57694:267;;;:::o;54033:746::-;54103:6;;-1:-1:-1;;;54103:6:0;;;;54081:62;;;;-1:-1:-1;;;54081:62:0;;;;;;;:::i;:::-;54176:19;;-1:-1:-1;;;54176:19:0;;;;54154:83;;;;-1:-1:-1;;;54154:83:0;;15570:2:1;54154:83:0;;;15552:21:1;15609:2;15589:18;;;15582:30;15648:29;15628:18;;;15621:57;15695:18;;54154:83:0;15368:351:1;54154:83:0;54276:15;;54248:25;;-1:-1:-1;;;;;54276:15:0;:25;17346:10;54276:39;;-1:-1:-1;;;;;;54276:39:0;;;;;;;-1:-1:-1;;;;;11149:32:1;;;54276:39:0;;;11131:51:1;11104:18;;54276:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54248:67;;54373:1;54353:17;:21;54345:49;;;;-1:-1:-1;;;54345:49:0;;26612:2:1;54345:49:0;;;26594:21:1;26651:2;26631:18;;;26624:30;-1:-1:-1;;;26670:18:1;;;26663:45;26725:18;;54345:49:0;26410:339:1;54345:49:0;54405:15;;54433:339;54457:17;54453:1;:21;54433:339;;;54506:15;;-1:-1:-1;;;;;54506:15:0;:35;17346:10;54506:52;;-1:-1:-1;;;;;;54506:52:0;;;;;;;-1:-1:-1;;;;;11878:32:1;;;54506:52:0;;;11860:51:1;11927:18;;;11920:34;;;11833:18;;54506:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54600:23;;;;:14;:23;;;;;;54496:62;;-1:-1:-1;54600:23:0;;54599:24;54573:107;;;;-1:-1:-1;;;54573:107:0;;25087:2:1;54573:107:0;;;25069:21:1;25126:2;25106:18;;;25099:30;-1:-1:-1;;;25145:18:1;;;25138:51;25206:18;;54573:107:0;24885:345:1;54573:107:0;54695:23;;;;:14;:23;;;;;:30;;-1:-1:-1;;54695:30:0;54721:4;54695:30;;;54740:20;54747:12;17346:10;;17266:98;54740:20;54476:3;;;;:::i;:::-;;;;54433:339;;54785:1105;54871:6;;-1:-1:-1;;;54871:6:0;;;;54849:62;;;;-1:-1:-1;;;54849:62:0;;;;;;;:::i;:::-;54946:16;;-1:-1:-1;;;54946:16:0;;;;54924:77;;;;-1:-1:-1;;;54924:77:0;;22042:2:1;54924:77:0;;;22024:21:1;22081:2;22061:18;;;22054:30;22120:26;22100:18;;;22093:54;22164:18;;54924:77:0;21840:348:1;54924:77:0;55052:13;;:29;;-1:-1:-1;;;55052:29:0;;;;;27251:25:1;;;-1:-1:-1;;;;;55052:13:0;;;;:21;;27224:18:1;;55052:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55036:45:0;17346:10;-1:-1:-1;;;;;55036:45:0;;55014:111;;;;-1:-1:-1;;;55014:111:0;;17521:2:1;55014:111:0;;;17503:21:1;17560:2;17540:18;;;17533:30;-1:-1:-1;;;17579:18:1;;;17572:46;17635:18;;55014:111:0;17319:340:1;55014:111:0;55238:19;;;;:11;:19;;;;;;;;55237:20;55215:100;;;;-1:-1:-1;;;55215:100:0;;20153:2:1;55215:100:0;;;20135:21:1;20192:2;20172:18;;;20165:30;20231:32;20211:18;;;20204:60;20281:18;;55215:100:0;19951:354:1;55215:100:0;55326:19;;;;:11;:19;;;;;:26;;-1:-1:-1;;55326:26:0;55348:4;55326:26;;;;;;55379:13;;;55419:17;;55379:13;;55419:17;:::i;:::-;55403:13;:33;55482:50;;55457:12;;55482:50;;55499:6;;55507:12;;55521:10;;55482:50;;10806:19:1;;;10850:2;10841:12;;10834:28;;;;10900:2;10896:15;-1:-1:-1;;;;;;10892:53:1;10887:2;10878:12;;10871:75;10971:2;10962:12;;10621:359;55482:50:0;;;;;;;-1:-1:-1;;55482:50:0;;;;;;55472:61;;55482:50;55472:61;;;;55544:23;;;;:15;:23;;;;;:34;;;;;;;;;;;;;;;;;;;55669:13;;-1:-1:-1;;;55669:27:0;;;;;27251:25:1;;;55472:61:0;;-1:-1:-1;55544:23:0;;;;;;;;;;-1:-1:-1;;;;;55669:13:0;;;;:19;;27224:18:1;;55669:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55591:105;;;;;;;;;;55723:61;;;;;;;;55741:10;55723:61;;;;;;55753:4;55723:61;;;;;;55759:9;55723:61;;;;;;55770:4;55723:61;;;;;;55776:7;55723:61;;;;;55707:5;:13;55713:6;55707:13;;;;;;;;;;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55823:15;;55841:1;55823:19;;;;:::i;:::-;55805:15;:37;55853:29;55863:10;55875:6;55853:9;:29::i;:::-;54832:1058;;;;;;;54785:1105;:::o;59176:124::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;51288:14:::1;::::0;-1:-1:-1;;;51288:14:0;::::1;;;51287:15;51279:44;;;::::0;-1:-1:-1;;;51279:44:0;;22395:2:1;51279:44:0::1;::::0;::::1;22377:21:1::0;22434:2;22414:18;;;22407:30;-1:-1:-1;;;22453:18:1;;;22446:46;22509:18;;51279:44:0::1;22193:340:1::0;51279:44:0::1;59276:6:::2;:16:::0;;-1:-1:-1;;;;;;59276:16:0::2;-1:-1:-1::0;;;;;59276:16:0;;;::::2;::::0;;;::::2;::::0;;59176:124::o;52402:96::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;52476:14:::1;::::0;;-1:-1:-1;;;;52460:30:0;::::1;-1:-1:-1::0;;;52476:14:0;;;::::1;;;52475:15;52460:30:::0;;::::1;;::::0;;52402:96::o;52903:334::-;53093:28;;-1:-1:-1;;;53093:28:0;;-1:-1:-1;;;;;11149:32:1;;;53093:28:0;;;11131:51:1;53009:4:0;;53093:40;;;;:13;:21;;;;11104:18:1;;53093:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53093:40:0;;53089:84;;;-1:-1:-1;53157:4:0;53150:11;;53089:84;-1:-1:-1;;;;;22314:25:0;;;22290:4;22314:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;53190:39;53183:46;52903:334;-1:-1:-1;;;52903:334:0:o;59565:115::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;59651:13:::1;:21:::0;;-1:-1:-1;;;;;;59651:21:0::1;-1:-1:-1::0;;;;;59651:21:0;;;::::1;::::0;;;::::1;::::0;;59565:115::o;50214:25::-;;;;;;;:::i;57238:128::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;57331:5:::1;:27:::0;57238:128::o;52297:99::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;52372:16:::1;::::0;;-1:-1:-1;;;;52354:34:0;::::1;-1:-1:-1::0;;;52372:16:0;;;::::1;;;52371:17;52354:34:::0;;::::1;;::::0;;52297:99::o;48685:192::-;47831:7;47858:6;-1:-1:-1;;;;;47858:6:0;17346:10;48005:23;47997:68;;;;-1:-1:-1;;;47997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48774:22:0;::::1;48766:73;;;::::0;-1:-1:-1;;;48766:73:0;;16757:2:1;48766:73:0::1;::::0;::::1;16739:21:1::0;16796:2;16776:18;;;16769:30;16835:34;16815:18;;;16808:62;-1:-1:-1;;;16886:18:1;;;16879:36;16932:19;;48766:73:0::1;16555:402:1::0;48766:73:0::1;48850:19;48860:8;48850:9;:19::i;19030:305::-:0;19132:4;-1:-1:-1;;;;;;19169:40:0;;-1:-1:-1;;;19169:40:0;;:105;;-1:-1:-1;;;;;;;19226:48:0;;-1:-1:-1;;;19226:48:0;19169:105;:158;;;-1:-1:-1;;;;;;;;;;7283:40:0;;;19291:36;7174:157;28960:174;29035:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29035:29:0;-1:-1:-1;;;;;29035:29:0;;;;;;;;:24;;29089:23;29035:24;29089:14;:23::i;:::-;-1:-1:-1;;;;;29080:46:0;;;;;;;;;;;28960:174;;:::o;25222:348::-;25315:4;25017:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25017:16:0;25332:73;;;;-1:-1:-1;;;25332:73:0;;18969:2:1;25332:73:0;;;18951:21:1;19008:2;18988:18;;;18981:30;19047:34;19027:18;;;19020:62;-1:-1:-1;;;19098:18:1;;;19091:42;19150:19;;25332:73:0;18767:408:1;25332:73:0;25416:13;25432:23;25447:7;25432:14;:23::i;:::-;25416:39;;25485:5;-1:-1:-1;;;;;25474:16:0;:7;-1:-1:-1;;;;;25474:16:0;;:51;;;;25518:7;-1:-1:-1;;;;;25494:31:0;:20;25506:7;25494:11;:20::i;:::-;-1:-1:-1;;;;;25494:31:0;;25474:51;:87;;;;25529:32;25546:5;25553:7;25529:16;:32::i;:::-;25466:96;25222:348;-1:-1:-1;;;;25222:348:0:o;28264:578::-;28423:4;-1:-1:-1;;;;;28396:31:0;:23;28411:7;28396:14;:23::i;:::-;-1:-1:-1;;;;;28396:31:0;;28388:85;;;;-1:-1:-1;;;28388:85:0;;23863:2:1;28388:85:0;;;23845:21:1;23902:2;23882:18;;;23875:30;23941:34;23921:18;;;23914:62;-1:-1:-1;;;23992:18:1;;;23985:39;24041:19;;28388:85:0;23661:405:1;28388:85:0;-1:-1:-1;;;;;28492:16:0;;28484:65;;;;-1:-1:-1;;;28484:65:0;;18210:2:1;28484:65:0;;;18192:21:1;18249:2;18229:18;;;18222:30;18288:34;18268:18;;;18261:62;-1:-1:-1;;;18339:18:1;;;18332:34;18383:19;;28484:65:0;18008:400:1;28484:65:0;28562:39;28583:4;28589:2;28593:7;28562:20;:39::i;:::-;28666:29;28683:1;28687:7;28666:8;:29::i;:::-;-1:-1:-1;;;;;28708:15:0;;;;;;:9;:15;;;;;:20;;28727:1;;28708:15;:20;;28727:1;;28708:20;:::i;:::-;;;;-1:-1:-1;;;;;;;28739:13:0;;;;;;:9;:13;;;;;:18;;28756:1;;28739:13;:18;;28756:1;;28739:18;:::i;:::-;;;;-1:-1:-1;;28768:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28768:21:0;-1:-1:-1;;;;;28768:21:0;;;;;;;;;28807:27;;28768:16;;28807:27;;;;;;;28264:578;;;:::o;27567:360::-;27627:13;27643:23;27658:7;27643:14;:23::i;:::-;27627:39;;27679:48;27700:5;27715:1;27719:7;27679:20;:48::i;:::-;27768:29;27785:1;27789:7;27768:8;:29::i;:::-;-1:-1:-1;;;;;27810:16:0;;;;;;:9;:16;;;;;:21;;27830:1;;27810:16;:21;;27830:1;;27810:21;:::i;:::-;;;;-1:-1:-1;;27849:16:0;;;;:7;:16;;;;;;27842:23;;-1:-1:-1;;;;;;27842:23:0;;;27883:36;27857:7;;27849:16;-1:-1:-1;;;;;27883:36:0;;;;;27849:16;;27883:36;27616:311;27567:360;:::o;41239:723::-;41295:13;41516:10;41512:53;;-1:-1:-1;;41543:10:0;;;;;;;;;;;;-1:-1:-1;;;41543:10:0;;;;;41239:723::o;41512:53::-;41590:5;41575:12;41631:78;41638:9;;41631:78;;41664:8;;;;:::i;:::-;;-1:-1:-1;41687:10:0;;-1:-1:-1;41695:2:0;41687:10;;:::i;:::-;;;41631:78;;;41719:19;41751:6;41741:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41741:17:0;;41719:39;;41769:154;41776:10;;41769:154;;41803:11;41813:1;41803:11;;:::i;:::-;;-1:-1:-1;41872:10:0;41880:2;41872:5;:10;:::i;:::-;41859:24;;:2;:24;:::i;:::-;41846:39;;41829:6;41836;41829:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;41829:56:0;;;;;;;;-1:-1:-1;41900:11:0;41909:2;41900:11;;:::i;:::-;;;41769:154;;48885:173;48941:16;48960:6;;-1:-1:-1;;;;;48977:17:0;;;-1:-1:-1;;;;;;48977:17:0;;;;;;49010:40;;48960:6;;;;;;;49010:40;;48941:16;49010:40;48930:128;48885:173;:::o;56864:366::-;56927:7;56947:12;56989:6;56997:12;57011:10;56972:50;;;;;;;;;10806:19:1;;;10850:2;10841:12;;10834:28;;;;10900:2;10896:15;-1:-1:-1;;;;;;10892:53:1;10887:2;10878:12;;10871:75;10971:2;10962:12;;10621:359;56972:50:0;;;;;;;-1:-1:-1;;56972:50:0;;;;;;;56962:61;;56972:50;56962:61;;;;57050:6;;57078:10;;-1:-1:-1;;;57050:39:0;;;;;27486:25:1;;;-1:-1:-1;;;;;57078:10:0;;;27527:18:1;;;27520:60;56962:61:0;;-1:-1:-1;57050:6:0;;:19;;27459:18:1;;57050:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57034:13;;;;:5;:13;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57034:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;57034:55:0;-1:-1:-1;;;57034:55:0;;;;;;;-1:-1:-1;;;;57034:55:0;;-1:-1:-1;;;57034:55:0;;;;;;;;;;;-1:-1:-1;;;;57034:55:0;-1:-1:-1;;;57034:55:0;;;;;;;;;;;;57100:15;:23;;;;;:34;;-1:-1:-1;57100:34:0;;;;;;;;;;;;;;57145:21;57155:2;57034:13;57145:9;:21::i;:::-;57182:16;;57191:6;;-1:-1:-1;;;;;57182:16:0;;;;;;;;-1:-1:-1;57216:6:0;;56864:366;-1:-1:-1;;56864:366:0:o;24300:315::-;24457:28;24467:4;24473:2;24477:7;24457:9;:28::i;:::-;24504:48;24527:4;24533:2;24537:7;24546:5;24504:22;:48::i;:::-;24496:111;;;;-1:-1:-1;;;24496:111:0;;;;;;;:::i;55955:214::-;56028:13;;56068:17;56028:13;56084:1;56068:17;:::i;:::-;56052:13;:33;56109:10;;:14;;56122:1;56109:14;:::i;:::-;56096:10;:27;56134;56142:10;56154:6;56134:7;:27::i;25900:136::-;26001:27;26012:2;26016:7;26001:27;;;;;;;;;;;;:9;:27::i;34183:589::-;-1:-1:-1;;;;;34389:18:0;;34385:187;;34424:40;34456:7;35599:10;:17;;35572:24;;;;:15;:24;;;;;:44;;;35627:24;;;;;;;;;;;;35495:164;34424:40;34385:187;;;34494:2;-1:-1:-1;;;;;34486:10:0;:4;-1:-1:-1;;;;;34486:10:0;;34482:90;;34513:47;34546:4;34552:7;34513:32;:47::i;:::-;-1:-1:-1;;;;;34586:16:0;;34582:183;;34619:45;34656:7;34619:36;:45::i;34582:183::-;34692:4;-1:-1:-1;;;;;34686:10:0;:2;-1:-1:-1;;;;;34686:10:0;;34682:83;;34713:40;34741:2;34745:7;34713:27;:40::i;29699:803::-;29854:4;-1:-1:-1;;;;;29875:13:0;;8371:20;8419:8;29871:624;;29911:72;;-1:-1:-1;;;29911:72:0;;-1:-1:-1;;;;;29911:36:0;;;;;:72;;17346:10;;29962:4;;29968:7;;29977:5;;29911:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29911:72:0;;;;;;;;-1:-1:-1;;29911:72:0;;;;;;;;;;;;:::i;:::-;;;29907:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30157:13:0;;30153:272;;30200:60;;-1:-1:-1;;;30200:60:0;;;;;;;:::i;30153:272::-;30375:6;30369:13;30360:6;30356:2;30352:15;30345:38;29907:533;-1:-1:-1;;;;;;30034:55:0;-1:-1:-1;;;30034:55:0;;-1:-1:-1;30027:62:0;;29871:624;-1:-1:-1;30479:4:0;29699:803;;;;;;:::o;26263:321::-;26393:18;26399:2;26403:7;26393:5;:18::i;:::-;26444:54;26475:1;26479:2;26483:7;26492:5;26444:22;:54::i;:::-;26422:154;;;;-1:-1:-1;;;26422:154:0;;;;;;;:::i;36286:988::-;36552:22;36602:1;36577:22;36594:4;36577:16;:22::i;:::-;:26;;;;:::i;:::-;36614:18;36635:26;;;:17;:26;;;;;;36552:51;;-1:-1:-1;36768:28:0;;;36764:328;;-1:-1:-1;;;;;36835:18:0;;36813:19;36835:18;;;:12;:18;;;;;;;;:34;;;;;;;;;36886:30;;;;;;:44;;;37003:30;;:17;:30;;;;;:43;;;36764:328;-1:-1:-1;37188:26:0;;;;:17;:26;;;;;;;;37181:33;;;-1:-1:-1;;;;;37232:18:0;;;;;:12;:18;;;;;:34;;;;;;;37225:41;36286:988::o;37569:1079::-;37847:10;:17;37822:22;;37847:21;;37867:1;;37847:21;:::i;:::-;37879:18;37900:24;;;:15;:24;;;;;;38273:10;:26;;37822:46;;-1:-1:-1;37900:24:0;;37822:46;;38273:26;;;;;;:::i;:::-;;;;;;;;;38251:48;;38337:11;38312:10;38323;38312:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;38417:28;;;:15;:28;;;;;;;:41;;;38589:24;;;;;38582:31;38624:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37640:1008;;;37569:1079;:::o;35073:221::-;35158:14;35175:20;35192:2;35175:16;:20::i;:::-;-1:-1:-1;;;;;35206:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;35251:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;35073:221:0:o;26931:407::-;-1:-1:-1;;;;;27036:16:0;;27028:61;;;;-1:-1:-1;;;27028:61:0;;21681:2:1;27028:61:0;;;21663:21:1;;;21700:18;;;21693:30;21759:34;21739:18;;;21732:62;21811:18;;27028:61:0;21479:356:1;27028:61:0;24993:4;25017:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25017:16:0;:30;27100:58;;;;-1:-1:-1;;;27100:58:0;;17164:2:1;27100:58:0;;;17146:21:1;17203:2;17183:18;;;17176:30;17242;17222:18;;;17215:58;17290:18;;27100:58:0;16962:352:1;27100:58:0;27171:45;27200:1;27204:2;27208:7;27171:20;:45::i;:::-;-1:-1:-1;;;;;27229:13:0;;;;;;:9;:13;;;;;:18;;27246:1;;27229:13;:18;;27246:1;;27229:18;:::i;:::-;;;;-1:-1:-1;;27258:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27258:21:0;-1:-1:-1;;;;;27258:21:0;;;;;;;;27297:33;;27258:16;;;27297:33;;27258:16;;27297:33;26931:407;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:171::-;433:13;;486:14;475:26;;465:37;;455:65;;516:1;513;506:12;455:65;355:171;;;:::o;531:247::-;590:6;643:2;631:9;622:7;618:23;614:32;611:52;;;659:1;656;649:12;611:52;698:9;685:23;717:31;742:5;717:31;:::i;783:251::-;853:6;906:2;894:9;885:7;881:23;877:32;874:52;;;922:1;919;912:12;874:52;954:9;948:16;973:31;998:5;973:31;:::i;1299:388::-;1367:6;1375;1428:2;1416:9;1407:7;1403:23;1399:32;1396:52;;;1444:1;1441;1434:12;1396:52;1483:9;1470:23;1502:31;1527:5;1502:31;:::i;:::-;1552:5;-1:-1:-1;1609:2:1;1594:18;;1581:32;1622:33;1581:32;1622:33;:::i;:::-;1674:7;1664:17;;;1299:388;;;;;:::o;1692:456::-;1769:6;1777;1785;1838:2;1826:9;1817:7;1813:23;1809:32;1806:52;;;1854:1;1851;1844:12;1806:52;1893:9;1880:23;1912:31;1937:5;1912:31;:::i;:::-;1962:5;-1:-1:-1;2019:2:1;2004:18;;1991:32;2032:33;1991:32;2032:33;:::i;:::-;1692:456;;2084:7;;-1:-1:-1;;;2138:2:1;2123:18;;;;2110:32;;1692:456::o;2153:794::-;2248:6;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2381:9;2368:23;2400:31;2425:5;2400:31;:::i;:::-;2450:5;-1:-1:-1;2507:2:1;2492:18;;2479:32;2520:33;2479:32;2520:33;:::i;:::-;2572:7;-1:-1:-1;2626:2:1;2611:18;;2598:32;;-1:-1:-1;2681:2:1;2666:18;;2653:32;2708:18;2697:30;;2694:50;;;2740:1;2737;2730:12;2694:50;2763:22;;2816:4;2808:13;;2804:27;-1:-1:-1;2794:55:1;;2845:1;2842;2835:12;2794:55;2868:73;2933:7;2928:2;2915:16;2910:2;2906;2902:11;2868:73;:::i;:::-;2858:83;;;2153:794;;;;;;;:::o;2952:416::-;3017:6;3025;3078:2;3066:9;3057:7;3053:23;3049:32;3046:52;;;3094:1;3091;3084:12;3046:52;3133:9;3120:23;3152:31;3177:5;3152:31;:::i;:::-;3202:5;-1:-1:-1;3259:2:1;3244:18;;3231:32;3301:15;;3294:23;3282:36;;3272:64;;3332:1;3329;3322:12;3373:315;3441:6;3449;3502:2;3490:9;3481:7;3477:23;3473:32;3470:52;;;3518:1;3515;3508:12;3470:52;3557:9;3544:23;3576:31;3601:5;3576:31;:::i;:::-;3626:5;3678:2;3663:18;;;;3650:32;;-1:-1:-1;;;3373:315:1:o;3693:245::-;3751:6;3804:2;3792:9;3783:7;3779:23;3775:32;3772:52;;;3820:1;3817;3810:12;3772:52;3859:9;3846:23;3878:30;3902:5;3878:30;:::i;3943:249::-;4012:6;4065:2;4053:9;4044:7;4040:23;4036:32;4033:52;;;4081:1;4078;4071:12;4033:52;4113:9;4107:16;4132:30;4156:5;4132:30;:::i;5021:450::-;5090:6;5143:2;5131:9;5122:7;5118:23;5114:32;5111:52;;;5159:1;5156;5149:12;5111:52;5199:9;5186:23;5232:18;5224:6;5221:30;5218:50;;;5264:1;5261;5254:12;5218:50;5287:22;;5340:4;5332:13;;5328:27;-1:-1:-1;5318:55:1;;5369:1;5366;5359:12;5318:55;5392:73;5457:7;5452:2;5439:16;5434:2;5430;5426:11;5392:73;:::i;5476:635::-;5556:6;5609:2;5597:9;5588:7;5584:23;5580:32;5577:52;;;5625:1;5622;5615:12;5577:52;5658:9;5652:16;5691:18;5683:6;5680:30;5677:50;;;5723:1;5720;5713:12;5677:50;5746:22;;5799:4;5791:13;;5787:27;-1:-1:-1;5777:55:1;;5828:1;5825;5818:12;5777:55;5857:2;5851:9;5882:48;5898:31;5926:2;5898:31;:::i;5882:48::-;5953:2;5946:5;5939:17;5993:7;5988:2;5983;5979;5975:11;5971:20;5968:33;5965:53;;;6014:1;6011;6004:12;5965:53;6027:54;6078:2;6073;6066:5;6062:14;6057:2;6053;6049:11;6027:54;:::i;6116:794::-;6208:6;6261:3;6249:9;6240:7;6236:23;6232:33;6229:53;;;6278:1;6275;6268:12;6229:53;6311:2;6305:9;6353:3;6345:6;6341:16;6423:6;6411:10;6408:22;6387:18;6375:10;6372:34;6369:62;6366:88;;;6434:18;;:::i;:::-;6470:2;6463:22;6509:39;6538:9;6509:39;:::i;:::-;6501:6;6494:55;6582:48;6626:2;6615:9;6611:18;6582:48;:::i;:::-;6577:2;6569:6;6565:15;6558:73;6664:48;6708:2;6697:9;6693:18;6664:48;:::i;:::-;6659:2;6651:6;6647:15;6640:73;6746:48;6790:2;6779:9;6775:18;6746:48;:::i;:::-;6741:2;6733:6;6729:15;6722:73;6829:49;6873:3;6862:9;6858:19;6829:49;:::i;:::-;6823:3;6811:16;;6804:75;6815:6;6116:794;-1:-1:-1;;;6116:794:1:o;6915:180::-;6974:6;7027:2;7015:9;7006:7;7002:23;6998:32;6995:52;;;7043:1;7040;7033:12;6995:52;-1:-1:-1;7066:23:1;;6915:180;-1:-1:-1;6915:180:1:o;7100:184::-;7170:6;7223:2;7211:9;7202:7;7198:23;7194:32;7191:52;;;7239:1;7236;7229:12;7191:52;-1:-1:-1;7262:16:1;;7100:184;-1:-1:-1;7100:184:1:o;7289:540::-;7390:6;7398;7406;7414;7422;7475:3;7463:9;7454:7;7450:23;7446:33;7443:53;;;7492:1;7489;7482:12;7443:53;7515:39;7544:9;7515:39;:::i;:::-;7505:49;;7573:48;7617:2;7606:9;7602:18;7573:48;:::i;:::-;7563:58;;7640:48;7684:2;7673:9;7669:18;7640:48;:::i;:::-;7630:58;;7707:48;7751:2;7740:9;7736:18;7707:48;:::i;:::-;7697:58;;7774:49;7818:3;7807:9;7803:19;7774:49;:::i;:::-;7764:59;;7289:540;;;;;;;;:::o;7834:257::-;7875:3;7913:5;7907:12;7940:6;7935:3;7928:19;7956:63;8012:6;8005:4;8000:3;7996:14;7989:4;7982:5;7978:16;7956:63;:::i;:::-;8073:2;8052:15;-1:-1:-1;;8048:29:1;8039:39;;;;8080:4;8035:50;;7834:257;-1:-1:-1;;7834:257:1:o;8096:185::-;8138:3;8176:5;8170:12;8191:52;8236:6;8231:3;8224:4;8217:5;8213:16;8191:52;:::i;:::-;8259:16;;;;;8096:185;-1:-1:-1;;8096:185:1:o;8286:1174::-;8462:3;8491:1;8524:6;8518:13;8554:3;8576:1;8604:9;8600:2;8596:18;8586:28;;8664:2;8653:9;8649:18;8686;8676:61;;8730:4;8722:6;8718:17;8708:27;;8676:61;8756:2;8804;8796:6;8793:14;8773:18;8770:38;8767:165;;;-1:-1:-1;;;8831:33:1;;8887:4;8884:1;8877:15;8917:4;8838:3;8905:17;8767:165;8948:18;8975:104;;;;9093:1;9088:320;;;;8941:467;;8975:104;-1:-1:-1;;9008:24:1;;8996:37;;9053:16;;;;-1:-1:-1;8975:104:1;;9088:320;28671:1;28664:14;;;28708:4;28695:18;;9183:1;9197:165;9211:6;9208:1;9205:13;9197:165;;;9289:14;;9276:11;;;9269:35;9332:16;;;;9226:10;;9197:165;;;9201:3;;9391:6;9386:3;9382:16;9375:23;;8941:467;;;;;;;9424:30;9450:3;9442:6;9424:30;:::i;9465:422::-;-1:-1:-1;;;9722:3:1;9715:20;9697:3;9764:6;9758:13;9780:61;9834:6;9830:1;9825:3;9821:11;9814:4;9806:6;9802:17;9780:61;:::i;:::-;9861:16;;;;9879:1;9857:24;;9465:422;-1:-1:-1;;9465:422:1:o;9892:724::-;-1:-1:-1;;;10250:3:1;10243:20;10225:3;10292:6;10286:13;10308:61;10362:6;10358:1;10353:3;10349:11;10342:4;10334:6;10330:17;10308:61;:::i;:::-;10432:34;10428:1;10388:16;;;;10420:10;;;10413:54;-1:-1:-1;10496:34:1;10491:2;10483:11;;10476:55;-1:-1:-1;;;10555:2:1;10547:11;;10540:43;10607:2;10599:11;;9892:724;-1:-1:-1;9892:724:1:o;11193:488::-;-1:-1:-1;;;;;11462:15:1;;;11444:34;;11514:15;;11509:2;11494:18;;11487:43;11561:2;11546:18;;11539:34;;;11609:3;11604:2;11589:18;;11582:31;;;11387:4;;11630:45;;11655:19;;11647:6;11630:45;:::i;:::-;11622:53;11193:488;-1:-1:-1;;;;;;11193:488:1:o;11965:632::-;12136:2;12188:21;;;12258:13;;12161:18;;;12280:22;;;12107:4;;12136:2;12359:15;;;;12333:2;12318:18;;;12107:4;12402:169;12416:6;12413:1;12410:13;12402:169;;;12477:13;;12465:26;;12546:15;;;;12511:12;;;;12438:1;12431:9;12402:169;;;-1:-1:-1;12588:3:1;;11965:632;-1:-1:-1;;;;;;11965:632:1:o;13950:219::-;14099:2;14088:9;14081:21;14062:4;14119:44;14159:2;14148:9;14144:18;14136:6;14119:44;:::i;14174:840::-;14440:3;14429:9;14422:22;14403:4;14467:45;14507:3;14496:9;14492:19;14484:6;14467:45;:::i;:::-;14560:9;14552:6;14548:22;14543:2;14532:9;14528:18;14521:50;14588:32;14613:6;14605;14588:32;:::i;:::-;14580:40;;;14652:6;14646:13;14678:14;14743:2;14732:9;14728:18;14723:2;14712:9;14708:18;14701:46;14807:2;14795:9;14791:2;14787:18;14783:27;14778:2;14767:9;14763:18;14756:55;14872:2;14860:9;14856:2;14852:18;14848:27;14842:3;14831:9;14827:19;14820:56;14938:2;14926:9;14921:3;14917:19;14913:28;14907:3;14896:9;14892:19;14885:57;15004:2;14992:9;14987:3;14983:19;14979:28;14973:3;14962:9;14958:19;14951:57;;;14174:840;;;;;;:::o;16136:414::-;16338:2;16320:21;;;16377:2;16357:18;;;16350:30;16416:34;16411:2;16396:18;;16389:62;-1:-1:-1;;;16482:2:1;16467:18;;16460:48;16540:3;16525:19;;16136:414::o;21131:343::-;21333:2;21315:21;;;21372:2;21352:18;;;21345:30;-1:-1:-1;;;21406:2:1;21391:18;;21384:49;21465:2;21450:18;;21131:343::o;23300:356::-;23502:2;23484:21;;;23521:18;;;23514:30;23580:34;23575:2;23560:18;;23553:62;23647:2;23632:18;;23300:356::o;24071:407::-;24273:2;24255:21;;;24312:2;24292:18;;;24285:30;24351:34;24346:2;24331:18;;24324:62;-1:-1:-1;;;24417:2:1;24402:18;;24395:41;24468:3;24453:19;;24071:407::o;25235:413::-;25437:2;25419:21;;;25476:2;25456:18;;;25449:30;25515:34;25510:2;25495:18;;25488:62;-1:-1:-1;;;25581:2:1;25566:18;;25559:47;25638:3;25623:19;;25235:413::o;28127:275::-;28198:2;28192:9;28263:2;28244:13;;-1:-1:-1;;28240:27:1;28228:40;;28298:18;28283:34;;28319:22;;;28280:62;28277:88;;;28345:18;;:::i;:::-;28381:2;28374:22;28127:275;;-1:-1:-1;28127:275:1:o;28407:186::-;28455:4;28488:18;28480:6;28477:30;28474:56;;;28510:18;;:::i;:::-;-1:-1:-1;28576:2:1;28555:15;-1:-1:-1;;28551:29:1;28582:4;28547:40;;28407:186::o;28724:128::-;28764:3;28795:1;28791:6;28788:1;28785:13;28782:39;;;28801:18;;:::i;:::-;-1:-1:-1;28837:9:1;;28724:128::o;28857:120::-;28897:1;28923;28913:35;;28928:18;;:::i;:::-;-1:-1:-1;28962:9:1;;28857:120::o;28982:168::-;29022:7;29088:1;29084;29080:6;29076:14;29073:1;29070:21;29065:1;29058:9;29051:17;29047:45;29044:71;;;29095:18;;:::i;:::-;-1:-1:-1;29135:9:1;;28982:168::o;29155:125::-;29195:4;29223:1;29220;29217:8;29214:34;;;29228:18;;:::i;:::-;-1:-1:-1;29265:9:1;;29155:125::o;29285:258::-;29357:1;29367:113;29381:6;29378:1;29375:13;29367:113;;;29457:11;;;29451:18;29438:11;;;29431:39;29403:2;29396:10;29367:113;;;29498:6;29495:1;29492:13;29489:48;;;-1:-1:-1;;29533:1:1;29515:16;;29508:27;29285:258::o;29548:380::-;29627:1;29623:12;;;;29670;;;29691:61;;29745:4;29737:6;29733:17;29723:27;;29691:61;29798:2;29790:6;29787:14;29767:18;29764:38;29761:161;;;29844:10;29839:3;29835:20;29832:1;29825:31;29879:4;29876:1;29869:15;29907:4;29904:1;29897:15;29761:161;;29548:380;;;:::o;29933:135::-;29972:3;-1:-1:-1;;29993:17:1;;29990:43;;;30013:18;;:::i;:::-;-1:-1:-1;30060:1:1;30049:13;;29933:135::o;30073:112::-;30105:1;30131;30121:35;;30136:18;;:::i;:::-;-1:-1:-1;30170:9:1;;30073:112::o;30190:127::-;30251:10;30246:3;30242:20;30239:1;30232:31;30282:4;30279:1;30272:15;30306:4;30303:1;30296:15;30322:127;30383:10;30378:3;30374:20;30371:1;30364:31;30414:4;30411:1;30404:15;30438:4;30435:1;30428:15;30454:127;30515:10;30510:3;30506:20;30503:1;30496:31;30546:4;30543:1;30536:15;30570:4;30567:1;30560:15;30586:127;30647:10;30642:3;30638:20;30635:1;30628:31;30678:4;30675:1;30668:15;30702:4;30699:1;30692:15;30718:127;30779:10;30774:3;30770:20;30767:1;30760:31;30810:4;30807:1;30800:15;30834:4;30831:1;30824:15;30850:131;-1:-1:-1;;;;;30925:31:1;;30915:42;;30905:70;;30971:1;30968;30961:12;30986:131;-1:-1:-1;;;;;;31060:32:1;;31050:43;;31040:71;;31107:1;31104;31097:12
Swarm Source
ipfs://9d6a45d2a0e342299c5b31053bdbd86d740341b8387a5b56fe69bb62492807a0
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.