ERC-721
NFT
Overview
Max Total Supply
3,463 FPUNK
Holders
377
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 FPUNKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FreightPunks
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; interface IWorldOfFreight { function ownerOf(uint256 _tokenId) external view returns(address); function balanceOf(address _address) external view returns(uint256); } contract FreightPunks is ERC721Enumerable, Ownable { using SafeMath for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIds; uint public constant MAX_PUNKS = 10000; uint private PUNK_PRICE = 0.00 ether; uint256 private constant DEADLINE = 1636156800; uint256 private START = 1635530400; bool private WHITELIST_MINT_OPEN = false; uint256 private MAX_MINT = 10; uint256 private MAX_WHITELIST_TOTAL = 10; bool private PUBLIC_SALE_OPEN = false; address public CONTRACT_OWNER; address public awardAddress; string public PROVENANCE = ""; string public _prefixURI; IWorldOfFreight public nftContract; constructor(address _wof) ERC721("Freight Punks", "FPUNK") { nftContract = IWorldOfFreight(_wof); CONTRACT_OWNER = msg.sender; } mapping(uint256 => bool) public tokenMint; mapping(address => bool) public whitelist; mapping(address => uint256) private mintCount; function setProvenanceHash(string memory provenanceHash) public onlyOwner { PROVENANCE = provenanceHash; } function _baseURI() internal view override returns (string memory) { return _prefixURI; } function setBaseURI(string memory _uri) public onlyOwner { _prefixURI = _uri; } //SET AWARDS ADDRESS function setAwardAddress(address _address) public onlyOwner { awardAddress = _address; } //SET START TIME function setStart(uint256 _time) public onlyOwner { START = _time; } //WHITELIST FUNCTIONS function setWhitelistStatus() public onlyOwner { WHITELIST_MINT_OPEN = !WHITELIST_MINT_OPEN; } function setMaxMintPerWallet(uint256 _amount) public onlyOwner { MAX_WHITELIST_TOTAL = _amount; } function setMaxMint(uint256 _amount) public onlyOwner { MAX_MINT = _amount; } //PUBLIC SALE FUNCTIONS function setPublicSaleStatus() public onlyOwner { PUBLIC_SALE_OPEN = !PUBLIC_SALE_OPEN; } function setPrice(uint256 _amount) public onlyOwner { PUNK_PRICE = _amount; } function isMintedforToken (uint256 _tokenId) public view returns (bool) { return tokenMint[_tokenId]; } //MINTING FOR WOF HODLERS function mintPunk(uint256 [] memory _tokenId, uint256 _amount) public { require(block.timestamp >= START, 'Sorry, minting not started yet'); require(_tokenId.length == _amount, 'Amount not equal to tokenIds amount'); require(block.timestamp <= DEADLINE, 'Sorry, minting has ended'); require(nftContract.balanceOf(msg.sender) >= _amount, 'You do not own enough WOF NFT-s'); for (uint i = 0; i < _amount; i++) { require(tokenMint[_tokenId[i]] == false, 'Punk already minted for this NFT'); require(nftContract.ownerOf(_tokenId[i]) == msg.sender, 'You do not own this token'); tokenMint[_tokenId[i]] = true; _mintItem(msg.sender); } } //ADD TO WHITELIST function addToWhitelist(address [] memory _addresses) public onlyOwner { for (uint i = 0; i < _addresses.length; i++) { whitelist[_addresses[i]] = true; } } //WHITELIST MINTING function whitelistMint(uint256 _amount) public { require(WHITELIST_MINT_OPEN == true, 'Minting not open'); require(whitelist[msg.sender] == true, 'You are not on whitelist'); require(_amount <= MAX_MINT, 'Can not mint this much'); require(MAX_WHITELIST_TOTAL >= mintCount[msg.sender], 'Max mints per wallet achieved'); for (uint i = 0; i < _amount; i++) { _mintItem(msg.sender); } mintCount[msg.sender] = mintCount[msg.sender].add(_amount); } //OPEN MINTING function openMint(uint256 _amount) public payable { require(PUBLIC_SALE_OPEN == true, 'Minting not open'); require(_amount <= MAX_MINT, 'Can not mint this much'); require(msg.value >= PUNK_PRICE , 'Send more eth'); for (uint i = 0; i < _amount; i++) { _mintItem(msg.sender); } } //REWARDS TO MANY function airdropMany(address [] memory _rewardee) public { require(msg.sender == CONTRACT_OWNER || msg.sender == awardAddress, 'Not permitted'); require(totalSupply().add(_rewardee.length) <= MAX_PUNKS, 'Exeeds max'); for (uint i = 0; i < _rewardee.length; i++) { _mintItem(_rewardee[i]); } } //REWARD TO SINGLE function airDrop(address _to, uint256 _amount) public { require(msg.sender == CONTRACT_OWNER || msg.sender == awardAddress, 'Not permitted'); require(totalSupply().add(_amount) <= MAX_PUNKS, 'Exeeds max'); for (uint i = 0; i < _amount; i++) { _mintItem(_to); } } //SINGLE MINTING FUNCTION function _mintItem(address _to) internal returns (uint256) { _tokenIds.increment(); uint256 id = _tokenIds.current(); require(id <= MAX_PUNKS, 'Max already minted'); _safeMint(_to, id); return id; } function withdrawAmount(address payable to, uint256 amount) public onlyOwner { require(msg.sender == CONTRACT_OWNER); to.transfer(amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @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(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "hardhat/console.sol"; interface IWorldOfFreight { function balanceOG(address _user) external view returns(uint256); } contract WOFToken is ERC20("WoFToken", "WOF") { using SafeMath for uint256; uint256 constant public BASE_RATE = 25 ether; uint256 constant public INITIAL_ISSUANCE = 1 ether; mapping(address => uint256) public rewards; mapping(address => uint256) public lastUpdate; uint256 constant public END = 1947166276; //TMP IWorldOfFreight public wofContract; event RewardPaid(address indexed user, uint256 reward); constructor(address _wof) { wofContract = IWorldOfFreight(_wof); } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } // called on transfers - transfer half of tokens, burn the rest function transferTokens(address _from, address _to) external { require(msg.sender == address(wofContract)); uint256 time = min(block.timestamp, END); uint256 timerFrom = lastUpdate[_from]; if (timerFrom > 0) rewards[_from] += wofContract.balanceOG(_from).mul(BASE_RATE.mul((time.sub(timerFrom)))).div(86400); //rewards[_from] += BASE_RATE.mul(time.sub(timerFrom)).div(86400); if (timerFrom != END) lastUpdate[_from] = time; if (_to != address(0)) { uint256 timerTo = lastUpdate[_to]; if (timerTo > 0) rewards[_to] += wofContract.balanceOG(_to).mul(BASE_RATE.mul((time.sub(timerTo)))).div(86400); if (timerTo != END) lastUpdate[_to] = time; } } function rewardOnMint(address _user, uint256 _amount) external { require(msg.sender == address(wofContract), "Can't call this"); uint256 time = min(block.timestamp, END); uint256 timerUser = lastUpdate[_user]; if (timerUser > 0) rewards[_user] = rewards[_user].add(wofContract.balanceOG(_user).mul(BASE_RATE.mul((time.sub(timerUser)))).div(86400) .add(_amount.mul(INITIAL_ISSUANCE))); else rewards[_user] = rewards[_user].add(_amount.mul(INITIAL_ISSUANCE)); lastUpdate[_user] = time; } function getReward(address _to) external { require(msg.sender == address(wofContract)); uint256 reward = rewards[_to]; if (reward > 0) { rewards[_to] = 0; _mint(_to, reward); emit RewardPaid(_to, reward); } } function burn(address _from, uint256 _amount) external { require(msg.sender == address(wofContract)); _burn(_from, _amount); } function getTotalClaimable(address _user) external view returns(uint256) { uint256 time = min(block.timestamp, END); uint256 pending = wofContract.balanceOG(_user).mul(BASE_RATE.mul((time.sub(lastUpdate[_user])))).div(86400); return rewards[_user] + pending; } } contract ERC721Namable is ERC721 { uint256 public nameChangePrice = 300 ether; // Mapping from token ID to name mapping (uint256 => string) private _tokenName; // Mapping if certain name string has already been reserved mapping (string => bool) private _nameReserved; event NameChange (uint256 indexed tokenId, string newName); constructor(string memory _name, string memory _symbol, string[] memory _names, uint256[] memory _ids) ERC721(_name, _symbol) { for (uint256 i = 0; i < _ids.length; i++) { toggleReserveName(_names[i], true); _tokenName[_ids[i]] = _names[i]; emit NameChange(_ids[i], _names[i]); } } function changeName(uint256 tokenId, string memory newName) public virtual { address owner = ownerOf(tokenId); require(_msgSender() == owner, "ERC721: caller is not the owner"); require(validateName(newName) == true, "Not a valid new name"); require(sha256(bytes(newName)) != sha256(bytes(_tokenName[tokenId])), "New name is same as the current one"); require(isNameReserved(newName) == false, "Name already reserved"); // If already named, dereserve old name if (bytes(_tokenName[tokenId]).length > 0) { toggleReserveName(_tokenName[tokenId], false); } toggleReserveName(newName, true); _tokenName[tokenId] = newName; emit NameChange(tokenId, newName); } function toggleReserveName(string memory str, bool isReserve) internal { _nameReserved[toLower(str)] = isReserve; } function tokenNameByIndex(uint256 index) public view returns (string memory) { return _tokenName[index]; } function isNameReserved(string memory nameString) public view returns (bool) { return _nameReserved[toLower(nameString)]; } function validateName(string memory str) public pure returns (bool){ bytes memory b = bytes(str); if(b.length < 1) return false; if(b.length > 25) return false; // Cannot be longer than 25 characters if(b[0] == 0x20) return false; // Leading space if (b[b.length - 1] == 0x20) return false; // Trailing space bytes1 lastChar = b[0]; for(uint i; i<b.length; i++){ bytes1 char = b[i]; if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces if( !(char >= 0x30 && char <= 0x39) && //9-0 !(char >= 0x41 && char <= 0x5A) && //A-Z !(char >= 0x61 && char <= 0x7A) && //a-z !(char == 0x20) //space ) return false; lastChar = char; } return true; } /** * @dev Converts the string to lowercase */ function toLower(string memory str) public pure returns (string memory){ bytes memory bStr = bytes(str); bytes memory bLower = new bytes(bStr.length); for (uint i = 0; i < bStr.length; i++) { // Uppercase character if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) { bLower[i] = bytes1(uint8(bStr[i]) + 32); } else { bLower[i] = bStr[i]; } } return string(bLower); } } contract WorldOfFreight is ERC721Namable, Ownable { using SafeMath for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIds; address private contOwner; uint256 private constant _maxTokens = 10000; uint256 private constant _maxMint = 10; address public saleContract; uint256 public constant _price = 80000000000000000;//WEI // 0.08 ETH string public PROVENANCE = ""; string public _prefixURI; bool private _saleActive = true; bool private _openSale = false; address public constant burn = address(0x000000000000000000000000000000000000dEaD); mapping(address => uint256) public balanceOG; WOFToken public wofToken; constructor(string memory _name, string memory _symbol, string[] memory _names, uint256[] memory _ids) ERC721Namable(_name, _symbol, _names, _ids) { contOwner = msg.sender; } function setProvenanceHash(string memory provenanceHash) public onlyOwner { PROVENANCE = provenanceHash; } function _baseURI() internal view override returns (string memory) { return _prefixURI; } function setBaseURI(string memory _uri) public onlyOwner { _prefixURI = _uri; } function toggleSale() public onlyOwner { _saleActive = !_saleActive; } function toggleOpenSale() public onlyOwner { _openSale = !_openSale; } function myBalance (address _user) public view returns (uint256) { uint256 bal = balanceOf(_user); return bal; } function setSaleContract(address _saleContract) public onlyOwner { saleContract = _saleContract; } function mintItems(address to, uint256 amount) public { require(msg.sender == saleContract, "Nice try :)"); uint256 totalMinted = _tokenIds.current(); require(totalMinted + amount <= _maxTokens); for (uint256 i = 0; i < amount; i++) { _mintItem(to); } } function openMint(uint256 amount) public payable { require(_openSale, 'Sale not open'); require(amount <= _maxMint, 'Can not mint this much'); uint256 totalMinted = _tokenIds.current(); require(totalMinted + amount <= _maxTokens, 'Not enough tokens remaining'); require(msg.value >= amount * _price, 'Price too low'); for (uint256 i = 0; i < amount; i++) { _mintItem(msg.sender); } } function _mintItem(address to) internal returns (uint256) { _tokenIds.increment(); wofToken.rewardOnMint(to, 1); uint256 id = _tokenIds.current(); require(id <= _maxTokens); balanceOG[to] = balanceOG[to].add(1); _safeMint(to, id); return id; } //WOF TOKEN function setWofToken(address _yield) external onlyOwner { wofToken = WOFToken(_yield); } function changeNamePrice(uint256 _newPrice) external onlyOwner { nameChangePrice = _newPrice; } function changeName(uint256 tokenId, string memory newName) public override { wofToken.burn(msg.sender, nameChangePrice); super.changeName(tokenId, newName); } function getReward() external { wofToken.transferTokens(msg.sender, address(0)); wofToken.getReward(msg.sender); } function transferFrom(address from, address to, uint256 tokenId) public override { wofToken.transferTokens(from, to); balanceOG[from] = balanceOG[from].sub(1); balanceOG[to]++; super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override { wofToken.transferTokens(from, to); balanceOG[from] = balanceOG[from].sub(1); balanceOG[to]++; super.safeTransferFrom(from, to, tokenId, _data); } function tokensLeft() external view returns (uint256) { uint256 totalMinted = _tokenIds.current(); uint256 tokens = _maxTokens.sub(totalMinted); return tokens; } function mintedcount() public view returns (uint256){ uint256 totalMinted = _tokenIds.current(); return totalMinted; } //RESERVE function reserve(uint256 quantity) public onlyOwner { for (uint256 i = 0; i < quantity; i++) { _mintItem(msg.sender); } } //SEND TO WINNERS function giveAway(address to, uint256 quantity) public onlyOwner { for (uint256 i = 0; i < quantity; i++) { _mintItem(to); } } function withdrawAmount(address payable to, uint256 amount) public onlyOwner{ require(msg.sender == contOwner); to.transfer(amount); } } contract WofBuyMint is Ownable { using SafeMath for uint256; uint256 private _maxTokens = 9833; uint256 private _maxPresale = 9833; address private contOwner; bool private _saleActive = true; bool private _preSaleActive = true; uint256 public _preSalestartTime = 1632679200; uint256 public _salestartTime = 1632765600; uint256 public _buyTime = 259200; uint256 public constant _price = 80000000000000000;//WEI // 0.08 ETH mapping(address => uint256) public preSaleUserReserved; mapping(address => uint256) public userReserved; mapping(address => uint256) public buyTime; WorldOfFreight public _wofContract; constructor () { contOwner = msg.sender; } function toggleSale() public onlyOwner { _saleActive = !_saleActive; } function togglePreSale() public onlyOwner { _preSaleActive = !_preSaleActive; } function setPreSaleStartTime(uint256 time) public onlyOwner { _preSalestartTime = time; } function setSaleStartTime(uint256 time) public onlyOwner { _salestartTime = time; } function setBuyTime(uint256 time) public onlyOwner { _buyTime = time; } function setMaxTokens(uint256 amount) public onlyOwner { _maxTokens = amount; } function setWofContract(address _wof) public onlyOwner { _wofContract = WorldOfFreight(_wof); } function myAmount(address _user) public view returns (uint256) { uint256 userTotalAmount = preSaleUserReserved[_user].add(userReserved[_user]); return userTotalAmount; } function buyDeadline(address _user) public view returns (uint256) { uint256 timestamp = buyTime[_user]; return timestamp; } function presaleBuy(address _user, uint256 amount) public payable returns (uint256) { uint256 time = block.timestamp; require(msg.value >= amount * _price); require(amount <= _maxPresale, 'Sorry, sold out'); require(time > _preSalestartTime, "Sale has not started yet"); if(time >= _preSalestartTime && time < _preSalestartTime.add(600) ) { require(preSaleUserReserved[_user] <= 4,'Max amount bought'); require(amount <= 4, 'Can not mint this much'); preSaleUserReserved[_user] = preSaleUserReserved[_user].add(amount); buyTime[_user] = time; } else if(time >= _preSalestartTime.add(600) && time < _preSalestartTime.add(1200)) { require(preSaleUserReserved[_user] <= 20,'Max amount bought'); require(amount <= 16, 'Can not mint this much'); preSaleUserReserved[_user] = preSaleUserReserved[_user].add(amount); buyTime[_user] = time; } else if(time >= _preSalestartTime.add(1200)) { require(preSaleUserReserved[_user] <= 84,'Max amount bought'); require(amount <= 64, 'Can not mint this much'); preSaleUserReserved[_user] = preSaleUserReserved[_user].add(amount); buyTime[_user] = time; } else if(time >= _preSalestartTime.add(1800) && time < _salestartTime.add(1800)) { require(preSaleUserReserved[_user] <= 196,'Max amount bought'); require(amount <= 112, 'Can not mint this much'); preSaleUserReserved[_user] = preSaleUserReserved[_user].add(amount); buyTime[_user] = time; } _maxTokens = _maxTokens.sub(preSaleUserReserved[_user]); _maxPresale = _maxPresale.sub(preSaleUserReserved[_user]); return preSaleUserReserved[_user]; } function buy(address _user, uint256 amount) public payable returns (uint256) { uint256 time = block.timestamp; require(msg.value >= amount * _price); require(amount <= _maxTokens, 'Sorry, sold out'); require(time > _salestartTime, "Sale has not started yet"); if(time >= _salestartTime && time < _salestartTime.add(600) ) { require(userReserved[_user] <= 4,'Max amount bought'); require(amount <= 4, 'Can not mint this much'); userReserved[_user] = userReserved[_user].add(amount); buyTime[_user] = time; } else if(time >= _salestartTime.add(600) && time < _salestartTime.add(1200)) { require(userReserved[_user] <= 20,'Max amount bought'); require(amount <= 16, 'Can not mint this much'); userReserved[_user] = userReserved[_user].add(amount); buyTime[_user] = time; } else if(time >= _salestartTime.add(1200) && time < _salestartTime.add(1800)) { require(userReserved[_user] <= 84,'Max amount bought'); require(amount <= 64, 'Can not mint this much'); userReserved[_user] = userReserved[_user].add(amount); buyTime[_user] = time; } else if(time >= _salestartTime.add(1800)) { require(userReserved[_user] <= 192,'Max amount bought'); require(amount <= 112, 'Can not mint this much'); userReserved[_user] = userReserved[_user].add(amount); buyTime[_user] = time; } _maxTokens = _maxTokens.sub(userReserved[_user]); return userReserved[_user]; } function mint(address _user) public { uint256 time = block.timestamp; uint256 userTotalAmount = preSaleUserReserved[_user].add(userReserved[_user]); uint256 timeLeft = time.sub(buyTime[_user]); require(userTotalAmount > 0, 'You have no tickets left'); require(timeLeft <= _buyTime, 'Sorry, you ran out of time to mint'); preSaleUserReserved[_user] = 0; userReserved[_user] = 0; _wofContract.mintItems(_user, userTotalAmount); } function withdrawAmount(address payable to, uint256 amount) public onlyOwner { require(msg.sender == contOwner); to.transfer(amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; interface IWorldOfFreight { function ownerOf(uint256 tokenId) external view returns(address); function mintedcount() external view returns (uint256); function transferFrom(address from, address to, uint256 tokenId) external; function mintItems(address to, uint256 amount) external; } interface IWofToken { function burn(address _from, uint256 _amount) external; function balanceOf(address _address) external view returns (uint256); } contract GarageContract { using SafeMath for uint256; address private owner; bool public mintNew = true; uint256 public junkyardPrice = 5000 ether; mapping(uint256 => UpgradePack) public upgrades; event Upgrade(address indexed _from, uint256 _upgradeId, uint256 _tokenId); event JunkYard(address indexed _from, uint256 _tokenId, bool mintedNew); struct UpgradePack { uint256 id; uint256 cost; } IWorldOfFreight public nftContract; IWofToken public wofToken; constructor (address _wof, address _token) { owner = msg.sender; nftContract = IWorldOfFreight(_wof); wofToken = IWofToken(_token); } function setTokenContract(address _address) public { require(msg.sender == owner, 'Not the owner'); wofToken = IWofToken(_address); } function setJunkYardPrice(uint256 _price) public { require(msg.sender == owner, 'Not the owner'); junkyardPrice = _price; } function setMintNew() public { require(msg.sender == owner, 'Not the owner'); mintNew = !mintNew; } function setUpgradePack(UpgradePack [] memory _array) public { require(msg.sender == owner, 'Not the owner'); for(uint i=0; i < _array.length; i++){ upgrades[_array[i].id].id = _array[i].id; upgrades[_array[i].id].cost = _array[i].cost; } } function upgrade(uint256 _tokenId, uint256 _upgradeId) public { require(msg.sender == nftContract.ownerOf(_tokenId), 'You do not own this vehicle'); require(wofToken.balanceOf(msg.sender) >= upgrades[_upgradeId].cost, 'Not enough WOF tokens'); uint256 cost = upgrades[_upgradeId].cost; uint256 tokenContractAmount = cost.mul(1 ether); wofToken.burn(msg.sender, tokenContractAmount); emit Upgrade(msg.sender, _upgradeId, _tokenId); } function junkYard(uint256 _tokenId) public { require(msg.sender == nftContract.ownerOf(_tokenId), 'You do not own this vehicle'); require(wofToken.balanceOf(msg.sender) >= junkyardPrice, 'Not enough WOF tokens'); uint256 tokenContractAmount = junkyardPrice.mul(1 ether); bool mintedNew = false; wofToken.burn(msg.sender, tokenContractAmount); nftContract.transferFrom(msg.sender, owner , _tokenId); if(nftContract.mintedcount() < 10000 && mintNew == true) { nftContract.mintItems(msg.sender, 1); mintedNew = true; } emit JunkYard(msg.sender, _tokenId, mintedNew); } }
pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; interface IWorldOfFreight { function balanceOG(address _user) external view returns(uint256); function ownerOf(uint256 tokenId) external view returns(address); function mintedcount() external view returns (uint256); } contract WOFToken is ERC20("WoFToken", "WOF") { using SafeMath for uint256; uint256 public BASE_RATE = 25000000000000000000; uint256 public buyPrice = 30000000000000; bool public _saleOpen = false; uint256 public rate = 1; bool public cut = false; address public cutAddres; address public contOwner; address public _garageContract; uint256 public ENDTIME = 1664582400; mapping(address => uint256) public rewards; mapping(address => uint256) public lastUpdate; IWorldOfFreight public wofContract; constructor(address _wof) { wofContract = IWorldOfFreight(_wof); contOwner = msg.sender; } //Set buy price for token function setPrice(uint256 _price) public { require(msg.sender == contOwner, 'Sorry, no luck for you'); buyPrice = _price; } function setBaseRate(uint256 _price) public { require(msg.sender == contOwner, 'Sorry, no luck for you'); BASE_RATE = _price; } function setCut() public { require(msg.sender == contOwner, 'Sorry, no luck for you'); cut = !cut; } function setCutAddr(address _to) public { require(msg.sender == contOwner, 'Sorry, no luck for you'); cutAddres = _to; } function setGarageContract(address contractAddress) public { require(msg.sender == contOwner, 'Sorry, no luck for you'); _garageContract = contractAddress; } //Activate sale for token function toggleTokenSale() public { require(msg.sender == contOwner, 'Sorry, no luck for you'); _saleOpen = !_saleOpen; } function setRate(uint256 newRate) public { require(msg.sender == contOwner, 'Big no-no'); rate = newRate; } //Reward minters - Add virtual tokens function rewardOnMint(address _user, uint256 _amount) external { require(msg.sender == address(wofContract), "Can't call this"); uint256 tokenId = wofContract.mintedcount(); uint256 time = block.timestamp; if(tokenId < 2501) { rewards[_user] = rewards[_user].add(500 ether); } else { rewards[_user] = rewards[_user].add(_amount); } lastUpdate[_user] = time; } //GET BALANCE FOR SINGLE TOKEN function getClaimable(address _owner) public view returns(uint256){ uint256 time = block.timestamp; if(lastUpdate[_owner] == 0) { return 0; } else if(time < ENDTIME) { uint256 pending = wofContract.balanceOG(_owner).mul(BASE_RATE.mul((time.sub(lastUpdate[_owner])))).div(86400); uint256 total = rewards[_owner].add(pending); return total; } else { return rewards[_owner]; } } struct Rewardees { address owner; uint256 amount; } //Reward tokens to minted users function initialReward(Rewardees [] memory _array, uint256 time) public { require(msg.sender == contOwner, 'Big no-no'); for(uint i=0; i < _array.length; i++){ rewards[_array[i].owner] = _array[i].amount; lastUpdate[_array[i].owner] = time; } } //SET BALANCE FOR TOKEN function setBalance(Rewardees [] memory _array) public { require(msg.sender == contOwner || msg.sender == address(_garageContract), 'Big no-no'); for(uint i=0; i < _array.length; i++){ rewards[_array[i].owner] = _array[i].amount; } } function transferTokens(address _from, address _to) external { require(msg.sender == address(wofContract)); uint256 time = block.timestamp; rewards[_from] = getClaimable(_from); lastUpdate[_from] = time; rewards[_to] = getClaimable(_to); lastUpdate[_to] = time; } //Buy tokens from contract function buyMint(address _to, uint256 _amount) public payable { require(msg.value >= _amount.mul(buyPrice), 'Send more eth'); require(_saleOpen == true, 'Can not buy at the moment'); uint256 eth = _amount.mul(1 ether); _mint(_to, eth); } function rewardUsers(address _to, uint256 _amount) public { require(msg.sender == contOwner, 'Sorry, no luck for you'); uint256 time = block.timestamp; uint256 unclaimed = getClaimable(_to); rewards[_to] = rewards[_to].add(_amount).add(unclaimed); lastUpdate[_to] = time; } function claimTokens(address _to, uint256 _amount) public { require(_amount <= getClaimable(_to), 'You do not have this much'); rewards[_to] = getClaimable(_to); uint256 time = block.timestamp; rewards[_to] = rewards[_to].sub(_amount); lastUpdate[_to] = time; _mint(_to, _amount ); } //BURN THE TOKENS FOR NAMECHANGE function burn(address _from, uint256 _amount) external { require(msg.sender == address(wofContract) || msg.sender == address(_garageContract)); uint256 valueInEth = _amount/(1 ether); if(cut) { uint256 percentage = rate.div(100); uint256 cuttable = valueInEth.div(percentage); uint256 burnable = valueInEth.sub(cuttable); _transfer(_from, cutAddres, cuttable); _burn(_from, burnable); } else { _burn(_from, valueInEth); } } //GET ETH FROM CONTRACT function withdraw(address payable to, uint256 amount) public { require(msg.sender == contOwner); to.transfer(amount); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_wof","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"CONTRACT_OWNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUNKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardee","type":"address[]"}],"name":"airdropMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"awardAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isMintedforToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintPunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftContract","outputs":[{"internalType":"contract IWorldOfFreight","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"openMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setAwardAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhitelistStatus","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":"uint256","name":"","type":"uint256"}],"name":"tokenMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600c5563617c36a0600d556000600e60006101000a81548160ff021916908315150217905550600a600f55600a6010556000601160006101000a81548160ff021916908315150217905550604051806020016040528060008152506013908051906020019062000078929190620002c3565b503480156200008657600080fd5b5060405162005da438038062005da48339818101604052810190620000ac9190620003dd565b6040518060400160405280600d81526020017f467265696768742050756e6b73000000000000000000000000000000000000008152506040518060400160405280600581526020017f4650554e4b000000000000000000000000000000000000000000000000000000815250816000908051906020019062000130929190620002c3565b50806001908051906020019062000149929190620002c3565b5050506200016c62000160620001f560201b60201c565b620001fd60201b60201c565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000474565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002d1906200043e565b90600052602060002090601f016020900481019282620002f5576000855562000341565b82601f106200031057805160ff191683800117855562000341565b8280016001018555821562000341579182015b828111156200034057825182559160200191906001019062000323565b5b50905062000350919062000354565b5090565b5b808211156200036f57600081600090555060010162000355565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003a58262000378565b9050919050565b620003b78162000398565b8114620003c357600080fd5b50565b600081519050620003d781620003ac565b92915050565b600060208284031215620003f657620003f562000373565b5b60006200040684828501620003c6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045757607f821691505b602082108114156200046e576200046d6200040f565b5b50919050565b61592080620004846000396000f3fe6080604052600436106102675760003560e01c80637dfed9fe11610144578063afdf6134116100b6578063d56d229d1161007a578063d56d229d14610915578063deb59b3b14610940578063e985e9c51461096b578063f2fde38b146109a8578063f6a03ebf146109d1578063fd301c49146109fa57610267565b8063afdf613414610834578063b88d4fde1461085d578063c4d1957b14610886578063c87b56dd146108af578063cfa08b7c146108ec57610267565b806391860f781161010857806391860f781461073857806391b7f5ed1461076357806395d89b411461078c5780639b19251a146107b7578063a22cb465146107f4578063a8d43bd81461081d57610267565b80637dfed9fe1461067b5780637f649783146106925780638389e180146106bb578063868ff4a2146106e45780638da5cb5b1461070d57610267565b806342842e0e116101dd57806355f804b3116101a157806355f804b31461056d5780636352211e146105965780636373a6b1146105d357806370a08231146105fe578063715018a61461063b578063736fe5651461065257610267565b806342842e0e146104855780634287084f146104ae5780634e53faf1146104ca5780634f6ccce714610507578063547520fe1461054457610267565b8063097c0f361161022f578063097c0f3614610363578063109695231461038e57806318160ddd146103b757806323b872dd146103e25780632f745c591461040b578063306c96971461044857610267565b806301ffc9a71461026c578063045f7850146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613bae565b610a25565b6040516102a09190613bf6565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613ca5565b610a9f565b005b3480156102de57600080fd5b506102e7610c12565b6040516102f49190613d7e565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190613da0565b610ca4565b6040516103319190613ddc565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190613ca5565b610d29565b005b34801561036f57600080fd5b50610378610e41565b6040516103859190613ddc565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613f2c565b610e67565b005b3480156103c357600080fd5b506103cc610efd565b6040516103d99190613f84565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190613f9f565b610f0a565b005b34801561041757600080fd5b50610432600480360381019061042d9190613ca5565b610f6a565b60405161043f9190613f84565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a9190613da0565b61100f565b60405161047c9190613bf6565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613f9f565b61102f565b005b6104c860048036038101906104c39190613da0565b61104f565b005b3480156104d657600080fd5b506104f160048036038101906104ec9190613da0565b61115b565b6040516104fe9190613bf6565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190613da0565b611185565b60405161053b9190613f84565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190613da0565b6111f6565b005b34801561057957600080fd5b50610594600480360381019061058f9190613f2c565b61127c565b005b3480156105a257600080fd5b506105bd60048036038101906105b89190613da0565b611312565b6040516105ca9190613ddc565b60405180910390f35b3480156105df57600080fd5b506105e86113c4565b6040516105f59190613d7e565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613ff2565b611452565b6040516106329190613f84565b60405180910390f35b34801561064757600080fd5b5061065061150a565b005b34801561065e57600080fd5b506106796004803603810190610674919061405d565b611592565b005b34801561068757600080fd5b506106906116b3565b005b34801561069e57600080fd5b506106b960048036038101906106b49190614165565b61175b565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190614271565b61186c565b005b3480156106f057600080fd5b5061070b60048036038101906107069190613da0565b611c4e565b005b34801561071957600080fd5b50610722611ec1565b60405161072f9190613ddc565b60405180910390f35b34801561074457600080fd5b5061074d611eeb565b60405161075a9190613d7e565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190613da0565b611f79565b005b34801561079857600080fd5b506107a1611fff565b6040516107ae9190613d7e565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190613ff2565b612091565b6040516107eb9190613bf6565b60405180910390f35b34801561080057600080fd5b5061081b600480360381019061081691906142f9565b6120b1565b005b34801561082957600080fd5b50610832612232565b005b34801561084057600080fd5b5061085b60048036038101906108569190613da0565b6122da565b005b34801561086957600080fd5b50610884600480360381019061087f91906143da565b612360565b005b34801561089257600080fd5b506108ad60048036038101906108a89190614165565b6123c2565b005b3480156108bb57600080fd5b506108d660048036038101906108d19190613da0565b612550565b6040516108e39190613d7e565b60405180910390f35b3480156108f857600080fd5b50610913600480360381019061090e9190613ff2565b6125f7565b005b34801561092157600080fd5b5061092a6126b7565b60405161093791906144bc565b60405180910390f35b34801561094c57600080fd5b506109556126dd565b6040516109629190613f84565b60405180910390f35b34801561097757600080fd5b50610992600480360381019061098d91906144d7565b6126e3565b60405161099f9190613bf6565b60405180910390f35b3480156109b457600080fd5b506109cf60048036038101906109ca9190613ff2565b612777565b005b3480156109dd57600080fd5b506109f860048036038101906109f39190613da0565b61286f565b005b348015610a0657600080fd5b50610a0f6128f5565b604051610a1c9190613ddc565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a985750610a978261291b565b5b9050919050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b485750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90614563565b60405180910390fd5b612710610ba482610b96610efd565b6129fd90919063ffffffff16565b1115610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc906145cf565b60405180910390fd5b60005b81811015610c0d57610bf983612a13565b508080610c059061461e565b915050610be8565b505050565b606060008054610c2190614696565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4d90614696565b8015610c9a5780601f10610c6f57610100808354040283529160200191610c9a565b820191906000526020600020905b815481529060010190602001808311610c7d57829003601f168201915b5050505050905090565b6000610caf82612a85565b610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce59061473a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3482611312565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c906147cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dc4612af1565b73ffffffffffffffffffffffffffffffffffffffff161480610df35750610df281610ded612af1565b6126e3565b5b610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e299061485e565b60405180910390fd5b610e3c8383612af9565b505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e6f612af1565b73ffffffffffffffffffffffffffffffffffffffff16610e8d611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda906148ca565b60405180910390fd5b8060139080519060200190610ef9929190613a9f565b5050565b6000600880549050905090565b610f1b610f15612af1565b82612bb2565b610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f519061495c565b60405180910390fd5b610f65838383612c90565b505050565b6000610f7583611452565b8210610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad906149ee565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b61104a83838360405180602001604052806000815250612360565b505050565b60011515601160009054906101000a900460ff161515146110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90614a5a565b60405180910390fd5b600f548111156110ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e190614ac6565b60405180910390fd5b600c5434101561112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690614b32565b60405180910390fd5b60005b818110156111575761114333612a13565b50808061114f9061461e565b915050611132565b5050565b60006016600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061118f610efd565b82106111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790614bc4565b60405180910390fd5b600882815481106111e4576111e3614be4565b5b90600052602060002001549050919050565b6111fe612af1565b73ffffffffffffffffffffffffffffffffffffffff1661121c611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614611272576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611269906148ca565b60405180910390fd5b80600f8190555050565b611284612af1565b73ffffffffffffffffffffffffffffffffffffffff166112a2611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef906148ca565b60405180910390fd5b806014908051906020019061130e929190613a9f565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290614c85565b60405180910390fd5b80915050919050565b601380546113d190614696565b80601f01602080910402602001604051908101604052809291908181526020018280546113fd90614696565b801561144a5780601f1061141f5761010080835404028352916020019161144a565b820191906000526020600020905b81548152906001019060200180831161142d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614d17565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611512612af1565b73ffffffffffffffffffffffffffffffffffffffff16611530611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d906148ca565b60405180910390fd5b6115906000612eec565b565b61159a612af1565b73ffffffffffffffffffffffffffffffffffffffff166115b8611ec1565b73ffffffffffffffffffffffffffffffffffffffff161461160e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611605906148ca565b60405180910390fd5b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461166857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116ae573d6000803e3d6000fd5b505050565b6116bb612af1565b73ffffffffffffffffffffffffffffffffffffffff166116d9611ec1565b73ffffffffffffffffffffffffffffffffffffffff161461172f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611726906148ca565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b611763612af1565b73ffffffffffffffffffffffffffffffffffffffff16611781611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce906148ca565b60405180910390fd5b60005b8151811015611868576001601760008484815181106117fc576117fb614be4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806118609061461e565b9150506117da565b5050565b600d544210156118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890614d83565b60405180910390fd5b808251146118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614e15565b60405180910390fd5b636185c58042111561193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290614e81565b60405180910390fd5b80601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016119979190613ddc565b60206040518083038186803b1580156119af57600080fd5b505afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190614eb6565b1015611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614f2f565b60405180910390fd5b60005b81811015611c49576000151560166000858481518110611a4e57611a4d614be4565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16151514611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab90614f9b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110611b1c57611b1b614be4565b5b60200260200101516040518263ffffffff1660e01b8152600401611b409190613f84565b60206040518083038186803b158015611b5857600080fd5b505afa158015611b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b909190614fd0565b73ffffffffffffffffffffffffffffffffffffffff1614611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90615049565b60405180910390fd5b600160166000858481518110611bff57611bfe614be4565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550611c3533612a13565b508080611c419061461e565b915050611a2b565b505050565b60011515600e60009054906101000a900460ff16151514611ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9b90614a5a565b60405180910390fd5b60011515601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e906150b5565b60405180910390fd5b600f54811115611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390614ac6565b60405180910390fd5b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546010541015611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790615121565b60405180910390fd5b60005b81811015611e2857611e1433612a13565b508080611e209061461e565b915050611e03565b50611e7b81601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129fd90919063ffffffff16565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60148054611ef890614696565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2490614696565b8015611f715780601f10611f4657610100808354040283529160200191611f71565b820191906000526020600020905b815481529060010190602001808311611f5457829003601f168201915b505050505081565b611f81612af1565b73ffffffffffffffffffffffffffffffffffffffff16611f9f611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec906148ca565b60405180910390fd5b80600c8190555050565b60606001805461200e90614696565b80601f016020809104026020016040519081016040528092919081815260200182805461203a90614696565b80156120875780601f1061205c57610100808354040283529160200191612087565b820191906000526020600020905b81548152906001019060200180831161206a57829003601f168201915b5050505050905090565b60176020528060005260406000206000915054906101000a900460ff1681565b6120b9612af1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e9061518d565b60405180910390fd5b8060056000612134612af1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121e1612af1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122269190613bf6565b60405180910390a35050565b61223a612af1565b73ffffffffffffffffffffffffffffffffffffffff16612258611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146122ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a5906148ca565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6122e2612af1565b73ffffffffffffffffffffffffffffffffffffffff16612300611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d906148ca565b60405180910390fd5b8060108190555050565b61237161236b612af1565b83612bb2565b6123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a79061495c565b60405180910390fd5b6123bc84848484612fb2565b50505050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246b5750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614563565b60405180910390fd5b6127106124c882516124ba610efd565b6129fd90919063ffffffff16565b1115612509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612500906145cf565b60405180910390fd5b60005b815181101561254c5761253882828151811061252b5761252a614be4565b5b6020026020010151612a13565b5080806125449061461e565b91505061250c565b5050565b606061255b82612a85565b61259a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125919061521f565b60405180910390fd5b60006125a461300e565b905060008151116125c457604051806020016040528060008152506125ef565b806125ce846130a0565b6040516020016125df92919061527b565b6040516020818303038152906040525b915050919050565b6125ff612af1565b73ffffffffffffffffffffffffffffffffffffffff1661261d611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a906148ca565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61277f612af1565b73ffffffffffffffffffffffffffffffffffffffff1661279d611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146127f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ea906148ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a90615311565b60405180910390fd5b61286c81612eec565b50565b612877612af1565b73ffffffffffffffffffffffffffffffffffffffff16612895611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146128eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e2906148ca565b60405180910390fd5b80600d8190555050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129f657506129f582613201565b5b9050919050565b60008183612a0b9190615331565b905092915050565b6000612a1f600b61326b565b6000612a2b600b613281565b9050612710811115612a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a69906153d3565b60405180910390fd5b612a7c838261328f565b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b6c83611312565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bbd82612a85565b612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390615465565b60405180910390fd5b6000612c0783611312565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c7657508373ffffffffffffffffffffffffffffffffffffffff16612c5e84610ca4565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c875750612c8681856126e3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb082611312565b73ffffffffffffffffffffffffffffffffffffffff1614612d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfd906154f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6d90615589565b60405180910390fd5b612d818383836132ad565b612d8c600082612af9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ddc91906155a9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e339190615331565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fbd848484612c90565b612fc9848484846133c1565b613008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fff9061564f565b60405180910390fd5b50505050565b60606014805461301d90614696565b80601f016020809104026020016040519081016040528092919081815260200182805461304990614696565b80156130965780601f1061306b57610100808354040283529160200191613096565b820191906000526020600020905b81548152906001019060200180831161307957829003601f168201915b5050505050905090565b606060008214156130e8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131fc565b600082905060005b6000821461311a5780806131039061461e565b915050600a82613113919061569e565b91506130f0565b60008167ffffffffffffffff81111561313657613135613e01565b5b6040519080825280601f01601f1916602001820160405280156131685781602001600182028036833780820191505090505b5090505b600085146131f55760018261318191906155a9565b9150600a8561319091906156cf565b603061319c9190615331565b60f81b8183815181106131b2576131b1614be4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131ee919061569e565b945061316c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6132a9828260405180602001604052806000815250613558565b5050565b6132b88383836135b3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132fb576132f6816135b8565b61333a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613339576133388382613601565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561337d576133788161376e565b6133bc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133bb576133ba828261383f565b5b5b505050565b60006133e28473ffffffffffffffffffffffffffffffffffffffff166138be565b1561354b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261340b612af1565b8786866040518563ffffffff1660e01b815260040161342d9493929190615755565b602060405180830381600087803b15801561344757600080fd5b505af192505050801561347857506040513d601f19601f8201168201806040525081019061347591906157b6565b60015b6134fb573d80600081146134a8576040519150601f19603f3d011682016040523d82523d6000602084013e6134ad565b606091505b506000815114156134f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ea9061564f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613550565b600190505b949350505050565b61356283836138d1565b61356f60008484846133c1565b6135ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a59061564f565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161360e84611452565b61361891906155a9565b90506000600760008481526020019081526020016000205490508181146136fd576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061378291906155a9565b90506000600960008481526020019081526020016000205490506000600883815481106137b2576137b1614be4565b5b9060005260206000200154905080600883815481106137d4576137d3614be4565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613823576138226157e3565b5b6001900381819060005260206000200160009055905550505050565b600061384a83611452565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613941576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139389061585e565b60405180910390fd5b61394a81612a85565b1561398a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613981906158ca565b60405180910390fd5b613996600083836132ad565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139e69190615331565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613aab90614696565b90600052602060002090601f016020900481019282613acd5760008555613b14565b82601f10613ae657805160ff1916838001178555613b14565b82800160010185558215613b14579182015b82811115613b13578251825591602001919060010190613af8565b5b509050613b219190613b25565b5090565b5b80821115613b3e576000816000905550600101613b26565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b8b81613b56565b8114613b9657600080fd5b50565b600081359050613ba881613b82565b92915050565b600060208284031215613bc457613bc3613b4c565b5b6000613bd284828501613b99565b91505092915050565b60008115159050919050565b613bf081613bdb565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c3c82613c11565b9050919050565b613c4c81613c31565b8114613c5757600080fd5b50565b600081359050613c6981613c43565b92915050565b6000819050919050565b613c8281613c6f565b8114613c8d57600080fd5b50565b600081359050613c9f81613c79565b92915050565b60008060408385031215613cbc57613cbb613b4c565b5b6000613cca85828601613c5a565b9250506020613cdb85828601613c90565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d1f578082015181840152602081019050613d04565b83811115613d2e576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d5082613ce5565b613d5a8185613cf0565b9350613d6a818560208601613d01565b613d7381613d34565b840191505092915050565b60006020820190508181036000830152613d988184613d45565b905092915050565b600060208284031215613db657613db5613b4c565b5b6000613dc484828501613c90565b91505092915050565b613dd681613c31565b82525050565b6000602082019050613df16000830184613dcd565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e3982613d34565b810181811067ffffffffffffffff82111715613e5857613e57613e01565b5b80604052505050565b6000613e6b613b42565b9050613e778282613e30565b919050565b600067ffffffffffffffff821115613e9757613e96613e01565b5b613ea082613d34565b9050602081019050919050565b82818337600083830152505050565b6000613ecf613eca84613e7c565b613e61565b905082815260208101848484011115613eeb57613eea613dfc565b5b613ef6848285613ead565b509392505050565b600082601f830112613f1357613f12613df7565b5b8135613f23848260208601613ebc565b91505092915050565b600060208284031215613f4257613f41613b4c565b5b600082013567ffffffffffffffff811115613f6057613f5f613b51565b5b613f6c84828501613efe565b91505092915050565b613f7e81613c6f565b82525050565b6000602082019050613f996000830184613f75565b92915050565b600080600060608486031215613fb857613fb7613b4c565b5b6000613fc686828701613c5a565b9350506020613fd786828701613c5a565b9250506040613fe886828701613c90565b9150509250925092565b60006020828403121561400857614007613b4c565b5b600061401684828501613c5a565b91505092915050565b600061402a82613c11565b9050919050565b61403a8161401f565b811461404557600080fd5b50565b60008135905061405781614031565b92915050565b6000806040838503121561407457614073613b4c565b5b600061408285828601614048565b925050602061409385828601613c90565b9150509250929050565b600067ffffffffffffffff8211156140b8576140b7613e01565b5b602082029050602081019050919050565b600080fd5b60006140e16140dc8461409d565b613e61565b90508083825260208201905060208402830185811115614104576141036140c9565b5b835b8181101561412d57806141198882613c5a565b845260208401935050602081019050614106565b5050509392505050565b600082601f83011261414c5761414b613df7565b5b813561415c8482602086016140ce565b91505092915050565b60006020828403121561417b5761417a613b4c565b5b600082013567ffffffffffffffff81111561419957614198613b51565b5b6141a584828501614137565b91505092915050565b600067ffffffffffffffff8211156141c9576141c8613e01565b5b602082029050602081019050919050565b60006141ed6141e8846141ae565b613e61565b905080838252602082019050602084028301858111156142105761420f6140c9565b5b835b8181101561423957806142258882613c90565b845260208401935050602081019050614212565b5050509392505050565b600082601f83011261425857614257613df7565b5b81356142688482602086016141da565b91505092915050565b6000806040838503121561428857614287613b4c565b5b600083013567ffffffffffffffff8111156142a6576142a5613b51565b5b6142b285828601614243565b92505060206142c385828601613c90565b9150509250929050565b6142d681613bdb565b81146142e157600080fd5b50565b6000813590506142f3816142cd565b92915050565b600080604083850312156143105761430f613b4c565b5b600061431e85828601613c5a565b925050602061432f858286016142e4565b9150509250929050565b600067ffffffffffffffff82111561435457614353613e01565b5b61435d82613d34565b9050602081019050919050565b600061437d61437884614339565b613e61565b90508281526020810184848401111561439957614398613dfc565b5b6143a4848285613ead565b509392505050565b600082601f8301126143c1576143c0613df7565b5b81356143d184826020860161436a565b91505092915050565b600080600080608085870312156143f4576143f3613b4c565b5b600061440287828801613c5a565b945050602061441387828801613c5a565b935050604061442487828801613c90565b925050606085013567ffffffffffffffff81111561444557614444613b51565b5b614451878288016143ac565b91505092959194509250565b6000819050919050565b600061448261447d61447884613c11565b61445d565b613c11565b9050919050565b600061449482614467565b9050919050565b60006144a682614489565b9050919050565b6144b68161449b565b82525050565b60006020820190506144d160008301846144ad565b92915050565b600080604083850312156144ee576144ed613b4c565b5b60006144fc85828601613c5a565b925050602061450d85828601613c5a565b9150509250929050565b7f4e6f74207065726d697474656400000000000000000000000000000000000000600082015250565b600061454d600d83613cf0565b915061455882614517565b602082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f457865656473206d617800000000000000000000000000000000000000000000600082015250565b60006145b9600a83613cf0565b91506145c482614583565b602082019050919050565b600060208201905081810360008301526145e8816145ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061462982613c6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561465c5761465b6145ef565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146ae57607f821691505b602082108114156146c2576146c1614667565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614724602c83613cf0565b915061472f826146c8565b604082019050919050565b6000602082019050818103600083015261475381614717565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b6602183613cf0565b91506147c18261475a565b604082019050919050565b600060208201905081810360008301526147e5816147a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614848603883613cf0565b9150614853826147ec565b604082019050919050565b600060208201905081810360008301526148778161483b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148b4602083613cf0565b91506148bf8261487e565b602082019050919050565b600060208201905081810360008301526148e3816148a7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614946603183613cf0565b9150614951826148ea565b604082019050919050565b6000602082019050818103600083015261497581614939565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006149d8602b83613cf0565b91506149e38261497c565b604082019050919050565b60006020820190508181036000830152614a07816149cb565b9050919050565b7f4d696e74696e67206e6f74206f70656e00000000000000000000000000000000600082015250565b6000614a44601083613cf0565b9150614a4f82614a0e565b602082019050919050565b60006020820190508181036000830152614a7381614a37565b9050919050565b7f43616e206e6f74206d696e742074686973206d75636800000000000000000000600082015250565b6000614ab0601683613cf0565b9150614abb82614a7a565b602082019050919050565b60006020820190508181036000830152614adf81614aa3565b9050919050565b7f53656e64206d6f72652065746800000000000000000000000000000000000000600082015250565b6000614b1c600d83613cf0565b9150614b2782614ae6565b602082019050919050565b60006020820190508181036000830152614b4b81614b0f565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614bae602c83613cf0565b9150614bb982614b52565b604082019050919050565b60006020820190508181036000830152614bdd81614ba1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614c6f602983613cf0565b9150614c7a82614c13565b604082019050919050565b60006020820190508181036000830152614c9e81614c62565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614d01602a83613cf0565b9150614d0c82614ca5565b604082019050919050565b60006020820190508181036000830152614d3081614cf4565b9050919050565b7f536f7272792c206d696e74696e67206e6f742073746172746564207965740000600082015250565b6000614d6d601e83613cf0565b9150614d7882614d37565b602082019050919050565b60006020820190508181036000830152614d9c81614d60565b9050919050565b7f416d6f756e74206e6f7420657175616c20746f20746f6b656e49647320616d6f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b6000614dff602383613cf0565b9150614e0a82614da3565b604082019050919050565b60006020820190508181036000830152614e2e81614df2565b9050919050565b7f536f7272792c206d696e74696e672068617320656e6465640000000000000000600082015250565b6000614e6b601883613cf0565b9150614e7682614e35565b602082019050919050565b60006020820190508181036000830152614e9a81614e5e565b9050919050565b600081519050614eb081613c79565b92915050565b600060208284031215614ecc57614ecb613b4c565b5b6000614eda84828501614ea1565b91505092915050565b7f596f7520646f206e6f74206f776e20656e6f75676820574f46204e46542d7300600082015250565b6000614f19601f83613cf0565b9150614f2482614ee3565b602082019050919050565b60006020820190508181036000830152614f4881614f0c565b9050919050565b7f50756e6b20616c7265616479206d696e74656420666f722074686973204e4654600082015250565b6000614f85602083613cf0565b9150614f9082614f4f565b602082019050919050565b60006020820190508181036000830152614fb481614f78565b9050919050565b600081519050614fca81613c43565b92915050565b600060208284031215614fe657614fe5613b4c565b5b6000614ff484828501614fbb565b91505092915050565b7f596f7520646f206e6f74206f776e207468697320746f6b656e00000000000000600082015250565b6000615033601983613cf0565b915061503e82614ffd565b602082019050919050565b6000602082019050818103600083015261506281615026565b9050919050565b7f596f7520617265206e6f74206f6e2077686974656c6973740000000000000000600082015250565b600061509f601883613cf0565b91506150aa82615069565b602082019050919050565b600060208201905081810360008301526150ce81615092565b9050919050565b7f4d6178206d696e7473207065722077616c6c6574206163686965766564000000600082015250565b600061510b601d83613cf0565b9150615116826150d5565b602082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615177601983613cf0565b915061518282615141565b602082019050919050565b600060208201905081810360008301526151a68161516a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615209602f83613cf0565b9150615214826151ad565b604082019050919050565b60006020820190508181036000830152615238816151fc565b9050919050565b600081905092915050565b600061525582613ce5565b61525f818561523f565b935061526f818560208601613d01565b80840191505092915050565b6000615287828561524a565b9150615293828461524a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006152fb602683613cf0565b91506153068261529f565b604082019050919050565b6000602082019050818103600083015261532a816152ee565b9050919050565b600061533c82613c6f565b915061534783613c6f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561537c5761537b6145ef565b5b828201905092915050565b7f4d617820616c7265616479206d696e7465640000000000000000000000000000600082015250565b60006153bd601283613cf0565b91506153c882615387565b602082019050919050565b600060208201905081810360008301526153ec816153b0565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061544f602c83613cf0565b915061545a826153f3565b604082019050919050565b6000602082019050818103600083015261547e81615442565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006154e1602983613cf0565b91506154ec82615485565b604082019050919050565b60006020820190508181036000830152615510816154d4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615573602483613cf0565b915061557e82615517565b604082019050919050565b600060208201905081810360008301526155a281615566565b9050919050565b60006155b482613c6f565b91506155bf83613c6f565b9250828210156155d2576155d16145ef565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615639603283613cf0565b9150615644826155dd565b604082019050919050565b600060208201905081810360008301526156688161562c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006156a982613c6f565b91506156b483613c6f565b9250826156c4576156c361566f565b5b828204905092915050565b60006156da82613c6f565b91506156e583613c6f565b9250826156f5576156f461566f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061572782615700565b615731818561570b565b9350615741818560208601613d01565b61574a81613d34565b840191505092915050565b600060808201905061576a6000830187613dcd565b6157776020830186613dcd565b6157846040830185613f75565b8181036060830152615796818461571c565b905095945050505050565b6000815190506157b081613b82565b92915050565b6000602082840312156157cc576157cb613b4c565b5b60006157da848285016157a1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615848602083613cf0565b915061585382615812565b602082019050919050565b600060208201905081810360008301526158778161583b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006158b4601c83613cf0565b91506158bf8261587e565b602082019050919050565b600060208201905081810360008301526158e3816158a7565b905091905056fea26469706673582212203ca413742a37c4cbc083d9eb997c52285b096475250eedabb11bd9ffc0b34f0a64736f6c634300080900330000000000000000000000001a7e29a8c5d2320a1b56735b7654139e7b2860af
Deployed Bytecode
0x6080604052600436106102675760003560e01c80637dfed9fe11610144578063afdf6134116100b6578063d56d229d1161007a578063d56d229d14610915578063deb59b3b14610940578063e985e9c51461096b578063f2fde38b146109a8578063f6a03ebf146109d1578063fd301c49146109fa57610267565b8063afdf613414610834578063b88d4fde1461085d578063c4d1957b14610886578063c87b56dd146108af578063cfa08b7c146108ec57610267565b806391860f781161010857806391860f781461073857806391b7f5ed1461076357806395d89b411461078c5780639b19251a146107b7578063a22cb465146107f4578063a8d43bd81461081d57610267565b80637dfed9fe1461067b5780637f649783146106925780638389e180146106bb578063868ff4a2146106e45780638da5cb5b1461070d57610267565b806342842e0e116101dd57806355f804b3116101a157806355f804b31461056d5780636352211e146105965780636373a6b1146105d357806370a08231146105fe578063715018a61461063b578063736fe5651461065257610267565b806342842e0e146104855780634287084f146104ae5780634e53faf1146104ca5780634f6ccce714610507578063547520fe1461054457610267565b8063097c0f361161022f578063097c0f3614610363578063109695231461038e57806318160ddd146103b757806323b872dd146103e25780632f745c591461040b578063306c96971461044857610267565b806301ffc9a71461026c578063045f7850146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613bae565b610a25565b6040516102a09190613bf6565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613ca5565b610a9f565b005b3480156102de57600080fd5b506102e7610c12565b6040516102f49190613d7e565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190613da0565b610ca4565b6040516103319190613ddc565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190613ca5565b610d29565b005b34801561036f57600080fd5b50610378610e41565b6040516103859190613ddc565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613f2c565b610e67565b005b3480156103c357600080fd5b506103cc610efd565b6040516103d99190613f84565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190613f9f565b610f0a565b005b34801561041757600080fd5b50610432600480360381019061042d9190613ca5565b610f6a565b60405161043f9190613f84565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a9190613da0565b61100f565b60405161047c9190613bf6565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613f9f565b61102f565b005b6104c860048036038101906104c39190613da0565b61104f565b005b3480156104d657600080fd5b506104f160048036038101906104ec9190613da0565b61115b565b6040516104fe9190613bf6565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190613da0565b611185565b60405161053b9190613f84565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190613da0565b6111f6565b005b34801561057957600080fd5b50610594600480360381019061058f9190613f2c565b61127c565b005b3480156105a257600080fd5b506105bd60048036038101906105b89190613da0565b611312565b6040516105ca9190613ddc565b60405180910390f35b3480156105df57600080fd5b506105e86113c4565b6040516105f59190613d7e565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613ff2565b611452565b6040516106329190613f84565b60405180910390f35b34801561064757600080fd5b5061065061150a565b005b34801561065e57600080fd5b506106796004803603810190610674919061405d565b611592565b005b34801561068757600080fd5b506106906116b3565b005b34801561069e57600080fd5b506106b960048036038101906106b49190614165565b61175b565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190614271565b61186c565b005b3480156106f057600080fd5b5061070b60048036038101906107069190613da0565b611c4e565b005b34801561071957600080fd5b50610722611ec1565b60405161072f9190613ddc565b60405180910390f35b34801561074457600080fd5b5061074d611eeb565b60405161075a9190613d7e565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190613da0565b611f79565b005b34801561079857600080fd5b506107a1611fff565b6040516107ae9190613d7e565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190613ff2565b612091565b6040516107eb9190613bf6565b60405180910390f35b34801561080057600080fd5b5061081b600480360381019061081691906142f9565b6120b1565b005b34801561082957600080fd5b50610832612232565b005b34801561084057600080fd5b5061085b60048036038101906108569190613da0565b6122da565b005b34801561086957600080fd5b50610884600480360381019061087f91906143da565b612360565b005b34801561089257600080fd5b506108ad60048036038101906108a89190614165565b6123c2565b005b3480156108bb57600080fd5b506108d660048036038101906108d19190613da0565b612550565b6040516108e39190613d7e565b60405180910390f35b3480156108f857600080fd5b50610913600480360381019061090e9190613ff2565b6125f7565b005b34801561092157600080fd5b5061092a6126b7565b60405161093791906144bc565b60405180910390f35b34801561094c57600080fd5b506109556126dd565b6040516109629190613f84565b60405180910390f35b34801561097757600080fd5b50610992600480360381019061098d91906144d7565b6126e3565b60405161099f9190613bf6565b60405180910390f35b3480156109b457600080fd5b506109cf60048036038101906109ca9190613ff2565b612777565b005b3480156109dd57600080fd5b506109f860048036038101906109f39190613da0565b61286f565b005b348015610a0657600080fd5b50610a0f6128f5565b604051610a1c9190613ddc565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a985750610a978261291b565b5b9050919050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b485750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90614563565b60405180910390fd5b612710610ba482610b96610efd565b6129fd90919063ffffffff16565b1115610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc906145cf565b60405180910390fd5b60005b81811015610c0d57610bf983612a13565b508080610c059061461e565b915050610be8565b505050565b606060008054610c2190614696565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4d90614696565b8015610c9a5780601f10610c6f57610100808354040283529160200191610c9a565b820191906000526020600020905b815481529060010190602001808311610c7d57829003601f168201915b5050505050905090565b6000610caf82612a85565b610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce59061473a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3482611312565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c906147cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dc4612af1565b73ffffffffffffffffffffffffffffffffffffffff161480610df35750610df281610ded612af1565b6126e3565b5b610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e299061485e565b60405180910390fd5b610e3c8383612af9565b505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e6f612af1565b73ffffffffffffffffffffffffffffffffffffffff16610e8d611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda906148ca565b60405180910390fd5b8060139080519060200190610ef9929190613a9f565b5050565b6000600880549050905090565b610f1b610f15612af1565b82612bb2565b610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f519061495c565b60405180910390fd5b610f65838383612c90565b505050565b6000610f7583611452565b8210610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad906149ee565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b61104a83838360405180602001604052806000815250612360565b505050565b60011515601160009054906101000a900460ff161515146110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90614a5a565b60405180910390fd5b600f548111156110ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e190614ac6565b60405180910390fd5b600c5434101561112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690614b32565b60405180910390fd5b60005b818110156111575761114333612a13565b50808061114f9061461e565b915050611132565b5050565b60006016600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061118f610efd565b82106111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790614bc4565b60405180910390fd5b600882815481106111e4576111e3614be4565b5b90600052602060002001549050919050565b6111fe612af1565b73ffffffffffffffffffffffffffffffffffffffff1661121c611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614611272576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611269906148ca565b60405180910390fd5b80600f8190555050565b611284612af1565b73ffffffffffffffffffffffffffffffffffffffff166112a2611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef906148ca565b60405180910390fd5b806014908051906020019061130e929190613a9f565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290614c85565b60405180910390fd5b80915050919050565b601380546113d190614696565b80601f01602080910402602001604051908101604052809291908181526020018280546113fd90614696565b801561144a5780601f1061141f5761010080835404028352916020019161144a565b820191906000526020600020905b81548152906001019060200180831161142d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614d17565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611512612af1565b73ffffffffffffffffffffffffffffffffffffffff16611530611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d906148ca565b60405180910390fd5b6115906000612eec565b565b61159a612af1565b73ffffffffffffffffffffffffffffffffffffffff166115b8611ec1565b73ffffffffffffffffffffffffffffffffffffffff161461160e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611605906148ca565b60405180910390fd5b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461166857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116ae573d6000803e3d6000fd5b505050565b6116bb612af1565b73ffffffffffffffffffffffffffffffffffffffff166116d9611ec1565b73ffffffffffffffffffffffffffffffffffffffff161461172f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611726906148ca565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b611763612af1565b73ffffffffffffffffffffffffffffffffffffffff16611781611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce906148ca565b60405180910390fd5b60005b8151811015611868576001601760008484815181106117fc576117fb614be4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806118609061461e565b9150506117da565b5050565b600d544210156118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890614d83565b60405180910390fd5b808251146118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614e15565b60405180910390fd5b636185c58042111561193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290614e81565b60405180910390fd5b80601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016119979190613ddc565b60206040518083038186803b1580156119af57600080fd5b505afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190614eb6565b1015611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614f2f565b60405180910390fd5b60005b81811015611c49576000151560166000858481518110611a4e57611a4d614be4565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16151514611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab90614f9b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110611b1c57611b1b614be4565b5b60200260200101516040518263ffffffff1660e01b8152600401611b409190613f84565b60206040518083038186803b158015611b5857600080fd5b505afa158015611b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b909190614fd0565b73ffffffffffffffffffffffffffffffffffffffff1614611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90615049565b60405180910390fd5b600160166000858481518110611bff57611bfe614be4565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550611c3533612a13565b508080611c419061461e565b915050611a2b565b505050565b60011515600e60009054906101000a900460ff16151514611ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9b90614a5a565b60405180910390fd5b60011515601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e906150b5565b60405180910390fd5b600f54811115611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390614ac6565b60405180910390fd5b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546010541015611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790615121565b60405180910390fd5b60005b81811015611e2857611e1433612a13565b508080611e209061461e565b915050611e03565b50611e7b81601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129fd90919063ffffffff16565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60148054611ef890614696565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2490614696565b8015611f715780601f10611f4657610100808354040283529160200191611f71565b820191906000526020600020905b815481529060010190602001808311611f5457829003601f168201915b505050505081565b611f81612af1565b73ffffffffffffffffffffffffffffffffffffffff16611f9f611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec906148ca565b60405180910390fd5b80600c8190555050565b60606001805461200e90614696565b80601f016020809104026020016040519081016040528092919081815260200182805461203a90614696565b80156120875780601f1061205c57610100808354040283529160200191612087565b820191906000526020600020905b81548152906001019060200180831161206a57829003601f168201915b5050505050905090565b60176020528060005260406000206000915054906101000a900460ff1681565b6120b9612af1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e9061518d565b60405180910390fd5b8060056000612134612af1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121e1612af1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122269190613bf6565b60405180910390a35050565b61223a612af1565b73ffffffffffffffffffffffffffffffffffffffff16612258611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146122ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a5906148ca565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6122e2612af1565b73ffffffffffffffffffffffffffffffffffffffff16612300611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d906148ca565b60405180910390fd5b8060108190555050565b61237161236b612af1565b83612bb2565b6123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a79061495c565b60405180910390fd5b6123bc84848484612fb2565b50505050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246b5750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614563565b60405180910390fd5b6127106124c882516124ba610efd565b6129fd90919063ffffffff16565b1115612509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612500906145cf565b60405180910390fd5b60005b815181101561254c5761253882828151811061252b5761252a614be4565b5b6020026020010151612a13565b5080806125449061461e565b91505061250c565b5050565b606061255b82612a85565b61259a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125919061521f565b60405180910390fd5b60006125a461300e565b905060008151116125c457604051806020016040528060008152506125ef565b806125ce846130a0565b6040516020016125df92919061527b565b6040516020818303038152906040525b915050919050565b6125ff612af1565b73ffffffffffffffffffffffffffffffffffffffff1661261d611ec1565b73ffffffffffffffffffffffffffffffffffffffff1614612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a906148ca565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61277f612af1565b73ffffffffffffffffffffffffffffffffffffffff1661279d611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146127f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ea906148ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a90615311565b60405180910390fd5b61286c81612eec565b50565b612877612af1565b73ffffffffffffffffffffffffffffffffffffffff16612895611ec1565b73ffffffffffffffffffffffffffffffffffffffff16146128eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e2906148ca565b60405180910390fd5b80600d8190555050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129f657506129f582613201565b5b9050919050565b60008183612a0b9190615331565b905092915050565b6000612a1f600b61326b565b6000612a2b600b613281565b9050612710811115612a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a69906153d3565b60405180910390fd5b612a7c838261328f565b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b6c83611312565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bbd82612a85565b612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390615465565b60405180910390fd5b6000612c0783611312565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c7657508373ffffffffffffffffffffffffffffffffffffffff16612c5e84610ca4565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c875750612c8681856126e3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb082611312565b73ffffffffffffffffffffffffffffffffffffffff1614612d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfd906154f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6d90615589565b60405180910390fd5b612d818383836132ad565b612d8c600082612af9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ddc91906155a9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e339190615331565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fbd848484612c90565b612fc9848484846133c1565b613008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fff9061564f565b60405180910390fd5b50505050565b60606014805461301d90614696565b80601f016020809104026020016040519081016040528092919081815260200182805461304990614696565b80156130965780601f1061306b57610100808354040283529160200191613096565b820191906000526020600020905b81548152906001019060200180831161307957829003601f168201915b5050505050905090565b606060008214156130e8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131fc565b600082905060005b6000821461311a5780806131039061461e565b915050600a82613113919061569e565b91506130f0565b60008167ffffffffffffffff81111561313657613135613e01565b5b6040519080825280601f01601f1916602001820160405280156131685781602001600182028036833780820191505090505b5090505b600085146131f55760018261318191906155a9565b9150600a8561319091906156cf565b603061319c9190615331565b60f81b8183815181106131b2576131b1614be4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131ee919061569e565b945061316c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6132a9828260405180602001604052806000815250613558565b5050565b6132b88383836135b3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132fb576132f6816135b8565b61333a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613339576133388382613601565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561337d576133788161376e565b6133bc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133bb576133ba828261383f565b5b5b505050565b60006133e28473ffffffffffffffffffffffffffffffffffffffff166138be565b1561354b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261340b612af1565b8786866040518563ffffffff1660e01b815260040161342d9493929190615755565b602060405180830381600087803b15801561344757600080fd5b505af192505050801561347857506040513d601f19601f8201168201806040525081019061347591906157b6565b60015b6134fb573d80600081146134a8576040519150601f19603f3d011682016040523d82523d6000602084013e6134ad565b606091505b506000815114156134f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ea9061564f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613550565b600190505b949350505050565b61356283836138d1565b61356f60008484846133c1565b6135ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a59061564f565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161360e84611452565b61361891906155a9565b90506000600760008481526020019081526020016000205490508181146136fd576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061378291906155a9565b90506000600960008481526020019081526020016000205490506000600883815481106137b2576137b1614be4565b5b9060005260206000200154905080600883815481106137d4576137d3614be4565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613823576138226157e3565b5b6001900381819060005260206000200160009055905550505050565b600061384a83611452565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613941576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139389061585e565b60405180910390fd5b61394a81612a85565b1561398a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613981906158ca565b60405180910390fd5b613996600083836132ad565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139e69190615331565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613aab90614696565b90600052602060002090601f016020900481019282613acd5760008555613b14565b82601f10613ae657805160ff1916838001178555613b14565b82800160010185558215613b14579182015b82811115613b13578251825591602001919060010190613af8565b5b509050613b219190613b25565b5090565b5b80821115613b3e576000816000905550600101613b26565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b8b81613b56565b8114613b9657600080fd5b50565b600081359050613ba881613b82565b92915050565b600060208284031215613bc457613bc3613b4c565b5b6000613bd284828501613b99565b91505092915050565b60008115159050919050565b613bf081613bdb565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c3c82613c11565b9050919050565b613c4c81613c31565b8114613c5757600080fd5b50565b600081359050613c6981613c43565b92915050565b6000819050919050565b613c8281613c6f565b8114613c8d57600080fd5b50565b600081359050613c9f81613c79565b92915050565b60008060408385031215613cbc57613cbb613b4c565b5b6000613cca85828601613c5a565b9250506020613cdb85828601613c90565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d1f578082015181840152602081019050613d04565b83811115613d2e576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d5082613ce5565b613d5a8185613cf0565b9350613d6a818560208601613d01565b613d7381613d34565b840191505092915050565b60006020820190508181036000830152613d988184613d45565b905092915050565b600060208284031215613db657613db5613b4c565b5b6000613dc484828501613c90565b91505092915050565b613dd681613c31565b82525050565b6000602082019050613df16000830184613dcd565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e3982613d34565b810181811067ffffffffffffffff82111715613e5857613e57613e01565b5b80604052505050565b6000613e6b613b42565b9050613e778282613e30565b919050565b600067ffffffffffffffff821115613e9757613e96613e01565b5b613ea082613d34565b9050602081019050919050565b82818337600083830152505050565b6000613ecf613eca84613e7c565b613e61565b905082815260208101848484011115613eeb57613eea613dfc565b5b613ef6848285613ead565b509392505050565b600082601f830112613f1357613f12613df7565b5b8135613f23848260208601613ebc565b91505092915050565b600060208284031215613f4257613f41613b4c565b5b600082013567ffffffffffffffff811115613f6057613f5f613b51565b5b613f6c84828501613efe565b91505092915050565b613f7e81613c6f565b82525050565b6000602082019050613f996000830184613f75565b92915050565b600080600060608486031215613fb857613fb7613b4c565b5b6000613fc686828701613c5a565b9350506020613fd786828701613c5a565b9250506040613fe886828701613c90565b9150509250925092565b60006020828403121561400857614007613b4c565b5b600061401684828501613c5a565b91505092915050565b600061402a82613c11565b9050919050565b61403a8161401f565b811461404557600080fd5b50565b60008135905061405781614031565b92915050565b6000806040838503121561407457614073613b4c565b5b600061408285828601614048565b925050602061409385828601613c90565b9150509250929050565b600067ffffffffffffffff8211156140b8576140b7613e01565b5b602082029050602081019050919050565b600080fd5b60006140e16140dc8461409d565b613e61565b90508083825260208201905060208402830185811115614104576141036140c9565b5b835b8181101561412d57806141198882613c5a565b845260208401935050602081019050614106565b5050509392505050565b600082601f83011261414c5761414b613df7565b5b813561415c8482602086016140ce565b91505092915050565b60006020828403121561417b5761417a613b4c565b5b600082013567ffffffffffffffff81111561419957614198613b51565b5b6141a584828501614137565b91505092915050565b600067ffffffffffffffff8211156141c9576141c8613e01565b5b602082029050602081019050919050565b60006141ed6141e8846141ae565b613e61565b905080838252602082019050602084028301858111156142105761420f6140c9565b5b835b8181101561423957806142258882613c90565b845260208401935050602081019050614212565b5050509392505050565b600082601f83011261425857614257613df7565b5b81356142688482602086016141da565b91505092915050565b6000806040838503121561428857614287613b4c565b5b600083013567ffffffffffffffff8111156142a6576142a5613b51565b5b6142b285828601614243565b92505060206142c385828601613c90565b9150509250929050565b6142d681613bdb565b81146142e157600080fd5b50565b6000813590506142f3816142cd565b92915050565b600080604083850312156143105761430f613b4c565b5b600061431e85828601613c5a565b925050602061432f858286016142e4565b9150509250929050565b600067ffffffffffffffff82111561435457614353613e01565b5b61435d82613d34565b9050602081019050919050565b600061437d61437884614339565b613e61565b90508281526020810184848401111561439957614398613dfc565b5b6143a4848285613ead565b509392505050565b600082601f8301126143c1576143c0613df7565b5b81356143d184826020860161436a565b91505092915050565b600080600080608085870312156143f4576143f3613b4c565b5b600061440287828801613c5a565b945050602061441387828801613c5a565b935050604061442487828801613c90565b925050606085013567ffffffffffffffff81111561444557614444613b51565b5b614451878288016143ac565b91505092959194509250565b6000819050919050565b600061448261447d61447884613c11565b61445d565b613c11565b9050919050565b600061449482614467565b9050919050565b60006144a682614489565b9050919050565b6144b68161449b565b82525050565b60006020820190506144d160008301846144ad565b92915050565b600080604083850312156144ee576144ed613b4c565b5b60006144fc85828601613c5a565b925050602061450d85828601613c5a565b9150509250929050565b7f4e6f74207065726d697474656400000000000000000000000000000000000000600082015250565b600061454d600d83613cf0565b915061455882614517565b602082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f457865656473206d617800000000000000000000000000000000000000000000600082015250565b60006145b9600a83613cf0565b91506145c482614583565b602082019050919050565b600060208201905081810360008301526145e8816145ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061462982613c6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561465c5761465b6145ef565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146ae57607f821691505b602082108114156146c2576146c1614667565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614724602c83613cf0565b915061472f826146c8565b604082019050919050565b6000602082019050818103600083015261475381614717565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b6602183613cf0565b91506147c18261475a565b604082019050919050565b600060208201905081810360008301526147e5816147a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614848603883613cf0565b9150614853826147ec565b604082019050919050565b600060208201905081810360008301526148778161483b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148b4602083613cf0565b91506148bf8261487e565b602082019050919050565b600060208201905081810360008301526148e3816148a7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614946603183613cf0565b9150614951826148ea565b604082019050919050565b6000602082019050818103600083015261497581614939565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006149d8602b83613cf0565b91506149e38261497c565b604082019050919050565b60006020820190508181036000830152614a07816149cb565b9050919050565b7f4d696e74696e67206e6f74206f70656e00000000000000000000000000000000600082015250565b6000614a44601083613cf0565b9150614a4f82614a0e565b602082019050919050565b60006020820190508181036000830152614a7381614a37565b9050919050565b7f43616e206e6f74206d696e742074686973206d75636800000000000000000000600082015250565b6000614ab0601683613cf0565b9150614abb82614a7a565b602082019050919050565b60006020820190508181036000830152614adf81614aa3565b9050919050565b7f53656e64206d6f72652065746800000000000000000000000000000000000000600082015250565b6000614b1c600d83613cf0565b9150614b2782614ae6565b602082019050919050565b60006020820190508181036000830152614b4b81614b0f565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614bae602c83613cf0565b9150614bb982614b52565b604082019050919050565b60006020820190508181036000830152614bdd81614ba1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614c6f602983613cf0565b9150614c7a82614c13565b604082019050919050565b60006020820190508181036000830152614c9e81614c62565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614d01602a83613cf0565b9150614d0c82614ca5565b604082019050919050565b60006020820190508181036000830152614d3081614cf4565b9050919050565b7f536f7272792c206d696e74696e67206e6f742073746172746564207965740000600082015250565b6000614d6d601e83613cf0565b9150614d7882614d37565b602082019050919050565b60006020820190508181036000830152614d9c81614d60565b9050919050565b7f416d6f756e74206e6f7420657175616c20746f20746f6b656e49647320616d6f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b6000614dff602383613cf0565b9150614e0a82614da3565b604082019050919050565b60006020820190508181036000830152614e2e81614df2565b9050919050565b7f536f7272792c206d696e74696e672068617320656e6465640000000000000000600082015250565b6000614e6b601883613cf0565b9150614e7682614e35565b602082019050919050565b60006020820190508181036000830152614e9a81614e5e565b9050919050565b600081519050614eb081613c79565b92915050565b600060208284031215614ecc57614ecb613b4c565b5b6000614eda84828501614ea1565b91505092915050565b7f596f7520646f206e6f74206f776e20656e6f75676820574f46204e46542d7300600082015250565b6000614f19601f83613cf0565b9150614f2482614ee3565b602082019050919050565b60006020820190508181036000830152614f4881614f0c565b9050919050565b7f50756e6b20616c7265616479206d696e74656420666f722074686973204e4654600082015250565b6000614f85602083613cf0565b9150614f9082614f4f565b602082019050919050565b60006020820190508181036000830152614fb481614f78565b9050919050565b600081519050614fca81613c43565b92915050565b600060208284031215614fe657614fe5613b4c565b5b6000614ff484828501614fbb565b91505092915050565b7f596f7520646f206e6f74206f776e207468697320746f6b656e00000000000000600082015250565b6000615033601983613cf0565b915061503e82614ffd565b602082019050919050565b6000602082019050818103600083015261506281615026565b9050919050565b7f596f7520617265206e6f74206f6e2077686974656c6973740000000000000000600082015250565b600061509f601883613cf0565b91506150aa82615069565b602082019050919050565b600060208201905081810360008301526150ce81615092565b9050919050565b7f4d6178206d696e7473207065722077616c6c6574206163686965766564000000600082015250565b600061510b601d83613cf0565b9150615116826150d5565b602082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615177601983613cf0565b915061518282615141565b602082019050919050565b600060208201905081810360008301526151a68161516a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615209602f83613cf0565b9150615214826151ad565b604082019050919050565b60006020820190508181036000830152615238816151fc565b9050919050565b600081905092915050565b600061525582613ce5565b61525f818561523f565b935061526f818560208601613d01565b80840191505092915050565b6000615287828561524a565b9150615293828461524a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006152fb602683613cf0565b91506153068261529f565b604082019050919050565b6000602082019050818103600083015261532a816152ee565b9050919050565b600061533c82613c6f565b915061534783613c6f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561537c5761537b6145ef565b5b828201905092915050565b7f4d617820616c7265616479206d696e7465640000000000000000000000000000600082015250565b60006153bd601283613cf0565b91506153c882615387565b602082019050919050565b600060208201905081810360008301526153ec816153b0565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061544f602c83613cf0565b915061545a826153f3565b604082019050919050565b6000602082019050818103600083015261547e81615442565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006154e1602983613cf0565b91506154ec82615485565b604082019050919050565b60006020820190508181036000830152615510816154d4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615573602483613cf0565b915061557e82615517565b604082019050919050565b600060208201905081810360008301526155a281615566565b9050919050565b60006155b482613c6f565b91506155bf83613c6f565b9250828210156155d2576155d16145ef565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615639603283613cf0565b9150615644826155dd565b604082019050919050565b600060208201905081810360008301526156688161562c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006156a982613c6f565b91506156b483613c6f565b9250826156c4576156c361566f565b5b828204905092915050565b60006156da82613c6f565b91506156e583613c6f565b9250826156f5576156f461566f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061572782615700565b615731818561570b565b9350615741818560208601613d01565b61574a81613d34565b840191505092915050565b600060808201905061576a6000830187613dcd565b6157776020830186613dcd565b6157846040830185613f75565b8181036060830152615796818461571c565b905095945050505050565b6000815190506157b081613b82565b92915050565b6000602082840312156157cc576157cb613b4c565b5b60006157da848285016157a1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615848602083613cf0565b915061585382615812565b602082019050919050565b600060208201905081810360008301526158778161583b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006158b4601c83613cf0565b91506158bf8261587e565b602082019050919050565b600060208201905081810360008301526158e3816158a7565b905091905056fea26469706673582212203ca413742a37c4cbc083d9eb997c52285b096475250eedabb11bd9ffc0b34f0a64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001a7e29a8c5d2320a1b56735b7654139e7b2860af
-----Decoded View---------------
Arg [0] : _wof (address): 0x1a7E29a8c5d2320a1b56735B7654139E7B2860aF
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a7e29a8c5d2320a1b56735b7654139e7b2860af
Deployed Bytecode Sourcemap
550:5439:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:222:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5210:317:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2414:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3925:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3463:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1117:27:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1574:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1535:111:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4789:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1211:253:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1422:41:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5185:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4458:341:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2752:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1718:230:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2416:91:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1811:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2117:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1151:29:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1855:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1605:92:0;;;;;;;;;;;;;:::i;:::-;;5822:164:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2544:103;;;;;;;;;;;;;:::i;:::-;;3682:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2908:742;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3907:523;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;973:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1187:24:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2653:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2576:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1470:41:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4209:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2185:108:17;;;;;;;;;;;;;:::i;:::-;;2299:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5430:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4830:348:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2744:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1936:102:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1220:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;725:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4565:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1846:189:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2068:82:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1081:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;910:222:7;1012:4;1050:35;1035:50;;;:11;:50;;;;:90;;;;1089:36;1113:11;1089:23;:36::i;:::-;1035:90;1028:97;;910:222;;;:::o;5210:317:17:-;5297:14;;;;;;;;;;;5283:28;;:10;:28;;;:59;;;;5330:12;;;;;;;;;;;5315:27;;:10;:27;;;5283:59;5275:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;758:5;5379:26;5397:7;5379:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:39;;5371:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5449:6;5444:76;5465:7;5461:1;:11;5444:76;;;5494:14;5504:3;5494:9;:14::i;:::-;;5474:3;;;;;:::i;:::-;;;;5444:76;;;;5210:317;;:::o;2414:98:4:-;2468:13;2500:5;2493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:98;:::o;3925:217::-;4001:7;4028:16;4036:7;4028;:16::i;:::-;4020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4111:15;:24;4127:7;4111:24;;;;;;;;;;;;;;;;;;;;;4104:31;;3925:217;;;:::o;3463:401::-;3543:13;3559:23;3574:7;3559:14;:23::i;:::-;3543:39;;3606:5;3600:11;;:2;:11;;;;3592:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3697:5;3681:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3706:37;3723:5;3730:12;:10;:12::i;:::-;3706:16;:37::i;:::-;3681:62;3660:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3836:21;3845:2;3849:7;3836:8;:21::i;:::-;3533:331;3463:401;;:::o;1117:27:17:-;;;;;;;;;;;;;:::o;1574:120::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1672:14:17::1;1659:10;:27;;;;;;;;;;;;:::i;:::-;;1574:120:::0;:::o;1535:111:7:-;1596:7;1622:10;:17;;;;1615:24;;1535:111;:::o;4789:330:4:-;4978:41;4997:12;:10;:12::i;:::-;5011:7;4978:18;:41::i;:::-;4970:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;:::-;4789:330;;;:::o;1211:253:7:-;1308:7;1343:23;1360:5;1343:16;:23::i;:::-;1335:5;:31;1327:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1431:12;:19;1444:5;1431:19;;;;;;;;;;;;;;;:26;1451:5;1431:26;;;;;;;;;;;;1424:33;;1211:253;;;;:::o;1422:41:17:-;;;;;;;;;;;;;;;;;;;;;;:::o;5185:179:4:-;5318:39;5335:4;5341:2;5345:7;5318:39;;;;;;;;;;;;:16;:39::i;:::-;5185:179;;;:::o;4458:341:17:-;4547:4;4527:24;;:16;;;;;;;;;;;:24;;;4519:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;4602:8;;4591:7;:19;;4583:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4669:10;;4656:9;:23;;4648:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4714:6;4709:83;4730:7;4726:1;:11;4709:83;;;4759:21;4769:10;4759:9;:21::i;:::-;;4739:3;;;;;:::i;:::-;;;;4709:83;;;;4458:341;:::o;2752:117::-;2818:4;2842:9;:19;2852:8;2842:19;;;;;;;;;;;;;;;;;;;;;2835:26;;2752:117;;;:::o;1718:230:7:-;1793:7;1828:30;:28;:30::i;:::-;1820:5;:38;1812:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1924:10;1935:5;1924:17;;;;;;;;:::i;:::-;;;;;;;;;;1917:24;;1718:230;;;:::o;2416:91:17:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2492:7:17::1;2481:8;:18;;;;2416:91:::0;:::o;1811:93::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1892:4:17::1;1879:10;:17;;;;;;;;;;;;:::i;:::-;;1811:93:::0;:::o;2117:235:4:-;2189:7;2208:13;2224:7;:16;2232:7;2224:16;;;;;;;;;;;;;;;;;;;;;2208:32;;2275:1;2258:19;;:5;:19;;;;2250:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2340:5;2333:12;;;2117:235;;;:::o;1151:29:17:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1855:205:4:-;1927:7;1971:1;1954:19;;:5;:19;;;;1946:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2037:9;:16;2047:5;2037:16;;;;;;;;;;;;;;;;2030:23;;1855:205;;;:::o;1605:92:0:-;1196:12;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;5822:164:17:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5932:14:17::1;;;;;;;;;;;5918:28;;:10;:28;;;5910:37;;;::::0;::::1;;5958:2;:11;;:19;5970:6;5958:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5822:164:::0;;:::o;2544:103::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2623:16:17::1;;;;;;;;;;;2622:17;2603:16;;:36;;;;;;;;;;;;;;;;;;2544:103::o:0;3682:192::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3769:6:17::1;3764:103;3785:10;:17;3781:1;:21;3764:103;;;3851:4;3824:9;:24;3834:10;3845:1;3834:13;;;;;;;;:::i;:::-;;;;;;;;3824:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;3804:3;;;;;:::i;:::-;;;;3764:103;;;;3682:192:::0;:::o;2908:742::-;3016:5;;2997:15;:24;;2989:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3094:7;3075:8;:15;:26;3067:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;849:10;3160:15;:27;;3152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3272:7;3235:11;;;;;;;;;;;:21;;;3257:10;3235:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;3227:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;3331:6;3326:317;3347:7;3343:1;:11;3326:317;;;3410:5;3384:31;;:9;:22;3394:8;3403:1;3394:11;;;;;;;;:::i;:::-;;;;;;;;3384:22;;;;;;;;;;;;;;;;;;;;;:31;;;3376:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3511:10;3475:46;;:11;;;;;;;;;;;:19;;;3495:8;3504:1;3495:11;;;;;;;;:::i;:::-;;;;;;;;3475:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;3467:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;3591:4;3566:9;:22;3576:8;3585:1;3576:11;;;;;;;;:::i;:::-;;;;;;;;3566:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;3610:21;3620:10;3610:9;:21::i;:::-;;3356:3;;;;;:::i;:::-;;;;3326:317;;;;2908:742;;:::o;3907:523::-;3996:4;3973:27;;:19;;;;;;;;;;;:27;;;3965:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;4065:4;4040:29;;:9;:21;4050:10;4040:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;4032:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4128:8;;4117:7;:19;;4109:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4205:9;:21;4215:10;4205:21;;;;;;;;;;;;;;;;4182:19;;:44;;4174:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;4276:6;4271:83;4292:7;4288:1;:11;4271:83;;;4321:21;4331:10;4321:9;:21::i;:::-;;4301:3;;;;;:::i;:::-;;;;4271:83;;;;4388:34;4414:7;4388:9;:21;4398:10;4388:21;;;;;;;;;;;;;;;;:25;;:34;;;;:::i;:::-;4364:9;:21;4374:10;4364:21;;;;;;;;;;;;;;;:58;;;;3907:523;:::o;973:85:0:-;1019:7;1045:6;;;;;;;;;;;1038:13;;973:85;:::o;1187:24:17:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2653:91::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2729:7:17::1;2716:10;:20;;;;2653:91:::0;:::o;2576:102:4:-;2632:13;2664:7;2657:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:102;:::o;1470:41:17:-;;;;;;;;;;;;;;;;;;;;;;:::o;4209:290:4:-;4323:12;:10;:12::i;:::-;4311:24;;:8;:24;;;;4303:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4421:8;4376:18;:32;4395:12;:10;:12::i;:::-;4376:32;;;;;;;;;;;;;;;:42;4409:8;4376:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4473:8;4444:48;;4459:12;:10;:12::i;:::-;4444:48;;;4483:8;4444:48;;;;;;:::i;:::-;;;;;;;;4209:290;;:::o;2185:108:17:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2266:19:17::1;;;;;;;;;;;2265:20;2243:19;;:42;;;;;;;;;;;;;;;;;;2185:108::o:0;2299:111::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2395:7:17::1;2373:19;:29;;;;2299:111:::0;:::o;5430:320:4:-;5599:41;5618:12;:10;:12::i;:::-;5632:7;5599:18;:41::i;:::-;5591:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5704:39;5718:4;5724:2;5728:7;5737:5;5704:13;:39::i;:::-;5430:320;;;;:::o;4830:348:17:-;4920:14;;;;;;;;;;;4906:28;;:10;:28;;;:59;;;;4953:12;;;;;;;;;;;4938:27;;:10;:27;;;4906:59;4898:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;758:5;5002:35;5020:9;:16;5002:13;:11;:13::i;:::-;:17;;:35;;;;:::i;:::-;:48;;4994:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5081:6;5076:95;5097:9;:16;5093:1;:20;5076:95;;;5136:23;5146:9;5156:1;5146:12;;;;;;;;:::i;:::-;;;;;;;;5136:9;:23::i;:::-;;5115:3;;;;;:::i;:::-;;;;5076:95;;;;4830:348;:::o;2744:329:4:-;2817:13;2850:16;2858:7;2850;:16::i;:::-;2842:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2929:21;2953:10;:8;:10::i;:::-;2929:34;;3004:1;2986:7;2980:21;:25;:86;;;;;;;;;;;;;;;;;3032:7;3041:18;:7;:16;:18::i;:::-;3015:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2980:86;2973:93;;;2744:329;;;:::o;1936:102:17:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2022:8:17::1;2007:12;;:23;;;;;;;;;;;;;;;;;;1936:102:::0;:::o;1220:34::-;;;;;;;;;;;;;:::o;725:38::-;758:5;725:38;:::o;4565:162:4:-;4662:4;4685:18;:25;4704:5;4685:25;;;;;;;;;;;;;;;:35;4711:8;4685:35;;;;;;;;;;;;;;;;;;;;;;;;;4678:42;;4565:162;;;;:::o;1846:189:0:-;1196:12;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1954:1:::1;1934:22;;:8;:22;;;;1926:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2009:19;2019:8;2009:9;:19::i;:::-;1846:189:::0;:::o;2068:82:17:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:5:17::1;2129;:13;;;;2068:82:::0;:::o;1081:29::-;;;;;;;;;;;;;:::o;1496:300:4:-;1598:4;1648:25;1633:40;;;:11;:40;;;;:104;;;;1704:33;1689:48;;;:11;:48;;;;1633:104;:156;;;;1753:36;1777:11;1753:23;:36::i;:::-;1633:156;1614:175;;1496:300;;;:::o;2672:96:16:-;2730:7;2760:1;2756;:5;;;;:::i;:::-;2749:12;;2672:96;;;;:::o;5566:248:17:-;5616:7;5636:21;:9;:19;:21::i;:::-;5668:10;5681:19;:9;:17;:19::i;:::-;5668:32;;758:5;5719:2;:15;;5711:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5768:18;5778:3;5783:2;5768:9;:18::i;:::-;5804:2;5797:9;;;5566:248;;;:::o;7222:125:4:-;7287:4;7338:1;7310:30;;:7;:16;7318:7;7310:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7303:37;;7222:125;;;:::o;587:96:11:-;640:7;666:10;659:17;;587:96;:::o;11073:171:4:-;11174:2;11147:15;:24;11163:7;11147:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11229:7;11225:2;11191:46;;11200:23;11215:7;11200:14;:23::i;:::-;11191:46;;;;;;;;;;;;11073:171;;:::o;7505:344::-;7598:4;7622:16;7630:7;7622;:16::i;:::-;7614:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7697:13;7713:23;7728:7;7713:14;:23::i;:::-;7697:39;;7765:5;7754:16;;:7;:16;;;:51;;;;7798:7;7774:31;;:20;7786:7;7774:11;:20::i;:::-;:31;;;7754:51;:87;;;;7809:32;7826:5;7833:7;7809:16;:32::i;:::-;7754:87;7746:96;;;7505:344;;;;:::o;10402:560::-;10556:4;10529:31;;:23;10544:7;10529:14;:23::i;:::-;:31;;;10521:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10638:1;10624:16;;:2;:16;;;;10616:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10692:39;10713:4;10719:2;10723:7;10692:20;:39::i;:::-;10793:29;10810:1;10814:7;10793:8;:29::i;:::-;10852:1;10833:9;:15;10843:4;10833:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10880:1;10863:9;:13;10873:2;10863:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10910:2;10891:7;:16;10899:7;10891:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10947:7;10943:2;10928:27;;10937:4;10928:27;;;;;;;;;;;;10402:560;;;:::o;2041:169:0:-;2096:16;2115:6;;;;;;;;;;;2096:25;;2140:8;2131:6;;:17;;;;;;;;;;;;;;;;;;2194:8;2163:40;;2184:8;2163:40;;;;;;;;;;;;2086:124;2041:169;:::o;6612:307:4:-;6763:28;6773:4;6779:2;6783:7;6763:9;:28::i;:::-;6809:48;6832:4;6838:2;6842:7;6851:5;6809:22;:48::i;:::-;6801:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6612:307;;;;:::o;1700:103:17:-;1752:13;1785:10;1778:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1700:103;:::o;275:703:13:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;763:155:14:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;891:123:12:-;996:1;978:7;:14;;;:19;;;;;;;;;;;891:123;:::o;773:112::-;838:7;864;:14;;;857:21;;773:112;;;:::o;8179:108:4:-;8254:26;8264:2;8268:7;8254:26;;;;;;;;;;;;:9;:26::i;:::-;8179:108;;:::o;2544:572:7:-;2683:45;2710:4;2716:2;2720:7;2683:26;:45::i;:::-;2759:1;2743:18;;:4;:18;;;2739:183;;;2777:40;2809:7;2777:31;:40::i;:::-;2739:183;;;2846:2;2838:10;;:4;:10;;;2834:88;;2864:47;2897:4;2903:7;2864:32;:47::i;:::-;2834:88;2739:183;2949:1;2935:16;;:2;:16;;;2931:179;;;2967:45;3004:7;2967:36;:45::i;:::-;2931:179;;;3039:4;3033:10;;:2;:10;;;3029:81;;3059:40;3087:2;3091:7;3059:27;:40::i;:::-;3029:81;2931:179;2544:572;;;:::o;11797:778:4:-;11947:4;11967:15;:2;:13;;;:15::i;:::-;11963:606;;;12018:2;12002:36;;;12039:12;:10;:12::i;:::-;12053:4;12059:7;12068:5;12002:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11998:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12258:1;12241:6;:13;:18;12237:266;;;12283:60;;;;;;;;;;:::i;:::-;;;;;;;;12237:266;12455:6;12449:13;12440:6;12436:2;12432:15;12425:38;11998:519;12134:41;;;12124:51;;;:6;:51;;;;12117:58;;;;;11963:606;12554:4;12547:11;;11797:778;;;;;;;:::o;8508:311::-;8633:18;8639:2;8643:7;8633:5;:18::i;:::-;8682:54;8713:1;8717:2;8721:7;8730:5;8682:22;:54::i;:::-;8661:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8508:311;;;:::o;13131:122::-;;;;:::o;3822:161:7:-;3925:10;:17;;;;3898:15;:24;3914:7;3898:24;;;;;;;;;;;:44;;;;3952:10;3968:7;3952:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3822:161;:::o;4600:970::-;4862:22;4912:1;4887:22;4904:4;4887:16;:22::i;:::-;:26;;;;:::i;:::-;4862:51;;4923:18;4944:17;:26;4962:7;4944:26;;;;;;;;;;;;4923:47;;5088:14;5074:10;:28;5070:323;;5118:19;5140:12;:18;5153:4;5140:18;;;;;;;;;;;;;;;:34;5159:14;5140:34;;;;;;;;;;;;5118:56;;5222:11;5189:12;:18;5202:4;5189:18;;;;;;;;;;;;;;;:30;5208:10;5189:30;;;;;;;;;;;:44;;;;5338:10;5305:17;:30;5323:11;5305:30;;;;;;;;;;;:43;;;;5104:289;5070:323;5486:17;:26;5504:7;5486:26;;;;;;;;;;;5479:33;;;5529:12;:18;5542:4;5529:18;;;;;;;;;;;;;;;:34;5548:14;5529:34;;;;;;;;;;;5522:41;;;4681:889;;4600:970;;:::o;5858:1061::-;6107:22;6152:1;6132:10;:17;;;;:21;;;;:::i;:::-;6107:46;;6163:18;6184:15;:24;6200:7;6184:24;;;;;;;;;;;;6163:45;;6530:19;6552:10;6563:14;6552:26;;;;;;;;:::i;:::-;;;;;;;;;;6530:48;;6614:11;6589:10;6600;6589:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6724:10;6693:15;:28;6709:11;6693:28;;;;;;;;;;;:41;;;;6862:15;:24;6878:7;6862:24;;;;;;;;;;;6855:31;;;6896:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5929:990;;;5858:1061;:::o;3410:217::-;3494:14;3511:20;3528:2;3511:16;:20::i;:::-;3494:37;;3568:7;3541:12;:16;3554:2;3541:16;;;;;;;;;;;;;;;:24;3558:6;3541:24;;;;;;;;;;;:34;;;;3614:6;3585:17;:26;3603:7;3585:26;;;;;;;;;;;:35;;;;3484:143;3410:217;;:::o;718:377:10:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;9141:372:4:-;9234:1;9220:16;;:2;:16;;;;9212:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9292:16;9300:7;9292;:16::i;:::-;9291:17;9283:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9352:45;9381:1;9385:2;9389:7;9352:20;:45::i;:::-;9425:1;9408:9;:13;9418:2;9408:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9455:2;9436:7;:16;9444:7;9436:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9498:7;9494:2;9473:33;;9490:1;9473:33;;;;;;;;;;;;9141:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:22:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:77::-;2062:7;2091:5;2080:16;;2025:77;;;:::o;2108:122::-;2181:24;2199:5;2181:24;:::i;:::-;2174:5;2171:35;2161:63;;2220:1;2217;2210:12;2161:63;2108:122;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2236:139;;;;:::o;2381:474::-;2449:6;2457;2506:2;2494:9;2485:7;2481:23;2477:32;2474:119;;;2512:79;;:::i;:::-;2474:119;2632:1;2657:53;2702:7;2693:6;2682:9;2678:22;2657:53;:::i;:::-;2647:63;;2603:117;2759:2;2785:53;2830:7;2821:6;2810:9;2806:22;2785:53;:::i;:::-;2775:63;;2730:118;2381:474;;;;;:::o;2861:99::-;2913:6;2947:5;2941:12;2931:22;;2861:99;;;:::o;2966:169::-;3050:11;3084:6;3079:3;3072:19;3124:4;3119:3;3115:14;3100:29;;2966:169;;;;:::o;3141:307::-;3209:1;3219:113;3233:6;3230:1;3227:13;3219:113;;;3318:1;3313:3;3309:11;3303:18;3299:1;3294:3;3290:11;3283:39;3255:2;3252:1;3248:10;3243:15;;3219:113;;;3350:6;3347:1;3344:13;3341:101;;;3430:1;3421:6;3416:3;3412:16;3405:27;3341:101;3190:258;3141:307;;;:::o;3454:102::-;3495:6;3546:2;3542:7;3537:2;3530:5;3526:14;3522:28;3512:38;;3454:102;;;:::o;3562:364::-;3650:3;3678:39;3711:5;3678:39;:::i;:::-;3733:71;3797:6;3792:3;3733:71;:::i;:::-;3726:78;;3813:52;3858:6;3853:3;3846:4;3839:5;3835:16;3813:52;:::i;:::-;3890:29;3912:6;3890:29;:::i;:::-;3885:3;3881:39;3874:46;;3654:272;3562:364;;;;:::o;3932:313::-;4045:4;4083:2;4072:9;4068:18;4060:26;;4132:9;4126:4;4122:20;4118:1;4107:9;4103:17;4096:47;4160:78;4233:4;4224:6;4160:78;:::i;:::-;4152:86;;3932:313;;;;:::o;4251:329::-;4310:6;4359:2;4347:9;4338:7;4334:23;4330:32;4327:119;;;4365:79;;:::i;:::-;4327:119;4485:1;4510:53;4555:7;4546:6;4535:9;4531:22;4510:53;:::i;:::-;4500:63;;4456:117;4251:329;;;;:::o;4586:118::-;4673:24;4691:5;4673:24;:::i;:::-;4668:3;4661:37;4586:118;;:::o;4710:222::-;4803:4;4841:2;4830:9;4826:18;4818:26;;4854:71;4922:1;4911:9;4907:17;4898:6;4854:71;:::i;:::-;4710:222;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:104::-;8916:7;8945:24;8963:5;8945:24;:::i;:::-;8934:35;;8871:104;;;:::o;8981:138::-;9062:32;9088:5;9062:32;:::i;:::-;9055:5;9052:43;9042:71;;9109:1;9106;9099:12;9042:71;8981:138;:::o;9125:155::-;9179:5;9217:6;9204:20;9195:29;;9233:41;9268:5;9233:41;:::i;:::-;9125:155;;;;:::o;9286:490::-;9362:6;9370;9419:2;9407:9;9398:7;9394:23;9390:32;9387:119;;;9425:79;;:::i;:::-;9387:119;9545:1;9570:61;9623:7;9614:6;9603:9;9599:22;9570:61;:::i;:::-;9560:71;;9516:125;9680:2;9706:53;9751:7;9742:6;9731:9;9727:22;9706:53;:::i;:::-;9696:63;;9651:118;9286:490;;;;;:::o;9782:311::-;9859:4;9949:18;9941:6;9938:30;9935:56;;;9971:18;;:::i;:::-;9935:56;10021:4;10013:6;10009:17;10001:25;;10081:4;10075;10071:15;10063:23;;9782:311;;;:::o;10099:117::-;10208:1;10205;10198:12;10239:710;10335:5;10360:81;10376:64;10433:6;10376:64;:::i;:::-;10360:81;:::i;:::-;10351:90;;10461:5;10490:6;10483:5;10476:21;10524:4;10517:5;10513:16;10506:23;;10577:4;10569:6;10565:17;10557:6;10553:30;10606:3;10598:6;10595:15;10592:122;;;10625:79;;:::i;:::-;10592:122;10740:6;10723:220;10757:6;10752:3;10749:15;10723:220;;;10832:3;10861:37;10894:3;10882:10;10861:37;:::i;:::-;10856:3;10849:50;10928:4;10923:3;10919:14;10912:21;;10799:144;10783:4;10778:3;10774:14;10767:21;;10723:220;;;10727:21;10341:608;;10239:710;;;;;:::o;10972:370::-;11043:5;11092:3;11085:4;11077:6;11073:17;11069:27;11059:122;;11100:79;;:::i;:::-;11059:122;11217:6;11204:20;11242:94;11332:3;11324:6;11317:4;11309:6;11305:17;11242:94;:::i;:::-;11233:103;;11049:293;10972:370;;;;:::o;11348:539::-;11432:6;11481:2;11469:9;11460:7;11456:23;11452:32;11449:119;;;11487:79;;:::i;:::-;11449:119;11635:1;11624:9;11620:17;11607:31;11665:18;11657:6;11654:30;11651:117;;;11687:79;;:::i;:::-;11651:117;11792:78;11862:7;11853:6;11842:9;11838:22;11792:78;:::i;:::-;11782:88;;11578:302;11348:539;;;;:::o;11893:311::-;11970:4;12060:18;12052:6;12049:30;12046:56;;;12082:18;;:::i;:::-;12046:56;12132:4;12124:6;12120:17;12112:25;;12192:4;12186;12182:15;12174:23;;11893:311;;;:::o;12227:710::-;12323:5;12348:81;12364:64;12421:6;12364:64;:::i;:::-;12348:81;:::i;:::-;12339:90;;12449:5;12478:6;12471:5;12464:21;12512:4;12505:5;12501:16;12494:23;;12565:4;12557:6;12553:17;12545:6;12541:30;12594:3;12586:6;12583:15;12580:122;;;12613:79;;:::i;:::-;12580:122;12728:6;12711:220;12745:6;12740:3;12737:15;12711:220;;;12820:3;12849:37;12882:3;12870:10;12849:37;:::i;:::-;12844:3;12837:50;12916:4;12911:3;12907:14;12900:21;;12787:144;12771:4;12766:3;12762:14;12755:21;;12711:220;;;12715:21;12329:608;;12227:710;;;;;:::o;12960:370::-;13031:5;13080:3;13073:4;13065:6;13061:17;13057:27;13047:122;;13088:79;;:::i;:::-;13047:122;13205:6;13192:20;13230:94;13320:3;13312:6;13305:4;13297:6;13293:17;13230:94;:::i;:::-;13221:103;;13037:293;12960:370;;;;:::o;13336:684::-;13429:6;13437;13486:2;13474:9;13465:7;13461:23;13457:32;13454:119;;;13492:79;;:::i;:::-;13454:119;13640:1;13629:9;13625:17;13612:31;13670:18;13662:6;13659:30;13656:117;;;13692:79;;:::i;:::-;13656:117;13797:78;13867:7;13858:6;13847:9;13843:22;13797:78;:::i;:::-;13787:88;;13583:302;13924:2;13950:53;13995:7;13986:6;13975:9;13971:22;13950:53;:::i;:::-;13940:63;;13895:118;13336:684;;;;;:::o;14026:116::-;14096:21;14111:5;14096:21;:::i;:::-;14089:5;14086:32;14076:60;;14132:1;14129;14122:12;14076:60;14026:116;:::o;14148:133::-;14191:5;14229:6;14216:20;14207:29;;14245:30;14269:5;14245:30;:::i;:::-;14148:133;;;;:::o;14287:468::-;14352:6;14360;14409:2;14397:9;14388:7;14384:23;14380:32;14377:119;;;14415:79;;:::i;:::-;14377:119;14535:1;14560:53;14605:7;14596:6;14585:9;14581:22;14560:53;:::i;:::-;14550:63;;14506:117;14662:2;14688:50;14730:7;14721:6;14710:9;14706:22;14688:50;:::i;:::-;14678:60;;14633:115;14287:468;;;;;:::o;14761:307::-;14822:4;14912:18;14904:6;14901:30;14898:56;;;14934:18;;:::i;:::-;14898:56;14972:29;14994:6;14972:29;:::i;:::-;14964:37;;15056:4;15050;15046:15;15038:23;;14761:307;;;:::o;15074:410::-;15151:5;15176:65;15192:48;15233:6;15192:48;:::i;:::-;15176:65;:::i;:::-;15167:74;;15264:6;15257:5;15250:21;15302:4;15295:5;15291:16;15340:3;15331:6;15326:3;15322:16;15319:25;15316:112;;;15347:79;;:::i;:::-;15316:112;15437:41;15471:6;15466:3;15461;15437:41;:::i;:::-;15157:327;15074:410;;;;;:::o;15503:338::-;15558:5;15607:3;15600:4;15592:6;15588:17;15584:27;15574:122;;15615:79;;:::i;:::-;15574:122;15732:6;15719:20;15757:78;15831:3;15823:6;15816:4;15808:6;15804:17;15757:78;:::i;:::-;15748:87;;15564:277;15503:338;;;;:::o;15847:943::-;15942:6;15950;15958;15966;16015:3;16003:9;15994:7;15990:23;15986:33;15983:120;;;16022:79;;:::i;:::-;15983:120;16142:1;16167:53;16212:7;16203:6;16192:9;16188:22;16167:53;:::i;:::-;16157:63;;16113:117;16269:2;16295:53;16340:7;16331:6;16320:9;16316:22;16295:53;:::i;:::-;16285:63;;16240:118;16397:2;16423:53;16468:7;16459:6;16448:9;16444:22;16423:53;:::i;:::-;16413:63;;16368:118;16553:2;16542:9;16538:18;16525:32;16584:18;16576:6;16573:30;16570:117;;;16606:79;;:::i;:::-;16570:117;16711:62;16765:7;16756:6;16745:9;16741:22;16711:62;:::i;:::-;16701:72;;16496:287;15847:943;;;;;;;:::o;16796:60::-;16824:3;16845:5;16838:12;;16796:60;;;:::o;16862:142::-;16912:9;16945:53;16963:34;16972:24;16990:5;16972:24;:::i;:::-;16963:34;:::i;:::-;16945:53;:::i;:::-;16932:66;;16862:142;;;:::o;17010:126::-;17060:9;17093:37;17124:5;17093:37;:::i;:::-;17080:50;;17010:126;;;:::o;17142:150::-;17216:9;17249:37;17280:5;17249:37;:::i;:::-;17236:50;;17142:150;;;:::o;17298:179::-;17409:61;17464:5;17409:61;:::i;:::-;17404:3;17397:74;17298:179;;:::o;17483:270::-;17600:4;17638:2;17627:9;17623:18;17615:26;;17651:95;17743:1;17732:9;17728:17;17719:6;17651:95;:::i;:::-;17483:270;;;;:::o;17759:474::-;17827:6;17835;17884:2;17872:9;17863:7;17859:23;17855:32;17852:119;;;17890:79;;:::i;:::-;17852:119;18010:1;18035:53;18080:7;18071:6;18060:9;18056:22;18035:53;:::i;:::-;18025:63;;17981:117;18137:2;18163:53;18208:7;18199:6;18188:9;18184:22;18163:53;:::i;:::-;18153:63;;18108:118;17759:474;;;;;:::o;18239:163::-;18379:15;18375:1;18367:6;18363:14;18356:39;18239:163;:::o;18408:366::-;18550:3;18571:67;18635:2;18630:3;18571:67;:::i;:::-;18564:74;;18647:93;18736:3;18647:93;:::i;:::-;18765:2;18760:3;18756:12;18749:19;;18408:366;;;:::o;18780:419::-;18946:4;18984:2;18973:9;18969:18;18961:26;;19033:9;19027:4;19023:20;19019:1;19008:9;19004:17;18997:47;19061:131;19187:4;19061:131;:::i;:::-;19053:139;;18780:419;;;:::o;19205:160::-;19345:12;19341:1;19333:6;19329:14;19322:36;19205:160;:::o;19371:366::-;19513:3;19534:67;19598:2;19593:3;19534:67;:::i;:::-;19527:74;;19610:93;19699:3;19610:93;:::i;:::-;19728:2;19723:3;19719:12;19712:19;;19371:366;;;:::o;19743:419::-;19909:4;19947:2;19936:9;19932:18;19924:26;;19996:9;19990:4;19986:20;19982:1;19971:9;19967:17;19960:47;20024:131;20150:4;20024:131;:::i;:::-;20016:139;;19743:419;;;:::o;20168:180::-;20216:77;20213:1;20206:88;20313:4;20310:1;20303:15;20337:4;20334:1;20327:15;20354:233;20393:3;20416:24;20434:5;20416:24;:::i;:::-;20407:33;;20462:66;20455:5;20452:77;20449:103;;;20532:18;;:::i;:::-;20449:103;20579:1;20572:5;20568:13;20561:20;;20354:233;;;:::o;20593:180::-;20641:77;20638:1;20631:88;20738:4;20735:1;20728:15;20762:4;20759:1;20752:15;20779:320;20823:6;20860:1;20854:4;20850:12;20840:22;;20907:1;20901:4;20897:12;20928:18;20918:81;;20984:4;20976:6;20972:17;20962:27;;20918:81;21046:2;21038:6;21035:14;21015:18;21012:38;21009:84;;;21065:18;;:::i;:::-;21009:84;20830:269;20779:320;;;:::o;21105:231::-;21245:34;21241:1;21233:6;21229:14;21222:58;21314:14;21309:2;21301:6;21297:15;21290:39;21105:231;:::o;21342:366::-;21484:3;21505:67;21569:2;21564:3;21505:67;:::i;:::-;21498:74;;21581:93;21670:3;21581:93;:::i;:::-;21699:2;21694:3;21690:12;21683:19;;21342:366;;;:::o;21714:419::-;21880:4;21918:2;21907:9;21903:18;21895:26;;21967:9;21961:4;21957:20;21953:1;21942:9;21938:17;21931:47;21995:131;22121:4;21995:131;:::i;:::-;21987:139;;21714:419;;;:::o;22139:220::-;22279:34;22275:1;22267:6;22263:14;22256:58;22348:3;22343:2;22335:6;22331:15;22324:28;22139:220;:::o;22365:366::-;22507:3;22528:67;22592:2;22587:3;22528:67;:::i;:::-;22521:74;;22604:93;22693:3;22604:93;:::i;:::-;22722:2;22717:3;22713:12;22706:19;;22365:366;;;:::o;22737:419::-;22903:4;22941:2;22930:9;22926:18;22918:26;;22990:9;22984:4;22980:20;22976:1;22965:9;22961:17;22954:47;23018:131;23144:4;23018:131;:::i;:::-;23010:139;;22737:419;;;:::o;23162:243::-;23302:34;23298:1;23290:6;23286:14;23279:58;23371:26;23366:2;23358:6;23354:15;23347:51;23162:243;:::o;23411:366::-;23553:3;23574:67;23638:2;23633:3;23574:67;:::i;:::-;23567:74;;23650:93;23739:3;23650:93;:::i;:::-;23768:2;23763:3;23759:12;23752:19;;23411:366;;;:::o;23783:419::-;23949:4;23987:2;23976:9;23972:18;23964:26;;24036:9;24030:4;24026:20;24022:1;24011:9;24007:17;24000:47;24064:131;24190:4;24064:131;:::i;:::-;24056:139;;23783:419;;;:::o;24208:182::-;24348:34;24344:1;24336:6;24332:14;24325:58;24208:182;:::o;24396:366::-;24538:3;24559:67;24623:2;24618:3;24559:67;:::i;:::-;24552:74;;24635:93;24724:3;24635:93;:::i;:::-;24753:2;24748:3;24744:12;24737:19;;24396:366;;;:::o;24768:419::-;24934:4;24972:2;24961:9;24957:18;24949:26;;25021:9;25015:4;25011:20;25007:1;24996:9;24992:17;24985:47;25049:131;25175:4;25049:131;:::i;:::-;25041:139;;24768:419;;;:::o;25193:236::-;25333:34;25329:1;25321:6;25317:14;25310:58;25402:19;25397:2;25389:6;25385:15;25378:44;25193:236;:::o;25435:366::-;25577:3;25598:67;25662:2;25657:3;25598:67;:::i;:::-;25591:74;;25674:93;25763:3;25674:93;:::i;:::-;25792:2;25787:3;25783:12;25776:19;;25435:366;;;:::o;25807:419::-;25973:4;26011:2;26000:9;25996:18;25988:26;;26060:9;26054:4;26050:20;26046:1;26035:9;26031:17;26024:47;26088:131;26214:4;26088:131;:::i;:::-;26080:139;;25807:419;;;:::o;26232:230::-;26372:34;26368:1;26360:6;26356:14;26349:58;26441:13;26436:2;26428:6;26424:15;26417:38;26232:230;:::o;26468:366::-;26610:3;26631:67;26695:2;26690:3;26631:67;:::i;:::-;26624:74;;26707:93;26796:3;26707:93;:::i;:::-;26825:2;26820:3;26816:12;26809:19;;26468:366;;;:::o;26840:419::-;27006:4;27044:2;27033:9;27029:18;27021:26;;27093:9;27087:4;27083:20;27079:1;27068:9;27064:17;27057:47;27121:131;27247:4;27121:131;:::i;:::-;27113:139;;26840:419;;;:::o;27265:166::-;27405:18;27401:1;27393:6;27389:14;27382:42;27265:166;:::o;27437:366::-;27579:3;27600:67;27664:2;27659:3;27600:67;:::i;:::-;27593:74;;27676:93;27765:3;27676:93;:::i;:::-;27794:2;27789:3;27785:12;27778:19;;27437:366;;;:::o;27809:419::-;27975:4;28013:2;28002:9;27998:18;27990:26;;28062:9;28056:4;28052:20;28048:1;28037:9;28033:17;28026:47;28090:131;28216:4;28090:131;:::i;:::-;28082:139;;27809:419;;;:::o;28234:172::-;28374:24;28370:1;28362:6;28358:14;28351:48;28234:172;:::o;28412:366::-;28554:3;28575:67;28639:2;28634:3;28575:67;:::i;:::-;28568:74;;28651:93;28740:3;28651:93;:::i;:::-;28769:2;28764:3;28760:12;28753:19;;28412:366;;;:::o;28784:419::-;28950:4;28988:2;28977:9;28973:18;28965:26;;29037:9;29031:4;29027:20;29023:1;29012:9;29008:17;29001:47;29065:131;29191:4;29065:131;:::i;:::-;29057:139;;28784:419;;;:::o;29209:163::-;29349:15;29345:1;29337:6;29333:14;29326:39;29209:163;:::o;29378:366::-;29520:3;29541:67;29605:2;29600:3;29541:67;:::i;:::-;29534:74;;29617:93;29706:3;29617:93;:::i;:::-;29735:2;29730:3;29726:12;29719:19;;29378:366;;;:::o;29750:419::-;29916:4;29954:2;29943:9;29939:18;29931:26;;30003:9;29997:4;29993:20;29989:1;29978:9;29974:17;29967:47;30031:131;30157:4;30031:131;:::i;:::-;30023:139;;29750:419;;;:::o;30175:231::-;30315:34;30311:1;30303:6;30299:14;30292:58;30384:14;30379:2;30371:6;30367:15;30360:39;30175:231;:::o;30412:366::-;30554:3;30575:67;30639:2;30634:3;30575:67;:::i;:::-;30568:74;;30651:93;30740:3;30651:93;:::i;:::-;30769:2;30764:3;30760:12;30753:19;;30412:366;;;:::o;30784:419::-;30950:4;30988:2;30977:9;30973:18;30965:26;;31037:9;31031:4;31027:20;31023:1;31012:9;31008:17;31001:47;31065:131;31191:4;31065:131;:::i;:::-;31057:139;;30784:419;;;:::o;31209:180::-;31257:77;31254:1;31247:88;31354:4;31351:1;31344:15;31378:4;31375:1;31368:15;31395:228;31535:34;31531:1;31523:6;31519:14;31512:58;31604:11;31599:2;31591:6;31587:15;31580:36;31395:228;:::o;31629:366::-;31771:3;31792:67;31856:2;31851:3;31792:67;:::i;:::-;31785:74;;31868:93;31957:3;31868:93;:::i;:::-;31986:2;31981:3;31977:12;31970:19;;31629:366;;;:::o;32001:419::-;32167:4;32205:2;32194:9;32190:18;32182:26;;32254:9;32248:4;32244:20;32240:1;32229:9;32225:17;32218:47;32282:131;32408:4;32282:131;:::i;:::-;32274:139;;32001:419;;;:::o;32426:229::-;32566:34;32562:1;32554:6;32550:14;32543:58;32635:12;32630:2;32622:6;32618:15;32611:37;32426:229;:::o;32661:366::-;32803:3;32824:67;32888:2;32883:3;32824:67;:::i;:::-;32817:74;;32900:93;32989:3;32900:93;:::i;:::-;33018:2;33013:3;33009:12;33002:19;;32661:366;;;:::o;33033:419::-;33199:4;33237:2;33226:9;33222:18;33214:26;;33286:9;33280:4;33276:20;33272:1;33261:9;33257:17;33250:47;33314:131;33440:4;33314:131;:::i;:::-;33306:139;;33033:419;;;:::o;33458:180::-;33598:32;33594:1;33586:6;33582:14;33575:56;33458:180;:::o;33644:366::-;33786:3;33807:67;33871:2;33866:3;33807:67;:::i;:::-;33800:74;;33883:93;33972:3;33883:93;:::i;:::-;34001:2;33996:3;33992:12;33985:19;;33644:366;;;:::o;34016:419::-;34182:4;34220:2;34209:9;34205:18;34197:26;;34269:9;34263:4;34259:20;34255:1;34244:9;34240:17;34233:47;34297:131;34423:4;34297:131;:::i;:::-;34289:139;;34016:419;;;:::o;34441:222::-;34581:34;34577:1;34569:6;34565:14;34558:58;34650:5;34645:2;34637:6;34633:15;34626:30;34441:222;:::o;34669:366::-;34811:3;34832:67;34896:2;34891:3;34832:67;:::i;:::-;34825:74;;34908:93;34997:3;34908:93;:::i;:::-;35026:2;35021:3;35017:12;35010:19;;34669:366;;;:::o;35041:419::-;35207:4;35245:2;35234:9;35230:18;35222:26;;35294:9;35288:4;35284:20;35280:1;35269:9;35265:17;35258:47;35322:131;35448:4;35322:131;:::i;:::-;35314:139;;35041:419;;;:::o;35466:174::-;35606:26;35602:1;35594:6;35590:14;35583:50;35466:174;:::o;35646:366::-;35788:3;35809:67;35873:2;35868:3;35809:67;:::i;:::-;35802:74;;35885:93;35974:3;35885:93;:::i;:::-;36003:2;35998:3;35994:12;35987:19;;35646:366;;;:::o;36018:419::-;36184:4;36222:2;36211:9;36207:18;36199:26;;36271:9;36265:4;36261:20;36257:1;36246:9;36242:17;36235:47;36299:131;36425:4;36299:131;:::i;:::-;36291:139;;36018:419;;;:::o;36443:143::-;36500:5;36531:6;36525:13;36516:22;;36547:33;36574:5;36547:33;:::i;:::-;36443:143;;;;:::o;36592:351::-;36662:6;36711:2;36699:9;36690:7;36686:23;36682:32;36679:119;;;36717:79;;:::i;:::-;36679:119;36837:1;36862:64;36918:7;36909:6;36898:9;36894:22;36862:64;:::i;:::-;36852:74;;36808:128;36592:351;;;;:::o;36949:181::-;37089:33;37085:1;37077:6;37073:14;37066:57;36949:181;:::o;37136:366::-;37278:3;37299:67;37363:2;37358:3;37299:67;:::i;:::-;37292:74;;37375:93;37464:3;37375:93;:::i;:::-;37493:2;37488:3;37484:12;37477:19;;37136:366;;;:::o;37508:419::-;37674:4;37712:2;37701:9;37697:18;37689:26;;37761:9;37755:4;37751:20;37747:1;37736:9;37732:17;37725:47;37789:131;37915:4;37789:131;:::i;:::-;37781:139;;37508:419;;;:::o;37933:182::-;38073:34;38069:1;38061:6;38057:14;38050:58;37933:182;:::o;38121:366::-;38263:3;38284:67;38348:2;38343:3;38284:67;:::i;:::-;38277:74;;38360:93;38449:3;38360:93;:::i;:::-;38478:2;38473:3;38469:12;38462:19;;38121:366;;;:::o;38493:419::-;38659:4;38697:2;38686:9;38682:18;38674:26;;38746:9;38740:4;38736:20;38732:1;38721:9;38717:17;38710:47;38774:131;38900:4;38774:131;:::i;:::-;38766:139;;38493:419;;;:::o;38918:143::-;38975:5;39006:6;39000:13;38991:22;;39022:33;39049:5;39022:33;:::i;:::-;38918:143;;;;:::o;39067:351::-;39137:6;39186:2;39174:9;39165:7;39161:23;39157:32;39154:119;;;39192:79;;:::i;:::-;39154:119;39312:1;39337:64;39393:7;39384:6;39373:9;39369:22;39337:64;:::i;:::-;39327:74;;39283:128;39067:351;;;;:::o;39424:175::-;39564:27;39560:1;39552:6;39548:14;39541:51;39424:175;:::o;39605:366::-;39747:3;39768:67;39832:2;39827:3;39768:67;:::i;:::-;39761:74;;39844:93;39933:3;39844:93;:::i;:::-;39962:2;39957:3;39953:12;39946:19;;39605:366;;;:::o;39977:419::-;40143:4;40181:2;40170:9;40166:18;40158:26;;40230:9;40224:4;40220:20;40216:1;40205:9;40201:17;40194:47;40258:131;40384:4;40258:131;:::i;:::-;40250:139;;39977:419;;;:::o;40402:174::-;40542:26;40538:1;40530:6;40526:14;40519:50;40402:174;:::o;40582:366::-;40724:3;40745:67;40809:2;40804:3;40745:67;:::i;:::-;40738:74;;40821:93;40910:3;40821:93;:::i;:::-;40939:2;40934:3;40930:12;40923:19;;40582:366;;;:::o;40954:419::-;41120:4;41158:2;41147:9;41143:18;41135:26;;41207:9;41201:4;41197:20;41193:1;41182:9;41178:17;41171:47;41235:131;41361:4;41235:131;:::i;:::-;41227:139;;40954:419;;;:::o;41379:179::-;41519:31;41515:1;41507:6;41503:14;41496:55;41379:179;:::o;41564:366::-;41706:3;41727:67;41791:2;41786:3;41727:67;:::i;:::-;41720:74;;41803:93;41892:3;41803:93;:::i;:::-;41921:2;41916:3;41912:12;41905:19;;41564:366;;;:::o;41936:419::-;42102:4;42140:2;42129:9;42125:18;42117:26;;42189:9;42183:4;42179:20;42175:1;42164:9;42160:17;42153:47;42217:131;42343:4;42217:131;:::i;:::-;42209:139;;41936:419;;;:::o;42361:175::-;42501:27;42497:1;42489:6;42485:14;42478:51;42361:175;:::o;42542:366::-;42684:3;42705:67;42769:2;42764:3;42705:67;:::i;:::-;42698:74;;42781:93;42870:3;42781:93;:::i;:::-;42899:2;42894:3;42890:12;42883:19;;42542:366;;;:::o;42914:419::-;43080:4;43118:2;43107:9;43103:18;43095:26;;43167:9;43161:4;43157:20;43153:1;43142:9;43138:17;43131:47;43195:131;43321:4;43195:131;:::i;:::-;43187:139;;42914:419;;;:::o;43339:234::-;43479:34;43475:1;43467:6;43463:14;43456:58;43548:17;43543:2;43535:6;43531:15;43524:42;43339:234;:::o;43579:366::-;43721:3;43742:67;43806:2;43801:3;43742:67;:::i;:::-;43735:74;;43818:93;43907:3;43818:93;:::i;:::-;43936:2;43931:3;43927:12;43920:19;;43579:366;;;:::o;43951:419::-;44117:4;44155:2;44144:9;44140:18;44132:26;;44204:9;44198:4;44194:20;44190:1;44179:9;44175:17;44168:47;44232:131;44358:4;44232:131;:::i;:::-;44224:139;;43951:419;;;:::o;44376:148::-;44478:11;44515:3;44500:18;;44376:148;;;;:::o;44530:377::-;44636:3;44664:39;44697:5;44664:39;:::i;:::-;44719:89;44801:6;44796:3;44719:89;:::i;:::-;44712:96;;44817:52;44862:6;44857:3;44850:4;44843:5;44839:16;44817:52;:::i;:::-;44894:6;44889:3;44885:16;44878:23;;44640:267;44530:377;;;;:::o;44913:435::-;45093:3;45115:95;45206:3;45197:6;45115:95;:::i;:::-;45108:102;;45227:95;45318:3;45309:6;45227:95;:::i;:::-;45220:102;;45339:3;45332:10;;44913:435;;;;;:::o;45354:225::-;45494:34;45490:1;45482:6;45478:14;45471:58;45563:8;45558:2;45550:6;45546:15;45539:33;45354:225;:::o;45585:366::-;45727:3;45748:67;45812:2;45807:3;45748:67;:::i;:::-;45741:74;;45824:93;45913:3;45824:93;:::i;:::-;45942:2;45937:3;45933:12;45926:19;;45585:366;;;:::o;45957:419::-;46123:4;46161:2;46150:9;46146:18;46138:26;;46210:9;46204:4;46200:20;46196:1;46185:9;46181:17;46174:47;46238:131;46364:4;46238:131;:::i;:::-;46230:139;;45957:419;;;:::o;46382:305::-;46422:3;46441:20;46459:1;46441:20;:::i;:::-;46436:25;;46475:20;46493:1;46475:20;:::i;:::-;46470:25;;46629:1;46561:66;46557:74;46554:1;46551:81;46548:107;;;46635:18;;:::i;:::-;46548:107;46679:1;46676;46672:9;46665:16;;46382:305;;;;:::o;46693:168::-;46833:20;46829:1;46821:6;46817:14;46810:44;46693:168;:::o;46867:366::-;47009:3;47030:67;47094:2;47089:3;47030:67;:::i;:::-;47023:74;;47106:93;47195:3;47106:93;:::i;:::-;47224:2;47219:3;47215:12;47208:19;;46867:366;;;:::o;47239:419::-;47405:4;47443:2;47432:9;47428:18;47420:26;;47492:9;47486:4;47482:20;47478:1;47467:9;47463:17;47456:47;47520:131;47646:4;47520:131;:::i;:::-;47512:139;;47239:419;;;:::o;47664:231::-;47804:34;47800:1;47792:6;47788:14;47781:58;47873:14;47868:2;47860:6;47856:15;47849:39;47664:231;:::o;47901:366::-;48043:3;48064:67;48128:2;48123:3;48064:67;:::i;:::-;48057:74;;48140:93;48229:3;48140:93;:::i;:::-;48258:2;48253:3;48249:12;48242:19;;47901:366;;;:::o;48273:419::-;48439:4;48477:2;48466:9;48462:18;48454:26;;48526:9;48520:4;48516:20;48512:1;48501:9;48497:17;48490:47;48554:131;48680:4;48554:131;:::i;:::-;48546:139;;48273:419;;;:::o;48698:228::-;48838:34;48834:1;48826:6;48822:14;48815:58;48907:11;48902:2;48894:6;48890:15;48883:36;48698:228;:::o;48932:366::-;49074:3;49095:67;49159:2;49154:3;49095:67;:::i;:::-;49088:74;;49171:93;49260:3;49171:93;:::i;:::-;49289:2;49284:3;49280:12;49273:19;;48932:366;;;:::o;49304:419::-;49470:4;49508:2;49497:9;49493:18;49485:26;;49557:9;49551:4;49547:20;49543:1;49532:9;49528:17;49521:47;49585:131;49711:4;49585:131;:::i;:::-;49577:139;;49304:419;;;:::o;49729:223::-;49869:34;49865:1;49857:6;49853:14;49846:58;49938:6;49933:2;49925:6;49921:15;49914:31;49729:223;:::o;49958:366::-;50100:3;50121:67;50185:2;50180:3;50121:67;:::i;:::-;50114:74;;50197:93;50286:3;50197:93;:::i;:::-;50315:2;50310:3;50306:12;50299:19;;49958:366;;;:::o;50330:419::-;50496:4;50534:2;50523:9;50519:18;50511:26;;50583:9;50577:4;50573:20;50569:1;50558:9;50554:17;50547:47;50611:131;50737:4;50611:131;:::i;:::-;50603:139;;50330:419;;;:::o;50755:191::-;50795:4;50815:20;50833:1;50815:20;:::i;:::-;50810:25;;50849:20;50867:1;50849:20;:::i;:::-;50844:25;;50888:1;50885;50882:8;50879:34;;;50893:18;;:::i;:::-;50879:34;50938:1;50935;50931:9;50923:17;;50755:191;;;;:::o;50952:237::-;51092:34;51088:1;51080:6;51076:14;51069:58;51161:20;51156:2;51148:6;51144:15;51137:45;50952:237;:::o;51195:366::-;51337:3;51358:67;51422:2;51417:3;51358:67;:::i;:::-;51351:74;;51434:93;51523:3;51434:93;:::i;:::-;51552:2;51547:3;51543:12;51536:19;;51195:366;;;:::o;51567:419::-;51733:4;51771:2;51760:9;51756:18;51748:26;;51820:9;51814:4;51810:20;51806:1;51795:9;51791:17;51784:47;51848:131;51974:4;51848:131;:::i;:::-;51840:139;;51567:419;;;:::o;51992:180::-;52040:77;52037:1;52030:88;52137:4;52134:1;52127:15;52161:4;52158:1;52151:15;52178:185;52218:1;52235:20;52253:1;52235:20;:::i;:::-;52230:25;;52269:20;52287:1;52269:20;:::i;:::-;52264:25;;52308:1;52298:35;;52313:18;;:::i;:::-;52298:35;52355:1;52352;52348:9;52343:14;;52178:185;;;;:::o;52369:176::-;52401:1;52418:20;52436:1;52418:20;:::i;:::-;52413:25;;52452:20;52470:1;52452:20;:::i;:::-;52447:25;;52491:1;52481:35;;52496:18;;:::i;:::-;52481:35;52537:1;52534;52530:9;52525:14;;52369:176;;;;:::o;52551:98::-;52602:6;52636:5;52630:12;52620:22;;52551:98;;;:::o;52655:168::-;52738:11;52772:6;52767:3;52760:19;52812:4;52807:3;52803:14;52788:29;;52655:168;;;;:::o;52829:360::-;52915:3;52943:38;52975:5;52943:38;:::i;:::-;52997:70;53060:6;53055:3;52997:70;:::i;:::-;52990:77;;53076:52;53121:6;53116:3;53109:4;53102:5;53098:16;53076:52;:::i;:::-;53153:29;53175:6;53153:29;:::i;:::-;53148:3;53144:39;53137:46;;52919:270;52829:360;;;;:::o;53195:640::-;53390:4;53428:3;53417:9;53413:19;53405:27;;53442:71;53510:1;53499:9;53495:17;53486:6;53442:71;:::i;:::-;53523:72;53591:2;53580:9;53576:18;53567:6;53523:72;:::i;:::-;53605;53673:2;53662:9;53658:18;53649:6;53605:72;:::i;:::-;53724:9;53718:4;53714:20;53709:2;53698:9;53694:18;53687:48;53752:76;53823:4;53814:6;53752:76;:::i;:::-;53744:84;;53195:640;;;;;;;:::o;53841:141::-;53897:5;53928:6;53922:13;53913:22;;53944:32;53970:5;53944:32;:::i;:::-;53841:141;;;;:::o;53988:349::-;54057:6;54106:2;54094:9;54085:7;54081:23;54077:32;54074:119;;;54112:79;;:::i;:::-;54074:119;54232:1;54257:63;54312:7;54303:6;54292:9;54288:22;54257:63;:::i;:::-;54247:73;;54203:127;53988:349;;;;:::o;54343:180::-;54391:77;54388:1;54381:88;54488:4;54485:1;54478:15;54512:4;54509:1;54502:15;54529:182;54669:34;54665:1;54657:6;54653:14;54646:58;54529:182;:::o;54717:366::-;54859:3;54880:67;54944:2;54939:3;54880:67;:::i;:::-;54873:74;;54956:93;55045:3;54956:93;:::i;:::-;55074:2;55069:3;55065:12;55058:19;;54717:366;;;:::o;55089:419::-;55255:4;55293:2;55282:9;55278:18;55270:26;;55342:9;55336:4;55332:20;55328:1;55317:9;55313:17;55306:47;55370:131;55496:4;55370:131;:::i;:::-;55362:139;;55089:419;;;:::o;55514:178::-;55654:30;55650:1;55642:6;55638:14;55631:54;55514:178;:::o;55698:366::-;55840:3;55861:67;55925:2;55920:3;55861:67;:::i;:::-;55854:74;;55937:93;56026:3;55937:93;:::i;:::-;56055:2;56050:3;56046:12;56039:19;;55698:366;;;:::o;56070:419::-;56236:4;56274:2;56263:9;56259:18;56251:26;;56323:9;56317:4;56313:20;56309:1;56298:9;56294:17;56287:47;56351:131;56477:4;56351:131;:::i;:::-;56343:139;;56070:419;;;:::o
Swarm Source
ipfs://3ca413742a37c4cbc083d9eb997c52285b096475250eedabb11bd9ffc0b34f0a
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.