Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
739 GOG
Holders
195
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 GOGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoGogos
Compiler Version
v0.7.0+commit.9e61f92b
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-08 */ // SPDX-License-Identifier: MIT pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } library Counters { using SafeMath for uint256; 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 { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } 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); } 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; } 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); } 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); } 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); } abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor() internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require( set._values.length > index, "EnumerableSet: index out of bounds" ); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping(bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set( Map storage map, bytes32 key, bytes32 value ) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({_key: key, _value: value})); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require( map._entries.length > index, "EnumerableMap: index out of bounds" ); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get( Map storage map, bytes32 key, string memory errorMessage ) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToAddressMap storage map, uint256 key, address value ) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToAddressMap storage map, uint256 key, string memory errorMessage ) internal view returns (address) { return address( uint160(uint256(_get(map._inner, bytes32(key), errorMessage))) ); } } library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + (temp % 10))); temp /= 10; } return string(buffer); } } contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping(address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @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 _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get( tokenId, "ERC721: owner query for nonexistent token" ); } /** * @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 _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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); _holderTokens[to].add(tokenId); _tokenOwners.set(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); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(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" ); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721Metadata: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall( abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer" ); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @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 {} } abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved" ); _burn(tokenId); } } contract CryptoGogos is ERC721Burnable, ERC721Pausable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIds; //Counter is a struct in the Counters library using SafeMath for uint256; uint256 private maxSupply = 7777; uint256 private maxSalePrice = 1 ether; event MAX_SUPPLY_UPDATED(uint256 maxSupply); event MAX_PRICE_UPDATED(uint256 maxPrice); constructor(string memory _baseURI) public ERC721("GOGOS", "GOG") { _setBaseURI(_baseURI); } /** * @dev Gets current gogo Pack Price */ function getNFTPackPrice() public view returns (uint256) { uint256 currentSupply = totalSupply(); if (currentSupply >= 7150) { return maxSalePrice.mul(3 * 83333333).div(100000000); } else if (currentSupply >= 3150) { return 0.55 ether; } else if (currentSupply >= 850) { return 0.4 ether; } else { return 0; } } /** * @dev Gets current gogo Price */ function getNFTPrice() public view returns (uint256) { uint256 currentSupply = totalSupply(); if (currentSupply >= 7150) { return maxSalePrice; } else if (currentSupply >= 3150) { return 0.2 ether; } else if (currentSupply >= 1150) { return 0.15 ether; } else if (currentSupply >= 300) { return 0.1 ether; } else if (currentSupply >= 150) { return 0.07 ether; } else { return 0.05 ether; } } /** * @dev Gets current gogo Price */ function cantMint() public view returns (bool) { uint256 currentSupply = totalSupply(); if (currentSupply <= 150 && balanceOf(msg.sender) >= 2) return false; if (currentSupply <= 300 && balanceOf(msg.sender) >= 4) return false; return true; } /** * @dev Gets current gogo Price */ function updateMaxPrice(uint256 _price) public onlyOwner { maxSalePrice = _price; emit MAX_PRICE_UPDATED(_price); } /** * @dev Creates a new token for `to`. Its token ID will be automatically * assigned (and available on the emitted {IERC721-Transfer} event), and the token * URI autogenerated based on the base URI passed at construction. * * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mintByAdmin(address to) public onlyOwner { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); require(newItemId <= maxSupply); _mint(to, newItemId); } /* * _tokenURI is link to json */ function mint() public payable returns (uint256) { require(getNFTPrice() == msg.value, "Ether value sent is not correct"); require(!paused(), "ERC721Pausable: token mint while paused"); uint256 currentSupply = totalSupply(); if (!cantMint()) revert(); _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); require(newItemId <= maxSupply); _mint(msg.sender, newItemId); return newItemId; } /* * _tokenURIs is a array of links to json */ function mintPack() public payable returns (uint256) { require(totalSupply() >= 850, "Pack is not available now"); require( getNFTPackPrice() == msg.value, "Ether value sent is not correct" ); require(!paused(), "ERC721Pausable: token mint while paused"); uint256 newItemId; for (uint256 i = 0; i < 3; i++) { _tokenIds.increment(); newItemId = _tokenIds.current(); require(newItemId <= maxSupply); _mint(msg.sender, newItemId); } return newItemId; } function updateBaseURI(string memory _baseURI) public onlyOwner { _setBaseURI(_baseURI); } /** * @dev Withdraw ether from this contract (Callable by owner) */ function withdraw() external onlyOwner { uint256 balance = address(this).balance; msg.sender.transfer(balance); } /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721Pausable, ERC721) { super._beforeTokenTransfer(from, to, tokenId); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function pause() public onlyOwner whenNotPaused { _pause(); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function unpause() public onlyOwner whenPaused { _unpause(); } function updateMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; emit MAX_SUPPLY_UPDATED(_maxSupply); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"MAX_PRICE_UPDATED","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"MAX_SUPPLY_UPDATED","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cantMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPackPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateMaxPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052611e61600c55670de0b6b3a7640000600d553480156200002357600080fd5b5060405162004e6138038062004e6183398181016040528101906200004991906200042b565b6040518060400160405280600581526020017f474f474f530000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474f470000000000000000000000000000000000000000000000000000000000815250620000cd6301ffc9a760e01b6200022d60201b60201c565b8160069080519060200190620000e592919062000329565b508060079080519060200190620000fe92919062000329565b50620001176380ac58cd60e01b6200022d60201b60201c565b6200012f635b5e139f60e01b6200022d60201b60201c565b6200014763780e9d6360e01b6200022d60201b60201c565b50506000600a60006101000a81548160ff0219169083151502179055506000620001766200030560201b60201c565b905080600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000226816200030d60201b60201c565b5062000576565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029090620004b2565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b80600990805190602001906200032592919062000329565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200036c57805160ff19168380011785556200039d565b828001600101855582156200039d579182015b828111156200039c5782518255916020019190600101906200037f565b5b509050620003ac9190620003b0565b5090565b5b80821115620003cb576000816000905550600101620003b1565b5090565b600082601f830112620003e157600080fd5b8151620003f8620003f28262000502565b620004d4565b915080825260208301602083018583830111156200041557600080fd5b6200042283828462000540565b50505092915050565b6000602082840312156200043e57600080fd5b600082015167ffffffffffffffff8111156200045957600080fd5b6200046784828501620003cf565b91505092915050565b60006200047f601c836200052f565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620004cd8162000470565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620004f857600080fd5b8060405250919050565b600067ffffffffffffffff8211156200051a57600080fd5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b838110156200056057808201518184015260208101905062000543565b8381111562000570576000848401525b50505050565b6148db80620005866000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063931688cb116100a0578063c87b56dd1161006f578063c87b56dd146106cd578063e985e9c51461070a578063f103b43314610747578063f2fde38b14610770578063fb107a4f14610799576101f9565b8063931688cb1461062757806395d89b4114610650578063a22cb4651461067b578063b88d4fde146106a4576101f9565b8063722676e2116100dc578063722676e21461059e5780638456cb59146105bc5780638da5cb5b146105d35780638ea0507b146105fe576101f9565b80636352211e146104e25780636c0360eb1461051f57806370a082311461054a578063715018a614610587576101f9565b80632f745c591161019057806342966c681161015f57806342966c68146103fd578063469619f2146104265780634f6ccce71461044f5780635ac117251461048c5780635c975abb146104b7576101f9565b80632f745c59146103695780633ccfd60b146103a65780633f4ba83a146103bd57806342842e0e146103d4576101f9565b80631249c58b116101cc5780631249c58b146102cc57806318160ddd146102ea57806319e325151461031557806323b872dd14610340576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906135f0565b6107c4565b6040516102329190614234565b60405180910390f35b34801561024757600080fd5b5061025061082b565b60405161025d919061424f565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613683565b6108cd565b60405161029a91906141b2565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906135b4565b610952565b005b6102d4610a6a565b6040516102e191906145f1565b60405180910390f35b3480156102f657600080fd5b506102ff610b53565b60405161030c91906145f1565b60405180910390f35b34801561032157600080fd5b5061032a610b64565b6040516103379190614234565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906134ae565b610bcd565b005b34801561037557600080fd5b50610390600480360381019061038b91906135b4565b610c2d565b60405161039d91906145f1565b60405180910390f35b3480156103b257600080fd5b506103bb610c88565b005b3480156103c957600080fd5b506103d2610d53565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906134ae565b610e20565b005b34801561040957600080fd5b50610424600480360381019061041f9190613683565b610e40565b005b34801561043257600080fd5b5061044d60048036038101906104489190613683565b610e9c565b005b34801561045b57600080fd5b5061047660048036038101906104719190613683565b610f59565b60405161048391906145f1565b60405180910390f35b34801561049857600080fd5b506104a1610f7c565b6040516104ae91906145f1565b60405180910390f35b3480156104c357600080fd5b506104cc611006565b6040516104d99190614234565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190613683565b61101d565b60405161051691906141b2565b60405180910390f35b34801561052b57600080fd5b50610534611054565b604051610541919061424f565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190613449565b6110f6565b60405161057e91906145f1565b60405180910390f35b34801561059357600080fd5b5061059c6111b5565b005b6105a66112f2565b6040516105b391906145f1565b60405180910390f35b3480156105c857600080fd5b506105d1611426565b005b3480156105df57600080fd5b506105e86114f4565b6040516105f591906141b2565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613449565b61151e565b005b34801561063357600080fd5b5061064e60048036038101906106499190613642565b6115cf565b005b34801561065c57600080fd5b50610665611657565b604051610672919061424f565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613578565b6116f9565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906134fd565b61187a565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190613683565b6118dc565b604051610701919061424f565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c9190613472565b611a5f565b60405161073e9190614234565b60405180910390f35b34801561075357600080fd5b5061076e60048036038101906107699190613683565b611af3565b005b34801561077c57600080fd5b5061079760048036038101906107929190613449565b611bb0565b005b3480156107a557600080fd5b506107ae611d5c565b6040516107bb91906145f1565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611df2565b610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906144f1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095d8261101d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590614571565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ed611e0f565b73ffffffffffffffffffffffffffffffffffffffff161480610a1c5750610a1b81610a16611e0f565b611a5f565b5b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290614431565b60405180910390fd5b610a658383611e17565b505050565b600034610a75611d5c565b14610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90614371565b60405180910390fd5b610abd611006565b15610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af4906144b1565b60405180910390fd5b6000610b07610b53565b9050610b11610b64565b610b1a57600080fd5b610b24600b611ed0565b6000610b30600b611ee6565b9050600c54811115610b4157600080fd5b610b4b3382611ef4565b809250505090565b6000610b5f6002612082565b905090565b600080610b6f610b53565b905060968111158015610b8b57506002610b88336110f6565b10155b15610b9a576000915050610bca565b61012c8111158015610bb557506004610bb2336110f6565b10155b15610bc4576000915050610bca565b60019150505b90565b610bde610bd8611e0f565b82612097565b610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490614591565b60405180910390fd5b610c28838383612175565b505050565b6000610c8082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061238c90919063ffffffff16565b905092915050565b610c90611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610cae6114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90614511565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d4f573d6000803e3d6000fd5b5050565b610d5b611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610d796114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690614511565b60405180910390fd5b610dd7611006565b610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d906142b1565b60405180910390fd5b610e1e6123a6565b565b610e3b8383836040518060200160405280600081525061187a565b505050565b610e51610e4b611e0f565b82612097565b610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e87906145d1565b60405180910390fd5b610e9981612448565b50565b610ea4611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610ec26114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614511565b60405180910390fd5b80600d819055507f4b9d786179e2599e65d6eb10cdb73af77287bb79b562194500404a8612be165781604051610f4e91906145f1565b60405180910390a150565b600080610f7083600261258290919063ffffffff16565b50905080915050919050565b600080610f87610b53565b9050611bee8110610fc957610fc16305f5e100610fb3630ee6b27f600d546125ae90919063ffffffff16565b61261e90919063ffffffff16565b915050611003565b610c4e8110610fe3576707a1fe1602770000915050611003565b6103528110610ffd5767058d15e176280000915050611003565b60009150505b90565b6000600a60009054906101000a900460ff16905090565b600061104d8260405180606001604052806029815260200161487d6029913960026126749092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110ec5780601f106110c1576101008083540402835291602001916110ec565b820191906000526020600020905b8154815290600101906020018083116110cf57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614451565b60405180910390fd5b6111ae600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612693565b9050919050565b6111bd611e0f565b73ffffffffffffffffffffffffffffffffffffffff166111db6114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614511565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006103526112ff610b53565b1015611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614391565b60405180910390fd5b34611349610f7c565b14611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090614371565b60405180910390fd5b611391611006565b156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c8906144b1565b60405180910390fd5b600080600090505b600381101561141e576113ec600b611ed0565b6113f6600b611ee6565b9150600c5482111561140757600080fd5b6114113383611ef4565b80806001019150506113d9565b508091505090565b61142e611e0f565b73ffffffffffffffffffffffffffffffffffffffff1661144c6114f4565b73ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990614511565b60405180910390fd5b6114aa611006565b156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614411565b60405180910390fd5b6114f26126a8565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611526611e0f565b73ffffffffffffffffffffffffffffffffffffffff166115446114f4565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159190614511565b60405180910390fd5b6115a4600b611ed0565b60006115b0600b611ee6565b9050600c548111156115c157600080fd5b6115cb8282611ef4565b5050565b6115d7611e0f565b73ffffffffffffffffffffffffffffffffffffffff166115f56114f4565b73ffffffffffffffffffffffffffffffffffffffff161461164b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164290614511565b60405180910390fd5b6116548161274b565b50565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b611701611e0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614351565b60405180910390fd5b806005600061177c611e0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611829611e0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186e9190614234565b60405180910390a35050565b61188b611885611e0f565b83612097565b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614591565b60405180910390fd5b6118d684848484612765565b50505050565b60606118e782611df2565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90614551565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119cf5780601f106119a4576101008083540402835291602001916119cf565b820191906000526020600020905b8154815290600101906020018083116119b257829003601f168201915b5050505050905060606119e0611054565b90506000815114156119f6578192505050611a5a565b600082511115611a2b578082604051602001611a1392919061418e565b60405160208183030381529060405292505050611a5a565b80611a35856127c1565b604051602001611a4692919061418e565b604051602081830303815290604052925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611afb611e0f565b73ffffffffffffffffffffffffffffffffffffffff16611b196114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690614511565b60405180910390fd5b80600c819055507fd8419718ffd2a34111add9f7b4dca791378fc702c0803a6c6b12bf0b1896278d81604051611ba591906145f1565b60405180910390a150565b611bb8611e0f565b73ffffffffffffffffffffffffffffffffffffffff16611bd66114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390614511565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c93906142f1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611d67610b53565b9050611bee8110611d7d57600d54915050611def565b610c4e8110611d97576702c68af0bb140000915050611def565b61047e8110611db157670214e8348c4f0000915050611def565b61012c8110611dcb5767016345785d8a0000915050611def565b60968110611de35766f8b0a10e470000915050611def565b66b1a2bc2ec500009150505b90565b6000611e0882600261290890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e8a8361101d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5b90614491565b60405180910390fd5b611f6d81611df2565b15611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490614311565b60405180910390fd5b611fb960008383612922565b61200a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061293290919063ffffffff16565b506120218183600261294c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061209082600001612981565b9050919050565b60006120a282611df2565b6120e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d8906143d1565b60405180910390fd5b60006120ec8361101d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061215b57508373ffffffffffffffffffffffffffffffffffffffff16612143846108cd565b73ffffffffffffffffffffffffffffffffffffffff16145b8061216c575061216b8185611a5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121958261101d565b73ffffffffffffffffffffffffffffffffffffffff16146121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e290614531565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225290614331565b60405180910390fd5b612266838383612922565b612271600082611e17565b6122c281600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061299290919063ffffffff16565b5061231481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061293290919063ffffffff16565b5061232b8183600261294c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061239b83600001836129ac565b60001c905092915050565b6123ae611006565b6123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e4906142b1565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612431611e0f565b60405161243e91906141cd565b60405180910390a1565b60006124538261101d565b905061246181600084612922565b61246c600083611e17565b600060086000848152602001908152602001600020805460018160011615610100020316600290049050146124bb576008600083815260200190815260200160002060006124ba9190613253565b5b61250c82600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061299290919063ffffffff16565b50612521826002612a1990919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000806125958660000186612a33565b915091508160001c8160001c9350935050509250929050565b6000808314156125c15760009050612618565b60008284029050828482816125d257fe5b0414612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a906144d1565b60405180910390fd5b809150505b92915050565b6000808211612662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612659906143f1565b60405180910390fd5b81838161266b57fe5b04905092915050565b6000612687846000018460001b84612ab6565b60001c90509392505050565b60006126a182600001612b47565b9050919050565b6126b0611006565b156126f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e790614411565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612734611e0f565b60405161274191906141cd565b60405180910390a1565b806009908051906020019061276192919061329b565b5050565b612770848484612175565b61277c84848484612b58565b6127bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b2906142d1565b60405180910390fd5b50505050565b60606000821415612809576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612903565b600082905060005b60008214612833578080600101915050600a828161282b57fe5b049150612811565b60608167ffffffffffffffff8111801561284c57600080fd5b506040519080825280601f01601f19166020018201604052801561287f5781602001600182028036833780820191505090505b50905060006001830390508593505b600084146128fb57600a84816128a057fe5b0660300160f81b828280600190039350815181106128ba57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816128f357fe5b04935061288e565b819450505050505b919050565b600061291a836000018360001b612cbc565b905092915050565b61292d838383612cdf565b505050565b6000612944836000018360001b612d37565b905092915050565b6000612978846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612da7565b90509392505050565b600081600001805490509050919050565b60006129a4836000018360001b612e83565b905092915050565b6000818360000180549050116129f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ee90614271565b60405180910390fd5b826000018281548110612a0657fe5b9060005260206000200154905092915050565b6000612a2b836000018360001b612f6b565b905092915050565b60008082846000018054905011612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614471565b60405180910390fd5b6000846000018481548110612a9057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0f919061424f565b60405180910390fd5b50846000016001820381548110612b2b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612b798473ffffffffffffffffffffffffffffffffffffffff16613084565b612b865760019050612cb4565b6060612c4d63150b7a0260e01b612b9b611e0f565b888787604051602401612bb194939291906141e8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161484b603291398773ffffffffffffffffffffffffffffffffffffffff166130979092919063ffffffff16565b9050600081806020019051810190612c659190613619565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b612cea8383836130af565b612cf2611006565b15612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990614291565b60405180910390fd5b505050565b6000612d4383836130b4565b612d9c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612da1565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612e4e57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612e7c565b82856000016001830381548110612e6157fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60008083600101600084815260200190815260200160002054905060008114612f5f5760006001820390506000600186600001805490500390506000866000018281548110612ece57fe5b9060005260206000200154905080876000018481548110612eeb57fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612f2357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612f65565b60009150505b92915050565b600080836001016000848152602001908152602001600020549050600081146130785760006001820390506000600186600001805490500390506000866000018281548110612fb657fe5b9060005260206000209060020201905080876000018481548110612fd657fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061302957fe5b600190038181906000526020600020906002020160008082016000905560018201600090555050905586600101600087815260200190815260200160002060009055600194505050505061307e565b60009150505b92915050565b600080823b905060008111915050919050565b60606130a684846000856130d7565b90509392505050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561311c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613113906143b1565b60405180910390fd5b61312585613084565b613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b906145b1565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff16858760405161318e9190614177565b60006040518083038185875af1925050503d80600081146131cb576040519150601f19603f3d011682016040523d82523d6000602084013e6131d0565b606091505b50915091506131e08282866131ec565b92505050949350505050565b606083156131fc5782905061324c565b60008351111561320f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613243919061424f565b60405180910390fd5b9392505050565b50805460018160011615610100020316600290046000825580601f106132795750613298565b601f016020900490600052602060002090810190613297919061331b565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106132dc57805160ff191683800117855561330a565b8280016001018555821561330a579182015b828111156133095782518255916020019190600101906132ee565b5b509050613317919061331b565b5090565b5b8082111561333457600081600090555060010161331c565b5090565b600081359050613347816147ee565b92915050565b60008135905061335c81614805565b92915050565b6000813590506133718161481c565b92915050565b6000815190506133868161481c565b92915050565b600082601f83011261339d57600080fd5b81356133b06133ab82614639565b61460c565b915080825260208301602083018583830111156133cc57600080fd5b6133d783828461479b565b50505092915050565b600082601f8301126133f157600080fd5b81356134046133ff82614665565b61460c565b9150808252602083016020830185838301111561342057600080fd5b61342b83828461479b565b50505092915050565b60008135905061344381614833565b92915050565b60006020828403121561345b57600080fd5b600061346984828501613338565b91505092915050565b6000806040838503121561348557600080fd5b600061349385828601613338565b92505060206134a485828601613338565b9150509250929050565b6000806000606084860312156134c357600080fd5b60006134d186828701613338565b93505060206134e286828701613338565b92505060406134f386828701613434565b9150509250925092565b6000806000806080858703121561351357600080fd5b600061352187828801613338565b945050602061353287828801613338565b935050604061354387828801613434565b925050606085013567ffffffffffffffff81111561356057600080fd5b61356c8782880161338c565b91505092959194509250565b6000806040838503121561358b57600080fd5b600061359985828601613338565b92505060206135aa8582860161334d565b9150509250929050565b600080604083850312156135c757600080fd5b60006135d585828601613338565b92505060206135e685828601613434565b9150509250929050565b60006020828403121561360257600080fd5b600061361084828501613362565b91505092915050565b60006020828403121561362b57600080fd5b600061363984828501613377565b91505092915050565b60006020828403121561365457600080fd5b600082013567ffffffffffffffff81111561366e57600080fd5b61367a848285016133e0565b91505092915050565b60006020828403121561369557600080fd5b60006136a384828501613434565b91505092915050565b6136b581614765565b82525050565b6136c4816146f1565b82525050565b6136d3816146df565b82525050565b6136e281614703565b82525050565b60006136f382614691565b6136fd81856146a7565b935061370d8185602086016147aa565b613716816147dd565b840191505092915050565b600061372c82614691565b61373681856146b8565b93506137468185602086016147aa565b80840191505092915050565b600061375d8261469c565b61376781856146c3565b93506137778185602086016147aa565b613780816147dd565b840191505092915050565b60006137968261469c565b6137a081856146d4565b93506137b08185602086016147aa565b80840191505092915050565b60006137c96022836146c3565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061382f602b836146c3565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006138956014836146c3565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006138d56032836146c3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061393b6026836146c3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139a1601c836146c3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006139e16024836146c3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a476019836146c3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613a87601f836146c3565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613ac76019836146c3565b91507f5061636b206973206e6f7420617661696c61626c65206e6f77000000000000006000830152602082019050919050565b6000613b076026836146c3565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b6d602c836146c3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613bd3601a836146c3565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b6000613c136010836146c3565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613c536038836146c3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613cb9602a836146c3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d1f6022836146c3565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d856020836146c3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613dc56027836146c3565b91507f4552433732315061757361626c653a20746f6b656e206d696e74207768696c6560008301527f20706175736564000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e2b6021836146c3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e91602c836146c3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ef76020836146c3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613f376029836146c3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f9d602f836146c3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006140036021836146c3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140696031836146c3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006140cf601d836146c3565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061410f6030836146c3565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b6141718161475b565b82525050565b60006141838284613721565b915081905092915050565b600061419a828561378b565b91506141a6828461378b565b91508190509392505050565b60006020820190506141c760008301846136ca565b92915050565b60006020820190506141e260008301846136ac565b92915050565b60006080820190506141fd60008301876136bb565b61420a60208301866136ca565b6142176040830185614168565b818103606083015261422981846136e8565b905095945050505050565b600060208201905061424960008301846136d9565b92915050565b600060208201905081810360008301526142698184613752565b905092915050565b6000602082019050818103600083015261428a816137bc565b9050919050565b600060208201905081810360008301526142aa81613822565b9050919050565b600060208201905081810360008301526142ca81613888565b9050919050565b600060208201905081810360008301526142ea816138c8565b9050919050565b6000602082019050818103600083015261430a8161392e565b9050919050565b6000602082019050818103600083015261432a81613994565b9050919050565b6000602082019050818103600083015261434a816139d4565b9050919050565b6000602082019050818103600083015261436a81613a3a565b9050919050565b6000602082019050818103600083015261438a81613a7a565b9050919050565b600060208201905081810360008301526143aa81613aba565b9050919050565b600060208201905081810360008301526143ca81613afa565b9050919050565b600060208201905081810360008301526143ea81613b60565b9050919050565b6000602082019050818103600083015261440a81613bc6565b9050919050565b6000602082019050818103600083015261442a81613c06565b9050919050565b6000602082019050818103600083015261444a81613c46565b9050919050565b6000602082019050818103600083015261446a81613cac565b9050919050565b6000602082019050818103600083015261448a81613d12565b9050919050565b600060208201905081810360008301526144aa81613d78565b9050919050565b600060208201905081810360008301526144ca81613db8565b9050919050565b600060208201905081810360008301526144ea81613e1e565b9050919050565b6000602082019050818103600083015261450a81613e84565b9050919050565b6000602082019050818103600083015261452a81613eea565b9050919050565b6000602082019050818103600083015261454a81613f2a565b9050919050565b6000602082019050818103600083015261456a81613f90565b9050919050565b6000602082019050818103600083015261458a81613ff6565b9050919050565b600060208201905081810360008301526145aa8161405c565b9050919050565b600060208201905081810360008301526145ca816140c2565b9050919050565b600060208201905081810360008301526145ea81614102565b9050919050565b60006020820190506146066000830184614168565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561462f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561465057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561467c57600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146ea8261473b565b9050919050565b60006146fc8261473b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061477082614777565b9050919050565b600061478282614789565b9050919050565b60006147948261473b565b9050919050565b82818337600083830152505050565b60005b838110156147c85780820151818401526020810190506147ad565b838111156147d7576000848401525b50505050565b6000601f19601f8301169050919050565b6147f7816146df565b811461480257600080fd5b50565b61480e81614703565b811461481957600080fd5b50565b6148258161470f565b811461483057600080fd5b50565b61483c8161475b565b811461484757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220e5012c02ec2c17618d7710a25f17f0c0f410a6118d027bdba0f534cda8829ebe64736f6c634300070000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6170692e63727970746f676f676f732e636f6d2f6170692f6d657461646174612f0000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80636352211e1161010d578063931688cb116100a0578063c87b56dd1161006f578063c87b56dd146106cd578063e985e9c51461070a578063f103b43314610747578063f2fde38b14610770578063fb107a4f14610799576101f9565b8063931688cb1461062757806395d89b4114610650578063a22cb4651461067b578063b88d4fde146106a4576101f9565b8063722676e2116100dc578063722676e21461059e5780638456cb59146105bc5780638da5cb5b146105d35780638ea0507b146105fe576101f9565b80636352211e146104e25780636c0360eb1461051f57806370a082311461054a578063715018a614610587576101f9565b80632f745c591161019057806342966c681161015f57806342966c68146103fd578063469619f2146104265780634f6ccce71461044f5780635ac117251461048c5780635c975abb146104b7576101f9565b80632f745c59146103695780633ccfd60b146103a65780633f4ba83a146103bd57806342842e0e146103d4576101f9565b80631249c58b116101cc5780631249c58b146102cc57806318160ddd146102ea57806319e325151461031557806323b872dd14610340576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906135f0565b6107c4565b6040516102329190614234565b60405180910390f35b34801561024757600080fd5b5061025061082b565b60405161025d919061424f565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613683565b6108cd565b60405161029a91906141b2565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906135b4565b610952565b005b6102d4610a6a565b6040516102e191906145f1565b60405180910390f35b3480156102f657600080fd5b506102ff610b53565b60405161030c91906145f1565b60405180910390f35b34801561032157600080fd5b5061032a610b64565b6040516103379190614234565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906134ae565b610bcd565b005b34801561037557600080fd5b50610390600480360381019061038b91906135b4565b610c2d565b60405161039d91906145f1565b60405180910390f35b3480156103b257600080fd5b506103bb610c88565b005b3480156103c957600080fd5b506103d2610d53565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906134ae565b610e20565b005b34801561040957600080fd5b50610424600480360381019061041f9190613683565b610e40565b005b34801561043257600080fd5b5061044d60048036038101906104489190613683565b610e9c565b005b34801561045b57600080fd5b5061047660048036038101906104719190613683565b610f59565b60405161048391906145f1565b60405180910390f35b34801561049857600080fd5b506104a1610f7c565b6040516104ae91906145f1565b60405180910390f35b3480156104c357600080fd5b506104cc611006565b6040516104d99190614234565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190613683565b61101d565b60405161051691906141b2565b60405180910390f35b34801561052b57600080fd5b50610534611054565b604051610541919061424f565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190613449565b6110f6565b60405161057e91906145f1565b60405180910390f35b34801561059357600080fd5b5061059c6111b5565b005b6105a66112f2565b6040516105b391906145f1565b60405180910390f35b3480156105c857600080fd5b506105d1611426565b005b3480156105df57600080fd5b506105e86114f4565b6040516105f591906141b2565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613449565b61151e565b005b34801561063357600080fd5b5061064e60048036038101906106499190613642565b6115cf565b005b34801561065c57600080fd5b50610665611657565b604051610672919061424f565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613578565b6116f9565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906134fd565b61187a565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190613683565b6118dc565b604051610701919061424f565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c9190613472565b611a5f565b60405161073e9190614234565b60405180910390f35b34801561075357600080fd5b5061076e60048036038101906107699190613683565b611af3565b005b34801561077c57600080fd5b5061079760048036038101906107929190613449565b611bb0565b005b3480156107a557600080fd5b506107ae611d5c565b6040516107bb91906145f1565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611df2565b610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906144f1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095d8261101d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590614571565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ed611e0f565b73ffffffffffffffffffffffffffffffffffffffff161480610a1c5750610a1b81610a16611e0f565b611a5f565b5b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290614431565b60405180910390fd5b610a658383611e17565b505050565b600034610a75611d5c565b14610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90614371565b60405180910390fd5b610abd611006565b15610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af4906144b1565b60405180910390fd5b6000610b07610b53565b9050610b11610b64565b610b1a57600080fd5b610b24600b611ed0565b6000610b30600b611ee6565b9050600c54811115610b4157600080fd5b610b4b3382611ef4565b809250505090565b6000610b5f6002612082565b905090565b600080610b6f610b53565b905060968111158015610b8b57506002610b88336110f6565b10155b15610b9a576000915050610bca565b61012c8111158015610bb557506004610bb2336110f6565b10155b15610bc4576000915050610bca565b60019150505b90565b610bde610bd8611e0f565b82612097565b610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490614591565b60405180910390fd5b610c28838383612175565b505050565b6000610c8082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061238c90919063ffffffff16565b905092915050565b610c90611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610cae6114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90614511565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d4f573d6000803e3d6000fd5b5050565b610d5b611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610d796114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690614511565b60405180910390fd5b610dd7611006565b610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d906142b1565b60405180910390fd5b610e1e6123a6565b565b610e3b8383836040518060200160405280600081525061187a565b505050565b610e51610e4b611e0f565b82612097565b610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e87906145d1565b60405180910390fd5b610e9981612448565b50565b610ea4611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610ec26114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614511565b60405180910390fd5b80600d819055507f4b9d786179e2599e65d6eb10cdb73af77287bb79b562194500404a8612be165781604051610f4e91906145f1565b60405180910390a150565b600080610f7083600261258290919063ffffffff16565b50905080915050919050565b600080610f87610b53565b9050611bee8110610fc957610fc16305f5e100610fb3630ee6b27f600d546125ae90919063ffffffff16565b61261e90919063ffffffff16565b915050611003565b610c4e8110610fe3576707a1fe1602770000915050611003565b6103528110610ffd5767058d15e176280000915050611003565b60009150505b90565b6000600a60009054906101000a900460ff16905090565b600061104d8260405180606001604052806029815260200161487d6029913960026126749092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110ec5780601f106110c1576101008083540402835291602001916110ec565b820191906000526020600020905b8154815290600101906020018083116110cf57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614451565b60405180910390fd5b6111ae600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612693565b9050919050565b6111bd611e0f565b73ffffffffffffffffffffffffffffffffffffffff166111db6114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614511565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006103526112ff610b53565b1015611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614391565b60405180910390fd5b34611349610f7c565b14611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090614371565b60405180910390fd5b611391611006565b156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c8906144b1565b60405180910390fd5b600080600090505b600381101561141e576113ec600b611ed0565b6113f6600b611ee6565b9150600c5482111561140757600080fd5b6114113383611ef4565b80806001019150506113d9565b508091505090565b61142e611e0f565b73ffffffffffffffffffffffffffffffffffffffff1661144c6114f4565b73ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990614511565b60405180910390fd5b6114aa611006565b156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614411565b60405180910390fd5b6114f26126a8565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611526611e0f565b73ffffffffffffffffffffffffffffffffffffffff166115446114f4565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159190614511565b60405180910390fd5b6115a4600b611ed0565b60006115b0600b611ee6565b9050600c548111156115c157600080fd5b6115cb8282611ef4565b5050565b6115d7611e0f565b73ffffffffffffffffffffffffffffffffffffffff166115f56114f4565b73ffffffffffffffffffffffffffffffffffffffff161461164b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164290614511565b60405180910390fd5b6116548161274b565b50565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b611701611e0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614351565b60405180910390fd5b806005600061177c611e0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611829611e0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186e9190614234565b60405180910390a35050565b61188b611885611e0f565b83612097565b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614591565b60405180910390fd5b6118d684848484612765565b50505050565b60606118e782611df2565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90614551565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119cf5780601f106119a4576101008083540402835291602001916119cf565b820191906000526020600020905b8154815290600101906020018083116119b257829003601f168201915b5050505050905060606119e0611054565b90506000815114156119f6578192505050611a5a565b600082511115611a2b578082604051602001611a1392919061418e565b60405160208183030381529060405292505050611a5a565b80611a35856127c1565b604051602001611a4692919061418e565b604051602081830303815290604052925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611afb611e0f565b73ffffffffffffffffffffffffffffffffffffffff16611b196114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690614511565b60405180910390fd5b80600c819055507fd8419718ffd2a34111add9f7b4dca791378fc702c0803a6c6b12bf0b1896278d81604051611ba591906145f1565b60405180910390a150565b611bb8611e0f565b73ffffffffffffffffffffffffffffffffffffffff16611bd66114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390614511565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c93906142f1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611d67610b53565b9050611bee8110611d7d57600d54915050611def565b610c4e8110611d97576702c68af0bb140000915050611def565b61047e8110611db157670214e8348c4f0000915050611def565b61012c8110611dcb5767016345785d8a0000915050611def565b60968110611de35766f8b0a10e470000915050611def565b66b1a2bc2ec500009150505b90565b6000611e0882600261290890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e8a8361101d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5b90614491565b60405180910390fd5b611f6d81611df2565b15611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490614311565b60405180910390fd5b611fb960008383612922565b61200a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061293290919063ffffffff16565b506120218183600261294c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061209082600001612981565b9050919050565b60006120a282611df2565b6120e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d8906143d1565b60405180910390fd5b60006120ec8361101d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061215b57508373ffffffffffffffffffffffffffffffffffffffff16612143846108cd565b73ffffffffffffffffffffffffffffffffffffffff16145b8061216c575061216b8185611a5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121958261101d565b73ffffffffffffffffffffffffffffffffffffffff16146121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e290614531565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225290614331565b60405180910390fd5b612266838383612922565b612271600082611e17565b6122c281600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061299290919063ffffffff16565b5061231481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061293290919063ffffffff16565b5061232b8183600261294c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061239b83600001836129ac565b60001c905092915050565b6123ae611006565b6123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e4906142b1565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612431611e0f565b60405161243e91906141cd565b60405180910390a1565b60006124538261101d565b905061246181600084612922565b61246c600083611e17565b600060086000848152602001908152602001600020805460018160011615610100020316600290049050146124bb576008600083815260200190815260200160002060006124ba9190613253565b5b61250c82600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061299290919063ffffffff16565b50612521826002612a1990919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000806125958660000186612a33565b915091508160001c8160001c9350935050509250929050565b6000808314156125c15760009050612618565b60008284029050828482816125d257fe5b0414612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a906144d1565b60405180910390fd5b809150505b92915050565b6000808211612662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612659906143f1565b60405180910390fd5b81838161266b57fe5b04905092915050565b6000612687846000018460001b84612ab6565b60001c90509392505050565b60006126a182600001612b47565b9050919050565b6126b0611006565b156126f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e790614411565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612734611e0f565b60405161274191906141cd565b60405180910390a1565b806009908051906020019061276192919061329b565b5050565b612770848484612175565b61277c84848484612b58565b6127bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b2906142d1565b60405180910390fd5b50505050565b60606000821415612809576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612903565b600082905060005b60008214612833578080600101915050600a828161282b57fe5b049150612811565b60608167ffffffffffffffff8111801561284c57600080fd5b506040519080825280601f01601f19166020018201604052801561287f5781602001600182028036833780820191505090505b50905060006001830390508593505b600084146128fb57600a84816128a057fe5b0660300160f81b828280600190039350815181106128ba57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816128f357fe5b04935061288e565b819450505050505b919050565b600061291a836000018360001b612cbc565b905092915050565b61292d838383612cdf565b505050565b6000612944836000018360001b612d37565b905092915050565b6000612978846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612da7565b90509392505050565b600081600001805490509050919050565b60006129a4836000018360001b612e83565b905092915050565b6000818360000180549050116129f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ee90614271565b60405180910390fd5b826000018281548110612a0657fe5b9060005260206000200154905092915050565b6000612a2b836000018360001b612f6b565b905092915050565b60008082846000018054905011612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614471565b60405180910390fd5b6000846000018481548110612a9057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0f919061424f565b60405180910390fd5b50846000016001820381548110612b2b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612b798473ffffffffffffffffffffffffffffffffffffffff16613084565b612b865760019050612cb4565b6060612c4d63150b7a0260e01b612b9b611e0f565b888787604051602401612bb194939291906141e8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161484b603291398773ffffffffffffffffffffffffffffffffffffffff166130979092919063ffffffff16565b9050600081806020019051810190612c659190613619565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b612cea8383836130af565b612cf2611006565b15612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990614291565b60405180910390fd5b505050565b6000612d4383836130b4565b612d9c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612da1565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612e4e57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612e7c565b82856000016001830381548110612e6157fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60008083600101600084815260200190815260200160002054905060008114612f5f5760006001820390506000600186600001805490500390506000866000018281548110612ece57fe5b9060005260206000200154905080876000018481548110612eeb57fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612f2357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612f65565b60009150505b92915050565b600080836001016000848152602001908152602001600020549050600081146130785760006001820390506000600186600001805490500390506000866000018281548110612fb657fe5b9060005260206000209060020201905080876000018481548110612fd657fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061302957fe5b600190038181906000526020600020906002020160008082016000905560018201600090555050905586600101600087815260200190815260200160002060009055600194505050505061307e565b60009150505b92915050565b600080823b905060008111915050919050565b60606130a684846000856130d7565b90509392505050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561311c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613113906143b1565b60405180910390fd5b61312585613084565b613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b906145b1565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff16858760405161318e9190614177565b60006040518083038185875af1925050503d80600081146131cb576040519150601f19603f3d011682016040523d82523d6000602084013e6131d0565b606091505b50915091506131e08282866131ec565b92505050949350505050565b606083156131fc5782905061324c565b60008351111561320f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613243919061424f565b60405180910390fd5b9392505050565b50805460018160011615610100020316600290046000825580601f106132795750613298565b601f016020900490600052602060002090810190613297919061331b565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106132dc57805160ff191683800117855561330a565b8280016001018555821561330a579182015b828111156133095782518255916020019190600101906132ee565b5b509050613317919061331b565b5090565b5b8082111561333457600081600090555060010161331c565b5090565b600081359050613347816147ee565b92915050565b60008135905061335c81614805565b92915050565b6000813590506133718161481c565b92915050565b6000815190506133868161481c565b92915050565b600082601f83011261339d57600080fd5b81356133b06133ab82614639565b61460c565b915080825260208301602083018583830111156133cc57600080fd5b6133d783828461479b565b50505092915050565b600082601f8301126133f157600080fd5b81356134046133ff82614665565b61460c565b9150808252602083016020830185838301111561342057600080fd5b61342b83828461479b565b50505092915050565b60008135905061344381614833565b92915050565b60006020828403121561345b57600080fd5b600061346984828501613338565b91505092915050565b6000806040838503121561348557600080fd5b600061349385828601613338565b92505060206134a485828601613338565b9150509250929050565b6000806000606084860312156134c357600080fd5b60006134d186828701613338565b93505060206134e286828701613338565b92505060406134f386828701613434565b9150509250925092565b6000806000806080858703121561351357600080fd5b600061352187828801613338565b945050602061353287828801613338565b935050604061354387828801613434565b925050606085013567ffffffffffffffff81111561356057600080fd5b61356c8782880161338c565b91505092959194509250565b6000806040838503121561358b57600080fd5b600061359985828601613338565b92505060206135aa8582860161334d565b9150509250929050565b600080604083850312156135c757600080fd5b60006135d585828601613338565b92505060206135e685828601613434565b9150509250929050565b60006020828403121561360257600080fd5b600061361084828501613362565b91505092915050565b60006020828403121561362b57600080fd5b600061363984828501613377565b91505092915050565b60006020828403121561365457600080fd5b600082013567ffffffffffffffff81111561366e57600080fd5b61367a848285016133e0565b91505092915050565b60006020828403121561369557600080fd5b60006136a384828501613434565b91505092915050565b6136b581614765565b82525050565b6136c4816146f1565b82525050565b6136d3816146df565b82525050565b6136e281614703565b82525050565b60006136f382614691565b6136fd81856146a7565b935061370d8185602086016147aa565b613716816147dd565b840191505092915050565b600061372c82614691565b61373681856146b8565b93506137468185602086016147aa565b80840191505092915050565b600061375d8261469c565b61376781856146c3565b93506137778185602086016147aa565b613780816147dd565b840191505092915050565b60006137968261469c565b6137a081856146d4565b93506137b08185602086016147aa565b80840191505092915050565b60006137c96022836146c3565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061382f602b836146c3565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006138956014836146c3565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006138d56032836146c3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061393b6026836146c3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139a1601c836146c3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006139e16024836146c3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a476019836146c3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613a87601f836146c3565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613ac76019836146c3565b91507f5061636b206973206e6f7420617661696c61626c65206e6f77000000000000006000830152602082019050919050565b6000613b076026836146c3565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b6d602c836146c3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613bd3601a836146c3565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b6000613c136010836146c3565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613c536038836146c3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613cb9602a836146c3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d1f6022836146c3565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d856020836146c3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613dc56027836146c3565b91507f4552433732315061757361626c653a20746f6b656e206d696e74207768696c6560008301527f20706175736564000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e2b6021836146c3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e91602c836146c3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ef76020836146c3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613f376029836146c3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f9d602f836146c3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006140036021836146c3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140696031836146c3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006140cf601d836146c3565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061410f6030836146c3565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b6141718161475b565b82525050565b60006141838284613721565b915081905092915050565b600061419a828561378b565b91506141a6828461378b565b91508190509392505050565b60006020820190506141c760008301846136ca565b92915050565b60006020820190506141e260008301846136ac565b92915050565b60006080820190506141fd60008301876136bb565b61420a60208301866136ca565b6142176040830185614168565b818103606083015261422981846136e8565b905095945050505050565b600060208201905061424960008301846136d9565b92915050565b600060208201905081810360008301526142698184613752565b905092915050565b6000602082019050818103600083015261428a816137bc565b9050919050565b600060208201905081810360008301526142aa81613822565b9050919050565b600060208201905081810360008301526142ca81613888565b9050919050565b600060208201905081810360008301526142ea816138c8565b9050919050565b6000602082019050818103600083015261430a8161392e565b9050919050565b6000602082019050818103600083015261432a81613994565b9050919050565b6000602082019050818103600083015261434a816139d4565b9050919050565b6000602082019050818103600083015261436a81613a3a565b9050919050565b6000602082019050818103600083015261438a81613a7a565b9050919050565b600060208201905081810360008301526143aa81613aba565b9050919050565b600060208201905081810360008301526143ca81613afa565b9050919050565b600060208201905081810360008301526143ea81613b60565b9050919050565b6000602082019050818103600083015261440a81613bc6565b9050919050565b6000602082019050818103600083015261442a81613c06565b9050919050565b6000602082019050818103600083015261444a81613c46565b9050919050565b6000602082019050818103600083015261446a81613cac565b9050919050565b6000602082019050818103600083015261448a81613d12565b9050919050565b600060208201905081810360008301526144aa81613d78565b9050919050565b600060208201905081810360008301526144ca81613db8565b9050919050565b600060208201905081810360008301526144ea81613e1e565b9050919050565b6000602082019050818103600083015261450a81613e84565b9050919050565b6000602082019050818103600083015261452a81613eea565b9050919050565b6000602082019050818103600083015261454a81613f2a565b9050919050565b6000602082019050818103600083015261456a81613f90565b9050919050565b6000602082019050818103600083015261458a81613ff6565b9050919050565b600060208201905081810360008301526145aa8161405c565b9050919050565b600060208201905081810360008301526145ca816140c2565b9050919050565b600060208201905081810360008301526145ea81614102565b9050919050565b60006020820190506146066000830184614168565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561462f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561465057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561467c57600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146ea8261473b565b9050919050565b60006146fc8261473b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061477082614777565b9050919050565b600061478282614789565b9050919050565b60006147948261473b565b9050919050565b82818337600083830152505050565b60005b838110156147c85780820151818401526020810190506147ad565b838111156147d7576000848401525b50505050565b6000601f19601f8301169050919050565b6147f7816146df565b811461480257600080fd5b50565b61480e81614703565b811461481957600080fd5b50565b6148258161470f565b811461483057600080fd5b50565b61483c8161475b565b811461484757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220e5012c02ec2c17618d7710a25f17f0c0f410a6118d027bdba0f534cda8829ebe64736f6c63430007000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6170692e63727970746f676f676f732e636f6d2f6170692f6d657461646174612f0000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _baseURI (string): https://api.cryptogogos.com/api/metadata/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [2] : 68747470733a2f2f6170692e63727970746f676f676f732e636f6d2f6170692f
Arg [3] : 6d657461646174612f0000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
68547:5292:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18114:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51724:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54732:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54231:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71361:486;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53659:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70242:283;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55791:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53371:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72731:136;;;;;;;;;;;;;:::i;:::-;;73603:76;;;;;;;;;;;;;:::i;:::-;;56238:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68258:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70588:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53947:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69144:424;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66350:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51368:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53190:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50998:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1669:148;;;;;;;;;;;;;:::i;:::-;;71920:606;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73387:75;;;;;;;;;;;;;:::i;:::-;;1018:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71088:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72534:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51893;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55112:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56494:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52068:879;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55510:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73687:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69631:548;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18114:200;18244:4;18273:20;:33;18294:11;18273:33;;;;;;;;;;;;;;;;;;;;;;;;;;;18266:40;;18114:200;;;:::o;51724:100::-;51778:13;51811:5;51804:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51724:100;:::o;54732:308::-;54853:7;54900:16;54908:7;54900;:16::i;:::-;54878:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;55008:15;:24;55024:7;55008:24;;;;;;;;;;;;;;;;;;;;;55001:31;;54732:308;;;:::o;54231:435::-;54312:13;54328:23;54343:7;54328:14;:23::i;:::-;54312:39;;54376:5;54370:11;;:2;:11;;;;54362:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54470:5;54454:21;;:12;:10;:12::i;:::-;:21;;;:86;;;;54496:44;54520:5;54527:12;:10;:12::i;:::-;54496:23;:44::i;:::-;54454:86;54432:192;;;;;;;;;;;;:::i;:::-;;;;;;;;;54637:21;54646:2;54650:7;54637:8;:21::i;:::-;54231:435;;;:::o;71361:486::-;71401:7;71446:9;71429:13;:11;:13::i;:::-;:26;71421:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;71511:8;:6;:8::i;:::-;71510:9;71502:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71576:21;71600:13;:11;:13::i;:::-;71576:37;;71629:10;:8;:10::i;:::-;71624:25;;71641:8;;;71624:25;71660:21;:9;:19;:21::i;:::-;71692:17;71712:19;:9;:17;:19::i;:::-;71692:39;;71763:9;;71750;:22;;71742:31;;;;;;71784:28;71790:10;71802:9;71784:5;:28::i;:::-;71830:9;71823:16;;;;71361:486;:::o;53659:211::-;53720:7;53841:21;:12;:19;:21::i;:::-;53834:28;;53659:211;:::o;70242:283::-;70283:4;70300:21;70324:13;:11;:13::i;:::-;70300:37;;70369:3;70352:13;:20;;:50;;;;;70401:1;70376:21;70386:10;70376:9;:21::i;:::-;:26;;70352:50;70348:68;;;70411:5;70404:12;;;;;70348:68;70448:3;70431:13;:20;;:50;;;;;70480:1;70455:21;70465:10;70455:9;:21::i;:::-;:26;;70431:50;70427:68;;;70490:5;70483:12;;;;;70427:68;70513:4;70506:11;;;70242:283;;:::o;55791:376::-;56000:41;56019:12;:10;:12::i;:::-;56033:7;56000:18;:41::i;:::-;55978:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;56131:28;56141:4;56147:2;56151:7;56131:9;:28::i;:::-;55791:376;;;:::o;53371:212::-;53513:7;53545:30;53569:5;53545:13;:20;53559:5;53545:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53538:37;;53371:212;;;;:::o;72731:136::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72781:15:::1;72799:21;72781:39;;72831:10;:19;;:28;72851:7;72831:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1309:1;72731:136::o:0;73603:76::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66953:8:::1;:6;:8::i;:::-;66945:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;73661:10:::2;:8;:10::i;:::-;73603:76::o:0;56238:185::-;56376:39;56393:4;56399:2;56403:7;56376:39;;;;;;;;;;;;:16;:39::i;:::-;56238:185;;;:::o;68258:282::-;68390:41;68409:12;:10;:12::i;:::-;68423:7;68390:18;:41::i;:::-;68368:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;68518:14;68524:7;68518:5;:14::i;:::-;68258:282;:::o;70588:140::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70671:6:::1;70656:12;:21;;;;70695:25;70713:6;70695:25;;;;;;:::i;:::-;;;;;;;;70588:140:::0;:::o;53947:222::-;54067:7;54093:15;54114:22;54130:5;54114:12;:15;;:22;;;;:::i;:::-;54092:44;;;54154:7;54147:14;;;53947:222;;;:::o;69144:424::-;69192:7;69212:21;69236:13;:11;:13::i;:::-;69212:37;;69283:4;69266:13;:21;69262:299;;69311:45;69346:9;69311:30;69328:12;69311;;:16;;:30;;;;:::i;:::-;:34;;:45;;;;:::i;:::-;69304:52;;;;;69262:299;69395:4;69378:13;:21;69374:187;;69423:10;69416:17;;;;;69374:187;69472:3;69455:13;:20;69451:110;;69499:9;69492:16;;;;;69451:110;69548:1;69541:8;;;69144:424;;:::o;66350:86::-;66397:4;66421:7;;;;;;;;;;;66414:14;;66350:86;:::o;51368:289::-;51485:7;51530:119;51565:7;51530:119;;;;;;;;;;;;;;;;;:12;:16;;:119;;;;;:::i;:::-;51510:139;;51368:289;;;:::o;53190:97::-;53238:13;53271:8;53264:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53190:97;:::o;50998:308::-;51115:7;51179:1;51162:19;;:5;:19;;;;51140:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;51269:29;:13;:20;51283:5;51269:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51262:36;;50998:308;;;:::o;1669:148::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1776:1:::1;1739:40;;1760:6;;;;;;;;;;;1739:40;;;;;;;;;;;;1807:1;1790:6;;:19;;;;;;;;;;;;;;;;;;1669:148::o:0;71920:606::-;71964:7;72009:3;71992:13;:11;:13::i;:::-;:20;;71984:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;72096:9;72075:17;:15;:17::i;:::-;:30;72053:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;72184:8;:6;:8::i;:::-;72183:9;72175:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;72249:17;72282:9;72294:1;72282:13;;72277:215;72301:1;72297;:5;72277:215;;;72324:21;:9;:19;:21::i;:::-;72372:19;:9;:17;:19::i;:::-;72360:31;;72427:9;;72414;:22;;72406:31;;;;;;72452:28;72458:10;72470:9;72452:5;:28::i;:::-;72304:3;;;;;;;72277:215;;;;72509:9;72502:16;;;71920:606;:::o;73387:75::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66676:8:::1;:6;:8::i;:::-;66675:9;66667:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;73446:8:::2;:6;:8::i;:::-;73387:75::o:0;1018:87::-;1064:7;1091:6;;;;;;;;;;;1084:13;;1018:87;:::o;71088:213::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71149:21:::1;:9;:19;:21::i;:::-;71181:17;71201:19;:9;:17;:19::i;:::-;71181:39;;71252:9;;71239;:22;;71231:31;;;::::0;::::1;;71273:20;71279:2;71283:9;71273:5;:20::i;:::-;1309:1;71088:213:::0;:::o;72534:104::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72609:21:::1;72621:8;72609:11;:21::i;:::-;72534:104:::0;:::o;51893:::-;51949:13;51982:7;51975:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51893:104;:::o;55112:327::-;55259:12;:10;:12::i;:::-;55247:24;;:8;:24;;;;55239:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;55359:8;55314:18;:32;55333:12;:10;:12::i;:::-;55314:32;;;;;;;;;;;;;;;:42;55347:8;55314:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;55412:8;55383:48;;55398:12;:10;:12::i;:::-;55383:48;;;55422:8;55383:48;;;;;;:::i;:::-;;;;;;;;55112:327;;:::o;56494:365::-;56683:41;56702:12;:10;:12::i;:::-;56716:7;56683:18;:41::i;:::-;56661:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;56812:39;56826:4;56832:2;56836:7;56845:5;56812:13;:39::i;:::-;56494:365;;;;:::o;52068:879::-;52186:13;52239:16;52247:7;52239;:16::i;:::-;52217:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;52343:23;52369:10;:19;52380:7;52369:19;;;;;;;;;;;52343:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52399:18;52420:9;:7;:9::i;:::-;52399:30;;52527:1;52511:4;52505:18;:23;52501:72;;;52552:9;52545:16;;;;;;52501:72;52703:1;52683:9;52677:23;:27;52673:108;;;52752:4;52758:9;52735:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52721:48;;;;;;52673:108;52913:4;52919:18;:7;:16;:18::i;:::-;52896:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52882:57;;;;52068:879;;;;:::o;55510:214::-;55652:4;55681:18;:25;55700:5;55681:25;;;;;;;;;;;;;;;:35;55707:8;55681:35;;;;;;;;;;;;;;;;;;;;;;;;;55674:42;;55510:214;;;;:::o;73687:149::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73772:10:::1;73760:9;:22;;;;73798:30;73817:10;73798:30;;;;;;:::i;:::-;;;;;;;;73687:149:::0;:::o;1972:281::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2053:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2208:8;2179:38;;2200:6;;;;;;;;;;;2179:38;;;;;;;;;;;;2237:8;2228:6;;:17;;;;;;;;;;;;;;;;;;1972:281:::0;:::o;69631:548::-;69675:7;69695:21;69719:13;:11;:13::i;:::-;69695:37;;69766:4;69749:13;:21;69745:427;;69794:12;;69787:19;;;;;69745:427;69845:4;69828:13;:21;69824:348;;69873:9;69866:16;;;;;69824:348;69921:4;69904:13;:21;69900:272;;69949:10;69942:17;;;;;69900:272;69998:3;69981:13;:20;69977:195;;70025:9;70018:16;;;;;69977:195;70073:3;70056:13;:20;70052:120;;70100:10;70093:17;;;;;70052:120;70150:10;70143:17;;;69631:548;;:::o;58406:127::-;58471:4;58495:30;58517:7;58495:12;:21;;:30;;;;:::i;:::-;58488:37;;58406:127;;;:::o;130:106::-;183:15;218:10;211:17;;130:106;:::o;64869:192::-;64971:2;64944:15;:24;64960:7;64944:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;65027:7;65023:2;64989:46;;64998:23;65013:7;64998:14;:23::i;:::-;64989:46;;;;;;;;;;;;64869:192;;:::o;9884:181::-;10056:1;10038:7;:14;;;:19;;;;;;;;;;;9884:181;:::o;9762:114::-;9827:7;9854;:14;;;9847:21;;9762:114;;;:::o;60496:404::-;60590:1;60576:16;;:2;:16;;;;60568:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;60649:16;60657:7;60649;:16::i;:::-;60648:17;60640:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;60711:45;60740:1;60744:2;60748:7;60711:20;:45::i;:::-;60769:30;60791:7;60769:13;:17;60783:2;60769:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;60812:29;60829:7;60838:2;60812:12;:16;;:29;;;;;:::i;:::-;;60884:7;60880:2;60859:33;;60876:1;60859:33;;;;;;;;;;;;60496:404;;:::o;44407:155::-;44503:7;44535:19;44543:3;:10;;44535:7;:19::i;:::-;44528:26;;44407:155;;;:::o;58700:459::-;58829:4;58873:16;58881:7;58873;:16::i;:::-;58851:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;58972:13;58988:23;59003:7;58988:14;:23::i;:::-;58972:39;;59041:5;59030:16;;:7;:16;;;:64;;;;59087:7;59063:31;;:20;59075:7;59063:11;:20::i;:::-;:31;;;59030:64;:120;;;;59111:39;59135:5;59142:7;59111:23;:39::i;:::-;59030:120;59022:129;;;58700:459;;;;:::o;62011:670::-;62184:4;62157:31;;:23;62172:7;62157:14;:23::i;:::-;:31;;;62135:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;62308:1;62294:16;;:2;:16;;;;62286:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62364:39;62385:4;62391:2;62395:7;62364:20;:39::i;:::-;62468:29;62485:1;62489:7;62468:8;:29::i;:::-;62510:35;62537:7;62510:13;:19;62524:4;62510:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;62556:30;62578:7;62556:13;:17;62570:2;62556:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;62599:29;62616:7;62625:2;62599:12;:16;;:29;;;;;:::i;:::-;;62665:7;62661:2;62646:27;;62655:4;62646:27;;;;;;;;;;;;62011:670;;;:::o;36674:169::-;36772:7;36812:22;36816:3;:10;;36828:5;36812:3;:22::i;:::-;36804:31;;36797:38;;36674:169;;;;:::o;67409:120::-;66953:8;:6;:8::i;:::-;66945:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;67478:5:::1;67468:7;;:15;;;;;;;;;;;;;;;;;;67499:22;67508:12;:10;:12::i;:::-;67499:22;;;;;;:::i;:::-;;;;;;;;67409:120::o:0;61129:545::-;61189:13;61205:23;61220:7;61205:14;:23::i;:::-;61189:39;;61259:48;61280:5;61295:1;61299:7;61259:20;:48::i;:::-;61348:29;61365:1;61369:7;61348:8;:29::i;:::-;61467:1;61436:10;:19;61447:7;61436:19;;;;;;;;;;;61430:33;;;;;;;;;;;;;;;;:38;61426:97;;61492:10;:19;61503:7;61492:19;;;;;;;;;;;;61485:26;;;;:::i;:::-;61426:97;61535:36;61563:7;61535:13;:20;61549:5;61535:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;61584:28;61604:7;61584:12;:19;;:28;;;;:::i;:::-;;61658:7;61654:1;61630:36;;61639:5;61630:36;;;;;;;;;;;;61129:545;;:::o;44910:268::-;45017:7;45026;45052:11;45065:13;45082:22;45086:3;:10;;45098:5;45082:3;:22::i;:::-;45051:53;;;;45131:3;45123:12;;45161:5;45153:14;;45115:55;;;;;;44910:268;;;;;:::o;5426:220::-;5484:7;5513:1;5508;:6;5504:20;;;5523:1;5516:8;;;;5504:20;5535:9;5551:1;5547;:5;5535:17;;5580:1;5575;5571;:5;;;;;;:10;5563:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;5637:1;5630:8;;;5426:220;;;;;:::o;6124:153::-;6182:7;6214:1;6210;:5;6202:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;6268:1;6264;:5;;;;;;6257:12;;6124:153;;;;:::o;46292:292::-;46433:7;46515:44;46520:3;:10;;46540:3;46532:12;;46546;46515:4;:44::i;:::-;46507:53;;46453:123;;46292:292;;;;;:::o;36206:114::-;36266:7;36293:19;36301:3;:10;;36293:7;:19::i;:::-;36286:26;;36206:114;;;:::o;67150:118::-;66676:8;:6;:8::i;:::-;66675:9;66667:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;67220:4:::1;67210:7;;:14;;;;;;;;;;;;;;;;;;67240:20;67247:12;:10;:12::i;:::-;67240:20;;;;;;:::i;:::-;;;;;;;;67150:118::o:0;63342:100::-;63426:8;63415;:19;;;;;;;;;;;;:::i;:::-;;63342:100;:::o;57741:352::-;57898:28;57908:4;57914:2;57918:7;57898:9;:28::i;:::-;57959:48;57982:4;57988:2;57992:7;58001:5;57959:22;:48::i;:::-;57937:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;57741:352;;;;:::o;46704:748::-;46760:13;46990:1;46981:5;:10;46977:53;;;47008:10;;;;;;;;;;;;;;;;;;;;;46977:53;47040:12;47055:5;47040:20;;47071:14;47096:78;47111:1;47103:4;:9;47096:78;;47129:8;;;;;;;47160:2;47152:10;;;;;;;;;47096:78;;;47184:19;47216:6;47206:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47184:39;;47234:13;47259:1;47250:6;:10;47234:26;;47278:5;47271:12;;47294:119;47309:1;47301:4;:9;47294:119;;47371:2;47364:4;:9;;;;;;47358:2;:16;47345:31;;47327:6;47334:7;;;;;;;47327:15;;;;;;;;;;;:49;;;;;;;;;;;47399:2;47391:10;;;;;;;;;47294:119;;;47437:6;47423:21;;;;;;46704:748;;;;:::o;44136:183::-;44247:4;44276:35;44286:3;:10;;44306:3;44298:12;;44276:9;:35::i;:::-;44269:42;;44136:183;;;;:::o;73022:221::-;73190:45;73217:4;73223:2;73227:7;73190:26;:45::i;:::-;73022:221;;;:::o;35389:131::-;35456:4;35480:32;35485:3;:10;;35505:5;35497:14;;35480:4;:32::i;:::-;35473:39;;35389:131;;;;:::o;43502:219::-;43625:4;43649:64;43654:3;:10;;43674:3;43666:12;;43704:5;43688:23;;43680:32;;43649:4;:64::i;:::-;43642:71;;43502:219;;;;;:::o;40752:110::-;40808:7;40835:3;:12;;:19;;;;40828:26;;40752:110;;;:::o;35696:160::-;35784:4;35813:35;35821:3;:10;;35841:5;35833:14;;35813:7;:35::i;:::-;35806:42;;35696:160;;;;:::o;31340:273::-;31434:7;31502:5;31481:3;:11;;:18;;;;:26;31459:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31587:3;:11;;31599:5;31587:18;;;;;;;;;;;;;;;;31580:25;;31340:273;;;;:::o;43887:165::-;43982:4;44011:33;44019:3;:10;;44039:3;44031:12;;44011:7;:33::i;:::-;44004:40;;43887:165;;;;:::o;41227:348::-;41321:7;41330;41399:5;41377:3;:12;;:19;;;;:27;41355:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41479:22;41504:3;:12;;41517:5;41504:19;;;;;;;;;;;;;;;;;;41479:44;;41542:5;:10;;;41554:5;:12;;;41534:33;;;;;41227:348;;;;;:::o;42825:353::-;42953:7;42973:16;42992:3;:12;;:17;43005:3;42992:17;;;;;;;;;;;;42973:36;;43040:1;43028:8;:13;;43043:12;43020:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43110:3;:12;;43134:1;43123:8;:12;43110:26;;;;;;;;;;;;;;;;;;:33;;;43103:40;;;42825:353;;;;;:::o;30877:109::-;30933:7;30960:3;:11;;:18;;;;30953:25;;30877:109;;;:::o;64007:743::-;64162:4;64184:15;:2;:13;;;:15::i;:::-;64179:60;;64223:4;64216:11;;;;64179:60;64249:23;64288:349;64367:45;;;64435:12;:10;:12::i;:::-;64470:4;64497:7;64527:5;64322:229;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64288:349;;;;;;;;;;;;;;;;;:2;:15;;;;:349;;;;;:::i;:::-;64249:388;;64648:13;64675:10;64664:32;;;;;;;;;;;;:::i;:::-;64648:48;;48001:10;64725:16;;64715:26;;;:6;:26;;;;64707:35;;;;64007:743;;;;;;;:::o;40500:157::-;40598:4;40648:1;40627:3;:12;;:17;40640:3;40627:17;;;;;;;;;;;;:22;;40620:29;;40500:157;;;;:::o;67743:275::-;67887:45;67914:4;67920:2;67924:7;67887:26;:45::i;:::-;67954:8;:6;:8::i;:::-;67953:9;67945:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;67743:275;;;:::o;28397:414::-;28460:4;28482:21;28492:3;28497:5;28482:9;:21::i;:::-;28477:327;;28520:3;:11;;28537:5;28520:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28703:3;:11;;:18;;;;28681:3;:12;;:19;28694:5;28681:19;;;;;;;;;;;:40;;;;28743:4;28736:11;;;;28477:327;28787:5;28780:12;;28397:414;;;;;:::o;37942:737::-;38052:4;38168:16;38187:3;:12;;:17;38200:3;38187:17;;;;;;;;;;;;38168:36;;38233:1;38221:8;:13;38217:455;;;38301:3;:12;;38319:36;;;;;;;;38335:3;38319:36;;;;38348:5;38319:36;;;38301:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38514:3;:12;;:19;;;;38494:3;:12;;:17;38507:3;38494:17;;;;;;;;;;;:39;;;;38555:4;38548:11;;;;;38217:455;38628:5;38592:3;:12;;38616:1;38605:8;:12;38592:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38655:5;38648:12;;;37942:737;;;;;;:::o;28987:1557::-;29053:4;29171:18;29192:3;:12;;:19;29205:5;29192:19;;;;;;;;;;;;29171:40;;29242:1;29228:10;:15;29224:1313;;29603:21;29640:1;29627:10;:14;29603:38;;29656:17;29697:1;29676:3;:11;;:18;;;;:22;29656:42;;29943:17;29963:3;:11;;29975:9;29963:22;;;;;;;;;;;;;;;;29943:42;;30109:9;30080:3;:11;;30092:13;30080:26;;;;;;;;;;;;;;;:38;;;;30228:1;30212:13;:17;30186:3;:12;;:23;30199:9;30186:23;;;;;;;;;;;:43;;;;30338:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30433:3;:12;;:19;30446:5;30433:19;;;;;;;;;;;30426:26;;;30476:4;30469:11;;;;;;;;29224:1313;30520:5;30513:12;;;28987:1557;;;;;:::o;38854:1562::-;38918:4;39034:16;39053:3;:12;;:17;39066:3;39053:17;;;;;;;;;;;;39034:36;;39099:1;39087:8;:13;39083:1326;;39461:21;39496:1;39485:8;:12;39461:36;;39512:17;39554:1;39532:3;:12;;:19;;;;:23;39512:43;;39800:26;39829:3;:12;;39842:9;39829:23;;;;;;;;;;;;;;;;;;39800:52;;39977:9;39947:3;:12;;39960:13;39947:27;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;40101:1;40085:13;:17;40054:3;:12;;:28;40067:9;:14;;;40054:28;;;;;;;;;;;:48;;;;40211:3;:12;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40307:3;:12;;:17;40320:3;40307:17;;;;;;;;;;;40300:24;;;40348:4;40341:11;;;;;;;;39083:1326;40392:5;40385:12;;;38854:1562;;;;;:::o;19539:444::-;19599:4;19807:12;19931:7;19919:20;19911:28;;19974:1;19967:4;:8;19960:15;;;19539:444;;;:::o;22576:229::-;22713:12;22745:52;22767:6;22775:4;22781:1;22784:12;22745:21;:52::i;:::-;22738:59;;22576:229;;;;;:::o;65674:126::-;;;;:::o;30630:161::-;30730:4;30782:1;30759:3;:12;;:19;30772:5;30759:19;;;;;;;;;;;;:24;;30752:31;;30630:161;;;;:::o;23792:621::-;23962:12;24034:5;24009:21;:30;;23987:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;24124:18;24135:6;24124:10;:18::i;:::-;24116:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24250:12;24264:23;24304:6;:11;;24323:5;24330:4;24304:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24249:86;;;;24353:52;24371:7;24380:10;24392:12;24353:17;:52::i;:::-;24346:59;;;;23792:621;;;;;;:::o;26704:777::-;26854:12;26883:7;26879:595;;;26914:10;26907:17;;;;26879:595;27048:1;27028:10;:17;:21;27024:439;;;27291:10;27285:17;27352:15;27339:10;27335:2;27331:19;27324:44;27239:148;27434:12;27427:20;;;;;;;;;;;:::i;:::-;;;;;;;;26704:777;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:124::-;;219:6;206:20;197:29;;231:30;255:5;231:30;:::i;:::-;191:75;;;;:::o;273:128::-;;352:6;339:20;330:29;;364:32;390:5;364:32;:::i;:::-;324:77;;;;:::o;408:132::-;;491:6;485:13;476:22;;503:32;529:5;503:32;:::i;:::-;470:70;;;;:::o;548:440::-;;649:3;642:4;634:6;630:17;626:27;616:2;;667:1;664;657:12;616:2;704:6;691:20;726:64;741:48;782:6;741:48;:::i;:::-;726:64;:::i;:::-;717:73;;810:6;803:5;796:21;846:4;838:6;834:17;879:4;872:5;868:16;914:3;905:6;900:3;896:16;893:25;890:2;;;931:1;928;921:12;890:2;941:41;975:6;970:3;965;941:41;:::i;:::-;609:379;;;;;;;:::o;997:442::-;;1099:3;1092:4;1084:6;1080:17;1076:27;1066:2;;1117:1;1114;1107:12;1066:2;1154:6;1141:20;1176:65;1191:49;1233:6;1191:49;:::i;:::-;1176:65;:::i;:::-;1167:74;;1261:6;1254:5;1247:21;1297:4;1289:6;1285:17;1330:4;1323:5;1319:16;1365:3;1356:6;1351:3;1347:16;1344:25;1341:2;;;1382:1;1379;1372:12;1341:2;1392:41;1426:6;1421:3;1416;1392:41;:::i;:::-;1059:380;;;;;;;:::o;1447:130::-;;1527:6;1514:20;1505:29;;1539:33;1566:5;1539:33;:::i;:::-;1499:78;;;;:::o;1584:241::-;;1688:2;1676:9;1667:7;1663:23;1659:32;1656:2;;;1704:1;1701;1694:12;1656:2;1739:1;1756:53;1801:7;1792:6;1781:9;1777:22;1756:53;:::i;:::-;1746:63;;1718:97;1650:175;;;;:::o;1832:366::-;;;1953:2;1941:9;1932:7;1928:23;1924:32;1921:2;;;1969:1;1966;1959:12;1921:2;2004:1;2021:53;2066:7;2057:6;2046:9;2042:22;2021:53;:::i;:::-;2011:63;;1983:97;2111:2;2129:53;2174:7;2165:6;2154:9;2150:22;2129:53;:::i;:::-;2119:63;;2090:98;1915:283;;;;;:::o;2205:491::-;;;;2343:2;2331:9;2322:7;2318:23;2314:32;2311:2;;;2359:1;2356;2349:12;2311:2;2394:1;2411:53;2456:7;2447:6;2436:9;2432:22;2411:53;:::i;:::-;2401:63;;2373:97;2501:2;2519:53;2564:7;2555:6;2544:9;2540:22;2519:53;:::i;:::-;2509:63;;2480:98;2609:2;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2588:98;2305:391;;;;;:::o;2703:721::-;;;;;2867:3;2855:9;2846:7;2842:23;2838:33;2835:2;;;2884:1;2881;2874:12;2835:2;2919:1;2936:53;2981:7;2972:6;2961:9;2957:22;2936:53;:::i;:::-;2926:63;;2898:97;3026:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;3005:98;3134:2;3152:53;3197:7;3188:6;3177:9;3173:22;3152:53;:::i;:::-;3142:63;;3113:98;3270:2;3259:9;3255:18;3242:32;3294:18;3286:6;3283:30;3280:2;;;3326:1;3323;3316:12;3280:2;3346:62;3400:7;3391:6;3380:9;3376:22;3346:62;:::i;:::-;3336:72;;3221:193;2829:595;;;;;;;:::o;3431:360::-;;;3549:2;3537:9;3528:7;3524:23;3520:32;3517:2;;;3565:1;3562;3555:12;3517:2;3600:1;3617:53;3662:7;3653:6;3642:9;3638:22;3617:53;:::i;:::-;3607:63;;3579:97;3707:2;3725:50;3767:7;3758:6;3747:9;3743:22;3725:50;:::i;:::-;3715:60;;3686:95;3511:280;;;;;:::o;3798:366::-;;;3919:2;3907:9;3898:7;3894:23;3890:32;3887:2;;;3935:1;3932;3925:12;3887:2;3970:1;3987:53;4032:7;4023:6;4012:9;4008:22;3987:53;:::i;:::-;3977:63;;3949:97;4077:2;4095:53;4140:7;4131:6;4120:9;4116:22;4095:53;:::i;:::-;4085:63;;4056:98;3881:283;;;;;:::o;4171:239::-;;4274:2;4262:9;4253:7;4249:23;4245:32;4242:2;;;4290:1;4287;4280:12;4242:2;4325:1;4342:52;4386:7;4377:6;4366:9;4362:22;4342:52;:::i;:::-;4332:62;;4304:96;4236:174;;;;:::o;4417:261::-;;4531:2;4519:9;4510:7;4506:23;4502:32;4499:2;;;4547:1;4544;4537:12;4499:2;4582:1;4599:63;4654:7;4645:6;4634:9;4630:22;4599:63;:::i;:::-;4589:73;;4561:107;4493:185;;;;:::o;4685:347::-;;4799:2;4787:9;4778:7;4774:23;4770:32;4767:2;;;4815:1;4812;4805:12;4767:2;4878:1;4867:9;4863:17;4850:31;4901:18;4893:6;4890:30;4887:2;;;4933:1;4930;4923:12;4887:2;4953:63;5008:7;4999:6;4988:9;4984:22;4953:63;:::i;:::-;4943:73;;4829:193;4761:271;;;;:::o;5039:241::-;;5143:2;5131:9;5122:7;5118:23;5114:32;5111:2;;;5159:1;5156;5149:12;5111:2;5194:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5173:97;5105:175;;;;:::o;5287:142::-;5378:45;5417:5;5378:45;:::i;:::-;5373:3;5366:58;5360:69;;:::o;5436:137::-;5535:32;5561:5;5535:32;:::i;:::-;5530:3;5523:45;5517:56;;:::o;5580:113::-;5663:24;5681:5;5663:24;:::i;:::-;5658:3;5651:37;5645:48;;:::o;5700:104::-;5777:21;5792:5;5777:21;:::i;:::-;5772:3;5765:34;5759:45;;:::o;5811:343::-;;5921:38;5953:5;5921:38;:::i;:::-;5971:70;6034:6;6029:3;5971:70;:::i;:::-;5964:77;;6046:52;6091:6;6086:3;6079:4;6072:5;6068:16;6046:52;:::i;:::-;6119:29;6141:6;6119:29;:::i;:::-;6114:3;6110:39;6103:46;;5901:253;;;;;:::o;6161:356::-;;6289:38;6321:5;6289:38;:::i;:::-;6339:88;6420:6;6415:3;6339:88;:::i;:::-;6332:95;;6432:52;6477:6;6472:3;6465:4;6458:5;6454:16;6432:52;:::i;:::-;6505:6;6500:3;6496:16;6489:23;;6269:248;;;;;:::o;6524:347::-;;6636:39;6669:5;6636:39;:::i;:::-;6687:71;6751:6;6746:3;6687:71;:::i;:::-;6680:78;;6763:52;6808:6;6803:3;6796:4;6789:5;6785:16;6763:52;:::i;:::-;6836:29;6858:6;6836:29;:::i;:::-;6831:3;6827:39;6820:46;;6616:255;;;;;:::o;6878:360::-;;7008:39;7041:5;7008:39;:::i;:::-;7059:89;7141:6;7136:3;7059:89;:::i;:::-;7052:96;;7153:52;7198:6;7193:3;7186:4;7179:5;7175:16;7153:52;:::i;:::-;7226:6;7221:3;7217:16;7210:23;;6988:250;;;;;:::o;7246:371::-;;7406:67;7470:2;7465:3;7406:67;:::i;:::-;7399:74;;7506:34;7502:1;7497:3;7493:11;7486:55;7575:4;7570:2;7565:3;7561:12;7554:26;7608:2;7603:3;7599:12;7592:19;;7392:225;;;:::o;7626:380::-;;7786:67;7850:2;7845:3;7786:67;:::i;:::-;7779:74;;7886:34;7882:1;7877:3;7873:11;7866:55;7955:13;7950:2;7945:3;7941:12;7934:35;7997:2;7992:3;7988:12;7981:19;;7772:234;;;:::o;8015:320::-;;8175:67;8239:2;8234:3;8175:67;:::i;:::-;8168:74;;8275:22;8271:1;8266:3;8262:11;8255:43;8326:2;8321:3;8317:12;8310:19;;8161:174;;;:::o;8344:387::-;;8504:67;8568:2;8563:3;8504:67;:::i;:::-;8497:74;;8604:34;8600:1;8595:3;8591:11;8584:55;8673:20;8668:2;8663:3;8659:12;8652:42;8722:2;8717:3;8713:12;8706:19;;8490:241;;;:::o;8740:375::-;;8900:67;8964:2;8959:3;8900:67;:::i;:::-;8893:74;;9000:34;8996:1;8991:3;8987:11;8980:55;9069:8;9064:2;9059:3;9055:12;9048:30;9106:2;9101:3;9097:12;9090:19;;8886:229;;;:::o;9124:328::-;;9284:67;9348:2;9343:3;9284:67;:::i;:::-;9277:74;;9384:30;9380:1;9375:3;9371:11;9364:51;9443:2;9438:3;9434:12;9427:19;;9270:182;;;:::o;9461:373::-;;9621:67;9685:2;9680:3;9621:67;:::i;:::-;9614:74;;9721:34;9717:1;9712:3;9708:11;9701:55;9790:6;9785:2;9780:3;9776:12;9769:28;9825:2;9820:3;9816:12;9809:19;;9607:227;;;:::o;9843:325::-;;10003:67;10067:2;10062:3;10003:67;:::i;:::-;9996:74;;10103:27;10099:1;10094:3;10090:11;10083:48;10159:2;10154:3;10150:12;10143:19;;9989:179;;;:::o;10177:331::-;;10337:67;10401:2;10396:3;10337:67;:::i;:::-;10330:74;;10437:33;10433:1;10428:3;10424:11;10417:54;10499:2;10494:3;10490:12;10483:19;;10323:185;;;:::o;10517:325::-;;10677:67;10741:2;10736:3;10677:67;:::i;:::-;10670:74;;10777:27;10773:1;10768:3;10764:11;10757:48;10833:2;10828:3;10824:12;10817:19;;10663:179;;;:::o;10851:375::-;;11011:67;11075:2;11070:3;11011:67;:::i;:::-;11004:74;;11111:34;11107:1;11102:3;11098:11;11091:55;11180:8;11175:2;11170:3;11166:12;11159:30;11217:2;11212:3;11208:12;11201:19;;10997:229;;;:::o;11235:381::-;;11395:67;11459:2;11454:3;11395:67;:::i;:::-;11388:74;;11495:34;11491:1;11486:3;11482:11;11475:55;11564:14;11559:2;11554:3;11550:12;11543:36;11607:2;11602:3;11598:12;11591:19;;11381:235;;;:::o;11625:326::-;;11785:67;11849:2;11844:3;11785:67;:::i;:::-;11778:74;;11885:28;11881:1;11876:3;11872:11;11865:49;11942:2;11937:3;11933:12;11926:19;;11771:180;;;:::o;11960:316::-;;12120:67;12184:2;12179:3;12120:67;:::i;:::-;12113:74;;12220:18;12216:1;12211:3;12207:11;12200:39;12267:2;12262:3;12258:12;12251:19;;12106:170;;;:::o;12285:393::-;;12445:67;12509:2;12504:3;12445:67;:::i;:::-;12438:74;;12545:34;12541:1;12536:3;12532:11;12525:55;12614:26;12609:2;12604:3;12600:12;12593:48;12669:2;12664:3;12660:12;12653:19;;12431:247;;;:::o;12687:379::-;;12847:67;12911:2;12906:3;12847:67;:::i;:::-;12840:74;;12947:34;12943:1;12938:3;12934:11;12927:55;13016:12;13011:2;13006:3;13002:12;12995:34;13057:2;13052:3;13048:12;13041:19;;12833:233;;;:::o;13075:371::-;;13235:67;13299:2;13294:3;13235:67;:::i;:::-;13228:74;;13335:34;13331:1;13326:3;13322:11;13315:55;13404:4;13399:2;13394:3;13390:12;13383:26;13437:2;13432:3;13428:12;13421:19;;13221:225;;;:::o;13455:332::-;;13615:67;13679:2;13674:3;13615:67;:::i;:::-;13608:74;;13715:34;13711:1;13706:3;13702:11;13695:55;13778:2;13773:3;13769:12;13762:19;;13601:186;;;:::o;13796:376::-;;13956:67;14020:2;14015:3;13956:67;:::i;:::-;13949:74;;14056:34;14052:1;14047:3;14043:11;14036:55;14125:9;14120:2;14115:3;14111:12;14104:31;14163:2;14158:3;14154:12;14147:19;;13942:230;;;:::o;14181:370::-;;14341:67;14405:2;14400:3;14341:67;:::i;:::-;14334:74;;14441:34;14437:1;14432:3;14428:11;14421:55;14510:3;14505:2;14500:3;14496:12;14489:25;14542:2;14537:3;14533:12;14526:19;;14327:224;;;:::o;14560:381::-;;14720:67;14784:2;14779:3;14720:67;:::i;:::-;14713:74;;14820:34;14816:1;14811:3;14807:11;14800:55;14889:14;14884:2;14879:3;14875:12;14868:36;14932:2;14927:3;14923:12;14916:19;;14706:235;;;:::o;14950:332::-;;15110:67;15174:2;15169:3;15110:67;:::i;:::-;15103:74;;15210:34;15206:1;15201:3;15197:11;15190:55;15273:2;15268:3;15264:12;15257:19;;15096:186;;;:::o;15291:378::-;;15451:67;15515:2;15510:3;15451:67;:::i;:::-;15444:74;;15551:34;15547:1;15542:3;15538:11;15531:55;15620:11;15615:2;15610:3;15606:12;15599:33;15660:2;15655:3;15651:12;15644:19;;15437:232;;;:::o;15678:384::-;;15838:67;15902:2;15897:3;15838:67;:::i;:::-;15831:74;;15938:34;15934:1;15929:3;15925:11;15918:55;16007:17;16002:2;15997:3;15993:12;15986:39;16053:2;16048:3;16044:12;16037:19;;15824:238;;;:::o;16071:370::-;;16231:67;16295:2;16290:3;16231:67;:::i;:::-;16224:74;;16331:34;16327:1;16322:3;16318:11;16311:55;16400:3;16395:2;16390:3;16386:12;16379:25;16432:2;16427:3;16423:12;16416:19;;16217:224;;;:::o;16450:386::-;;16610:67;16674:2;16669:3;16610:67;:::i;:::-;16603:74;;16710:34;16706:1;16701:3;16697:11;16690:55;16779:19;16774:2;16769:3;16765:12;16758:41;16827:2;16822:3;16818:12;16811:19;;16596:240;;;:::o;16845:329::-;;17005:67;17069:2;17064:3;17005:67;:::i;:::-;16998:74;;17105:31;17101:1;17096:3;17092:11;17085:52;17165:2;17160:3;17156:12;17149:19;;16991:183;;;:::o;17183:385::-;;17343:67;17407:2;17402:3;17343:67;:::i;:::-;17336:74;;17443:34;17439:1;17434:3;17430:11;17423:55;17512:18;17507:2;17502:3;17498:12;17491:40;17559:2;17554:3;17550:12;17543:19;;17329:239;;;:::o;17576:113::-;17659:24;17677:5;17659:24;:::i;:::-;17654:3;17647:37;17641:48;;:::o;17696:271::-;;17849:93;17938:3;17929:6;17849:93;:::i;:::-;17842:100;;17959:3;17952:10;;17830:137;;;;:::o;17974:436::-;;18177:95;18268:3;18259:6;18177:95;:::i;:::-;18170:102;;18290:95;18381:3;18372:6;18290:95;:::i;:::-;18283:102;;18402:3;18395:10;;18158:252;;;;;:::o;18417:222::-;;18544:2;18533:9;18529:18;18521:26;;18558:71;18626:1;18615:9;18611:17;18602:6;18558:71;:::i;:::-;18515:124;;;;:::o;18646:238::-;;18781:2;18770:9;18766:18;18758:26;;18795:79;18871:1;18860:9;18856:17;18847:6;18795:79;:::i;:::-;18752:132;;;;:::o;18891:672::-;;19136:3;19125:9;19121:19;19113:27;;19151:87;19235:1;19224:9;19220:17;19211:6;19151:87;:::i;:::-;19249:72;19317:2;19306:9;19302:18;19293:6;19249:72;:::i;:::-;19332;19400:2;19389:9;19385:18;19376:6;19332:72;:::i;:::-;19452:9;19446:4;19442:20;19437:2;19426:9;19422:18;19415:48;19477:76;19548:4;19539:6;19477:76;:::i;:::-;19469:84;;19107:456;;;;;;;:::o;19570:210::-;;19691:2;19680:9;19676:18;19668:26;;19705:65;19767:1;19756:9;19752:17;19743:6;19705:65;:::i;:::-;19662:118;;;;:::o;19787:310::-;;19934:2;19923:9;19919:18;19911:26;;19984:9;19978:4;19974:20;19970:1;19959:9;19955:17;19948:47;20009:78;20082:4;20073:6;20009:78;:::i;:::-;20001:86;;19905:192;;;;:::o;20104:416::-;;20304:2;20293:9;20289:18;20281:26;;20354:9;20348:4;20344:20;20340:1;20329:9;20325:17;20318:47;20379:131;20505:4;20379:131;:::i;:::-;20371:139;;20275:245;;;:::o;20527:416::-;;20727:2;20716:9;20712:18;20704:26;;20777:9;20771:4;20767:20;20763:1;20752:9;20748:17;20741:47;20802:131;20928:4;20802:131;:::i;:::-;20794:139;;20698:245;;;:::o;20950:416::-;;21150:2;21139:9;21135:18;21127:26;;21200:9;21194:4;21190:20;21186:1;21175:9;21171:17;21164:47;21225:131;21351:4;21225:131;:::i;:::-;21217:139;;21121:245;;;:::o;21373:416::-;;21573:2;21562:9;21558:18;21550:26;;21623:9;21617:4;21613:20;21609:1;21598:9;21594:17;21587:47;21648:131;21774:4;21648:131;:::i;:::-;21640:139;;21544:245;;;:::o;21796:416::-;;21996:2;21985:9;21981:18;21973:26;;22046:9;22040:4;22036:20;22032:1;22021:9;22017:17;22010:47;22071:131;22197:4;22071:131;:::i;:::-;22063:139;;21967:245;;;:::o;22219:416::-;;22419:2;22408:9;22404:18;22396:26;;22469:9;22463:4;22459:20;22455:1;22444:9;22440:17;22433:47;22494:131;22620:4;22494:131;:::i;:::-;22486:139;;22390:245;;;:::o;22642:416::-;;22842:2;22831:9;22827:18;22819:26;;22892:9;22886:4;22882:20;22878:1;22867:9;22863:17;22856:47;22917:131;23043:4;22917:131;:::i;:::-;22909:139;;22813:245;;;:::o;23065:416::-;;23265:2;23254:9;23250:18;23242:26;;23315:9;23309:4;23305:20;23301:1;23290:9;23286:17;23279:47;23340:131;23466:4;23340:131;:::i;:::-;23332:139;;23236:245;;;:::o;23488:416::-;;23688:2;23677:9;23673:18;23665:26;;23738:9;23732:4;23728:20;23724:1;23713:9;23709:17;23702:47;23763:131;23889:4;23763:131;:::i;:::-;23755:139;;23659:245;;;:::o;23911:416::-;;24111:2;24100:9;24096:18;24088:26;;24161:9;24155:4;24151:20;24147:1;24136:9;24132:17;24125:47;24186:131;24312:4;24186:131;:::i;:::-;24178:139;;24082:245;;;:::o;24334:416::-;;24534:2;24523:9;24519:18;24511:26;;24584:9;24578:4;24574:20;24570:1;24559:9;24555:17;24548:47;24609:131;24735:4;24609:131;:::i;:::-;24601:139;;24505:245;;;:::o;24757:416::-;;24957:2;24946:9;24942:18;24934:26;;25007:9;25001:4;24997:20;24993:1;24982:9;24978:17;24971:47;25032:131;25158:4;25032:131;:::i;:::-;25024:139;;24928:245;;;:::o;25180:416::-;;25380:2;25369:9;25365:18;25357:26;;25430:9;25424:4;25420:20;25416:1;25405:9;25401:17;25394:47;25455:131;25581:4;25455:131;:::i;:::-;25447:139;;25351:245;;;:::o;25603:416::-;;25803:2;25792:9;25788:18;25780:26;;25853:9;25847:4;25843:20;25839:1;25828:9;25824:17;25817:47;25878:131;26004:4;25878:131;:::i;:::-;25870:139;;25774:245;;;:::o;26026:416::-;;26226:2;26215:9;26211:18;26203:26;;26276:9;26270:4;26266:20;26262:1;26251:9;26247:17;26240:47;26301:131;26427:4;26301:131;:::i;:::-;26293:139;;26197:245;;;:::o;26449:416::-;;26649:2;26638:9;26634:18;26626:26;;26699:9;26693:4;26689:20;26685:1;26674:9;26670:17;26663:47;26724:131;26850:4;26724:131;:::i;:::-;26716:139;;26620:245;;;:::o;26872:416::-;;27072:2;27061:9;27057:18;27049:26;;27122:9;27116:4;27112:20;27108:1;27097:9;27093:17;27086:47;27147:131;27273:4;27147:131;:::i;:::-;27139:139;;27043:245;;;:::o;27295:416::-;;27495:2;27484:9;27480:18;27472:26;;27545:9;27539:4;27535:20;27531:1;27520:9;27516:17;27509:47;27570:131;27696:4;27570:131;:::i;:::-;27562:139;;27466:245;;;:::o;27718:416::-;;27918:2;27907:9;27903:18;27895:26;;27968:9;27962:4;27958:20;27954:1;27943:9;27939:17;27932:47;27993:131;28119:4;27993:131;:::i;:::-;27985:139;;27889:245;;;:::o;28141:416::-;;28341:2;28330:9;28326:18;28318:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28416:131;28542:4;28416:131;:::i;:::-;28408:139;;28312:245;;;:::o;28564:416::-;;28764:2;28753:9;28749:18;28741:26;;28814:9;28808:4;28804:20;28800:1;28789:9;28785:17;28778:47;28839:131;28965:4;28839:131;:::i;:::-;28831:139;;28735:245;;;:::o;28987:416::-;;29187:2;29176:9;29172:18;29164:26;;29237:9;29231:4;29227:20;29223:1;29212:9;29208:17;29201:47;29262:131;29388:4;29262:131;:::i;:::-;29254:139;;29158:245;;;:::o;29410:416::-;;29610:2;29599:9;29595:18;29587:26;;29660:9;29654:4;29650:20;29646:1;29635:9;29631:17;29624:47;29685:131;29811:4;29685:131;:::i;:::-;29677:139;;29581:245;;;:::o;29833:416::-;;30033:2;30022:9;30018:18;30010:26;;30083:9;30077:4;30073:20;30069:1;30058:9;30054:17;30047:47;30108:131;30234:4;30108:131;:::i;:::-;30100:139;;30004:245;;;:::o;30256:416::-;;30456:2;30445:9;30441:18;30433:26;;30506:9;30500:4;30496:20;30492:1;30481:9;30477:17;30470:47;30531:131;30657:4;30531:131;:::i;:::-;30523:139;;30427:245;;;:::o;30679:416::-;;30879:2;30868:9;30864:18;30856:26;;30929:9;30923:4;30919:20;30915:1;30904:9;30900:17;30893:47;30954:131;31080:4;30954:131;:::i;:::-;30946:139;;30850:245;;;:::o;31102:416::-;;31302:2;31291:9;31287:18;31279:26;;31352:9;31346:4;31342:20;31338:1;31327:9;31323:17;31316:47;31377:131;31503:4;31377:131;:::i;:::-;31369:139;;31273:245;;;:::o;31525:416::-;;31725:2;31714:9;31710:18;31702:26;;31775:9;31769:4;31765:20;31761:1;31750:9;31746:17;31739:47;31800:131;31926:4;31800:131;:::i;:::-;31792:139;;31696:245;;;:::o;31948:222::-;;32075:2;32064:9;32060:18;32052:26;;32089:71;32157:1;32146:9;32142:17;32133:6;32089:71;:::i;:::-;32046:124;;;;:::o;32177:256::-;;32239:2;32233:9;32223:19;;32277:4;32269:6;32265:17;32376:6;32364:10;32361:22;32340:18;32328:10;32325:34;32322:62;32319:2;;;32397:1;32394;32387:12;32319:2;32417:10;32413:2;32406:22;32217:216;;;;:::o;32440:321::-;;32583:18;32575:6;32572:30;32569:2;;;32615:1;32612;32605:12;32569:2;32682:4;32678:9;32671:4;32663:6;32659:17;32655:33;32647:41;;32746:4;32740;32736:15;32728:23;;32506:255;;;:::o;32768:322::-;;32912:18;32904:6;32901:30;32898:2;;;32944:1;32941;32934:12;32898:2;33011:4;33007:9;33000:4;32992:6;32988:17;32984:33;32976:41;;33075:4;33069;33065:15;33057:23;;32835:255;;;:::o;33097:121::-;;33190:5;33184:12;33174:22;;33155:63;;;:::o;33225:122::-;;33319:5;33313:12;33303:22;;33284:63;;;:::o;33355:162::-;;33469:6;33464:3;33457:19;33506:4;33501:3;33497:14;33482:29;;33450:67;;;;:::o;33526:144::-;;33661:3;33646:18;;33639:31;;;;:::o;33679:163::-;;33794:6;33789:3;33782:19;33831:4;33826:3;33822:14;33807:29;;33775:67;;;;:::o;33851:145::-;;33987:3;33972:18;;33965:31;;;;:::o;34004:91::-;;34066:24;34084:5;34066:24;:::i;:::-;34055:35;;34049:46;;;:::o;34102:99::-;;34172:24;34190:5;34172:24;:::i;:::-;34161:35;;34155:46;;;:::o;34208:85::-;;34281:5;34274:13;34267:21;34256:32;;34250:43;;;:::o;34300:144::-;;34372:66;34365:5;34361:78;34350:89;;34344:100;;;:::o;34451:121::-;;34524:42;34517:5;34513:54;34502:65;;34496:76;;;:::o;34579:72::-;;34641:5;34630:16;;34624:27;;;:::o;34658:129::-;;34745:37;34776:5;34745:37;:::i;:::-;34732:50;;34726:61;;;:::o;34794:121::-;;34873:37;34904:5;34873:37;:::i;:::-;34860:50;;34854:61;;;:::o;34922:108::-;;35001:24;35019:5;35001:24;:::i;:::-;34988:37;;34982:48;;;:::o;35038:145::-;35119:6;35114:3;35109;35096:30;35175:1;35166:6;35161:3;35157:16;35150:27;35089:94;;;:::o;35192:268::-;35257:1;35264:101;35278:6;35275:1;35272:13;35264:101;;;35354:1;35349:3;35345:11;35339:18;35335:1;35330:3;35326:11;35319:39;35300:2;35297:1;35293:10;35288:15;;35264:101;;;35380:6;35377:1;35374:13;35371:2;;;35445:1;35436:6;35431:3;35427:16;35420:27;35371:2;35241:219;;;;:::o;35468:97::-;;35556:2;35552:7;35547:2;35540:5;35536:14;35532:28;35522:38;;35516:49;;;:::o;35573:117::-;35642:24;35660:5;35642:24;:::i;:::-;35635:5;35632:35;35622:2;;35681:1;35678;35671:12;35622:2;35616:74;:::o;35697:111::-;35763:21;35778:5;35763:21;:::i;:::-;35756:5;35753:32;35743:2;;35799:1;35796;35789:12;35743:2;35737:71;:::o;35815:115::-;35883:23;35900:5;35883:23;:::i;:::-;35876:5;35873:34;35863:2;;35921:1;35918;35911:12;35863:2;35857:73;:::o;35937:117::-;36006:24;36024:5;36006:24;:::i;:::-;35999:5;35996:35;35986:2;;36045:1;36042;36035:12;35986:2;35980:74;:::o
Swarm Source
ipfs://e5012c02ec2c17618d7710a25f17f0c0f410a6118d027bdba0f534cda8829ebe
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.