Contract Overview
[ Download CSV Export ]
Contract Name:
GrabClub
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-08-30 */ // Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) // 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); } // Dependency file: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/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); } // Dependency file: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) // pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // Dependency file: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; // import "@openzeppelin/contracts/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 {} } // Dependency file: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Burnable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } } // Dependency file: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) // pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // Dependency file: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) // pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // Dependency file: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/utils/Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // Dependency file: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // Dependency file: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) // 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; } } // Dependency file: @openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; // import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; // import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; // import "@openzeppelin/contracts/utils/Counters.sol"; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") {} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } // Root file: contracts/GrabClub.sol pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; // import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; contract GrabClub is ERC20, ERC20Burnable, ERC20Permit { constructor() ERC20("GrabClub", "GC") ERC20Permit("GrabClub") { _mint(_msgSender(), 6_000_000_000 * 10**decimals()); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140908152503480156200003a57600080fd5b506040518060400160405280600881526020017f47726162436c7562000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f47726162436c75620000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f474300000000000000000000000000000000000000000000000000000000000081525081600390805190602001906200012c92919062000424565b5080600490805190602001906200014592919062000424565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001b18184846200025460201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050506200024e620002126200029060201b60201c565b620002226200029860201b60201c565b600a62000230919062000693565b640165a0bc00620002429190620007d0565b620002a160201b60201c565b62000950565b60008383834630604051602001620002719594939291906200052e565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030b906200058b565b60405180910390fd5b62000328600083836200041a60201b60201c565b80600260008282546200033c9190620005db565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620003939190620005db565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003fa9190620005ad565b60405180910390a362000416600083836200041f60201b60201c565b5050565b505050565b505050565b828054620004329062000886565b90600052602060002090601f016020900481019282620004565760008555620004a2565b82601f106200047157805160ff1916838001178555620004a2565b82800160010185558215620004a2579182015b82811115620004a157825182559160200191906001019062000484565b5b509050620004b19190620004b5565b5090565b5b80821115620004d0576000816000905550600101620004b6565b5090565b620004df8162000831565b82525050565b620004f08162000845565b82525050565b600062000505601f83620005ca565b9150620005128262000927565b602082019050919050565b62000528816200086f565b82525050565b600060a082019050620005456000830188620004e5565b620005546020830187620004e5565b620005636040830186620004e5565b6200057260608301856200051d565b620005816080830184620004d4565b9695505050505050565b60006020820190508181036000830152620005a681620004f6565b9050919050565b6000602082019050620005c460008301846200051d565b92915050565b600082825260208201905092915050565b6000620005e8826200086f565b9150620005f5836200086f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200062d576200062c620008bc565b5b828201905092915050565b6000808291508390505b60018511156200068a57808604811115620006625762000661620008bc565b5b6001851615620006725780820291505b808102905062000682856200091a565b945062000642565b94509492505050565b6000620006a0826200086f565b9150620006ad8362000879565b9250620006dc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620006e4565b905092915050565b600082620006f65760019050620007c9565b81620007065760009050620007c9565b81600181146200071f57600281146200072a5762000760565b6001915050620007c9565b60ff8411156200073f576200073e620008bc565b5b8360020a915084821115620007595762000758620008bc565b5b50620007c9565b5060208310610133831016604e8410600b84101617156200079a5782820a905083811115620007945762000793620008bc565b5b620007c9565b620007a9848484600162000638565b92509050818404811115620007c357620007c2620008bc565b5b81810290505b9392505050565b6000620007dd826200086f565b9150620007ea836200086f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620008265762000825620008bc565b5b828202905092915050565b60006200083e826200084f565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200089f57607f821691505b60208210811415620008b657620008b5620008eb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60805160a05160c05160601c60e0516101005161012051610140516125d9620009ae60003960006108ee01526000610f7201526000610fb401526000610f9301526000610ec801526000610f1e01526000610f4701526125d96000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a457c2d711610066578063a457c2d7146102c3578063a9059cbb146102f3578063d505accf14610323578063dd62ed3e1461033f57610100565b806370a082311461022957806379cc6790146102595780637ecebe001461027557806395d89b41146102a557610100565b8063313ce567116100d3578063313ce567146101a15780633644e515146101bf57806339509351146101dd57806342966c681461020d57610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806323b872dd14610171575b600080fd5b61010d61036f565b60405161011a9190611c4c565b60405180910390f35b61013d6004803603810190610138919061178b565b610401565b60405161014a9190611b1d565b60405180910390f35b61015b61041f565b6040516101689190611e6e565b60405180910390f35b61018b60048036038101906101869190611696565b610429565b6040516101989190611b1d565b60405180910390f35b6101a9610521565b6040516101b69190611e89565b60405180910390f35b6101c761052a565b6040516101d49190611b38565b60405180910390f35b6101f760048036038101906101f2919061178b565b610539565b6040516102049190611b1d565b60405180910390f35b610227600480360381019061022291906117cb565b6105e5565b005b610243600480360381019061023e9190611629565b6105f9565b6040516102509190611e6e565b60405180910390f35b610273600480360381019061026e919061178b565b610641565b005b61028f600480360381019061028a9190611629565b6106bc565b60405161029c9190611e6e565b60405180910390f35b6102ad61070c565b6040516102ba9190611c4c565b60405180910390f35b6102dd60048036038101906102d8919061178b565b61079e565b6040516102ea9190611b1d565b60405180910390f35b61030d6004803603810190610308919061178b565b610889565b60405161031a9190611b1d565b60405180910390f35b61033d600480360381019061033891906116e9565b6108a7565b005b61035960048036038101906103549190611656565b6109e9565b6040516103669190611e6e565b60405180910390f35b60606003805461037e90611fe7565b80601f01602080910402602001604051908101604052809291908181526020018280546103aa90611fe7565b80156103f75780601f106103cc576101008083540402835291602001916103f7565b820191906000526020600020905b8154815290600101906020018083116103da57829003601f168201915b5050505050905090565b600061041561040e610a70565b8484610a78565b6001905092915050565b6000600254905090565b6000610436848484610c43565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610481610a70565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f890611dae565b60405180910390fd5b6105158561050d610a70565b858403610a78565b60019150509392505050565b60006012905090565b6000610534610ec4565b905090565b60006105db610546610a70565b848460016000610554610a70565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546105d69190611ecb565b610a78565b6001905092915050565b6105f66105f0610a70565b82610fde565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006106548361064f610a70565b6109e9565b905081811015610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069090611dce565b60405180910390fd5b6106ad836106a5610a70565b848403610a78565b6106b78383610fde565b505050565b6000610705600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206111b5565b9050919050565b60606004805461071b90611fe7565b80601f016020809104026020016040519081016040528092919081815260200182805461074790611fe7565b80156107945780601f1061076957610100808354040283529160200191610794565b820191906000526020600020905b81548152906001019060200180831161077757829003601f168201915b5050505050905090565b600080600160006107ad610a70565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561086a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086190611e4e565b60405180910390fd5b61087e610875610a70565b85858403610a78565b600191505092915050565b600061089d610896610a70565b8484610c43565b6001905092915050565b834211156108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190611d0e565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008888886109198c6111c3565b8960405160200161092f96959493929190611b53565b604051602081830303815290604052805190602001209050600061095282611221565b905060006109628287878761123b565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990611d8e565b60405180910390fd5b6109dd8a8a8a610a78565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90611e2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f90611cee565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610c369190611e6e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90611e0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90611c8e565b60405180910390fd5b610d2e838383611266565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90611d2e565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e479190611ecb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610eab9190611e6e565b60405180910390a3610ebe84848461126b565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610f4057507f000000000000000000000000000000000000000000000000000000000000000046145b15610f6d577f00000000000000000000000000000000000000000000000000000000000000009050610fdb565b610fd87f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611270565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590611dee565b60405180910390fd5b61105a82600083611266565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790611cae565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546111379190611f21565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161119c9190611e6e565b60405180910390a36111b08360008461126b565b505050565b600081600001549050919050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611210816111b5565b915061121b816112aa565b50919050565b600061123461122e610ec4565b836112c0565b9050919050565b600080600061124c878787876112f3565b9150915061125981611400565b8192505050949350505050565b505050565b505050565b6000838383463060405160200161128b959493929190611bb4565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b600082826040516020016112d5929190611ae6565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561132e5760006003915091506113f7565b601b8560ff16141580156113465750601c8560ff1614155b156113585760006004915091506113f7565b60006001878787876040516000815260200160405260405161137d9493929190611c07565b6020604051602081039080840390855afa15801561139f573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ee576000600192509250506113f7565b80600092509250505b94509492505050565b6000600481111561141457611413612052565b5b81600481111561142757611426612052565b5b1415611432576115d2565b6001600481111561144657611445612052565b5b81600481111561145957611458612052565b5b141561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190611c6e565b60405180910390fd5b600260048111156114ae576114ad612052565b5b8160048111156114c1576114c0612052565b5b1415611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f990611cce565b60405180910390fd5b6003600481111561151657611515612052565b5b81600481111561152957611528612052565b5b141561156a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156190611d4e565b60405180910390fd5b60048081111561157d5761157c612052565b5b8160048111156115905761158f612052565b5b14156115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890611d6e565b60405180910390fd5b5b50565b6000813590506115e481612547565b92915050565b6000813590506115f98161255e565b92915050565b60008135905061160e81612575565b92915050565b6000813590506116238161258c565b92915050565b60006020828403121561163f5761163e6120b0565b5b600061164d848285016115d5565b91505092915050565b6000806040838503121561166d5761166c6120b0565b5b600061167b858286016115d5565b925050602061168c858286016115d5565b9150509250929050565b6000806000606084860312156116af576116ae6120b0565b5b60006116bd868287016115d5565b93505060206116ce868287016115d5565b92505060406116df868287016115ff565b9150509250925092565b600080600080600080600060e0888a031215611708576117076120b0565b5b60006117168a828b016115d5565b97505060206117278a828b016115d5565b96505060406117388a828b016115ff565b95505060606117498a828b016115ff565b945050608061175a8a828b01611614565b93505060a061176b8a828b016115ea565b92505060c061177c8a828b016115ea565b91505092959891949750929550565b600080604083850312156117a2576117a16120b0565b5b60006117b0858286016115d5565b92505060206117c1858286016115ff565b9150509250929050565b6000602082840312156117e1576117e06120b0565b5b60006117ef848285016115ff565b91505092915050565b61180181611f55565b82525050565b61181081611f67565b82525050565b61181f81611f73565b82525050565b61183661183182611f73565b612019565b82525050565b600061184782611ea4565b6118518185611eaf565b9350611861818560208601611fb4565b61186a816120b5565b840191505092915050565b6000611882601883611eaf565b915061188d826120c6565b602082019050919050565b60006118a5602383611eaf565b91506118b0826120ef565b604082019050919050565b60006118c8602283611eaf565b91506118d38261213e565b604082019050919050565b60006118eb601f83611eaf565b91506118f68261218d565b602082019050919050565b600061190e602283611eaf565b9150611919826121b6565b604082019050919050565b6000611931600283611ec0565b915061193c82612205565b600282019050919050565b6000611954601d83611eaf565b915061195f8261222e565b602082019050919050565b6000611977602683611eaf565b915061198282612257565b604082019050919050565b600061199a602283611eaf565b91506119a5826122a6565b604082019050919050565b60006119bd602283611eaf565b91506119c8826122f5565b604082019050919050565b60006119e0601e83611eaf565b91506119eb82612344565b602082019050919050565b6000611a03602883611eaf565b9150611a0e8261236d565b604082019050919050565b6000611a26602483611eaf565b9150611a31826123bc565b604082019050919050565b6000611a49602183611eaf565b9150611a548261240b565b604082019050919050565b6000611a6c602583611eaf565b9150611a778261245a565b604082019050919050565b6000611a8f602483611eaf565b9150611a9a826124a9565b604082019050919050565b6000611ab2602583611eaf565b9150611abd826124f8565b604082019050919050565b611ad181611f9d565b82525050565b611ae081611fa7565b82525050565b6000611af182611924565b9150611afd8285611825565b602082019150611b0d8284611825565b6020820191508190509392505050565b6000602082019050611b326000830184611807565b92915050565b6000602082019050611b4d6000830184611816565b92915050565b600060c082019050611b686000830189611816565b611b7560208301886117f8565b611b8260408301876117f8565b611b8f6060830186611ac8565b611b9c6080830185611ac8565b611ba960a0830184611ac8565b979650505050505050565b600060a082019050611bc96000830188611816565b611bd66020830187611816565b611be36040830186611816565b611bf06060830185611ac8565b611bfd60808301846117f8565b9695505050505050565b6000608082019050611c1c6000830187611816565b611c296020830186611ad7565b611c366040830185611816565b611c436060830184611816565b95945050505050565b60006020820190508181036000830152611c66818461183c565b905092915050565b60006020820190508181036000830152611c8781611875565b9050919050565b60006020820190508181036000830152611ca781611898565b9050919050565b60006020820190508181036000830152611cc7816118bb565b9050919050565b60006020820190508181036000830152611ce7816118de565b9050919050565b60006020820190508181036000830152611d0781611901565b9050919050565b60006020820190508181036000830152611d2781611947565b9050919050565b60006020820190508181036000830152611d478161196a565b9050919050565b60006020820190508181036000830152611d678161198d565b9050919050565b60006020820190508181036000830152611d87816119b0565b9050919050565b60006020820190508181036000830152611da7816119d3565b9050919050565b60006020820190508181036000830152611dc7816119f6565b9050919050565b60006020820190508181036000830152611de781611a19565b9050919050565b60006020820190508181036000830152611e0781611a3c565b9050919050565b60006020820190508181036000830152611e2781611a5f565b9050919050565b60006020820190508181036000830152611e4781611a82565b9050919050565b60006020820190508181036000830152611e6781611aa5565b9050919050565b6000602082019050611e836000830184611ac8565b92915050565b6000602082019050611e9e6000830184611ad7565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000611ed682611f9d565b9150611ee183611f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611f1657611f15612023565b5b828201905092915050565b6000611f2c82611f9d565b9150611f3783611f9d565b925082821015611f4a57611f49612023565b5b828203905092915050565b6000611f6082611f7d565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015611fd2578082015181840152602081019050611fb7565b83811115611fe1576000848401525b50505050565b60006002820490506001821680611fff57607f821691505b6020821081141561201357612012612081565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b61255081611f55565b811461255b57600080fd5b50565b61256781611f73565b811461257257600080fd5b50565b61257e81611f9d565b811461258957600080fd5b50565b61259581611fa7565b81146125a057600080fd5b5056fea2646970667358221220d38df5f59eddcd6610287c9ca81dcc367f54c781a95eefe345ec478827a63c4864736f6c63430008070033
Deployed ByteCode Sourcemap
42322:197:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6996:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9163:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8116:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9814:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7958:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41562:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10715:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17653:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8287:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18063:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41304:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7215:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11433:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8627:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40593:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8865:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6996:100;7050:13;7083:5;7076:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6996:100;:::o;9163:169::-;9246:4;9263:39;9272:12;:10;:12::i;:::-;9286:7;9295:6;9263:8;:39::i;:::-;9320:4;9313:11;;9163:169;;;;:::o;8116:108::-;8177:7;8204:12;;8197:19;;8116:108;:::o;9814:492::-;9954:4;9971:36;9981:6;9989:9;10000:6;9971:9;:36::i;:::-;10020:24;10047:11;:19;10059:6;10047:19;;;;;;;;;;;;;;;:33;10067:12;:10;:12::i;:::-;10047:33;;;;;;;;;;;;;;;;10020:60;;10119:6;10099:16;:26;;10091:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;10206:57;10215:6;10223:12;:10;:12::i;:::-;10256:6;10237:16;:25;10206:8;:57::i;:::-;10294:4;10287:11;;;9814:492;;;;;:::o;7958:93::-;8016:5;8041:2;8034:9;;7958:93;:::o;41562:115::-;41622:7;41649:20;:18;:20::i;:::-;41642:27;;41562:115;:::o;10715:215::-;10803:4;10820:80;10829:12;:10;:12::i;:::-;10843:7;10889:10;10852:11;:25;10864:12;:10;:12::i;:::-;10852:25;;;;;;;;;;;;;;;:34;10878:7;10852:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10820:8;:80::i;:::-;10918:4;10911:11;;10715:215;;;;:::o;17653:91::-;17709:27;17715:12;:10;:12::i;:::-;17729:6;17709:5;:27::i;:::-;17653:91;:::o;8287:127::-;8361:7;8388:9;:18;8398:7;8388:18;;;;;;;;;;;;;;;;8381:25;;8287:127;;;:::o;18063:368::-;18140:24;18167:32;18177:7;18186:12;:10;:12::i;:::-;18167:9;:32::i;:::-;18140:59;;18238:6;18218:16;:26;;18210:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;18321:58;18330:7;18339:12;:10;:12::i;:::-;18372:6;18353:16;:25;18321:8;:58::i;:::-;18401:22;18407:7;18416:6;18401:5;:22::i;:::-;18129:302;18063:368;;:::o;41304:128::-;41373:7;41400:24;:7;:14;41408:5;41400:14;;;;;;;;;;;;;;;:22;:24::i;:::-;41393:31;;41304:128;;;:::o;7215:104::-;7271:13;7304:7;7297:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7215:104;:::o;11433:413::-;11526:4;11543:24;11570:11;:25;11582:12;:10;:12::i;:::-;11570:25;;;;;;;;;;;;;;;:34;11596:7;11570:34;;;;;;;;;;;;;;;;11543:61;;11643:15;11623:16;:35;;11615:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11736:67;11745:12;:10;:12::i;:::-;11759:7;11787:15;11768:16;:34;11736:8;:67::i;:::-;11834:4;11827:11;;;11433:413;;;;:::o;8627:175::-;8713:4;8730:42;8740:12;:10;:12::i;:::-;8754:9;8765:6;8730:9;:42::i;:::-;8790:4;8783:11;;8627:175;;;;:::o;40593:645::-;40837:8;40818:15;:27;;40810:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40892:18;40934:16;40952:5;40959:7;40968:5;40975:16;40985:5;40975:9;:16::i;:::-;40993:8;40923:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40913:90;;;;;;40892:111;;41016:12;41031:28;41048:10;41031:16;:28::i;:::-;41016:43;;41072:14;41089:28;41103:4;41109:1;41112;41115;41089:13;:28::i;:::-;41072:45;;41146:5;41136:15;;:6;:15;;;41128:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41199:31;41208:5;41215:7;41224:5;41199:8;:31::i;:::-;40799:439;;;40593:645;;;;;;;:::o;8865:151::-;8954:7;8981:11;:18;8993:5;8981:18;;;;;;;;;;;;;;;:27;9000:7;8981:27;;;;;;;;;;;;;;;;8974:34;;8865:151;;;;:::o;4444:98::-;4497:7;4524:10;4517:17;;4444:98;:::o;15117:380::-;15270:1;15253:19;;:5;:19;;;;15245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15351:1;15332:21;;:7;:21;;;;15324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15435:6;15405:11;:18;15417:5;15405:18;;;;;;;;;;;;;;;:27;15424:7;15405:27;;;;;;;;;;;;;;;:36;;;;15473:7;15457:32;;15466:5;15457:32;;;15482:6;15457:32;;;;;;:::i;:::-;;;;;;;;15117:380;;;:::o;12336:733::-;12494:1;12476:20;;:6;:20;;;;12468:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12578:1;12557:23;;:9;:23;;;;12549:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12633:47;12654:6;12662:9;12673:6;12633:20;:47::i;:::-;12693:21;12717:9;:17;12727:6;12717:17;;;;;;;;;;;;;;;;12693:41;;12770:6;12753:13;:23;;12745:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12891:6;12875:13;:22;12855:9;:17;12865:6;12855:17;;;;;;;;;;;;;;;:42;;;;12943:6;12919:9;:20;12929:9;12919:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12984:9;12967:35;;12976:6;12967:35;;;12995:6;12967:35;;;;;;:::i;:::-;;;;;;;;13015:46;13035:6;13043:9;13054:6;13015:19;:46::i;:::-;12457:612;12336:733;;;:::o;35902:314::-;35955:7;35996:12;35979:29;;35987:4;35979:29;;;:66;;;;;36029:16;36012:13;:33;35979:66;35975:234;;;36069:24;36062:31;;;;35975:234;36133:64;36155:10;36167:12;36181:15;36133:21;:64::i;:::-;36126:71;;35902:314;;:::o;14088:591::-;14191:1;14172:21;;:7;:21;;;;14164:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14244:49;14265:7;14282:1;14286:6;14244:20;:49::i;:::-;14306:22;14331:9;:18;14341:7;14331:18;;;;;;;;;;;;;;;;14306:43;;14386:6;14368:14;:24;;14360:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14505:6;14488:14;:23;14467:9;:18;14477:7;14467:18;;;;;;;;;;;;;;;:44;;;;14549:6;14533:12;;:22;;;;;;;:::i;:::-;;;;;;;;14599:1;14573:37;;14582:7;14573:37;;;14603:6;14573:37;;;;;;:::i;:::-;;;;;;;;14623:48;14643:7;14660:1;14664:6;14623:19;:48::i;:::-;14153:526;14088:591;;:::o;38189:114::-;38254:7;38281;:14;;;38274:21;;38189:114;;;:::o;41815:207::-;41875:15;41903:30;41936:7;:14;41944:5;41936:14;;;;;;;;;;;;;;;41903:47;;41971:15;:5;:13;:15::i;:::-;41961:25;;41997:17;:5;:15;:17::i;:::-;41892:130;41815:207;;;:::o;37129:167::-;37206:7;37233:55;37255:20;:18;:20::i;:::-;37277:10;37233:21;:55::i;:::-;37226:62;;37129:167;;;:::o;30697:279::-;30825:7;30846:17;30865:18;30887:25;30898:4;30904:1;30907;30910;30887:10;:25::i;:::-;30845:67;;;;30923:18;30935:5;30923:11;:18::i;:::-;30959:9;30952:16;;;;30697:279;;;;;;:::o;16097:125::-;;;;:::o;16826:124::-;;;;:::o;36224:263::-;36368:7;36416:8;36426;36436:11;36449:13;36472:4;36405:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36395:84;;;;;;36388:91;;36224:263;;;;;:::o;38311:127::-;38418:1;38400:7;:14;;;:19;;;;;;;;;;;38311:127;:::o;32388:196::-;32481:7;32547:15;32564:10;32518:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32508:68;;;;;;32501:75;;32388:196;;;;:::o;28926:1632::-;29057:7;29066:12;29991:66;29986:1;29978:10;;:79;29974:163;;;30090:1;30094:30;30074:51;;;;;;29974:163;30156:2;30151:1;:7;;;;:18;;;;;30167:2;30162:1;:7;;;;30151:18;30147:102;;;30202:1;30206:30;30186:51;;;;;;30147:102;30346:14;30363:24;30373:4;30379:1;30382;30385;30363:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30346:41;;30420:1;30402:20;;:6;:20;;;30398:103;;;30455:1;30459:29;30439:50;;;;;;;30398:103;30521:6;30529:20;30513:37;;;;;28926:1632;;;;;;;;:::o;23588:643::-;23666:20;23657:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;23653:571;;;23703:7;;23653:571;23764:29;23755:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;23751:473;;;23810:34;;;;;;;;;;:::i;:::-;;;;;;;;23751:473;23875:35;23866:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;23862:362;;;23927:41;;;;;;;;;;:::i;:::-;;;;;;;;23862:362;23999:30;23990:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;23986:238;;;24046:44;;;;;;;;;;:::i;:::-;;;;;;;;23986:238;24121:30;24112:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;24108:116;;;24168:44;;;;;;;;;;:::i;:::-;;;;;;;;24108:116;23588:643;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:::-;343:5;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;297:139;;;;:::o;442:135::-;486:5;524:6;511:20;502:29;;540:31;565:5;540:31;:::i;:::-;442:135;;;;:::o;583:329::-;642:6;691:2;679:9;670:7;666:23;662:32;659:119;;;697:79;;:::i;:::-;659:119;817:1;842:53;887:7;878:6;867:9;863:22;842:53;:::i;:::-;832:63;;788:117;583:329;;;;:::o;918:474::-;986:6;994;1043:2;1031:9;1022:7;1018:23;1014:32;1011:119;;;1049:79;;:::i;:::-;1011:119;1169:1;1194:53;1239:7;1230:6;1219:9;1215:22;1194:53;:::i;:::-;1184:63;;1140:117;1296:2;1322:53;1367:7;1358:6;1347:9;1343:22;1322:53;:::i;:::-;1312:63;;1267:118;918:474;;;;;:::o;1398:619::-;1475:6;1483;1491;1540:2;1528:9;1519:7;1515:23;1511:32;1508:119;;;1546:79;;:::i;:::-;1508:119;1666:1;1691:53;1736:7;1727:6;1716:9;1712:22;1691:53;:::i;:::-;1681:63;;1637:117;1793:2;1819:53;1864:7;1855:6;1844:9;1840:22;1819:53;:::i;:::-;1809:63;;1764:118;1921:2;1947:53;1992:7;1983:6;1972:9;1968:22;1947:53;:::i;:::-;1937:63;;1892:118;1398:619;;;;;:::o;2023:1199::-;2134:6;2142;2150;2158;2166;2174;2182;2231:3;2219:9;2210:7;2206:23;2202:33;2199:120;;;2238:79;;:::i;:::-;2199:120;2358:1;2383:53;2428:7;2419:6;2408:9;2404:22;2383:53;:::i;:::-;2373:63;;2329:117;2485:2;2511:53;2556:7;2547:6;2536:9;2532:22;2511:53;:::i;:::-;2501:63;;2456:118;2613:2;2639:53;2684:7;2675:6;2664:9;2660:22;2639:53;:::i;:::-;2629:63;;2584:118;2741:2;2767:53;2812:7;2803:6;2792:9;2788:22;2767:53;:::i;:::-;2757:63;;2712:118;2869:3;2896:51;2939:7;2930:6;2919:9;2915:22;2896:51;:::i;:::-;2886:61;;2840:117;2996:3;3023:53;3068:7;3059:6;3048:9;3044:22;3023:53;:::i;:::-;3013:63;;2967:119;3125:3;3152:53;3197:7;3188:6;3177:9;3173:22;3152:53;:::i;:::-;3142:63;;3096:119;2023:1199;;;;;;;;;;:::o;3228:474::-;3296:6;3304;3353:2;3341:9;3332:7;3328:23;3324:32;3321:119;;;3359:79;;:::i;:::-;3321:119;3479:1;3504:53;3549:7;3540:6;3529:9;3525:22;3504:53;:::i;:::-;3494:63;;3450:117;3606:2;3632:53;3677:7;3668:6;3657:9;3653:22;3632:53;:::i;:::-;3622:63;;3577:118;3228:474;;;;;:::o;3708:329::-;3767:6;3816:2;3804:9;3795:7;3791:23;3787:32;3784:119;;;3822:79;;:::i;:::-;3784:119;3942:1;3967:53;4012:7;4003:6;3992:9;3988:22;3967:53;:::i;:::-;3957:63;;3913:117;3708:329;;;;:::o;4043:118::-;4130:24;4148:5;4130:24;:::i;:::-;4125:3;4118:37;4043:118;;:::o;4167:109::-;4248:21;4263:5;4248:21;:::i;:::-;4243:3;4236:34;4167:109;;:::o;4282:118::-;4369:24;4387:5;4369:24;:::i;:::-;4364:3;4357:37;4282:118;;:::o;4406:157::-;4511:45;4531:24;4549:5;4531:24;:::i;:::-;4511:45;:::i;:::-;4506:3;4499:58;4406:157;;:::o;4569:364::-;4657:3;4685:39;4718:5;4685:39;:::i;:::-;4740:71;4804:6;4799:3;4740:71;:::i;:::-;4733:78;;4820:52;4865:6;4860:3;4853:4;4846:5;4842:16;4820:52;:::i;:::-;4897:29;4919:6;4897:29;:::i;:::-;4892:3;4888:39;4881:46;;4661:272;4569:364;;;;:::o;4939:366::-;5081:3;5102:67;5166:2;5161:3;5102:67;:::i;:::-;5095:74;;5178:93;5267:3;5178:93;:::i;:::-;5296:2;5291:3;5287:12;5280:19;;4939:366;;;:::o;5311:::-;5453:3;5474:67;5538:2;5533:3;5474:67;:::i;:::-;5467:74;;5550:93;5639:3;5550:93;:::i;:::-;5668:2;5663:3;5659:12;5652:19;;5311:366;;;:::o;5683:::-;5825:3;5846:67;5910:2;5905:3;5846:67;:::i;:::-;5839:74;;5922:93;6011:3;5922:93;:::i;:::-;6040:2;6035:3;6031:12;6024:19;;5683:366;;;:::o;6055:::-;6197:3;6218:67;6282:2;6277:3;6218:67;:::i;:::-;6211:74;;6294:93;6383:3;6294:93;:::i;:::-;6412:2;6407:3;6403:12;6396:19;;6055:366;;;:::o;6427:::-;6569:3;6590:67;6654:2;6649:3;6590:67;:::i;:::-;6583:74;;6666:93;6755:3;6666:93;:::i;:::-;6784:2;6779:3;6775:12;6768:19;;6427:366;;;:::o;6799:400::-;6959:3;6980:84;7062:1;7057:3;6980:84;:::i;:::-;6973:91;;7073:93;7162:3;7073:93;:::i;:::-;7191:1;7186:3;7182:11;7175:18;;6799:400;;;:::o;7205:366::-;7347:3;7368:67;7432:2;7427:3;7368:67;:::i;:::-;7361:74;;7444:93;7533:3;7444:93;:::i;:::-;7562:2;7557:3;7553:12;7546:19;;7205:366;;;:::o;7577:::-;7719:3;7740:67;7804:2;7799:3;7740:67;:::i;:::-;7733:74;;7816:93;7905:3;7816:93;:::i;:::-;7934:2;7929:3;7925:12;7918:19;;7577:366;;;:::o;7949:::-;8091:3;8112:67;8176:2;8171:3;8112:67;:::i;:::-;8105:74;;8188:93;8277:3;8188:93;:::i;:::-;8306:2;8301:3;8297:12;8290:19;;7949:366;;;:::o;8321:::-;8463:3;8484:67;8548:2;8543:3;8484:67;:::i;:::-;8477:74;;8560:93;8649:3;8560:93;:::i;:::-;8678:2;8673:3;8669:12;8662:19;;8321:366;;;:::o;8693:::-;8835:3;8856:67;8920:2;8915:3;8856:67;:::i;:::-;8849:74;;8932:93;9021:3;8932:93;:::i;:::-;9050:2;9045:3;9041:12;9034:19;;8693:366;;;:::o;9065:::-;9207:3;9228:67;9292:2;9287:3;9228:67;:::i;:::-;9221:74;;9304:93;9393:3;9304:93;:::i;:::-;9422:2;9417:3;9413:12;9406:19;;9065:366;;;:::o;9437:::-;9579:3;9600:67;9664:2;9659:3;9600:67;:::i;:::-;9593:74;;9676:93;9765:3;9676:93;:::i;:::-;9794:2;9789:3;9785:12;9778:19;;9437:366;;;:::o;9809:::-;9951:3;9972:67;10036:2;10031:3;9972:67;:::i;:::-;9965:74;;10048:93;10137:3;10048:93;:::i;:::-;10166:2;10161:3;10157:12;10150:19;;9809:366;;;:::o;10181:::-;10323:3;10344:67;10408:2;10403:3;10344:67;:::i;:::-;10337:74;;10420:93;10509:3;10420:93;:::i;:::-;10538:2;10533:3;10529:12;10522:19;;10181:366;;;:::o;10553:::-;10695:3;10716:67;10780:2;10775:3;10716:67;:::i;:::-;10709:74;;10792:93;10881:3;10792:93;:::i;:::-;10910:2;10905:3;10901:12;10894:19;;10553:366;;;:::o;10925:::-;11067:3;11088:67;11152:2;11147:3;11088:67;:::i;:::-;11081:74;;11164:93;11253:3;11164:93;:::i;:::-;11282:2;11277:3;11273:12;11266:19;;10925:366;;;:::o;11297:118::-;11384:24;11402:5;11384:24;:::i;:::-;11379:3;11372:37;11297:118;;:::o;11421:112::-;11504:22;11520:5;11504:22;:::i;:::-;11499:3;11492:35;11421:112;;:::o;11539:663::-;11780:3;11802:148;11946:3;11802:148;:::i;:::-;11795:155;;11960:75;12031:3;12022:6;11960:75;:::i;:::-;12060:2;12055:3;12051:12;12044:19;;12073:75;12144:3;12135:6;12073:75;:::i;:::-;12173:2;12168:3;12164:12;12157:19;;12193:3;12186:10;;11539:663;;;;;:::o;12208:210::-;12295:4;12333:2;12322:9;12318:18;12310:26;;12346:65;12408:1;12397:9;12393:17;12384:6;12346:65;:::i;:::-;12208:210;;;;:::o;12424:222::-;12517:4;12555:2;12544:9;12540:18;12532:26;;12568:71;12636:1;12625:9;12621:17;12612:6;12568:71;:::i;:::-;12424:222;;;;:::o;12652:775::-;12885:4;12923:3;12912:9;12908:19;12900:27;;12937:71;13005:1;12994:9;12990:17;12981:6;12937:71;:::i;:::-;13018:72;13086:2;13075:9;13071:18;13062:6;13018:72;:::i;:::-;13100;13168:2;13157:9;13153:18;13144:6;13100:72;:::i;:::-;13182;13250:2;13239:9;13235:18;13226:6;13182:72;:::i;:::-;13264:73;13332:3;13321:9;13317:19;13308:6;13264:73;:::i;:::-;13347;13415:3;13404:9;13400:19;13391:6;13347:73;:::i;:::-;12652:775;;;;;;;;;:::o;13433:664::-;13638:4;13676:3;13665:9;13661:19;13653:27;;13690:71;13758:1;13747:9;13743:17;13734:6;13690:71;:::i;:::-;13771:72;13839:2;13828:9;13824:18;13815:6;13771:72;:::i;:::-;13853;13921:2;13910:9;13906:18;13897:6;13853:72;:::i;:::-;13935;14003:2;13992:9;13988:18;13979:6;13935:72;:::i;:::-;14017:73;14085:3;14074:9;14070:19;14061:6;14017:73;:::i;:::-;13433:664;;;;;;;;:::o;14103:545::-;14276:4;14314:3;14303:9;14299:19;14291:27;;14328:71;14396:1;14385:9;14381:17;14372:6;14328:71;:::i;:::-;14409:68;14473:2;14462:9;14458:18;14449:6;14409:68;:::i;:::-;14487:72;14555:2;14544:9;14540:18;14531:6;14487:72;:::i;:::-;14569;14637:2;14626:9;14622:18;14613:6;14569:72;:::i;:::-;14103:545;;;;;;;:::o;14654:313::-;14767:4;14805:2;14794:9;14790:18;14782:26;;14854:9;14848:4;14844:20;14840:1;14829:9;14825:17;14818:47;14882:78;14955:4;14946:6;14882:78;:::i;:::-;14874:86;;14654:313;;;;:::o;14973:419::-;15139:4;15177:2;15166:9;15162:18;15154:26;;15226:9;15220:4;15216:20;15212:1;15201:9;15197:17;15190:47;15254:131;15380:4;15254:131;:::i;:::-;15246:139;;14973:419;;;:::o;15398:::-;15564:4;15602:2;15591:9;15587:18;15579:26;;15651:9;15645:4;15641:20;15637:1;15626:9;15622:17;15615:47;15679:131;15805:4;15679:131;:::i;:::-;15671:139;;15398:419;;;:::o;15823:::-;15989:4;16027:2;16016:9;16012:18;16004:26;;16076:9;16070:4;16066:20;16062:1;16051:9;16047:17;16040:47;16104:131;16230:4;16104:131;:::i;:::-;16096:139;;15823:419;;;:::o;16248:::-;16414:4;16452:2;16441:9;16437:18;16429:26;;16501:9;16495:4;16491:20;16487:1;16476:9;16472:17;16465:47;16529:131;16655:4;16529:131;:::i;:::-;16521:139;;16248:419;;;:::o;16673:::-;16839:4;16877:2;16866:9;16862:18;16854:26;;16926:9;16920:4;16916:20;16912:1;16901:9;16897:17;16890:47;16954:131;17080:4;16954:131;:::i;:::-;16946:139;;16673:419;;;:::o;17098:::-;17264:4;17302:2;17291:9;17287:18;17279:26;;17351:9;17345:4;17341:20;17337:1;17326:9;17322:17;17315:47;17379:131;17505:4;17379:131;:::i;:::-;17371:139;;17098:419;;;:::o;17523:::-;17689:4;17727:2;17716:9;17712:18;17704:26;;17776:9;17770:4;17766:20;17762:1;17751:9;17747:17;17740:47;17804:131;17930:4;17804:131;:::i;:::-;17796:139;;17523:419;;;:::o;17948:::-;18114:4;18152:2;18141:9;18137:18;18129:26;;18201:9;18195:4;18191:20;18187:1;18176:9;18172:17;18165:47;18229:131;18355:4;18229:131;:::i;:::-;18221:139;;17948:419;;;:::o;18373:::-;18539:4;18577:2;18566:9;18562:18;18554:26;;18626:9;18620:4;18616:20;18612:1;18601:9;18597:17;18590:47;18654:131;18780:4;18654:131;:::i;:::-;18646:139;;18373:419;;;:::o;18798:::-;18964:4;19002:2;18991:9;18987:18;18979:26;;19051:9;19045:4;19041:20;19037:1;19026:9;19022:17;19015:47;19079:131;19205:4;19079:131;:::i;:::-;19071:139;;18798:419;;;:::o;19223:::-;19389:4;19427:2;19416:9;19412:18;19404:26;;19476:9;19470:4;19466:20;19462:1;19451:9;19447:17;19440:47;19504:131;19630:4;19504:131;:::i;:::-;19496:139;;19223:419;;;:::o;19648:::-;19814:4;19852:2;19841:9;19837:18;19829:26;;19901:9;19895:4;19891:20;19887:1;19876:9;19872:17;19865:47;19929:131;20055:4;19929:131;:::i;:::-;19921:139;;19648:419;;;:::o;20073:::-;20239:4;20277:2;20266:9;20262:18;20254:26;;20326:9;20320:4;20316:20;20312:1;20301:9;20297:17;20290:47;20354:131;20480:4;20354:131;:::i;:::-;20346:139;;20073:419;;;:::o;20498:::-;20664:4;20702:2;20691:9;20687:18;20679:26;;20751:9;20745:4;20741:20;20737:1;20726:9;20722:17;20715:47;20779:131;20905:4;20779:131;:::i;:::-;20771:139;;20498:419;;;:::o;20923:::-;21089:4;21127:2;21116:9;21112:18;21104:26;;21176:9;21170:4;21166:20;21162:1;21151:9;21147:17;21140:47;21204:131;21330:4;21204:131;:::i;:::-;21196:139;;20923:419;;;:::o;21348:::-;21514:4;21552:2;21541:9;21537:18;21529:26;;21601:9;21595:4;21591:20;21587:1;21576:9;21572:17;21565:47;21629:131;21755:4;21629:131;:::i;:::-;21621:139;;21348:419;;;:::o;21773:222::-;21866:4;21904:2;21893:9;21889:18;21881:26;;21917:71;21985:1;21974:9;21970:17;21961:6;21917:71;:::i;:::-;21773:222;;;;:::o;22001:214::-;22090:4;22128:2;22117:9;22113:18;22105:26;;22141:67;22205:1;22194:9;22190:17;22181:6;22141:67;:::i;:::-;22001:214;;;;:::o;22302:99::-;22354:6;22388:5;22382:12;22372:22;;22302:99;;;:::o;22407:169::-;22491:11;22525:6;22520:3;22513:19;22565:4;22560:3;22556:14;22541:29;;22407:169;;;;:::o;22582:148::-;22684:11;22721:3;22706:18;;22582:148;;;;:::o;22736:305::-;22776:3;22795:20;22813:1;22795:20;:::i;:::-;22790:25;;22829:20;22847:1;22829:20;:::i;:::-;22824:25;;22983:1;22915:66;22911:74;22908:1;22905:81;22902:107;;;22989:18;;:::i;:::-;22902:107;23033:1;23030;23026:9;23019:16;;22736:305;;;;:::o;23047:191::-;23087:4;23107:20;23125:1;23107:20;:::i;:::-;23102:25;;23141:20;23159:1;23141:20;:::i;:::-;23136:25;;23180:1;23177;23174:8;23171:34;;;23185:18;;:::i;:::-;23171:34;23230:1;23227;23223:9;23215:17;;23047:191;;;;:::o;23244:96::-;23281:7;23310:24;23328:5;23310:24;:::i;:::-;23299:35;;23244:96;;;:::o;23346:90::-;23380:7;23423:5;23416:13;23409:21;23398:32;;23346:90;;;:::o;23442:77::-;23479:7;23508:5;23497:16;;23442:77;;;:::o;23525:126::-;23562:7;23602:42;23595:5;23591:54;23580:65;;23525:126;;;:::o;23657:77::-;23694:7;23723:5;23712:16;;23657:77;;;:::o;23740:86::-;23775:7;23815:4;23808:5;23804:16;23793:27;;23740:86;;;:::o;23832:307::-;23900:1;23910:113;23924:6;23921:1;23918:13;23910:113;;;24009:1;24004:3;24000:11;23994:18;23990:1;23985:3;23981:11;23974:39;23946:2;23943:1;23939:10;23934:15;;23910:113;;;24041:6;24038:1;24035:13;24032:101;;;24121:1;24112:6;24107:3;24103:16;24096:27;24032:101;23881:258;23832:307;;;:::o;24145:320::-;24189:6;24226:1;24220:4;24216:12;24206:22;;24273:1;24267:4;24263:12;24294:18;24284:81;;24350:4;24342:6;24338:17;24328:27;;24284:81;24412:2;24404:6;24401:14;24381:18;24378:38;24375:84;;;24431:18;;:::i;:::-;24375:84;24196:269;24145:320;;;:::o;24471:79::-;24510:7;24539:5;24528:16;;24471:79;;;:::o;24556:180::-;24604:77;24601:1;24594:88;24701:4;24698:1;24691:15;24725:4;24722:1;24715:15;24742:180;24790:77;24787:1;24780:88;24887:4;24884:1;24877:15;24911:4;24908:1;24901:15;24928:180;24976:77;24973:1;24966:88;25073:4;25070:1;25063:15;25097:4;25094:1;25087:15;25237:117;25346:1;25343;25336:12;25360:102;25401:6;25452:2;25448:7;25443:2;25436:5;25432:14;25428:28;25418:38;;25360:102;;;:::o;25468:174::-;25608:26;25604:1;25596:6;25592:14;25585:50;25468:174;:::o;25648:222::-;25788:34;25784:1;25776:6;25772:14;25765:58;25857:5;25852:2;25844:6;25840:15;25833:30;25648:222;:::o;25876:221::-;26016:34;26012:1;26004:6;26000:14;25993:58;26085:4;26080:2;26072:6;26068:15;26061:29;25876:221;:::o;26103:181::-;26243:33;26239:1;26231:6;26227:14;26220:57;26103:181;:::o;26290:221::-;26430:34;26426:1;26418:6;26414:14;26407:58;26499:4;26494:2;26486:6;26482:15;26475:29;26290:221;:::o;26517:214::-;26657:66;26653:1;26645:6;26641:14;26634:90;26517:214;:::o;26737:179::-;26877:31;26873:1;26865:6;26861:14;26854:55;26737:179;:::o;26922:225::-;27062:34;27058:1;27050:6;27046:14;27039:58;27131:8;27126:2;27118:6;27114:15;27107:33;26922:225;:::o;27153:221::-;27293:34;27289:1;27281:6;27277:14;27270:58;27362:4;27357:2;27349:6;27345:15;27338:29;27153:221;:::o;27380:::-;27520:34;27516:1;27508:6;27504:14;27497:58;27589:4;27584:2;27576:6;27572:15;27565:29;27380:221;:::o;27607:180::-;27747:32;27743:1;27735:6;27731:14;27724:56;27607:180;:::o;27793:227::-;27933:34;27929:1;27921:6;27917:14;27910:58;28002:10;27997:2;27989:6;27985:15;27978:35;27793:227;:::o;28026:223::-;28166:34;28162:1;28154:6;28150:14;28143:58;28235:6;28230:2;28222:6;28218:15;28211:31;28026:223;:::o;28255:220::-;28395:34;28391:1;28383:6;28379:14;28372:58;28464:3;28459:2;28451:6;28447:15;28440:28;28255:220;:::o;28481:224::-;28621:34;28617:1;28609:6;28605:14;28598:58;28690:7;28685:2;28677:6;28673:15;28666:32;28481:224;:::o;28711:223::-;28851:34;28847:1;28839:6;28835:14;28828:58;28920:6;28915:2;28907:6;28903:15;28896:31;28711:223;:::o;28940:224::-;29080:34;29076:1;29068:6;29064:14;29057:58;29149:7;29144:2;29136:6;29132:15;29125:32;28940:224;:::o;29170:122::-;29243:24;29261:5;29243:24;:::i;:::-;29236:5;29233:35;29223:63;;29282:1;29279;29272:12;29223:63;29170:122;:::o;29298:::-;29371:24;29389:5;29371:24;:::i;:::-;29364:5;29361:35;29351:63;;29410:1;29407;29400:12;29351:63;29298:122;:::o;29426:::-;29499:24;29517:5;29499:24;:::i;:::-;29492:5;29489:35;29479:63;;29538:1;29535;29528:12;29479:63;29426:122;:::o;29554:118::-;29625:22;29641:5;29625:22;:::i;:::-;29618:5;29615:33;29605:61;;29662:1;29659;29652:12;29605:61;29554:118;:::o
Swarm Source
ipfs://d38df5f59eddcd6610287c9ca81dcc367f54c781a95eefe345ec478827a63c48
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.