ERC-721
Overview
Max Total Supply
731 GUNZ
Holders
150
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
26 GUNZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoGunz
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-30 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. 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 || ERC721.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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` 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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/CryptoGunz.sol pragma solidity ^0.8.0; contract CryptoGunz is ERC721Enumerable, Ownable { uint256 public constant MAX_NFT_SUPPLY = 7500; bool public saleStarted = false; constructor() ERC721("CryptoGunz", "GUNZ") { transferOwnership(0xec83dED4578FB8C5e14851D9F942A9871E295ad6); } function _baseURI() internal view virtual override returns (string memory) { return "https://api.cryptogunz.io/"; } function getCryptogunzPrice() public view returns (uint256) { require(saleStarted == true, "Sale has not started."); require(totalSupply() < MAX_NFT_SUPPLY, "Sale has ended."); uint256 currentSupply = totalSupply(); if (currentSupply == 7499) { return 3800000000000000000; // 7499 3.8 ETH } else if (currentSupply >= 7496) { return 2200000000000000000; // 7496 - 7498 2.2 ETH } else if (currentSupply >= 7475) { return 1400000000000000000; // 7475 - 7495 1.4 ETH } else if (currentSupply >= 7400) { return 1000000000000000000; // 7400 - 7474 1 ETH } else if (currentSupply >= 7300) { return 800000000000000000; // 7300 - 7399 0.8 ETH } else if (currentSupply >= 7200) { return 700000000000000000; // 7200 - 7299 0.7 ETH } else if (currentSupply >= 7100) { return 600000000000000000; // 7100 - 7199 0.6 ETH } else if (currentSupply >= 6650) { return 500000000000000000; // 6650 - 7099 0.5 ETH } else if (currentSupply >= 6200) { return 400000000000000000; // 6200 - 6649 0.4 ETH } else if (currentSupply >= 5600) { return 300000000000000000; // 5600 - 6199 0.3 ETH } else if (currentSupply >= 5000) { return 250000000000000000; // 5000 - 5599 0.25 ETH } else if (currentSupply >= 4500) { return 200000000000000000; // 4500 - 4999 0.2 ETH } else if (currentSupply >= 4000) { return 175000000000000000; // 4000 - 4999 0.175 ETH } else if (currentSupply >= 3500) { return 150000000000000000; // 3500 - 3999 0.15 ETH } else if (currentSupply >= 3000) { return 125000000000000000; // 3000 - 3499 0.125 ETH } else if (currentSupply >= 2500) { return 100000000000000000; // 2500 - 2999 0.1 ETH } else if (currentSupply >= 2000) { return 90000000000000000; // 2000 - 2499 0.09 ETH } else if (currentSupply >= 1500) { return 80000000000000000; // 1500 - 1999 0.08 ETH } else if (currentSupply >= 1000) { return 70000000000000000; // 1000 - 1499 0.07 ETH } else if (currentSupply >= 500) { return 60000000000000000; // 500 - 999 0.06 ETH } else { return 50000000000000000; // 0 - 499 0.05 ETH } } function purchaseCryptogun(uint256 amountToMint) public payable { require(totalSupply() < MAX_NFT_SUPPLY, "Sale has ended."); require(amountToMint > 0, "You must purchase at least one Cryptogun."); require( amountToMint <= 100, "You can only purchase max 100 Cryptogunz at a time." ); require( totalSupply() + amountToMint <= MAX_NFT_SUPPLY, "The amount you are trying to purchase exceeds MAX_NFT_SUPPLY." ); require( getCryptogunzPrice() * amountToMint == msg.value, "Incorrect Ether value." ); for (uint256 i = 0; i < amountToMint; i++) { uint256 mintIndex = totalSupply(); _safeMint(msg.sender, mintIndex); } } function withdraw() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } function startDrop() public onlyOwner { saleStarted = true; } function pauseDrop() public onlyOwner { saleStarted = false; } }
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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCryptogunzPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"purchaseCryptogun","outputs":[],"stateMutability":"payable","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":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"startDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526000600a60146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600a81526020017f43727970746f47756e7a000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f47554e5a000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b19291906200039d565b508060019080519060200190620000ca9291906200039d565b5050506000620000df620001a960201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001a373ec83ded4578fb8c5e14851d9f942a9871e295ad6620001b160201b60201c565b620005b1565b600033905090565b620001c1620001a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620001e76200037360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002379062000519565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620002b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002aa90620004f7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ab906200054c565b90600052602060002090601f016020900481019282620003cf57600085556200041b565b82601f10620003ea57805160ff19168380011785556200041b565b828001600101855582156200041b579182015b828111156200041a578251825591602001919060010190620003fd565b5b5090506200042a91906200042e565b5090565b5b80821115620004495760008160009055506001016200042f565b5090565b60006200045c6026836200053b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000620004c46020836200053b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000602082019050818103600083015262000512816200044d565b9050919050565b600060208201905081810360008301526200053481620004b5565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200056557607f821691505b602082108114156200057c576200057b62000582565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613e3e80620005c16000396000f3fe6080604052600436106101815760003560e01c806356ebe4e9116100d157806395d89b411161008a578063b88d4fde11610064578063b88d4fde14610530578063c87b56dd14610559578063e985e9c514610596578063f2fde38b146105d357610181565b806395d89b41146104b1578063a22cb465146104dc578063b5077f441461050557610181565b806356ebe4e9146103ae5780635c474f9e146103ca5780636352211e146103f557806370a0823114610432578063715018a61461046f5780638da5cb5b1461048657610181565b80632808c92c1161013e5780633ccfd60b116101185780633ccfd60b1461031357806342842e0e1461031d578063499bba97146103465780634f6ccce71461037157610181565b80632808c92c146102a85780632f745c59146102bf57806334d84c7b146102fc57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612c10565b6105fc565b6040516101ba919061366c565b60405180910390f35b3480156101cf57600080fd5b506101d8610676565b6040516101e59190613687565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612c62565b610708565b6040516102229190613605565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612bd4565b61078d565b005b34801561026057600080fd5b506102696108a5565b60405161027691906139a9565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612ace565b6108b2565b005b3480156102b457600080fd5b506102bd610912565b005b3480156102cb57600080fd5b506102e660048036038101906102e19190612bd4565b6109ab565b6040516102f391906139a9565b60405180910390f35b34801561030857600080fd5b50610311610a50565b005b61031b610ae9565b005b34801561032957600080fd5b50610344600480360381019061033f9190612ace565b610ba5565b005b34801561035257600080fd5b5061035b610bc5565b60405161036891906139a9565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612c62565b610e8a565b6040516103a591906139a9565b60405180910390f35b6103c860048036038101906103c39190612c62565b610f21565b005b3480156103d657600080fd5b506103df6110d7565b6040516103ec919061366c565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190612c62565b6110ea565b6040516104299190613605565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612a69565b61119c565b60405161046691906139a9565b60405180910390f35b34801561047b57600080fd5b50610484611254565b005b34801561049257600080fd5b5061049b611391565b6040516104a89190613605565b60405180910390f35b3480156104bd57600080fd5b506104c66113bb565b6040516104d39190613687565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190612b98565b61144d565b005b34801561051157600080fd5b5061051a6115ce565b60405161052791906139a9565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190612b1d565b6115d4565b005b34801561056557600080fd5b50610580600480360381019061057b9190612c62565b611636565b60405161058d9190613687565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190612a92565b6116dd565b6040516105ca919061366c565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190612a69565b611771565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066f575061066e8261191d565b5b9050919050565b60606000805461068590613c33565b80601f01602080910402602001604051908101604052809291908181526020018280546106b190613c33565b80156106fe5780601f106106d3576101008083540402835291602001916106fe565b820191906000526020600020905b8154815290600101906020018083116106e157829003601f168201915b5050505050905090565b6000610713826119ff565b610752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610749906138c9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610798826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090613949565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610828611a6b565b73ffffffffffffffffffffffffffffffffffffffff161480610857575061085681610851611a6b565b6116dd565b5b610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d90613829565b60405180910390fd5b6108a08383611a73565b505050565b6000600880549050905090565b6108c36108bd611a6b565b82611b2c565b610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f990613969565b60405180910390fd5b61090d838383611c0a565b505050565b61091a611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610938611391565b73ffffffffffffffffffffffffffffffffffffffff161461098e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610985906138e9565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b60006109b68361119c565b82106109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee906136e9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a58611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610a76611391565b73ffffffffffffffffffffffffffffffffffffffff1614610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac3906138e9565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610af1611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610b0f611391565b73ffffffffffffffffffffffffffffffffffffffff1614610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c906138e9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ba357600080fd5b565b610bc0838383604051806020016040528060008152506115d4565b505050565b600060011515600a60149054906101000a900460ff16151514610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c14906136c9565b60405180910390fd5b611d4c610c286108a5565b10610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f90613789565b60405180910390fd5b6000610c726108a5565b9050611d4b811415610c8f576734bc4fdde27c0000915050610e87565b611d488110610ca957671e87f85809dc0000915050610e87565b611d338110610cc35767136dcc951d8c0000915050610e87565b611ce88110610cdd57670de0b6b3a7640000915050610e87565b611c848110610cf757670b1a2bc2ec500000915050610e87565b611c208110610d11576709b6e64a8ec60000915050610e87565b611bbc8110610d2b57670853a0d2313c0000915050610e87565b6119fa8110610d45576706f05b59d3b20000915050610e87565b6118388110610d5f5767058d15e176280000915050610e87565b6115e08110610d7957670429d069189e0000915050610e87565b6113888110610d93576703782dace9d90000915050610e87565b6111948110610dad576702c68af0bb140000915050610e87565b610fa08110610dc75767026db992a3b18000915050610e87565b610dac8110610de157670214e8348c4f0000915050610e87565b610bb88110610dfb576701bc16d674ec8000915050610e87565b6109c48110610e155767016345785d8a0000915050610e87565b6107d08110610e2f5767013fbe85edc90000915050610e87565b6105dc8110610e495767011c37937e080000915050610e87565b6103e88110610e625766f8b0a10e470000915050610e87565b6101f48110610e7b5766d529ae9e860000915050610e87565b66b1a2bc2ec500009150505b90565b6000610e946108a5565b8210610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613989565b60405180910390fd5b60088281548110610f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611d4c610f2c6108a5565b10610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390613789565b60405180910390fd5b60008111610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa6906136a9565b60405180910390fd5b6064811115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613809565b60405180910390fd5b611d4c81610fff6108a5565b6110099190613a68565b111561104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613749565b60405180910390fd5b3481611054610bc5565b61105e9190613aef565b1461109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590613889565b60405180910390fd5b60005b818110156110d35760006110b36108a5565b90506110bf3382611e66565b5080806110cb90613c65565b9150506110a1565b5050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90613869565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613849565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61125c611a6b565b73ffffffffffffffffffffffffffffffffffffffff1661127a611391565b73ffffffffffffffffffffffffffffffffffffffff16146112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c7906138e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113ca90613c33565b80601f01602080910402602001604051908101604052809291908181526020018280546113f690613c33565b80156114435780601f1061141857610100808354040283529160200191611443565b820191906000526020600020905b81548152906001019060200180831161142657829003601f168201915b5050505050905090565b611455611a6b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba906137c9565b60405180910390fd5b80600560006114d0611a6b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661157d611a6b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c2919061366c565b60405180910390a35050565b611d4c81565b6115e56115df611a6b565b83611b2c565b611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613969565b60405180910390fd5b61163084848484611e84565b50505050565b6060611641826119ff565b611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790613929565b60405180910390fd5b600061168a611ee0565b905060008151116116aa57604051806020016040528060008152506116d5565b806116b484611f1d565b6040516020016116c59291906135e1565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611779611a6b565b73ffffffffffffffffffffffffffffffffffffffff16611797611391565b73ffffffffffffffffffffffffffffffffffffffff16146117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e4906138e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490613729565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119e857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119f857506119f7826120ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ae6836110ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b37826119ff565b611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d906137e9565b60405180910390fd5b6000611b81836110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bf057508373ffffffffffffffffffffffffffffffffffffffff16611bd884610708565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c015750611c0081856116dd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c2a826110ea565b73ffffffffffffffffffffffffffffffffffffffff1614611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790613909565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906137a9565b60405180910390fd5b611cfb838383612134565b611d06600082611a73565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d569190613b49565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dad9190613a68565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e80828260405180602001604052806000815250612248565b5050565b611e8f848484611c0a565b611e9b848484846122a3565b611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed190613709565b60405180910390fd5b50505050565b60606040518060400160405280601a81526020017f68747470733a2f2f6170692e63727970746f67756e7a2e696f2f000000000000815250905090565b60606000821415611f65576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120c5565b600082905060005b60008214611f97578080611f8090613c65565b915050600a82611f909190613abe565b9150611f6d565b60008167ffffffffffffffff811115611fd9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561200b5781602001600182028036833780820191505090505b5090505b600085146120be576001826120249190613b49565b9150600a856120339190613cae565b603061203f9190613a68565b60f81b81838151811061207b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120b79190613abe565b945061200f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61213f83838361243a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121825761217d8161243f565b6121c1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121c0576121bf8382612488565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612204576121ff816125f5565b612243565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612242576122418282612738565b5b5b505050565b61225283836127b7565b61225f60008484846122a3565b61229e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229590613709565b60405180910390fd5b505050565b60006122c48473ffffffffffffffffffffffffffffffffffffffff16612985565b1561242d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122ed611a6b565b8786866040518563ffffffff1660e01b815260040161230f9493929190613620565b602060405180830381600087803b15801561232957600080fd5b505af192505050801561235a57506040513d601f19601f820116820180604052508101906123579190612c39565b60015b6123dd573d806000811461238a576040519150601f19603f3d011682016040523d82523d6000602084013e61238f565b606091505b506000815114156123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90613709565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612432565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124958461119c565b61249f9190613b49565b9050600060076000848152602001908152602001600020549050818114612584576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126099190613b49565b905060006009600084815260200190815260200160002054905060006008838154811061265f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106126a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061271c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127438361119c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e906138a9565b60405180910390fd5b612830816119ff565b15612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790613769565b60405180910390fd5b61287c60008383612134565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128cc9190613a68565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006129ab6129a6846139f5565b6139c4565b9050828152602081018484840111156129c357600080fd5b6129ce848285613bf1565b509392505050565b6000813590506129e581613dac565b92915050565b6000813590506129fa81613dc3565b92915050565b600081359050612a0f81613dda565b92915050565b600081519050612a2481613dda565b92915050565b600082601f830112612a3b57600080fd5b8135612a4b848260208601612998565b91505092915050565b600081359050612a6381613df1565b92915050565b600060208284031215612a7b57600080fd5b6000612a89848285016129d6565b91505092915050565b60008060408385031215612aa557600080fd5b6000612ab3858286016129d6565b9250506020612ac4858286016129d6565b9150509250929050565b600080600060608486031215612ae357600080fd5b6000612af1868287016129d6565b9350506020612b02868287016129d6565b9250506040612b1386828701612a54565b9150509250925092565b60008060008060808587031215612b3357600080fd5b6000612b41878288016129d6565b9450506020612b52878288016129d6565b9350506040612b6387828801612a54565b925050606085013567ffffffffffffffff811115612b8057600080fd5b612b8c87828801612a2a565b91505092959194509250565b60008060408385031215612bab57600080fd5b6000612bb9858286016129d6565b9250506020612bca858286016129eb565b9150509250929050565b60008060408385031215612be757600080fd5b6000612bf5858286016129d6565b9250506020612c0685828601612a54565b9150509250929050565b600060208284031215612c2257600080fd5b6000612c3084828501612a00565b91505092915050565b600060208284031215612c4b57600080fd5b6000612c5984828501612a15565b91505092915050565b600060208284031215612c7457600080fd5b6000612c8284828501612a54565b91505092915050565b612c9481613b7d565b82525050565b612ca381613b8f565b82525050565b6000612cb482613a25565b612cbe8185613a3b565b9350612cce818560208601613c00565b612cd781613d9b565b840191505092915050565b6000612ced82613a30565b612cf78185613a4c565b9350612d07818560208601613c00565b612d1081613d9b565b840191505092915050565b6000612d2682613a30565b612d308185613a5d565b9350612d40818560208601613c00565b80840191505092915050565b6000612d59602983613a4c565b91507f596f75206d757374207075726368617365206174206c65617374206f6e65204360008301527f727970746f67756e2e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612dbf601583613a4c565b91507f53616c6520686173206e6f7420737461727465642e00000000000000000000006000830152602082019050919050565b6000612dff602b83613a4c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e65603283613a4c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612ecb602683613a4c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f31603d83613a4c565b91507f54686520616d6f756e7420796f752061726520747279696e6720746f2070757260008301527f63686173652065786365656473204d41585f4e46545f535550504c592e0000006020830152604082019050919050565b6000612f97601c83613a4c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612fd7600f83613a4c565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b6000613017602483613a4c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061307d601983613a4c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130bd602c83613a4c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613123603383613a4c565b91507f596f752063616e206f6e6c79207075726368617365206d61782031303020437260008301527f7970746f67756e7a20617420612074696d652e000000000000000000000000006020830152604082019050919050565b6000613189603883613a4c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131ef602a83613a4c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613255602983613a4c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132bb601683613a4c565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b60006132fb602083613a4c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061333b602c83613a4c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133a1602083613a4c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133e1602983613a4c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613447602f83613a4c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ad602183613a4c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613513603183613a4c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613579602c83613a4c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6135db81613be7565b82525050565b60006135ed8285612d1b565b91506135f98284612d1b565b91508190509392505050565b600060208201905061361a6000830184612c8b565b92915050565b60006080820190506136356000830187612c8b565b6136426020830186612c8b565b61364f60408301856135d2565b81810360608301526136618184612ca9565b905095945050505050565b60006020820190506136816000830184612c9a565b92915050565b600060208201905081810360008301526136a18184612ce2565b905092915050565b600060208201905081810360008301526136c281612d4c565b9050919050565b600060208201905081810360008301526136e281612db2565b9050919050565b6000602082019050818103600083015261370281612df2565b9050919050565b6000602082019050818103600083015261372281612e58565b9050919050565b6000602082019050818103600083015261374281612ebe565b9050919050565b6000602082019050818103600083015261376281612f24565b9050919050565b6000602082019050818103600083015261378281612f8a565b9050919050565b600060208201905081810360008301526137a281612fca565b9050919050565b600060208201905081810360008301526137c28161300a565b9050919050565b600060208201905081810360008301526137e281613070565b9050919050565b60006020820190508181036000830152613802816130b0565b9050919050565b6000602082019050818103600083015261382281613116565b9050919050565b600060208201905081810360008301526138428161317c565b9050919050565b60006020820190508181036000830152613862816131e2565b9050919050565b6000602082019050818103600083015261388281613248565b9050919050565b600060208201905081810360008301526138a2816132ae565b9050919050565b600060208201905081810360008301526138c2816132ee565b9050919050565b600060208201905081810360008301526138e28161332e565b9050919050565b6000602082019050818103600083015261390281613394565b9050919050565b60006020820190508181036000830152613922816133d4565b9050919050565b600060208201905081810360008301526139428161343a565b9050919050565b60006020820190508181036000830152613962816134a0565b9050919050565b6000602082019050818103600083015261398281613506565b9050919050565b600060208201905081810360008301526139a28161356c565b9050919050565b60006020820190506139be60008301846135d2565b92915050565b6000604051905081810181811067ffffffffffffffff821117156139eb576139ea613d6c565b5b8060405250919050565b600067ffffffffffffffff821115613a1057613a0f613d6c565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a7382613be7565b9150613a7e83613be7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ab357613ab2613cdf565b5b828201905092915050565b6000613ac982613be7565b9150613ad483613be7565b925082613ae457613ae3613d0e565b5b828204905092915050565b6000613afa82613be7565b9150613b0583613be7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b3e57613b3d613cdf565b5b828202905092915050565b6000613b5482613be7565b9150613b5f83613be7565b925082821015613b7257613b71613cdf565b5b828203905092915050565b6000613b8882613bc7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c1e578082015181840152602081019050613c03565b83811115613c2d576000848401525b50505050565b60006002820490506001821680613c4b57607f821691505b60208210811415613c5f57613c5e613d3d565b5b50919050565b6000613c7082613be7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ca357613ca2613cdf565b5b600182019050919050565b6000613cb982613be7565b9150613cc483613be7565b925082613cd457613cd3613d0e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613db581613b7d565b8114613dc057600080fd5b50565b613dcc81613b8f565b8114613dd757600080fd5b50565b613de381613b9b565b8114613dee57600080fd5b50565b613dfa81613be7565b8114613e0557600080fd5b5056fea26469706673582212205018a2af076e8e91e8dc24771fe315da7f569881b157a4353643d1ea349aad2664736f6c63430008000033
Deployed Bytecode
0x6080604052600436106101815760003560e01c806356ebe4e9116100d157806395d89b411161008a578063b88d4fde11610064578063b88d4fde14610530578063c87b56dd14610559578063e985e9c514610596578063f2fde38b146105d357610181565b806395d89b41146104b1578063a22cb465146104dc578063b5077f441461050557610181565b806356ebe4e9146103ae5780635c474f9e146103ca5780636352211e146103f557806370a0823114610432578063715018a61461046f5780638da5cb5b1461048657610181565b80632808c92c1161013e5780633ccfd60b116101185780633ccfd60b1461031357806342842e0e1461031d578063499bba97146103465780634f6ccce71461037157610181565b80632808c92c146102a85780632f745c59146102bf57806334d84c7b146102fc57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612c10565b6105fc565b6040516101ba919061366c565b60405180910390f35b3480156101cf57600080fd5b506101d8610676565b6040516101e59190613687565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612c62565b610708565b6040516102229190613605565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612bd4565b61078d565b005b34801561026057600080fd5b506102696108a5565b60405161027691906139a9565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612ace565b6108b2565b005b3480156102b457600080fd5b506102bd610912565b005b3480156102cb57600080fd5b506102e660048036038101906102e19190612bd4565b6109ab565b6040516102f391906139a9565b60405180910390f35b34801561030857600080fd5b50610311610a50565b005b61031b610ae9565b005b34801561032957600080fd5b50610344600480360381019061033f9190612ace565b610ba5565b005b34801561035257600080fd5b5061035b610bc5565b60405161036891906139a9565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612c62565b610e8a565b6040516103a591906139a9565b60405180910390f35b6103c860048036038101906103c39190612c62565b610f21565b005b3480156103d657600080fd5b506103df6110d7565b6040516103ec919061366c565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190612c62565b6110ea565b6040516104299190613605565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612a69565b61119c565b60405161046691906139a9565b60405180910390f35b34801561047b57600080fd5b50610484611254565b005b34801561049257600080fd5b5061049b611391565b6040516104a89190613605565b60405180910390f35b3480156104bd57600080fd5b506104c66113bb565b6040516104d39190613687565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190612b98565b61144d565b005b34801561051157600080fd5b5061051a6115ce565b60405161052791906139a9565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190612b1d565b6115d4565b005b34801561056557600080fd5b50610580600480360381019061057b9190612c62565b611636565b60405161058d9190613687565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190612a92565b6116dd565b6040516105ca919061366c565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190612a69565b611771565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066f575061066e8261191d565b5b9050919050565b60606000805461068590613c33565b80601f01602080910402602001604051908101604052809291908181526020018280546106b190613c33565b80156106fe5780601f106106d3576101008083540402835291602001916106fe565b820191906000526020600020905b8154815290600101906020018083116106e157829003601f168201915b5050505050905090565b6000610713826119ff565b610752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610749906138c9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610798826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090613949565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610828611a6b565b73ffffffffffffffffffffffffffffffffffffffff161480610857575061085681610851611a6b565b6116dd565b5b610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d90613829565b60405180910390fd5b6108a08383611a73565b505050565b6000600880549050905090565b6108c36108bd611a6b565b82611b2c565b610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f990613969565b60405180910390fd5b61090d838383611c0a565b505050565b61091a611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610938611391565b73ffffffffffffffffffffffffffffffffffffffff161461098e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610985906138e9565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b60006109b68361119c565b82106109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee906136e9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a58611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610a76611391565b73ffffffffffffffffffffffffffffffffffffffff1614610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac3906138e9565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610af1611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610b0f611391565b73ffffffffffffffffffffffffffffffffffffffff1614610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c906138e9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ba357600080fd5b565b610bc0838383604051806020016040528060008152506115d4565b505050565b600060011515600a60149054906101000a900460ff16151514610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c14906136c9565b60405180910390fd5b611d4c610c286108a5565b10610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f90613789565b60405180910390fd5b6000610c726108a5565b9050611d4b811415610c8f576734bc4fdde27c0000915050610e87565b611d488110610ca957671e87f85809dc0000915050610e87565b611d338110610cc35767136dcc951d8c0000915050610e87565b611ce88110610cdd57670de0b6b3a7640000915050610e87565b611c848110610cf757670b1a2bc2ec500000915050610e87565b611c208110610d11576709b6e64a8ec60000915050610e87565b611bbc8110610d2b57670853a0d2313c0000915050610e87565b6119fa8110610d45576706f05b59d3b20000915050610e87565b6118388110610d5f5767058d15e176280000915050610e87565b6115e08110610d7957670429d069189e0000915050610e87565b6113888110610d93576703782dace9d90000915050610e87565b6111948110610dad576702c68af0bb140000915050610e87565b610fa08110610dc75767026db992a3b18000915050610e87565b610dac8110610de157670214e8348c4f0000915050610e87565b610bb88110610dfb576701bc16d674ec8000915050610e87565b6109c48110610e155767016345785d8a0000915050610e87565b6107d08110610e2f5767013fbe85edc90000915050610e87565b6105dc8110610e495767011c37937e080000915050610e87565b6103e88110610e625766f8b0a10e470000915050610e87565b6101f48110610e7b5766d529ae9e860000915050610e87565b66b1a2bc2ec500009150505b90565b6000610e946108a5565b8210610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613989565b60405180910390fd5b60088281548110610f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611d4c610f2c6108a5565b10610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390613789565b60405180910390fd5b60008111610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa6906136a9565b60405180910390fd5b6064811115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613809565b60405180910390fd5b611d4c81610fff6108a5565b6110099190613a68565b111561104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613749565b60405180910390fd5b3481611054610bc5565b61105e9190613aef565b1461109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590613889565b60405180910390fd5b60005b818110156110d35760006110b36108a5565b90506110bf3382611e66565b5080806110cb90613c65565b9150506110a1565b5050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90613869565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613849565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61125c611a6b565b73ffffffffffffffffffffffffffffffffffffffff1661127a611391565b73ffffffffffffffffffffffffffffffffffffffff16146112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c7906138e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113ca90613c33565b80601f01602080910402602001604051908101604052809291908181526020018280546113f690613c33565b80156114435780601f1061141857610100808354040283529160200191611443565b820191906000526020600020905b81548152906001019060200180831161142657829003601f168201915b5050505050905090565b611455611a6b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba906137c9565b60405180910390fd5b80600560006114d0611a6b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661157d611a6b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c2919061366c565b60405180910390a35050565b611d4c81565b6115e56115df611a6b565b83611b2c565b611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613969565b60405180910390fd5b61163084848484611e84565b50505050565b6060611641826119ff565b611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790613929565b60405180910390fd5b600061168a611ee0565b905060008151116116aa57604051806020016040528060008152506116d5565b806116b484611f1d565b6040516020016116c59291906135e1565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611779611a6b565b73ffffffffffffffffffffffffffffffffffffffff16611797611391565b73ffffffffffffffffffffffffffffffffffffffff16146117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e4906138e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490613729565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119e857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119f857506119f7826120ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ae6836110ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b37826119ff565b611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d906137e9565b60405180910390fd5b6000611b81836110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bf057508373ffffffffffffffffffffffffffffffffffffffff16611bd884610708565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c015750611c0081856116dd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c2a826110ea565b73ffffffffffffffffffffffffffffffffffffffff1614611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790613909565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906137a9565b60405180910390fd5b611cfb838383612134565b611d06600082611a73565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d569190613b49565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dad9190613a68565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e80828260405180602001604052806000815250612248565b5050565b611e8f848484611c0a565b611e9b848484846122a3565b611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed190613709565b60405180910390fd5b50505050565b60606040518060400160405280601a81526020017f68747470733a2f2f6170692e63727970746f67756e7a2e696f2f000000000000815250905090565b60606000821415611f65576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120c5565b600082905060005b60008214611f97578080611f8090613c65565b915050600a82611f909190613abe565b9150611f6d565b60008167ffffffffffffffff811115611fd9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561200b5781602001600182028036833780820191505090505b5090505b600085146120be576001826120249190613b49565b9150600a856120339190613cae565b603061203f9190613a68565b60f81b81838151811061207b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120b79190613abe565b945061200f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61213f83838361243a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121825761217d8161243f565b6121c1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121c0576121bf8382612488565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612204576121ff816125f5565b612243565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612242576122418282612738565b5b5b505050565b61225283836127b7565b61225f60008484846122a3565b61229e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229590613709565b60405180910390fd5b505050565b60006122c48473ffffffffffffffffffffffffffffffffffffffff16612985565b1561242d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122ed611a6b565b8786866040518563ffffffff1660e01b815260040161230f9493929190613620565b602060405180830381600087803b15801561232957600080fd5b505af192505050801561235a57506040513d601f19601f820116820180604052508101906123579190612c39565b60015b6123dd573d806000811461238a576040519150601f19603f3d011682016040523d82523d6000602084013e61238f565b606091505b506000815114156123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90613709565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612432565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124958461119c565b61249f9190613b49565b9050600060076000848152602001908152602001600020549050818114612584576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126099190613b49565b905060006009600084815260200190815260200160002054905060006008838154811061265f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106126a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061271c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127438361119c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e906138a9565b60405180910390fd5b612830816119ff565b15612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790613769565b60405180910390fd5b61287c60008383612134565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128cc9190613a68565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006129ab6129a6846139f5565b6139c4565b9050828152602081018484840111156129c357600080fd5b6129ce848285613bf1565b509392505050565b6000813590506129e581613dac565b92915050565b6000813590506129fa81613dc3565b92915050565b600081359050612a0f81613dda565b92915050565b600081519050612a2481613dda565b92915050565b600082601f830112612a3b57600080fd5b8135612a4b848260208601612998565b91505092915050565b600081359050612a6381613df1565b92915050565b600060208284031215612a7b57600080fd5b6000612a89848285016129d6565b91505092915050565b60008060408385031215612aa557600080fd5b6000612ab3858286016129d6565b9250506020612ac4858286016129d6565b9150509250929050565b600080600060608486031215612ae357600080fd5b6000612af1868287016129d6565b9350506020612b02868287016129d6565b9250506040612b1386828701612a54565b9150509250925092565b60008060008060808587031215612b3357600080fd5b6000612b41878288016129d6565b9450506020612b52878288016129d6565b9350506040612b6387828801612a54565b925050606085013567ffffffffffffffff811115612b8057600080fd5b612b8c87828801612a2a565b91505092959194509250565b60008060408385031215612bab57600080fd5b6000612bb9858286016129d6565b9250506020612bca858286016129eb565b9150509250929050565b60008060408385031215612be757600080fd5b6000612bf5858286016129d6565b9250506020612c0685828601612a54565b9150509250929050565b600060208284031215612c2257600080fd5b6000612c3084828501612a00565b91505092915050565b600060208284031215612c4b57600080fd5b6000612c5984828501612a15565b91505092915050565b600060208284031215612c7457600080fd5b6000612c8284828501612a54565b91505092915050565b612c9481613b7d565b82525050565b612ca381613b8f565b82525050565b6000612cb482613a25565b612cbe8185613a3b565b9350612cce818560208601613c00565b612cd781613d9b565b840191505092915050565b6000612ced82613a30565b612cf78185613a4c565b9350612d07818560208601613c00565b612d1081613d9b565b840191505092915050565b6000612d2682613a30565b612d308185613a5d565b9350612d40818560208601613c00565b80840191505092915050565b6000612d59602983613a4c565b91507f596f75206d757374207075726368617365206174206c65617374206f6e65204360008301527f727970746f67756e2e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612dbf601583613a4c565b91507f53616c6520686173206e6f7420737461727465642e00000000000000000000006000830152602082019050919050565b6000612dff602b83613a4c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e65603283613a4c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612ecb602683613a4c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f31603d83613a4c565b91507f54686520616d6f756e7420796f752061726520747279696e6720746f2070757260008301527f63686173652065786365656473204d41585f4e46545f535550504c592e0000006020830152604082019050919050565b6000612f97601c83613a4c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612fd7600f83613a4c565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b6000613017602483613a4c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061307d601983613a4c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130bd602c83613a4c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613123603383613a4c565b91507f596f752063616e206f6e6c79207075726368617365206d61782031303020437260008301527f7970746f67756e7a20617420612074696d652e000000000000000000000000006020830152604082019050919050565b6000613189603883613a4c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131ef602a83613a4c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613255602983613a4c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132bb601683613a4c565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b60006132fb602083613a4c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061333b602c83613a4c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133a1602083613a4c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133e1602983613a4c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613447602f83613a4c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ad602183613a4c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613513603183613a4c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613579602c83613a4c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6135db81613be7565b82525050565b60006135ed8285612d1b565b91506135f98284612d1b565b91508190509392505050565b600060208201905061361a6000830184612c8b565b92915050565b60006080820190506136356000830187612c8b565b6136426020830186612c8b565b61364f60408301856135d2565b81810360608301526136618184612ca9565b905095945050505050565b60006020820190506136816000830184612c9a565b92915050565b600060208201905081810360008301526136a18184612ce2565b905092915050565b600060208201905081810360008301526136c281612d4c565b9050919050565b600060208201905081810360008301526136e281612db2565b9050919050565b6000602082019050818103600083015261370281612df2565b9050919050565b6000602082019050818103600083015261372281612e58565b9050919050565b6000602082019050818103600083015261374281612ebe565b9050919050565b6000602082019050818103600083015261376281612f24565b9050919050565b6000602082019050818103600083015261378281612f8a565b9050919050565b600060208201905081810360008301526137a281612fca565b9050919050565b600060208201905081810360008301526137c28161300a565b9050919050565b600060208201905081810360008301526137e281613070565b9050919050565b60006020820190508181036000830152613802816130b0565b9050919050565b6000602082019050818103600083015261382281613116565b9050919050565b600060208201905081810360008301526138428161317c565b9050919050565b60006020820190508181036000830152613862816131e2565b9050919050565b6000602082019050818103600083015261388281613248565b9050919050565b600060208201905081810360008301526138a2816132ae565b9050919050565b600060208201905081810360008301526138c2816132ee565b9050919050565b600060208201905081810360008301526138e28161332e565b9050919050565b6000602082019050818103600083015261390281613394565b9050919050565b60006020820190508181036000830152613922816133d4565b9050919050565b600060208201905081810360008301526139428161343a565b9050919050565b60006020820190508181036000830152613962816134a0565b9050919050565b6000602082019050818103600083015261398281613506565b9050919050565b600060208201905081810360008301526139a28161356c565b9050919050565b60006020820190506139be60008301846135d2565b92915050565b6000604051905081810181811067ffffffffffffffff821117156139eb576139ea613d6c565b5b8060405250919050565b600067ffffffffffffffff821115613a1057613a0f613d6c565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a7382613be7565b9150613a7e83613be7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ab357613ab2613cdf565b5b828201905092915050565b6000613ac982613be7565b9150613ad483613be7565b925082613ae457613ae3613d0e565b5b828204905092915050565b6000613afa82613be7565b9150613b0583613be7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b3e57613b3d613cdf565b5b828202905092915050565b6000613b5482613be7565b9150613b5f83613be7565b925082821015613b7257613b71613cdf565b5b828203905092915050565b6000613b8882613bc7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c1e578082015181840152602081019050613c03565b83811115613c2d576000848401525b50505050565b60006002820490506001821680613c4b57607f821691505b60208210811415613c5f57613c5e613d3d565b5b50919050565b6000613c7082613be7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ca357613ca2613cdf565b5b600182019050919050565b6000613cb982613be7565b9150613cc483613be7565b925082613cd457613cd3613d0e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613db581613b7d565b8114613dc057600080fd5b50565b613dcc81613b8f565b8114613dd757600080fd5b50565b613de381613b9b565b8114613dee57600080fd5b50565b613dfa81613be7565b8114613e0557600080fd5b5056fea26469706673582212205018a2af076e8e91e8dc24771fe315da7f569881b157a4353643d1ea349aad2664736f6c63430008000033
Deployed Bytecode Sourcemap
41709:3662:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33494:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21978:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23399:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22957:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34193:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24309:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45298:70;;;;;;;;;;;;;:::i;:::-;;33830:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45223:69;;;;;;;;;;;;;:::i;:::-;;45103:114;;;:::i;:::-;;24704:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42103:2264;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34369:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44373:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41813:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21666:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21386:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41125:138;;;;;;;;;;;;;:::i;:::-;;40514:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22133:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23702:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41763:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24932:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22294:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24064:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41408:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33494:260;33621:4;33666:35;33651:50;;;:11;:50;;;;:97;;;;33712:36;33736:11;33712:23;:36::i;:::-;33651:97;33637:111;;33494:260;;;:::o;21978:94::-;22032:13;22061:5;22054:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21978:94;:::o;23399:239::-;23500:7;23527:16;23535:7;23527;:16::i;:::-;23519:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23608:15;:24;23624:7;23608:24;;;;;;;;;;;;;;;;;;;;;23601:31;;23399:239;;;:::o;22957:384::-;23034:13;23050:23;23065:7;23050:14;:23::i;:::-;23034:39;;23094:5;23088:11;;:2;:11;;;;23080:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23178:5;23162:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;23187:44;23211:5;23218:12;:10;:12::i;:::-;23187:23;:44::i;:::-;23162:69;23146:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;23314:21;23323:2;23327:7;23314:8;:21::i;:::-;22957:384;;;:::o;34193:107::-;34254:7;34277:10;:17;;;;34270:24;;34193:107;:::o;24309:332::-;24490:41;24509:12;:10;:12::i;:::-;24523:7;24490:18;:41::i;:::-;24474:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;24607:28;24617:4;24623:2;24627:7;24607:9;:28::i;:::-;24309:332;;;:::o;45298:70::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45357:5:::1;45343:11;;:19;;;;;;;;;;;;;;;;;;45298:70::o:0;33830:295::-;33952:7;33995:23;34012:5;33995:16;:23::i;:::-;33987:5;:31;33971:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;34093:12;:19;34106:5;34093:19;;;;;;;;;;;;;;;:26;34113:5;34093:26;;;;;;;;;;;;34086:33;;33830:295;;;;:::o;45223:69::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45282:4:::1;45268:11;;:18;;;;;;;;;;;;;;;;;;45223:69::o:0;45103:114::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45171:10:::1;45163:24;;:47;45188:21;45163:47;;;;;;;;;;;;;;;;;;;;;;;45155:56;;;::::0;::::1;;45103:114::o:0;24704:165::-;24824:39;24841:4;24847:2;24851:7;24824:39;;;;;;;;;;;;:16;:39::i;:::-;24704:165;;;:::o;42103:2264::-;42154:7;42193:4;42178:19;;:11;;;;;;;;;;;:19;;;42170:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;41804:4;42238:13;:11;:13::i;:::-;:30;42230:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42297:21;42321:13;:11;:13::i;:::-;42297:37;;42364:4;42347:13;:21;42343:2019;;;42386:19;42379:26;;;;;42343:2019;42456:4;42439:13;:21;42435:1927;;42478:19;42471:26;;;;;42435:1927;42555:4;42538:13;:21;42534:1828;;42577:19;42570:26;;;;;42534:1828;42654:4;42637:13;:21;42633:1729;;42676:19;42669:26;;;;;42633:1729;42751:4;42734:13;:21;42730:1632;;42773:18;42766:25;;;;;42730:1632;42849:4;42832:13;:21;42828:1534;;42871:18;42864:25;;;;;42828:1534;42947:4;42930:13;:21;42926:1436;;42969:18;42962:25;;;;;42926:1436;43045:4;43028:13;:21;43024:1338;;43067:18;43060:25;;;;;43024:1338;43143:4;43126:13;:21;43122:1240;;43165:18;43158:25;;;;;43122:1240;43241:4;43224:13;:21;43220:1142;;43263:18;43256:25;;;;;43220:1142;43339:4;43322:13;:21;43318:1044;;43361:18;43354:25;;;;;43318:1044;43438:4;43421:13;:21;43417:945;;43460:18;43453:25;;;;;43417:945;43536:4;43519:13;:21;43515:847;;43558:18;43551:25;;;;;43515:847;43636:4;43619:13;:21;43615:747;;43658:18;43651:25;;;;;43615:747;43735:4;43718:13;:21;43714:648;;43757:18;43750:25;;;;;43714:648;43835:4;43818:13;:21;43814:548;;43857:18;43850:25;;;;;43814:548;43933:4;43916:13;:21;43912:450;;43955:17;43948:24;;;;;43912:450;44031:4;44014:13;:21;44010:352;;44053:17;44046:24;;;;;44010:352;44129:4;44112:13;:21;44108:254;;44151:17;44144:24;;;;;44108:254;44227:3;44210:13;:20;44206:156;;44248:17;44241:24;;;;;44206:156;44317:17;44310:24;;;42103:2264;;:::o;34369:272::-;34469:7;34512:30;:28;:30::i;:::-;34504:5;:38;34488:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;34618:10;34629:5;34618:17;;;;;;;;;;;;;;;;;;;;;;;;34611:24;;34369:272;;;:::o;44373:724::-;41804:4;44452:13;:11;:13::i;:::-;:30;44444:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44532:1;44517:12;:16;44509:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;44618:3;44602:12;:19;;44586:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;41804:4;44729:12;44713:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;44697:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;44900:9;44884:12;44861:20;:18;:20::i;:::-;:35;;;;:::i;:::-;:48;44845:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;44963:9;44958:134;44982:12;44978:1;:16;44958:134;;;45010:17;45030:13;:11;:13::i;:::-;45010:33;;45052:32;45062:10;45074:9;45052;:32::i;:::-;44958:134;44996:3;;;;;:::i;:::-;;;;44958:134;;;;44373:724;:::o;41813:31::-;;;;;;;;;;;;;:::o;21666:253::-;21763:7;21782:13;21798:7;:16;21806:7;21798:16;;;;;;;;;;;;;;;;;;;;;21782:32;;21846:1;21829:19;;:5;:19;;;;21821:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21908:5;21901:12;;;21666:253;;;:::o;21386:226::-;21483:7;21527:1;21510:19;;:5;:19;;;;21502:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21590:9;:16;21600:5;21590:16;;;;;;;;;;;;;;;;21583:23;;21386:226;;;:::o;41125:138::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41228:1:::1;41191:40;;41212:6;;;;;;;;;;;41191:40;;;;;;;;;;;;41255:1;41238:6;;:19;;;;;;;;;;;;;;;;;;41125:138::o:0;40514:81::-;40560:7;40583:6;;;;;;;;;;;40576:13;;40514:81;:::o;22133:98::-;22189:13;22218:7;22211:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22133:98;:::o;23702:299::-;23831:12;:10;:12::i;:::-;23819:24;;:8;:24;;;;23811:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23927:8;23882:18;:32;23901:12;:10;:12::i;:::-;23882:32;;;;;;;;;;;;;;;:42;23915:8;23882:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23976:8;23947:48;;23962:12;:10;:12::i;:::-;23947:48;;;23986:8;23947:48;;;;;;:::i;:::-;;;;;;;;23702:299;;:::o;41763:45::-;41804:4;41763:45;:::o;24932:321::-;25093:41;25112:12;:10;:12::i;:::-;25126:7;25093:18;:41::i;:::-;25077:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;25208:39;25222:4;25228:2;25232:7;25241:5;25208:13;:39::i;:::-;24932:321;;;;:::o;22294:394::-;22392:13;22433:16;22441:7;22433;:16::i;:::-;22417:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;22523:21;22547:10;:8;:10::i;:::-;22523:34;;22602:1;22584:7;22578:21;:25;:104;;;;;;;;;;;;;;;;;22639:7;22648:18;:7;:16;:18::i;:::-;22622:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22578:104;22564:118;;;22294:394;;;:::o;24064:186::-;24186:4;24209:18;:25;24228:5;24209:25;;;;;;;;;;;;;;;:35;24235:8;24209:35;;;;;;;;;;;;;;;;;;;;;;;;;24202:42;;24064:186;;;;:::o;41408:230::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41513:1:::1;41493:22;;:8;:22;;;;41485:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41599:8;41570:38;;41591:6;;;;;;;;;;;41570:38;;;;;;;;;;;;41624:8;41615:6;;:17;;;;;;;;;;;;;;;;;;41408:230:::0;:::o;21021:309::-;21148:4;21193:25;21178:40;;;:11;:40;;;;:99;;;;21244:33;21229:48;;;:11;:48;;;;21178:99;:146;;;;21288:36;21312:11;21288:23;:36::i;:::-;21178:146;21164:160;;21021:309;;;:::o;26700:121::-;26765:4;26813:1;26785:30;;:7;:16;26793:7;26785:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26778:37;;26700:121;;;:::o;16587:92::-;16640:7;16663:10;16656:17;;16587:92;:::o;30441:164::-;30539:2;30512:15;:24;30528:7;30512:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30591:7;30587:2;30553:46;;30562:23;30577:7;30562:14;:23::i;:::-;30553:46;;;;;;;;;;;;30441:164;;:::o;26972:378::-;27085:4;27109:16;27117:7;27109;:16::i;:::-;27101:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27181:13;27197:23;27212:7;27197:14;:23::i;:::-;27181:39;;27246:5;27235:16;;:7;:16;;;:58;;;;27286:7;27262:31;;:20;27274:7;27262:11;:20::i;:::-;:31;;;27235:58;:108;;;;27304:39;27328:5;27335:7;27304:23;:39::i;:::-;27235:108;27227:117;;;26972:378;;;;:::o;29788:547::-;29937:4;29910:31;;:23;29925:7;29910:14;:23::i;:::-;:31;;;29894:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;30029:1;30015:16;;:2;:16;;;;30007:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30081:39;30102:4;30108:2;30112:7;30081:20;:39::i;:::-;30177:29;30194:1;30198:7;30177:8;:29::i;:::-;30234:1;30215:9;:15;30225:4;30215:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30259:1;30242:9;:13;30252:2;30242:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30286:2;30267:7;:16;30275:7;30267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30321:7;30317:2;30302:27;;30311:4;30302:27;;;;;;;;;;;;29788:547;;;:::o;27670:104::-;27742:26;27752:2;27756:7;27742:26;;;;;;;;;;;;:9;:26::i;:::-;27670:104;;:::o;26097:308::-;26232:28;26242:4;26248:2;26252:7;26232:9;:28::i;:::-;26283:48;26306:4;26312:2;26316:7;26325:5;26283:22;:48::i;:::-;26267:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;26097:308;;;;:::o;41974:123::-;42034:13;42056:35;;;;;;;;;;;;;;;;;;;41974:123;:::o;17210:637::-;17266:13;17484:1;17475:5;:10;17471:43;;;17496:10;;;;;;;;;;;;;;;;;;;;;17471:43;17520:12;17535:5;17520:20;;17547:14;17568:62;17583:1;17575:4;:9;17568:62;;17595:8;;;;;:::i;:::-;;;;17620:2;17612:10;;;;;:::i;:::-;;;17568:62;;;17636:19;17668:6;17658:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17636:39;;17682:132;17698:1;17689:5;:10;17682:132;;17720:1;17710:11;;;;;:::i;:::-;;;17781:2;17773:5;:10;;;;:::i;:::-;17760:2;:24;;;;:::i;:::-;17747:39;;17730:6;17737;17730:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17804:2;17795:11;;;;;:::i;:::-;;;17682:132;;;17834:6;17820:21;;;;;17210:637;;;;:::o;19575:179::-;19685:4;19723:25;19708:40;;;:11;:40;;;;19701:47;;19575:179;;;:::o;35222:521::-;35348:45;35375:4;35381:2;35385:7;35348:26;:45::i;:::-;35422:1;35406:18;;:4;:18;;;35402:167;;;35435:40;35467:7;35435:31;:40::i;:::-;35402:167;;;35501:2;35493:10;;:4;:10;;;35489:80;;35514:47;35547:4;35553:7;35514:32;:47::i;:::-;35489:80;35402:167;35593:1;35579:16;;:2;:16;;;35575:163;;;35606:45;35643:7;35606:36;:45::i;:::-;35575:163;;;35675:4;35669:10;;:2;:10;;;35665:73;;35690:40;35718:2;35722:7;35690:27;:40::i;:::-;35665:73;35575:163;35222:521;;;:::o;27991:281::-;28103:18;28109:2;28113:7;28103:5;:18::i;:::-;28144:54;28175:1;28179:2;28183:7;28192:5;28144:22;:54::i;:::-;28128:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;27991:281;;;:::o;31148:748::-;31285:4;31302:15;:2;:13;;;:15::i;:::-;31298:593;;;31357:2;31341:36;;;31378:12;:10;:12::i;:::-;31392:4;31398:7;31407:5;31341:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31328:522;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31589:1;31572:6;:13;:18;31568:273;;;31605:60;;;;;;;;;;:::i;:::-;;;;;;;;31568:273;31809:6;31803:13;31794:6;31790:2;31786:15;31779:38;31328:522;31473:45;;;31463:55;;;:6;:55;;;;31456:62;;;;;31298:593;31879:4;31872:11;;31148:748;;;;;;;:::o;32477:112::-;;;;:::o;36430:154::-;36530:10;:17;;;;36503:15;:24;36519:7;36503:24;;;;;;;;;;;:44;;;;36554:10;36570:7;36554:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36430:154;:::o;37193:936::-;37455:22;37505:1;37480:22;37497:4;37480:16;:22::i;:::-;:26;;;;:::i;:::-;37455:51;;37513:18;37534:17;:26;37552:7;37534:26;;;;;;;;;;;;37513:47;;37673:14;37659:10;:28;37655:306;;37698:19;37720:12;:18;37733:4;37720:18;;;;;;;;;;;;;;;:34;37739:14;37720:34;;;;;;;;;;;;37698:56;;37798:11;37765:12;:18;37778:4;37765:18;;;;;;;;;;;;;;;:30;37784:10;37765:30;;;;;;;;;;;:44;;;;37909:10;37876:17;:30;37894:11;37876:30;;;;;;;;;;;:43;;;;37655:306;;38049:17;:26;38067:7;38049:26;;;;;;;;;;;38042:33;;;38089:12;:18;38102:4;38089:18;;;;;;;;;;;;;;;:34;38108:14;38089:34;;;;;;;;;;;38082:41;;;37193:936;;;;:::o;38412:1025::-;38653:22;38698:1;38678:10;:17;;;;:21;;;;:::i;:::-;38653:46;;38706:18;38727:15;:24;38743:7;38727:24;;;;;;;;;;;;38706:45;;39062:19;39084:10;39095:14;39084:26;;;;;;;;;;;;;;;;;;;;;;;;39062:48;;39144:11;39119:10;39130;39119:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39251:10;39220:15;:28;39236:11;39220:28;;;;;;;;;;;:41;;;;39384:15;:24;39400:7;39384:24;;;;;;;;;;;39377:31;;;39415:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38412:1025;;;;:::o;36032:207::-;36113:14;36130:20;36147:2;36130:16;:20::i;:::-;36113:37;;36184:7;36157:12;:16;36170:2;36157:16;;;;;;;;;;;;;;;:24;36174:6;36157:24;;;;;;;;;;;:34;;;;36227:6;36198:17;:26;36216:7;36198:26;;;;;;;;;;;:35;;;;36032:207;;;:::o;28582:356::-;28672:1;28658:16;;:2;:16;;;;28650:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28727:16;28735:7;28727;:16::i;:::-;28726:17;28718:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28785:45;28814:1;28818:2;28822:7;28785:20;:45::i;:::-;28856:1;28839:9;:13;28849:2;28839:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28883:2;28864:7;:16;28872:7;28864:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28924:7;28920:2;28899:33;;28916:1;28899:33;;;;;;;;;;;;28582:356;;:::o;8808:404::-;8868:4;9060:12;9170:7;9158:20;9150:28;;9205:1;9198:4;:8;9191:15;;;8808:404;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1219:139::-;;1303:6;1290:20;1281:29;;1319:33;1346:5;1319:33;:::i;:::-;1271:87;;;;:::o;1364:262::-;;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1488:1;1485;1478:12;1440:2;1531:1;1556:53;1601:7;1592:6;1581:9;1577:22;1556:53;:::i;:::-;1546:63;;1502:117;1430:196;;;;:::o;1632:407::-;;;1757:2;1745:9;1736:7;1732:23;1728:32;1725:2;;;1773:1;1770;1763:12;1725:2;1816:1;1841:53;1886:7;1877:6;1866:9;1862:22;1841:53;:::i;:::-;1831:63;;1787:117;1943:2;1969:53;2014:7;2005:6;1994:9;1990:22;1969:53;:::i;:::-;1959:63;;1914:118;1715:324;;;;;:::o;2045:552::-;;;;2187:2;2175:9;2166:7;2162:23;2158:32;2155:2;;;2203:1;2200;2193:12;2155:2;2246:1;2271:53;2316:7;2307:6;2296:9;2292:22;2271:53;:::i;:::-;2261:63;;2217:117;2373:2;2399:53;2444:7;2435:6;2424:9;2420:22;2399:53;:::i;:::-;2389:63;;2344:118;2501:2;2527:53;2572:7;2563:6;2552:9;2548:22;2527:53;:::i;:::-;2517:63;;2472:118;2145:452;;;;;:::o;2603:809::-;;;;;2771:3;2759:9;2750:7;2746:23;2742:33;2739:2;;;2788:1;2785;2778:12;2739:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3242:2;3231:9;3227:18;3214:32;3273:18;3265:6;3262:30;3259:2;;;3305:1;3302;3295:12;3259:2;3333:62;3387:7;3378:6;3367:9;3363:22;3333:62;:::i;:::-;3323:72;;3185:220;2729:683;;;;;;;:::o;3418:401::-;;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3556:1;3553;3546:12;3508:2;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:50;3794:7;3785:6;3774:9;3770:22;3752:50;:::i;:::-;3742:60;;3697:115;3498:321;;;;;:::o;3825:407::-;;;3950:2;3938:9;3929:7;3925:23;3921:32;3918:2;;;3966:1;3963;3956:12;3918:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;3908:324;;;;;:::o;4238:260::-;;4345:2;4333:9;4324:7;4320:23;4316:32;4313:2;;;4361:1;4358;4351:12;4313:2;4404:1;4429:52;4473:7;4464:6;4453:9;4449:22;4429:52;:::i;:::-;4419:62;;4375:116;4303:195;;;;:::o;4504:282::-;;4622:2;4610:9;4601:7;4597:23;4593:32;4590:2;;;4638:1;4635;4628:12;4590:2;4681:1;4706:63;4761:7;4752:6;4741:9;4737:22;4706:63;:::i;:::-;4696:73;;4652:127;4580:206;;;;:::o;4792:262::-;;4900:2;4888:9;4879:7;4875:23;4871:32;4868:2;;;4916:1;4913;4906:12;4868:2;4959:1;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4930:117;4858:196;;;;:::o;5060:118::-;5147:24;5165:5;5147:24;:::i;:::-;5142:3;5135:37;5125:53;;:::o;5184:109::-;5265:21;5280:5;5265:21;:::i;:::-;5260:3;5253:34;5243:50;;:::o;5299:360::-;;5413:38;5445:5;5413:38;:::i;:::-;5467:70;5530:6;5525:3;5467:70;:::i;:::-;5460:77;;5546:52;5591:6;5586:3;5579:4;5572:5;5568:16;5546:52;:::i;:::-;5623:29;5645:6;5623:29;:::i;:::-;5618:3;5614:39;5607:46;;5389:270;;;;;:::o;5665:364::-;;5781:39;5814:5;5781:39;:::i;:::-;5836:71;5900:6;5895:3;5836:71;:::i;:::-;5829:78;;5916:52;5961:6;5956:3;5949:4;5942:5;5938:16;5916:52;:::i;:::-;5993:29;6015:6;5993:29;:::i;:::-;5988:3;5984:39;5977:46;;5757:272;;;;;:::o;6035:377::-;;6169:39;6202:5;6169:39;:::i;:::-;6224:89;6306:6;6301:3;6224:89;:::i;:::-;6217:96;;6322:52;6367:6;6362:3;6355:4;6348:5;6344:16;6322:52;:::i;:::-;6399:6;6394:3;6390:16;6383:23;;6145:267;;;;;:::o;6418:373::-;;6581:67;6645:2;6640:3;6581:67;:::i;:::-;6574:74;;6678:34;6674:1;6669:3;6665:11;6658:55;6744:11;6739:2;6734:3;6730:12;6723:33;6782:2;6777:3;6773:12;6766:19;;6564:227;;;:::o;6797:319::-;;6960:67;7024:2;7019:3;6960:67;:::i;:::-;6953:74;;7057:23;7053:1;7048:3;7044:11;7037:44;7107:2;7102:3;7098:12;7091:19;;6943:173;;;:::o;7122:375::-;;7285:67;7349:2;7344:3;7285:67;:::i;:::-;7278:74;;7382:34;7378:1;7373:3;7369:11;7362:55;7448:13;7443:2;7438:3;7434:12;7427:35;7488:2;7483:3;7479:12;7472:19;;7268:229;;;:::o;7503:382::-;;7666:67;7730:2;7725:3;7666:67;:::i;:::-;7659:74;;7763:34;7759:1;7754:3;7750:11;7743:55;7829:20;7824:2;7819:3;7815:12;7808:42;7876:2;7871:3;7867:12;7860:19;;7649:236;;;:::o;7891:370::-;;8054:67;8118:2;8113:3;8054:67;:::i;:::-;8047:74;;8151:34;8147:1;8142:3;8138:11;8131:55;8217:8;8212:2;8207:3;8203:12;8196:30;8252:2;8247:3;8243:12;8236:19;;8037:224;;;:::o;8267:393::-;;8430:67;8494:2;8489:3;8430:67;:::i;:::-;8423:74;;8527:34;8523:1;8518:3;8514:11;8507:55;8593:31;8588:2;8583:3;8579:12;8572:53;8651:2;8646:3;8642:12;8635:19;;8413:247;;;:::o;8666:326::-;;8829:67;8893:2;8888:3;8829:67;:::i;:::-;8822:74;;8926:30;8922:1;8917:3;8913:11;8906:51;8983:2;8978:3;8974:12;8967:19;;8812:180;;;:::o;8998:313::-;;9161:67;9225:2;9220:3;9161:67;:::i;:::-;9154:74;;9258:17;9254:1;9249:3;9245:11;9238:38;9302:2;9297:3;9293:12;9286:19;;9144:167;;;:::o;9317:368::-;;9480:67;9544:2;9539:3;9480:67;:::i;:::-;9473:74;;9577:34;9573:1;9568:3;9564:11;9557:55;9643:6;9638:2;9633:3;9629:12;9622:28;9676:2;9671:3;9667:12;9660:19;;9463:222;;;:::o;9691:323::-;;9854:67;9918:2;9913:3;9854:67;:::i;:::-;9847:74;;9951:27;9947:1;9942:3;9938:11;9931:48;10005:2;10000:3;9996:12;9989:19;;9837:177;;;:::o;10020:376::-;;10183:67;10247:2;10242:3;10183:67;:::i;:::-;10176:74;;10280:34;10276:1;10271:3;10267:11;10260:55;10346:14;10341:2;10336:3;10332:12;10325:36;10387:2;10382:3;10378:12;10371:19;;10166:230;;;:::o;10402:383::-;;10565:67;10629:2;10624:3;10565:67;:::i;:::-;10558:74;;10662:34;10658:1;10653:3;10649:11;10642:55;10728:21;10723:2;10718:3;10714:12;10707:43;10776:2;10771:3;10767:12;10760:19;;10548:237;;;:::o;10791:388::-;;10954:67;11018:2;11013:3;10954:67;:::i;:::-;10947:74;;11051:34;11047:1;11042:3;11038:11;11031:55;11117:26;11112:2;11107:3;11103:12;11096:48;11170:2;11165:3;11161:12;11154:19;;10937:242;;;:::o;11185:374::-;;11348:67;11412:2;11407:3;11348:67;:::i;:::-;11341:74;;11445:34;11441:1;11436:3;11432:11;11425:55;11511:12;11506:2;11501:3;11497:12;11490:34;11550:2;11545:3;11541:12;11534:19;;11331:228;;;:::o;11565:373::-;;11728:67;11792:2;11787:3;11728:67;:::i;:::-;11721:74;;11825:34;11821:1;11816:3;11812:11;11805:55;11891:11;11886:2;11881:3;11877:12;11870:33;11929:2;11924:3;11920:12;11913:19;;11711:227;;;:::o;11944:320::-;;12107:67;12171:2;12166:3;12107:67;:::i;:::-;12100:74;;12204:24;12200:1;12195:3;12191:11;12184:45;12255:2;12250:3;12246:12;12239:19;;12090:174;;;:::o;12270:330::-;;12433:67;12497:2;12492:3;12433:67;:::i;:::-;12426:74;;12530:34;12526:1;12521:3;12517:11;12510:55;12591:2;12586:3;12582:12;12575:19;;12416:184;;;:::o;12606:376::-;;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12866:34;12862:1;12857:3;12853:11;12846:55;12932:14;12927:2;12922:3;12918:12;12911:36;12973:2;12968:3;12964:12;12957:19;;12752:230;;;:::o;12988:330::-;;13151:67;13215:2;13210:3;13151:67;:::i;:::-;13144:74;;13248:34;13244:1;13239:3;13235:11;13228:55;13309:2;13304:3;13300:12;13293:19;;13134:184;;;:::o;13324:373::-;;13487:67;13551:2;13546:3;13487:67;:::i;:::-;13480:74;;13584:34;13580:1;13575:3;13571:11;13564:55;13650:11;13645:2;13640:3;13636:12;13629:33;13688:2;13683:3;13679:12;13672:19;;13470:227;;;:::o;13703:379::-;;13866:67;13930:2;13925:3;13866:67;:::i;:::-;13859:74;;13963:34;13959:1;13954:3;13950:11;13943:55;14029:17;14024:2;14019:3;14015:12;14008:39;14073:2;14068:3;14064:12;14057:19;;13849:233;;;:::o;14088:365::-;;14251:67;14315:2;14310:3;14251:67;:::i;:::-;14244:74;;14348:34;14344:1;14339:3;14335:11;14328:55;14414:3;14409:2;14404:3;14400:12;14393:25;14444:2;14439:3;14435:12;14428:19;;14234:219;;;:::o;14459:381::-;;14622:67;14686:2;14681:3;14622:67;:::i;:::-;14615:74;;14719:34;14715:1;14710:3;14706:11;14699:55;14785:19;14780:2;14775:3;14771:12;14764:41;14831:2;14826:3;14822:12;14815:19;;14605:235;;;:::o;14846:376::-;;15009:67;15073:2;15068:3;15009:67;:::i;:::-;15002:74;;15106:34;15102:1;15097:3;15093:11;15086:55;15172:14;15167:2;15162:3;15158:12;15151:36;15213:2;15208:3;15204:12;15197:19;;14992:230;;;:::o;15228:118::-;15315:24;15333:5;15315:24;:::i;:::-;15310:3;15303:37;15293:53;;:::o;15352:435::-;;15554:95;15645:3;15636:6;15554:95;:::i;:::-;15547:102;;15666:95;15757:3;15748:6;15666:95;:::i;:::-;15659:102;;15778:3;15771:10;;15536:251;;;;;:::o;15793:222::-;;15924:2;15913:9;15909:18;15901:26;;15937:71;16005:1;15994:9;15990:17;15981:6;15937:71;:::i;:::-;15891:124;;;;:::o;16021:640::-;;16254:3;16243:9;16239:19;16231:27;;16268:71;16336:1;16325:9;16321:17;16312:6;16268:71;:::i;:::-;16349:72;16417:2;16406:9;16402:18;16393:6;16349:72;:::i;:::-;16431;16499:2;16488:9;16484:18;16475:6;16431:72;:::i;:::-;16550:9;16544:4;16540:20;16535:2;16524:9;16520:18;16513:48;16578:76;16649:4;16640:6;16578:76;:::i;:::-;16570:84;;16221:440;;;;;;;:::o;16667:210::-;;16792:2;16781:9;16777:18;16769:26;;16805:65;16867:1;16856:9;16852:17;16843:6;16805:65;:::i;:::-;16759:118;;;;:::o;16883:313::-;;17034:2;17023:9;17019:18;17011:26;;17083:9;17077:4;17073:20;17069:1;17058:9;17054:17;17047:47;17111:78;17184:4;17175:6;17111:78;:::i;:::-;17103:86;;17001:195;;;;:::o;17202:419::-;;17406:2;17395:9;17391:18;17383:26;;17455:9;17449:4;17445:20;17441:1;17430:9;17426:17;17419:47;17483:131;17609:4;17483:131;:::i;:::-;17475:139;;17373:248;;;:::o;17627:419::-;;17831:2;17820:9;17816:18;17808:26;;17880:9;17874:4;17870:20;17866:1;17855:9;17851:17;17844:47;17908:131;18034:4;17908:131;:::i;:::-;17900:139;;17798:248;;;:::o;18052:419::-;;18256:2;18245:9;18241:18;18233:26;;18305:9;18299:4;18295:20;18291:1;18280:9;18276:17;18269:47;18333:131;18459:4;18333:131;:::i;:::-;18325:139;;18223:248;;;:::o;18477:419::-;;18681:2;18670:9;18666:18;18658:26;;18730:9;18724:4;18720:20;18716:1;18705:9;18701:17;18694:47;18758:131;18884:4;18758:131;:::i;:::-;18750:139;;18648:248;;;:::o;18902:419::-;;19106:2;19095:9;19091:18;19083:26;;19155:9;19149:4;19145:20;19141:1;19130:9;19126:17;19119:47;19183:131;19309:4;19183:131;:::i;:::-;19175:139;;19073:248;;;:::o;19327:419::-;;19531:2;19520:9;19516:18;19508:26;;19580:9;19574:4;19570:20;19566:1;19555:9;19551:17;19544:47;19608:131;19734:4;19608:131;:::i;:::-;19600:139;;19498:248;;;:::o;19752:419::-;;19956:2;19945:9;19941:18;19933:26;;20005:9;19999:4;19995:20;19991:1;19980:9;19976:17;19969:47;20033:131;20159:4;20033:131;:::i;:::-;20025:139;;19923:248;;;:::o;20177:419::-;;20381:2;20370:9;20366:18;20358:26;;20430:9;20424:4;20420:20;20416:1;20405:9;20401:17;20394:47;20458:131;20584:4;20458:131;:::i;:::-;20450:139;;20348:248;;;:::o;20602:419::-;;20806:2;20795:9;20791:18;20783:26;;20855:9;20849:4;20845:20;20841:1;20830:9;20826:17;20819:47;20883:131;21009:4;20883:131;:::i;:::-;20875:139;;20773:248;;;:::o;21027:419::-;;21231:2;21220:9;21216:18;21208:26;;21280:9;21274:4;21270:20;21266:1;21255:9;21251:17;21244:47;21308:131;21434:4;21308:131;:::i;:::-;21300:139;;21198:248;;;:::o;21452:419::-;;21656:2;21645:9;21641:18;21633:26;;21705:9;21699:4;21695:20;21691:1;21680:9;21676:17;21669:47;21733:131;21859:4;21733:131;:::i;:::-;21725:139;;21623:248;;;:::o;21877:419::-;;22081:2;22070:9;22066:18;22058:26;;22130:9;22124:4;22120:20;22116:1;22105:9;22101:17;22094:47;22158:131;22284:4;22158:131;:::i;:::-;22150:139;;22048:248;;;:::o;22302:419::-;;22506:2;22495:9;22491:18;22483:26;;22555:9;22549:4;22545:20;22541:1;22530:9;22526:17;22519:47;22583:131;22709:4;22583:131;:::i;:::-;22575:139;;22473:248;;;:::o;22727:419::-;;22931:2;22920:9;22916:18;22908:26;;22980:9;22974:4;22970:20;22966:1;22955:9;22951:17;22944:47;23008:131;23134:4;23008:131;:::i;:::-;23000:139;;22898:248;;;:::o;23152:419::-;;23356:2;23345:9;23341:18;23333:26;;23405:9;23399:4;23395:20;23391:1;23380:9;23376:17;23369:47;23433:131;23559:4;23433:131;:::i;:::-;23425:139;;23323:248;;;:::o;23577:419::-;;23781:2;23770:9;23766:18;23758:26;;23830:9;23824:4;23820:20;23816:1;23805:9;23801:17;23794:47;23858:131;23984:4;23858:131;:::i;:::-;23850:139;;23748:248;;;:::o;24002:419::-;;24206:2;24195:9;24191:18;24183:26;;24255:9;24249:4;24245:20;24241:1;24230:9;24226:17;24219:47;24283:131;24409:4;24283:131;:::i;:::-;24275:139;;24173:248;;;:::o;24427:419::-;;24631:2;24620:9;24616:18;24608:26;;24680:9;24674:4;24670:20;24666:1;24655:9;24651:17;24644:47;24708:131;24834:4;24708:131;:::i;:::-;24700:139;;24598:248;;;:::o;24852:419::-;;25056:2;25045:9;25041:18;25033:26;;25105:9;25099:4;25095:20;25091:1;25080:9;25076:17;25069:47;25133:131;25259:4;25133:131;:::i;:::-;25125:139;;25023:248;;;:::o;25277:419::-;;25481:2;25470:9;25466:18;25458:26;;25530:9;25524:4;25520:20;25516:1;25505:9;25501:17;25494:47;25558:131;25684:4;25558:131;:::i;:::-;25550:139;;25448:248;;;:::o;25702:419::-;;25906:2;25895:9;25891:18;25883:26;;25955:9;25949:4;25945:20;25941:1;25930:9;25926:17;25919:47;25983:131;26109:4;25983:131;:::i;:::-;25975:139;;25873:248;;;:::o;26127:419::-;;26331:2;26320:9;26316:18;26308:26;;26380:9;26374:4;26370:20;26366:1;26355:9;26351:17;26344:47;26408:131;26534:4;26408:131;:::i;:::-;26400:139;;26298:248;;;:::o;26552:419::-;;26756:2;26745:9;26741:18;26733:26;;26805:9;26799:4;26795:20;26791:1;26780:9;26776:17;26769:47;26833:131;26959:4;26833:131;:::i;:::-;26825:139;;26723:248;;;:::o;26977:419::-;;27181:2;27170:9;27166:18;27158:26;;27230:9;27224:4;27220:20;27216:1;27205:9;27201:17;27194:47;27258:131;27384:4;27258:131;:::i;:::-;27250:139;;27148:248;;;:::o;27402:222::-;;27533:2;27522:9;27518:18;27510:26;;27546:71;27614:1;27603:9;27599:17;27590:6;27546:71;:::i;:::-;27500:124;;;;:::o;27630:283::-;;27696:2;27690:9;27680:19;;27738:4;27730:6;27726:17;27845:6;27833:10;27830:22;27809:18;27797:10;27794:34;27791:62;27788:2;;;27856:18;;:::i;:::-;27788:2;27896:10;27892:2;27885:22;27670:243;;;;:::o;27919:331::-;;28070:18;28062:6;28059:30;28056:2;;;28092:18;;:::i;:::-;28056:2;28177:4;28173:9;28166:4;28158:6;28154:17;28150:33;28142:41;;28238:4;28232;28228:15;28220:23;;27985:265;;;:::o;28256:98::-;;28341:5;28335:12;28325:22;;28314:40;;;:::o;28360:99::-;;28446:5;28440:12;28430:22;;28419:40;;;:::o;28465:168::-;;28582:6;28577:3;28570:19;28622:4;28617:3;28613:14;28598:29;;28560:73;;;;:::o;28639:169::-;;28757:6;28752:3;28745:19;28797:4;28792:3;28788:14;28773:29;;28735:73;;;;:::o;28814:148::-;;28953:3;28938:18;;28928:34;;;;:::o;28968:305::-;;29027:20;29045:1;29027:20;:::i;:::-;29022:25;;29061:20;29079:1;29061:20;:::i;:::-;29056:25;;29215:1;29147:66;29143:74;29140:1;29137:81;29134:2;;;29221:18;;:::i;:::-;29134:2;29265:1;29262;29258:9;29251:16;;29012:261;;;;:::o;29279:185::-;;29336:20;29354:1;29336:20;:::i;:::-;29331:25;;29370:20;29388:1;29370:20;:::i;:::-;29365:25;;29409:1;29399:2;;29414:18;;:::i;:::-;29399:2;29456:1;29453;29449:9;29444:14;;29321:143;;;;:::o;29470:348::-;;29533:20;29551:1;29533:20;:::i;:::-;29528:25;;29567:20;29585:1;29567:20;:::i;:::-;29562:25;;29755:1;29687:66;29683:74;29680:1;29677:81;29672:1;29665:9;29658:17;29654:105;29651:2;;;29762:18;;:::i;:::-;29651:2;29810:1;29807;29803:9;29792:20;;29518:300;;;;:::o;29824:191::-;;29884:20;29902:1;29884:20;:::i;:::-;29879:25;;29918:20;29936:1;29918:20;:::i;:::-;29913:25;;29957:1;29954;29951:8;29948:2;;;29962:18;;:::i;:::-;29948:2;30007:1;30004;30000:9;29992:17;;29869:146;;;;:::o;30021:96::-;;30087:24;30105:5;30087:24;:::i;:::-;30076:35;;30066:51;;;:::o;30123:90::-;;30200:5;30193:13;30186:21;30175:32;;30165:48;;;:::o;30219:149::-;;30295:66;30288:5;30284:78;30273:89;;30263:105;;;:::o;30374:126::-;;30451:42;30444:5;30440:54;30429:65;;30419:81;;;:::o;30506:77::-;;30572:5;30561:16;;30551:32;;;:::o;30589:154::-;30673:6;30668:3;30663;30650:30;30735:1;30726:6;30721:3;30717:16;30710:27;30640:103;;;:::o;30749:307::-;30817:1;30827:113;30841:6;30838:1;30835:13;30827:113;;;30926:1;30921:3;30917:11;30911:18;30907:1;30902:3;30898:11;30891:39;30863:2;30860:1;30856:10;30851:15;;30827:113;;;30958:6;30955:1;30952:13;30949:2;;;31038:1;31029:6;31024:3;31020:16;31013:27;30949:2;30798:258;;;;:::o;31062:320::-;;31143:1;31137:4;31133:12;31123:22;;31190:1;31184:4;31180:12;31211:18;31201:2;;31267:4;31259:6;31255:17;31245:27;;31201:2;31329;31321:6;31318:14;31298:18;31295:38;31292:2;;;31348:18;;:::i;:::-;31292:2;31113:269;;;;:::o;31388:233::-;;31450:24;31468:5;31450:24;:::i;:::-;31441:33;;31496:66;31489:5;31486:77;31483:2;;;31566:18;;:::i;:::-;31483:2;31613:1;31606:5;31602:13;31595:20;;31431:190;;;:::o;31627:176::-;;31676:20;31694:1;31676:20;:::i;:::-;31671:25;;31710:20;31728:1;31710:20;:::i;:::-;31705:25;;31749:1;31739:2;;31754:18;;:::i;:::-;31739:2;31795:1;31792;31788:9;31783:14;;31661:142;;;;:::o;31809:180::-;31857:77;31854:1;31847:88;31954:4;31951:1;31944:15;31978:4;31975:1;31968:15;31995:180;32043:77;32040:1;32033:88;32140:4;32137:1;32130:15;32164:4;32161:1;32154:15;32181:180;32229:77;32226:1;32219:88;32326:4;32323:1;32316:15;32350:4;32347:1;32340:15;32367:180;32415:77;32412:1;32405:88;32512:4;32509:1;32502:15;32536:4;32533:1;32526:15;32553:102;;32645:2;32641:7;32636:2;32629:5;32625:14;32621:28;32611:38;;32601:54;;;:::o;32661:122::-;32734:24;32752:5;32734:24;:::i;:::-;32727:5;32724:35;32714:2;;32773:1;32770;32763:12;32714:2;32704:79;:::o;32789:116::-;32859:21;32874:5;32859:21;:::i;:::-;32852:5;32849:32;32839:2;;32895:1;32892;32885:12;32839:2;32829:76;:::o;32911:120::-;32983:23;33000:5;32983:23;:::i;:::-;32976:5;32973:34;32963:2;;33021:1;33018;33011:12;32963:2;32953:78;:::o;33037:122::-;33110:24;33128:5;33110:24;:::i;:::-;33103:5;33100:35;33090:2;;33149:1;33146;33139:12;33090:2;33080:79;:::o
Swarm Source
ipfs://5018a2af076e8e91e8dc24771fe315da7f569881b157a4353643d1ea349aad26
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.