Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 47 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Bred NFT With Ko... | 14771334 | 1013 days ago | IN | 0 ETH | 0.01614651 | ||||
Bred NFT With Ko... | 14633462 | 1035 days ago | IN | 0 ETH | 0.01443458 | ||||
Bred NFT With Ko... | 14616441 | 1038 days ago | IN | 0 ETH | 0.01413442 | ||||
Bred NFT With Ko... | 14616432 | 1038 days ago | IN | 0 ETH | 0.01533529 | ||||
Bred NFT With Ko... | 14613704 | 1038 days ago | IN | 0 ETH | 0.01162794 | ||||
Bred NFT With Ko... | 14613163 | 1038 days ago | IN | 0 ETH | 0.007694 | ||||
Bred NFT With Ko... | 14612483 | 1038 days ago | IN | 0 ETH | 0.00773775 | ||||
Bred NFT With Ko... | 14612469 | 1038 days ago | IN | 0 ETH | 0.00785789 | ||||
Bred NFT With Ko... | 14600637 | 1040 days ago | IN | 0 ETH | 0.00722266 | ||||
Bred NFT With Ko... | 14600276 | 1040 days ago | IN | 0 ETH | 0.00783334 | ||||
Bred NFT With Ko... | 14600225 | 1040 days ago | IN | 0 ETH | 0.01060744 | ||||
Bred NFT With Ko... | 14593247 | 1041 days ago | IN | 0 ETH | 0.01089829 | ||||
Bred NFT With Ko... | 14587629 | 1042 days ago | IN | 0 ETH | 0.0141424 | ||||
Bred NFT With Ko... | 14587230 | 1042 days ago | IN | 0 ETH | 0.01614569 | ||||
Bred NFT With Ko... | 14582791 | 1043 days ago | IN | 0 ETH | 0.01147173 | ||||
Bred NFT With Ko... | 14582557 | 1043 days ago | IN | 0 ETH | 0.01289982 | ||||
Bred NFT With Ko... | 14581878 | 1043 days ago | IN | 0 ETH | 0.01420028 | ||||
Bred NFT With Ko... | 14581286 | 1043 days ago | IN | 0 ETH | 0.0166345 | ||||
Bred NFT With Ko... | 14578130 | 1044 days ago | IN | 0 ETH | 0.0289429 | ||||
Bred NFT With Ko... | 14578096 | 1044 days ago | IN | 0 ETH | 0.01537797 | ||||
Bred NFT With Ko... | 14578060 | 1044 days ago | IN | 0 ETH | 0.03421369 | ||||
Bred NFT With Ko... | 14562362 | 1046 days ago | IN | 0 ETH | 0.01264329 | ||||
Bred NFT With Ko... | 14542917 | 1049 days ago | IN | 0 ETH | 0.02760429 | ||||
Bred NFT With Ko... | 14517382 | 1053 days ago | IN | 0 ETH | 0.01913005 | ||||
Bred NFT With Ko... | 14473859 | 1060 days ago | IN | 0 ETH | 0.01051805 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
EKotketNFTFactory
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; import "./EKotketNFTBase.sol"; import "./EKotketNFTPurchaseBase.sol"; import "./interfaces/EKotketNFTInterface.sol"; import "./interfaces/EKotketTokenInterface.sol"; import "openzeppelin-solidity/contracts/security/ReentrancyGuard.sol"; contract EKotketNFTFactory is EKotketNFTPurchaseBase, EKotketNFTBase, ReentrancyGuard { struct KotketPrice { uint uKotketToken; uint eWei; } mapping (KOTKET_GENES => KotketPrice) private kotketPriceMap; mapping (KOTKET_GENES => uint256) public bredAmountAllowanceMap; mapping (address => bool) public activeRefMap; mapping (address => address[]) public childRefMap; mapping (address => address) public parentRefMap; event NFTBorn(address indexed beneficiary, address indexed referral, uint256 weiValue, uint256 uKotketValue, KOTKET_GENES gene, uint256 id); event NFTRateChanged(KOTKET_GENES indexed gene, uint256 uKotketTokenRate, uint256 weiRate, address setter); event NFTBredAmountAllowanceChanged(KOTKET_GENES indexed gene, uint256 _amount); constructor(address _governanceAdress) EKotketNFTPurchaseBase(_governanceAdress) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); bredAmountAllowanceMap[KOTKET_GENES.KITI] = 0; bredAmountAllowanceMap[KOTKET_GENES.RED] = 5000; bredAmountAllowanceMap[KOTKET_GENES.BLUE] = 2500; bredAmountAllowanceMap[KOTKET_GENES.LUCI] = 1250; bredAmountAllowanceMap[KOTKET_GENES.TOM] = 625; bredAmountAllowanceMap[KOTKET_GENES.KOTKET] = 312; bredAmountAllowanceMap[KOTKET_GENES.KING] = 166; } function updateBredAmountAllowance(uint8 _gene, uint256 _amount) public onlyAdminPermission{ require(_gene <= uint8(KOTKET_GENES.KING), "Invalid Gene"); KOTKET_GENES gene = KOTKET_GENES(_gene); bredAmountAllowanceMap[gene] = _amount; emit NFTBredAmountAllowanceChanged(gene, _amount); } function updatePrice(uint8 _gene, uint256 _uKotketToken, uint256 _eWei) public onlyAdminPermission{ require(_gene <= uint8(KOTKET_GENES.KING), "Invalid Gene"); KOTKET_GENES gene = KOTKET_GENES(_gene); kotketPriceMap[gene].uKotketToken = _uKotketToken; kotketPriceMap[gene].eWei = _eWei; emit NFTRateChanged(gene, _uKotketToken, _eWei, _msgSender()); } function checkKotketPrice(uint8 _gene) public view returns(uint uKotketToken, uint eWei){ require(_gene <= uint8(KOTKET_GENES.KING), "Invalid Gene"); KOTKET_GENES gene = KOTKET_GENES(_gene); return (kotketPriceMap[gene].uKotketToken, kotketPriceMap[gene].eWei); } function setActiveRefSatus(address referrer, bool status) public onlyAdminPermission{ require(referrer != address(0), "Invalid Referral Address"); activeRefMap[referrer] = status; } function handleReferral(address _referrer) internal{ if (_referrer!= address(0)){ require(activeRefMap[_referrer], "Inactived Referral Address"); require(_referrer != _msgSender(), "Cannot Referral Yourself"); require(parentRefMap[_msgSender()] == address(0) || parentRefMap[_msgSender()] == _referrer, "Invalid Referral Address"); if (parentRefMap[_msgSender()] == address(0)){ parentRefMap[_msgSender()] = _referrer; childRefMap[_referrer].push(_msgSender()); } }else{ require(parentRefMap[_msgSender()] != address(0), "Not allowed empty referrer"); } if (!activeRefMap[_msgSender()]){ activeRefMap[_msgSender()] = true; } } function bred(uint256 _tokenId, uint8 _gene, string memory _name, string memory _metadataURI, uint256 weiValue, uint256 uKotketValue) internal{ KOTKET_GENES gene = KOTKET_GENES(_gene); EKotketNFTInterface kotketNFT = EKotketNFTInterface(governance.kotketNFTAddress()); kotketNFT.kotketBred(_msgSender(), _tokenId, _gene, _name, _metadataURI); bredAmountAllowanceMap[gene] -= 1; emit NFTBorn(_msgSender(), parentRefMap[_msgSender()], weiValue, uKotketValue, gene, _tokenId); emit NFTBredAmountAllowanceChanged(gene, bredAmountAllowanceMap[gene]); } function bredNFTWithWei(uint256 _tokenId, address _referrer, uint8 _gene, string memory _name, string memory _metadataURI) public nonReentrant payable { require(allowedWeiPurchase, "Not allowed wei purchase"); require(_gene <= uint8(KOTKET_GENES.KING), "Invalid Gene"); KOTKET_GENES gene = KOTKET_GENES(_gene); require(bredAmountAllowanceMap[gene] > 0, "Not allow to bred more NFT of this gene"); uint256 weiAmount = msg.value; require(weiAmount >= kotketPriceMap[gene].eWei, "insufficient wei amount"); handleReferral(_referrer); _forwardWeiFunds(); bred(_tokenId, _gene, _name, _metadataURI, weiAmount, 0); } function _forwardWeiFunds() internal virtual{ address payable kotketWallet = payable(governance.kotketWallet()); kotketWallet.transfer(msg.value); } function bredNFTWithKotketToken(uint256 _tokenId, address _referral, uint8 _gene, string memory _name, string memory _metadataURI) public{ require(allowedKotketTokenPurchase, "Not allowed kotket token purchase"); require(_gene <= uint8(KOTKET_GENES.KING), "Invalid Gene"); KOTKET_GENES gene = KOTKET_GENES(_gene); require(bredAmountAllowanceMap[gene] > 0, "Not allow to bred more NFT of this gene"); uint256 price = kotketPriceMap[gene].uKotketToken; EKotketTokenInterface kotketToken = EKotketTokenInterface(governance.kotketTokenAddress()); require(kotketToken.balanceOf(_msgSender()) >= price, "Insufficient Kotket Token Balance!"); uint256 tokenAllowance = kotketToken.allowance(_msgSender(), address(this)); require(tokenAllowance >= price, "Not Allow Enough Kotket Token To Bred NFT"); handleReferral(_referral); kotketToken.transferFrom(_msgSender(), governance.kotketWallet(), price); bred(_tokenId, _gene, _name, _metadataURI, 0, price); } receive() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ 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; if (lastIndex != toDeleteIndex) { 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] = valueIndex; // Replace lastvalue's index to valueIndex } // 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) { 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)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./AccessControl.sol"; import "../utils/structs/EnumerableSet.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable { function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; interface EKotketTokenInterface { function allowance(address owner, address spender) external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; interface EKotketNFTInterface { function allTokens() external view returns (uint256[] memory ids); function totalSupply() external view returns (uint256); function tokenExisted(uint256 _tokenId) external view returns (bool); function balanceOf(address owner) external view returns (uint256); function ownerOf(uint256 tokenId) external view returns (address); function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); function tokensOwned(address owner) external view returns (uint256[] memory ids); function getApproved(uint256 tokenId) external view returns (address); function isApprovedForAll(address owner, address operator) external view returns (bool); function getGene(uint256 _tokenId) external view returns (uint8); function safeTransferFrom( address from, address to, uint256 tokenId ) external; function kotketBred(address _beneficiary, uint256 _tokenId, uint8 _gene, string memory _name, string memory _metadataURI) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; interface EGovernanceInterface { function kotketWallet() external view returns (address); function kotketFundWallet() external view returns (address); function kotketTokenAddress() external view returns (address); function kotketNFTAddress() external view returns (address); function kotketGatewayOracleAddress() external view returns (address); function kotketNFTFactoryAddress() external view returns (address); function kotketNFTMarketPlaceAddress() external view returns (address); function kotketNFTRentalMarketAddress() external view returns (address); function kotketNFTPlatformRentingAddress() external view returns (address); function usdtAddress() external view returns (address); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; import "./EGovernanceBase.sol"; contract EKotketNFTPurchaseBase is EGovernanceBase{ bool public allowedWeiPurchase = false; bool public allowedKotketTokenPurchase = true; constructor(address _governanceAdress) EGovernanceBase(_governanceAdress) { } function allowWeiPurchase(bool _allow) public onlyAdminPermission{ allowedWeiPurchase = _allow; } function allowKotketTokenPurchase(bool _allow) public onlyAdminPermission{ allowedKotketTokenPurchase = _allow; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; contract EKotketNFTBase{ enum KOTKET_GENES { KITI, RED, BLUE, LUCI, TOM, KOTKET, KING } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; import "openzeppelin-solidity/contracts/access/AccessControlEnumerable.sol"; import "openzeppelin-solidity/contracts/utils/Context.sol"; contract EKotketAccessControl is Context, AccessControlEnumerable { bytes32 public constant SC_MINTER_ROLE = keccak256("SC_MINTER_ROLE"); bytes32 public constant SC_GATEWAY_ORACLE_ROLE = keccak256("SC_GATEWAY_ORACLE_ROLE"); modifier onlyGatewayOraclePermission() { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) || hasRole(SC_GATEWAY_ORACLE_ROLE, _msgSender()), "Dont have Gateway Oracle permission!"); _; } modifier onlyMinterPermission() { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) || hasRole(SC_MINTER_ROLE, _msgSender()), "Dont have Minter permission!"); _; } modifier onlyAdminPermission() { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Dont have Admin permission!"); _; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; import "./interfaces/EGovernanceInterface.sol"; import "./EKotketAccessControl.sol"; contract EGovernanceBase is EKotketAccessControl{ EGovernanceInterface internal governance; constructor (address _governanceAdress) { require(_governanceAdress != address(0), "Governance is the zero address"); governance = EGovernanceInterface(_governanceAdress); } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "berlin", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_governanceAdress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"referral","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"uKotketValue","type":"uint256"},{"indexed":false,"internalType":"enum EKotketNFTBase.KOTKET_GENES","name":"gene","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"NFTBorn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum EKotketNFTBase.KOTKET_GENES","name":"gene","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"NFTBredAmountAllowanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum EKotketNFTBase.KOTKET_GENES","name":"gene","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"uKotketTokenRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weiRate","type":"uint256"},{"indexed":false,"internalType":"address","name":"setter","type":"address"}],"name":"NFTRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SC_GATEWAY_ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SC_MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"activeRefMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_allow","type":"bool"}],"name":"allowKotketTokenPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_allow","type":"bool"}],"name":"allowWeiPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowedKotketTokenPurchase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedWeiPurchase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum EKotketNFTBase.KOTKET_GENES","name":"","type":"uint8"}],"name":"bredAmountAllowanceMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_referral","type":"address"},{"internalType":"uint8","name":"_gene","type":"uint8"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_metadataURI","type":"string"}],"name":"bredNFTWithKotketToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"uint8","name":"_gene","type":"uint8"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_metadataURI","type":"string"}],"name":"bredNFTWithWei","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_gene","type":"uint8"}],"name":"checkKotketPrice","outputs":[{"internalType":"uint256","name":"uKotketToken","type":"uint256"},{"internalType":"uint256","name":"eWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"childRefMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"parentRefMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setActiveRefSatus","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":[{"internalType":"uint8","name":"_gene","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateBredAmountAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_gene","type":"uint8"},{"internalType":"uint256","name":"_uKotketToken","type":"uint256"},{"internalType":"uint256","name":"_eWei","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600260146101000a81548160ff0219169083151502179055506001600260156101000a81548160ff0219169083151502179055503480156200004757600080fd5b50604051620044ea380380620044ea83398181016040528101906200006d9190620005e4565b8080600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000d9906200063d565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506001600381905550620001516000801b620001456200033760201b60201c565b6200033f60201b60201c565b6000600560008060068111156200016d576200016c620006a4565b5b6006811115620001825762000181620006a4565b5b8152602001908152602001600020819055506113886005600060016006811115620001b257620001b1620006a4565b5b6006811115620001c757620001c6620006a4565b5b8152602001908152602001600020819055506109c46005600060026006811115620001f757620001f6620006a4565b5b60068111156200020c576200020b620006a4565b5b8152602001908152602001600020819055506104e260056000600360068111156200023c576200023b620006a4565b5b6006811115620002515762000250620006a4565b5b8152602001908152602001600020819055506102716005600060046006811115620002815762000280620006a4565b5b6006811115620002965762000295620006a4565b5b8152602001908152602001600020819055506101386005600060056006811115620002c657620002c5620006a4565b5b6006811115620002db57620002da620006a4565b5b81526020019081526020016000208190555060a660056000600680811115620003095762000308620006a4565b5b60068111156200031e576200031d620006a4565b5b815260200190815260200160002081905550506200071b565b600033905090565b6200035682826200038760201b620016ab1760201c565b6200038281600160008581526020019081526020016000206200039d60201b620016b91790919060201c565b505050565b620003998282620003d560201b60201c565b5050565b6000620003cd836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620004c660201b60201c565b905092915050565b620003e782826200054060201b60201c565b620004c257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004676200033760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620004da8383620005aa60201b60201c565b620005355782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200053a565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081519050620005de8162000701565b92915050565b600060208284031215620005fd57620005fc620006d3565b5b60006200060d84828501620005cd565b91505092915050565b600062000625601e836200065f565b91506200063282620006d8565b602082019050919050565b60006020820190508181036000830152620006588162000616565b9050919050565b600082825260208201905092915050565b60006200067d8262000684565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600080fd5b7f476f7665726e616e636520697320746865207a65726f20616464726573730000600082015250565b6200070c8162000670565b81146200071857600080fd5b50565b613dbf806200072b6000396000f3fe60806040526004361061016a5760003560e01c8063b0dd0cfd116100d1578063e03df2251161008a578063e59baed611610064578063e59baed61461056f578063ed79a46b14610598578063fae9b255146105c3578063fde450ce1461060057610171565b8063e03df225146104f2578063e04f38da1461051b578063e22cb7c91461054457610171565b8063b0dd0cfd146103c0578063be0bc384146103fd578063bef8904f14610426578063ca15c8731461044f578063d547741f1461048c578063dce1efef146104b557610171565b80633aacd305116101235780633aacd305146102875780634c0213f2146102c557806370f9f457146102f05780639010d07c1461031b57806391d1485414610358578063a217fddf1461039557610171565b806301ffc9a7146101765780630238facf146101b35780631567afdd146101dc578063248a9ca3146101f85780632f2ff15d1461023557806336568abe1461025e57610171565b3661017157005b600080fd5b34801561018257600080fd5b5061019d60048036038101906101989190612c87565b61063d565b6040516101aa91906132ae565b60405180910390f35b3480156101bf57600080fd5b506101da60048036038101906101d59190612b00565b6106b7565b005b6101f660048036038101906101f19190612d0e565b6107d5565b005b34801561020457600080fd5b5061021f600480360381019061021a9190612bda565b610a14565b60405161022c91906132c9565b60405180910390f35b34801561024157600080fd5b5061025c60048036038101906102579190612c07565b610a33565b005b34801561026a57600080fd5b5061028560048036038101906102809190612c07565b610a67565b005b34801561029357600080fd5b506102ae60048036038101906102a99190612dc1565b610a9b565b6040516102bc929190613501565b60405180910390f35b3480156102d157600080fd5b506102da610b93565b6040516102e791906132ae565b60405180910390f35b3480156102fc57600080fd5b50610305610ba6565b60405161031291906132c9565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190612c47565b610bca565b60405161034f91906131d2565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190612c07565b610bf9565b60405161038c91906132ae565b60405180910390f35b3480156103a157600080fd5b506103aa610c63565b6040516103b791906132c9565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e29190612cb4565b610c6a565b6040516103f491906134e6565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190612b80565b610c82565b005b34801561043257600080fd5b5061044d60048036038101906104489190612dee565b610cf2565b005b34801561045b57600080fd5b5061047660048036038101906104719190612bda565b610e45565b60405161048391906134e6565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190612c07565b610e69565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190612aa6565b610e9d565b6040516104e991906131d2565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190612d0e565b610ed0565b005b34801561052757600080fd5b50610542600480360381019061053d9190612e2e565b6113f5565b005b34801561055057600080fd5b50610559611596565b60405161056691906132c9565b60405180910390f35b34801561057b57600080fd5b5061059660048036038101906105919190612b80565b6115ba565b005b3480156105a457600080fd5b506105ad61162a565b6040516105ba91906132ae565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190612aa6565b61163d565b6040516105f791906132ae565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190612b40565b61165d565b60405161063491906131d2565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b057506106af826116e9565b5b9050919050565b6106cb6000801b6106c6611763565b610bf9565b61070a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070190613446565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610771906133e6565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6002600354141561081b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081290613466565b60405180910390fd5b6002600381905550600260149054906101000a900460ff16610872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610869906134a6565b60405180910390fd5b60068081111561088557610884613883565b5b60ff168360ff1611156108cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c490613326565b60405180910390fd5b60008360ff1660068111156108e5576108e4613883565b5b9050600060056000836006811115610900576108ff613883565b5b600681111561091257610911613883565b5b81526020019081526020016000205411610961576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610958906133a6565b60405180910390fd5b60003490506004600083600681111561097d5761097c613883565b5b600681111561098f5761098e613883565b5b8152602001908152602001600020600101548110156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da90613406565b60405180910390fd5b6109ec8661176b565b6109f4611d71565b610a0387868686856000611e5f565b505060016003819055505050505050565b6000806000838152602001908152602001600020600101549050919050565b610a3d8282612149565b610a6281600160008581526020019081526020016000206116b990919063ffffffff16565b505050565b610a718282612172565b610a9681600160008581526020019081526020016000206121f590919063ffffffff16565b505050565b600080600680811115610ab157610ab0613883565b5b60ff168360ff161115610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090613326565b60405180910390fd5b60008360ff166006811115610b1157610b10613883565b5b905060046000826006811115610b2a57610b29613883565b5b6006811115610b3c57610b3b613883565b5b81526020019081526020016000206000015460046000836006811115610b6557610b64613883565b5b6006811115610b7757610b76613883565b5b8152602001908152602001600020600101549250925050915091565b600260149054906101000a900460ff1681565b7fb49ea64ca9363ee24557fab3bed24140051b27b150a6658dd9436859666b280581565b6000610bf1826001600086815260200190815260200160002061222590919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b60056020528060005260406000206000915090505481565b610c966000801b610c91611763565b610bf9565b610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90613446565b60405180910390fd5b80600260156101000a81548160ff02191690831515021790555050565b610d066000801b610d01611763565b610bf9565b610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c90613446565b60405180910390fd5b600680811115610d5857610d57613883565b5b60ff168260ff161115610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790613326565b60405180910390fd5b60008260ff166006811115610db857610db7613883565b5b90508160056000836006811115610dd257610dd1613883565b5b6006811115610de457610de3613883565b5b815260200190815260200160002081905550806006811115610e0957610e08613883565b5b7fbaa6987cf8f3117b6846d7ce5f4d10dcccb0605732ed5afb686bed2385c0a77c83604051610e3891906134e6565b60405180910390a2505050565b6000610e626001600084815260200190815260200160002061223f565b9050919050565b610e738282612254565b610e9881600160008581526020019081526020016000206121f590919063ffffffff16565b505050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260159054906101000a900460ff16610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690613386565b60405180910390fd5b600680811115610f3257610f31613883565b5b60ff168360ff161115610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7190613326565b60405180910390fd5b60008360ff166006811115610f9257610f91613883565b5b9050600060056000836006811115610fad57610fac613883565b5b6006811115610fbf57610fbe613883565b5b8152602001908152602001600020541161100e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611005906133a6565b60405180910390fd5b60006004600083600681111561102757611026613883565b5b600681111561103957611038613883565b5b81526020019081526020016000206000015490506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d41558586040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b757600080fd5b505afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef9190612ad3565b9050818173ffffffffffffffffffffffffffffffffffffffff166370a08231611116611763565b6040518263ffffffff1660e01b815260040161113291906131d2565b60206040518083038186803b15801561114a57600080fd5b505afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111829190612ce1565b10156111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613486565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6111e9611763565b306040518363ffffffff1660e01b81526004016112079291906131ed565b60206040518083038186803b15801561121f57600080fd5b505afa158015611233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190612ce1565b90508281101561129c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129390613366565b60405180910390fd5b6112a58861176b565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd6112c9611763565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663824de02a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561133157600080fd5b505afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113699190612ad3565b866040518463ffffffff1660e01b815260040161138893929190613216565b602060405180830381600087803b1580156113a257600080fd5b505af11580156113b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113da9190612bad565b506113ea89888888600088611e5f565b505050505050505050565b6114096000801b611404611763565b610bf9565b611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f90613446565b60405180910390fd5b60068081111561145b5761145a613883565b5b60ff168360ff1611156114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90613326565b60405180910390fd5b60008360ff1660068111156114bb576114ba613883565b5b905082600460008360068111156114d5576114d4613883565b5b60068111156114e7576114e6613883565b5b815260200190815260200160002060000181905550816004600083600681111561151457611513613883565b5b600681111561152657611525613883565b5b81526020019081526020016000206001018190555080600681111561154e5761154d613883565b5b7f2365cbecbaf2e8a4efd5f3d836cb051134936d7099eec37b3793c82aa60926e08484611579611763565b6040516115889392919061352a565b60405180910390a250505050565b7f1b29449712117a54a2a96c49e8068b0f884e4ce02b861028ef54f23e90ecdcd281565b6115ce6000801b6115c9611763565b610bf9565b61160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490613446565b60405180910390fd5b80600260146101000a81548160ff02191690831515021790555050565b600260159054906101000a900460ff1681565b60066020528060005260406000206000915054906101000a900460ff1681565b6007602052816000526040600020818154811061167957600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116b5828261227d565b5050565b60006116e1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61235d565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061175c575061175b826123cd565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bdf57600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661182b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611822906133c6565b60405180910390fd5b611833611763565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189890613346565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860006118c5611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806119d357508073ffffffffffffffffffffffffffffffffffffffff1660086000611960611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a09906133e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660086000611a36611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bda578060086000611aba611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611b79611763565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b611cb6565b600073ffffffffffffffffffffffffffffffffffffffff1660086000611c03611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac90613426565b60405180910390fd5b5b60066000611cc2611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d6e57600160066000611d1c611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663824de02a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ddb57600080fd5b505afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190612ad3565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611e5b573d6000803e3d6000fd5b5050565b60008560ff166006811115611e7757611e76613883565b5b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384c4a5406040518163ffffffff1660e01b815260040160206040518083038186803b158015611ee357600080fd5b505afa158015611ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1b9190612ad3565b90508073ffffffffffffffffffffffffffffffffffffffff166377f5ca71611f41611763565b8a8a8a8a6040518663ffffffff1660e01b8152600401611f6595949392919061324d565b600060405180830381600087803b158015611f7f57600080fd5b505af1158015611f93573d6000803e3d6000fd5b50505050600160056000846006811115611fb057611faf613883565b5b6006811115611fc257611fc1613883565b5b81526020019081526020016000206000828254611fdf91906136d3565b9250508190555060086000611ff2611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661206b611763565b73ffffffffffffffffffffffffffffffffffffffff167fd2ee799066043decb61c2d9826853e837be93d36044b512b3f094af72f633a988686868d6040516120b69493929190613561565b60405180910390a38160068111156120d1576120d0613883565b5b7fbaa6987cf8f3117b6846d7ce5f4d10dcccb0605732ed5afb686bed2385c0a77c6005600085600681111561210957612108613883565b5b600681111561211b5761211a613883565b5b81526020019081526020016000205460405161213791906134e6565b60405180910390a25050505050505050565b61215282610a14565b6121638161215e611763565b612437565b61216d838361227d565b505050565b61217a611763565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121de906134c6565b60405180910390fd5b6121f182826124d4565b5050565b600061221d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6125b5565b905092915050565b600061223483600001836126c9565b60001c905092915050565b600061224d826000016126f4565b9050919050565b61225d82610a14565b61226e81612269611763565b612437565b61227883836124d4565b505050565b6122878282610bf9565b61235957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122fe611763565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006123698383612705565b6123c25782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506123c7565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124418282610bf9565b6124d0576124668173ffffffffffffffffffffffffffffffffffffffff166014612728565b6124748360001c6020612728565b604051602001612485929190613198565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c791906132e4565b60405180910390fd5b5050565b6124de8282610bf9565b156125b157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612556611763565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080836001016000848152602001908152602001600020549050600081146126bd5760006001826125e791906136d3565b90506000600186600001805490506125ff91906136d3565b905081811461266e5760008660000182815481106126205761261f6138e1565b5b9060005260206000200154905080876000018481548110612644576126436138e1565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612682576126816138b2565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126c3565b60009150505b92915050565b60008260000182815481106126e1576126e06138e1565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60606000600283600261273b9190613679565b6127459190613623565b67ffffffffffffffff81111561275e5761275d613910565b5b6040519080825280601f01601f1916602001820160405280156127905781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127c8576127c76138e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061282c5761282b6138e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261286c9190613679565b6128769190613623565b90505b6001811115612916577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106128b8576128b76138e1565b5b1a60f81b8282815181106128cf576128ce6138e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061290f906137f9565b9050612879565b506000841461295a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295190613306565b60405180910390fd5b8091505092915050565b6000612977612972846135cb565b6135a6565b90508281526020810184848401111561299357612992613944565b5b61299e8482856137b7565b509392505050565b6000813590506129b581613cef565b92915050565b6000815190506129ca81613cef565b92915050565b6000813590506129df81613d06565b92915050565b6000815190506129f481613d06565b92915050565b600081359050612a0981613d1d565b92915050565b600081359050612a1e81613d34565b92915050565b600081359050612a3381613d4b565b92915050565b600082601f830112612a4e57612a4d61393f565b5b8135612a5e848260208601612964565b91505092915050565b600081359050612a7681613d5b565b92915050565b600081519050612a8b81613d5b565b92915050565b600081359050612aa081613d72565b92915050565b600060208284031215612abc57612abb61394e565b5b6000612aca848285016129a6565b91505092915050565b600060208284031215612ae957612ae861394e565b5b6000612af7848285016129bb565b91505092915050565b60008060408385031215612b1757612b1661394e565b5b6000612b25858286016129a6565b9250506020612b36858286016129d0565b9150509250929050565b60008060408385031215612b5757612b5661394e565b5b6000612b65858286016129a6565b9250506020612b7685828601612a67565b9150509250929050565b600060208284031215612b9657612b9561394e565b5b6000612ba4848285016129d0565b91505092915050565b600060208284031215612bc357612bc261394e565b5b6000612bd1848285016129e5565b91505092915050565b600060208284031215612bf057612bef61394e565b5b6000612bfe848285016129fa565b91505092915050565b60008060408385031215612c1e57612c1d61394e565b5b6000612c2c858286016129fa565b9250506020612c3d858286016129a6565b9150509250929050565b60008060408385031215612c5e57612c5d61394e565b5b6000612c6c858286016129fa565b9250506020612c7d85828601612a67565b9150509250929050565b600060208284031215612c9d57612c9c61394e565b5b6000612cab84828501612a0f565b91505092915050565b600060208284031215612cca57612cc961394e565b5b6000612cd884828501612a24565b91505092915050565b600060208284031215612cf757612cf661394e565b5b6000612d0584828501612a7c565b91505092915050565b600080600080600060a08688031215612d2a57612d2961394e565b5b6000612d3888828901612a67565b9550506020612d49888289016129a6565b9450506040612d5a88828901612a91565b935050606086013567ffffffffffffffff811115612d7b57612d7a613949565b5b612d8788828901612a39565b925050608086013567ffffffffffffffff811115612da857612da7613949565b5b612db488828901612a39565b9150509295509295909350565b600060208284031215612dd757612dd661394e565b5b6000612de584828501612a91565b91505092915050565b60008060408385031215612e0557612e0461394e565b5b6000612e1385828601612a91565b9250506020612e2485828601612a67565b9150509250929050565b600080600060608486031215612e4757612e4661394e565b5b6000612e5586828701612a91565b9350506020612e6686828701612a67565b9250506040612e7786828701612a67565b9150509250925092565b612e8a81613707565b82525050565b612e9981613719565b82525050565b612ea881613725565b82525050565b612eb7816137a5565b82525050565b6000612ec8826135fc565b612ed28185613607565b9350612ee28185602086016137c6565b612eeb81613953565b840191505092915050565b6000612f01826135fc565b612f0b8185613618565b9350612f1b8185602086016137c6565b80840191505092915050565b6000612f34602083613607565b9150612f3f82613964565b602082019050919050565b6000612f57600c83613607565b9150612f628261398d565b602082019050919050565b6000612f7a601883613607565b9150612f85826139b6565b602082019050919050565b6000612f9d602983613607565b9150612fa8826139df565b604082019050919050565b6000612fc0602183613607565b9150612fcb82613a2e565b604082019050919050565b6000612fe3602783613607565b9150612fee82613a7d565b604082019050919050565b6000613006601a83613607565b915061301182613acc565b602082019050919050565b6000613029601883613607565b915061303482613af5565b602082019050919050565b600061304c601783613607565b915061305782613b1e565b602082019050919050565b600061306f601a83613607565b915061307a82613b47565b602082019050919050565b6000613092601783613618565b915061309d82613b70565b601782019050919050565b60006130b5601b83613607565b91506130c082613b99565b602082019050919050565b60006130d8601f83613607565b91506130e382613bc2565b602082019050919050565b60006130fb602283613607565b915061310682613beb565b604082019050919050565b600061311e601183613618565b915061312982613c3a565b601182019050919050565b6000613141601883613607565b915061314c82613c63565b602082019050919050565b6000613164602f83613607565b915061316f82613c8c565b604082019050919050565b6131838161378e565b82525050565b61319281613798565b82525050565b60006131a382613085565b91506131af8285612ef6565b91506131ba82613111565b91506131c68284612ef6565b91508190509392505050565b60006020820190506131e76000830184612e81565b92915050565b60006040820190506132026000830185612e81565b61320f6020830184612e81565b9392505050565b600060608201905061322b6000830186612e81565b6132386020830185612e81565b613245604083018461317a565b949350505050565b600060a0820190506132626000830188612e81565b61326f602083018761317a565b61327c6040830186613189565b818103606083015261328e8185612ebd565b905081810360808301526132a28184612ebd565b90509695505050505050565b60006020820190506132c36000830184612e90565b92915050565b60006020820190506132de6000830184612e9f565b92915050565b600060208201905081810360008301526132fe8184612ebd565b905092915050565b6000602082019050818103600083015261331f81612f27565b9050919050565b6000602082019050818103600083015261333f81612f4a565b9050919050565b6000602082019050818103600083015261335f81612f6d565b9050919050565b6000602082019050818103600083015261337f81612f90565b9050919050565b6000602082019050818103600083015261339f81612fb3565b9050919050565b600060208201905081810360008301526133bf81612fd6565b9050919050565b600060208201905081810360008301526133df81612ff9565b9050919050565b600060208201905081810360008301526133ff8161301c565b9050919050565b6000602082019050818103600083015261341f8161303f565b9050919050565b6000602082019050818103600083015261343f81613062565b9050919050565b6000602082019050818103600083015261345f816130a8565b9050919050565b6000602082019050818103600083015261347f816130cb565b9050919050565b6000602082019050818103600083015261349f816130ee565b9050919050565b600060208201905081810360008301526134bf81613134565b9050919050565b600060208201905081810360008301526134df81613157565b9050919050565b60006020820190506134fb600083018461317a565b92915050565b6000604082019050613516600083018561317a565b613523602083018461317a565b9392505050565b600060608201905061353f600083018661317a565b61354c602083018561317a565b6135596040830184612e81565b949350505050565b6000608082019050613576600083018761317a565b613583602083018661317a565b6135906040830185612eae565b61359d606083018461317a565b95945050505050565b60006135b06135c1565b90506135bc8282613823565b919050565b6000604051905090565b600067ffffffffffffffff8211156135e6576135e5613910565b5b6135ef82613953565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061362e8261378e565b91506136398361378e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561366e5761366d613854565b5b828201905092915050565b60006136848261378e565b915061368f8361378e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136c8576136c7613854565b5b828202905092915050565b60006136de8261378e565b91506136e98361378e565b9250828210156136fc576136fb613854565b5b828203905092915050565b60006137128261376e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061376982613cdb565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006137b08261375b565b9050919050565b82818337600083830152505050565b60005b838110156137e45780820151818401526020810190506137c9565b838111156137f3576000848401525b50505050565b60006138048261378e565b9150600082141561381857613817613854565b5b600182039050919050565b61382c82613953565b810181811067ffffffffffffffff8211171561384b5761384a613910565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f496e76616c69642047656e650000000000000000000000000000000000000000600082015250565b7f43616e6e6f7420526566657272616c20596f757273656c660000000000000000600082015250565b7f4e6f7420416c6c6f7720456e6f756768204b6f746b657420546f6b656e20546f60008201527f2042726564204e46540000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564206b6f746b657420746f6b656e207075726368617360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f7720746f2062726564206d6f7265204e4654206f6620746860008201527f69732067656e6500000000000000000000000000000000000000000000000000602082015250565b7f496e6163746976656420526566657272616c2041646472657373000000000000600082015250565b7f496e76616c696420526566657272616c20416464726573730000000000000000600082015250565b7f696e73756666696369656e742077656920616d6f756e74000000000000000000600082015250565b7f4e6f7420616c6c6f77656420656d707479207265666572726572000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f446f6e7420686176652041646d696e207065726d697373696f6e210000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e74204b6f746b657420546f6b656e2042616c616e6360008201527f6521000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f4e6f7420616c6c6f776564207765692070757263686173650000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60078110613cec57613ceb613883565b5b50565b613cf881613707565b8114613d0357600080fd5b50565b613d0f81613719565b8114613d1a57600080fd5b50565b613d2681613725565b8114613d3157600080fd5b50565b613d3d8161372f565b8114613d4857600080fd5b50565b60078110613d5857600080fd5b50565b613d648161378e565b8114613d6f57600080fd5b50565b613d7b81613798565b8114613d8657600080fd5b5056fea2646970667358221220fa30553f9a109e8d8fccd1eff76b262cb4e8bd8d363ccc0bff93cb021f8d7e3f64736f6c63430008060033000000000000000000000000f3ad02357fa97a7835c6643269af7f2094b02fed
Deployed Bytecode
0x60806040526004361061016a5760003560e01c8063b0dd0cfd116100d1578063e03df2251161008a578063e59baed611610064578063e59baed61461056f578063ed79a46b14610598578063fae9b255146105c3578063fde450ce1461060057610171565b8063e03df225146104f2578063e04f38da1461051b578063e22cb7c91461054457610171565b8063b0dd0cfd146103c0578063be0bc384146103fd578063bef8904f14610426578063ca15c8731461044f578063d547741f1461048c578063dce1efef146104b557610171565b80633aacd305116101235780633aacd305146102875780634c0213f2146102c557806370f9f457146102f05780639010d07c1461031b57806391d1485414610358578063a217fddf1461039557610171565b806301ffc9a7146101765780630238facf146101b35780631567afdd146101dc578063248a9ca3146101f85780632f2ff15d1461023557806336568abe1461025e57610171565b3661017157005b600080fd5b34801561018257600080fd5b5061019d60048036038101906101989190612c87565b61063d565b6040516101aa91906132ae565b60405180910390f35b3480156101bf57600080fd5b506101da60048036038101906101d59190612b00565b6106b7565b005b6101f660048036038101906101f19190612d0e565b6107d5565b005b34801561020457600080fd5b5061021f600480360381019061021a9190612bda565b610a14565b60405161022c91906132c9565b60405180910390f35b34801561024157600080fd5b5061025c60048036038101906102579190612c07565b610a33565b005b34801561026a57600080fd5b5061028560048036038101906102809190612c07565b610a67565b005b34801561029357600080fd5b506102ae60048036038101906102a99190612dc1565b610a9b565b6040516102bc929190613501565b60405180910390f35b3480156102d157600080fd5b506102da610b93565b6040516102e791906132ae565b60405180910390f35b3480156102fc57600080fd5b50610305610ba6565b60405161031291906132c9565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190612c47565b610bca565b60405161034f91906131d2565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190612c07565b610bf9565b60405161038c91906132ae565b60405180910390f35b3480156103a157600080fd5b506103aa610c63565b6040516103b791906132c9565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e29190612cb4565b610c6a565b6040516103f491906134e6565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190612b80565b610c82565b005b34801561043257600080fd5b5061044d60048036038101906104489190612dee565b610cf2565b005b34801561045b57600080fd5b5061047660048036038101906104719190612bda565b610e45565b60405161048391906134e6565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190612c07565b610e69565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190612aa6565b610e9d565b6040516104e991906131d2565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190612d0e565b610ed0565b005b34801561052757600080fd5b50610542600480360381019061053d9190612e2e565b6113f5565b005b34801561055057600080fd5b50610559611596565b60405161056691906132c9565b60405180910390f35b34801561057b57600080fd5b5061059660048036038101906105919190612b80565b6115ba565b005b3480156105a457600080fd5b506105ad61162a565b6040516105ba91906132ae565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190612aa6565b61163d565b6040516105f791906132ae565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190612b40565b61165d565b60405161063491906131d2565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b057506106af826116e9565b5b9050919050565b6106cb6000801b6106c6611763565b610bf9565b61070a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070190613446565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610771906133e6565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6002600354141561081b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081290613466565b60405180910390fd5b6002600381905550600260149054906101000a900460ff16610872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610869906134a6565b60405180910390fd5b60068081111561088557610884613883565b5b60ff168360ff1611156108cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c490613326565b60405180910390fd5b60008360ff1660068111156108e5576108e4613883565b5b9050600060056000836006811115610900576108ff613883565b5b600681111561091257610911613883565b5b81526020019081526020016000205411610961576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610958906133a6565b60405180910390fd5b60003490506004600083600681111561097d5761097c613883565b5b600681111561098f5761098e613883565b5b8152602001908152602001600020600101548110156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da90613406565b60405180910390fd5b6109ec8661176b565b6109f4611d71565b610a0387868686856000611e5f565b505060016003819055505050505050565b6000806000838152602001908152602001600020600101549050919050565b610a3d8282612149565b610a6281600160008581526020019081526020016000206116b990919063ffffffff16565b505050565b610a718282612172565b610a9681600160008581526020019081526020016000206121f590919063ffffffff16565b505050565b600080600680811115610ab157610ab0613883565b5b60ff168360ff161115610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090613326565b60405180910390fd5b60008360ff166006811115610b1157610b10613883565b5b905060046000826006811115610b2a57610b29613883565b5b6006811115610b3c57610b3b613883565b5b81526020019081526020016000206000015460046000836006811115610b6557610b64613883565b5b6006811115610b7757610b76613883565b5b8152602001908152602001600020600101549250925050915091565b600260149054906101000a900460ff1681565b7fb49ea64ca9363ee24557fab3bed24140051b27b150a6658dd9436859666b280581565b6000610bf1826001600086815260200190815260200160002061222590919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b60056020528060005260406000206000915090505481565b610c966000801b610c91611763565b610bf9565b610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90613446565b60405180910390fd5b80600260156101000a81548160ff02191690831515021790555050565b610d066000801b610d01611763565b610bf9565b610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c90613446565b60405180910390fd5b600680811115610d5857610d57613883565b5b60ff168260ff161115610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790613326565b60405180910390fd5b60008260ff166006811115610db857610db7613883565b5b90508160056000836006811115610dd257610dd1613883565b5b6006811115610de457610de3613883565b5b815260200190815260200160002081905550806006811115610e0957610e08613883565b5b7fbaa6987cf8f3117b6846d7ce5f4d10dcccb0605732ed5afb686bed2385c0a77c83604051610e3891906134e6565b60405180910390a2505050565b6000610e626001600084815260200190815260200160002061223f565b9050919050565b610e738282612254565b610e9881600160008581526020019081526020016000206121f590919063ffffffff16565b505050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260159054906101000a900460ff16610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690613386565b60405180910390fd5b600680811115610f3257610f31613883565b5b60ff168360ff161115610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7190613326565b60405180910390fd5b60008360ff166006811115610f9257610f91613883565b5b9050600060056000836006811115610fad57610fac613883565b5b6006811115610fbf57610fbe613883565b5b8152602001908152602001600020541161100e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611005906133a6565b60405180910390fd5b60006004600083600681111561102757611026613883565b5b600681111561103957611038613883565b5b81526020019081526020016000206000015490506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d41558586040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b757600080fd5b505afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef9190612ad3565b9050818173ffffffffffffffffffffffffffffffffffffffff166370a08231611116611763565b6040518263ffffffff1660e01b815260040161113291906131d2565b60206040518083038186803b15801561114a57600080fd5b505afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111829190612ce1565b10156111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613486565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6111e9611763565b306040518363ffffffff1660e01b81526004016112079291906131ed565b60206040518083038186803b15801561121f57600080fd5b505afa158015611233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190612ce1565b90508281101561129c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129390613366565b60405180910390fd5b6112a58861176b565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd6112c9611763565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663824de02a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561133157600080fd5b505afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113699190612ad3565b866040518463ffffffff1660e01b815260040161138893929190613216565b602060405180830381600087803b1580156113a257600080fd5b505af11580156113b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113da9190612bad565b506113ea89888888600088611e5f565b505050505050505050565b6114096000801b611404611763565b610bf9565b611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f90613446565b60405180910390fd5b60068081111561145b5761145a613883565b5b60ff168360ff1611156114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90613326565b60405180910390fd5b60008360ff1660068111156114bb576114ba613883565b5b905082600460008360068111156114d5576114d4613883565b5b60068111156114e7576114e6613883565b5b815260200190815260200160002060000181905550816004600083600681111561151457611513613883565b5b600681111561152657611525613883565b5b81526020019081526020016000206001018190555080600681111561154e5761154d613883565b5b7f2365cbecbaf2e8a4efd5f3d836cb051134936d7099eec37b3793c82aa60926e08484611579611763565b6040516115889392919061352a565b60405180910390a250505050565b7f1b29449712117a54a2a96c49e8068b0f884e4ce02b861028ef54f23e90ecdcd281565b6115ce6000801b6115c9611763565b610bf9565b61160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490613446565b60405180910390fd5b80600260146101000a81548160ff02191690831515021790555050565b600260159054906101000a900460ff1681565b60066020528060005260406000206000915054906101000a900460ff1681565b6007602052816000526040600020818154811061167957600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116b5828261227d565b5050565b60006116e1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61235d565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061175c575061175b826123cd565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bdf57600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661182b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611822906133c6565b60405180910390fd5b611833611763565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189890613346565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860006118c5611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806119d357508073ffffffffffffffffffffffffffffffffffffffff1660086000611960611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a09906133e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660086000611a36611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bda578060086000611aba611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611b79611763565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b611cb6565b600073ffffffffffffffffffffffffffffffffffffffff1660086000611c03611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac90613426565b60405180910390fd5b5b60066000611cc2611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d6e57600160066000611d1c611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663824de02a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ddb57600080fd5b505afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190612ad3565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611e5b573d6000803e3d6000fd5b5050565b60008560ff166006811115611e7757611e76613883565b5b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384c4a5406040518163ffffffff1660e01b815260040160206040518083038186803b158015611ee357600080fd5b505afa158015611ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1b9190612ad3565b90508073ffffffffffffffffffffffffffffffffffffffff166377f5ca71611f41611763565b8a8a8a8a6040518663ffffffff1660e01b8152600401611f6595949392919061324d565b600060405180830381600087803b158015611f7f57600080fd5b505af1158015611f93573d6000803e3d6000fd5b50505050600160056000846006811115611fb057611faf613883565b5b6006811115611fc257611fc1613883565b5b81526020019081526020016000206000828254611fdf91906136d3565b9250508190555060086000611ff2611763565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661206b611763565b73ffffffffffffffffffffffffffffffffffffffff167fd2ee799066043decb61c2d9826853e837be93d36044b512b3f094af72f633a988686868d6040516120b69493929190613561565b60405180910390a38160068111156120d1576120d0613883565b5b7fbaa6987cf8f3117b6846d7ce5f4d10dcccb0605732ed5afb686bed2385c0a77c6005600085600681111561210957612108613883565b5b600681111561211b5761211a613883565b5b81526020019081526020016000205460405161213791906134e6565b60405180910390a25050505050505050565b61215282610a14565b6121638161215e611763565b612437565b61216d838361227d565b505050565b61217a611763565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121de906134c6565b60405180910390fd5b6121f182826124d4565b5050565b600061221d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6125b5565b905092915050565b600061223483600001836126c9565b60001c905092915050565b600061224d826000016126f4565b9050919050565b61225d82610a14565b61226e81612269611763565b612437565b61227883836124d4565b505050565b6122878282610bf9565b61235957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122fe611763565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006123698383612705565b6123c25782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506123c7565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124418282610bf9565b6124d0576124668173ffffffffffffffffffffffffffffffffffffffff166014612728565b6124748360001c6020612728565b604051602001612485929190613198565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c791906132e4565b60405180910390fd5b5050565b6124de8282610bf9565b156125b157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612556611763565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080836001016000848152602001908152602001600020549050600081146126bd5760006001826125e791906136d3565b90506000600186600001805490506125ff91906136d3565b905081811461266e5760008660000182815481106126205761261f6138e1565b5b9060005260206000200154905080876000018481548110612644576126436138e1565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612682576126816138b2565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126c3565b60009150505b92915050565b60008260000182815481106126e1576126e06138e1565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60606000600283600261273b9190613679565b6127459190613623565b67ffffffffffffffff81111561275e5761275d613910565b5b6040519080825280601f01601f1916602001820160405280156127905781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127c8576127c76138e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061282c5761282b6138e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261286c9190613679565b6128769190613623565b90505b6001811115612916577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106128b8576128b76138e1565b5b1a60f81b8282815181106128cf576128ce6138e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061290f906137f9565b9050612879565b506000841461295a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295190613306565b60405180910390fd5b8091505092915050565b6000612977612972846135cb565b6135a6565b90508281526020810184848401111561299357612992613944565b5b61299e8482856137b7565b509392505050565b6000813590506129b581613cef565b92915050565b6000815190506129ca81613cef565b92915050565b6000813590506129df81613d06565b92915050565b6000815190506129f481613d06565b92915050565b600081359050612a0981613d1d565b92915050565b600081359050612a1e81613d34565b92915050565b600081359050612a3381613d4b565b92915050565b600082601f830112612a4e57612a4d61393f565b5b8135612a5e848260208601612964565b91505092915050565b600081359050612a7681613d5b565b92915050565b600081519050612a8b81613d5b565b92915050565b600081359050612aa081613d72565b92915050565b600060208284031215612abc57612abb61394e565b5b6000612aca848285016129a6565b91505092915050565b600060208284031215612ae957612ae861394e565b5b6000612af7848285016129bb565b91505092915050565b60008060408385031215612b1757612b1661394e565b5b6000612b25858286016129a6565b9250506020612b36858286016129d0565b9150509250929050565b60008060408385031215612b5757612b5661394e565b5b6000612b65858286016129a6565b9250506020612b7685828601612a67565b9150509250929050565b600060208284031215612b9657612b9561394e565b5b6000612ba4848285016129d0565b91505092915050565b600060208284031215612bc357612bc261394e565b5b6000612bd1848285016129e5565b91505092915050565b600060208284031215612bf057612bef61394e565b5b6000612bfe848285016129fa565b91505092915050565b60008060408385031215612c1e57612c1d61394e565b5b6000612c2c858286016129fa565b9250506020612c3d858286016129a6565b9150509250929050565b60008060408385031215612c5e57612c5d61394e565b5b6000612c6c858286016129fa565b9250506020612c7d85828601612a67565b9150509250929050565b600060208284031215612c9d57612c9c61394e565b5b6000612cab84828501612a0f565b91505092915050565b600060208284031215612cca57612cc961394e565b5b6000612cd884828501612a24565b91505092915050565b600060208284031215612cf757612cf661394e565b5b6000612d0584828501612a7c565b91505092915050565b600080600080600060a08688031215612d2a57612d2961394e565b5b6000612d3888828901612a67565b9550506020612d49888289016129a6565b9450506040612d5a88828901612a91565b935050606086013567ffffffffffffffff811115612d7b57612d7a613949565b5b612d8788828901612a39565b925050608086013567ffffffffffffffff811115612da857612da7613949565b5b612db488828901612a39565b9150509295509295909350565b600060208284031215612dd757612dd661394e565b5b6000612de584828501612a91565b91505092915050565b60008060408385031215612e0557612e0461394e565b5b6000612e1385828601612a91565b9250506020612e2485828601612a67565b9150509250929050565b600080600060608486031215612e4757612e4661394e565b5b6000612e5586828701612a91565b9350506020612e6686828701612a67565b9250506040612e7786828701612a67565b9150509250925092565b612e8a81613707565b82525050565b612e9981613719565b82525050565b612ea881613725565b82525050565b612eb7816137a5565b82525050565b6000612ec8826135fc565b612ed28185613607565b9350612ee28185602086016137c6565b612eeb81613953565b840191505092915050565b6000612f01826135fc565b612f0b8185613618565b9350612f1b8185602086016137c6565b80840191505092915050565b6000612f34602083613607565b9150612f3f82613964565b602082019050919050565b6000612f57600c83613607565b9150612f628261398d565b602082019050919050565b6000612f7a601883613607565b9150612f85826139b6565b602082019050919050565b6000612f9d602983613607565b9150612fa8826139df565b604082019050919050565b6000612fc0602183613607565b9150612fcb82613a2e565b604082019050919050565b6000612fe3602783613607565b9150612fee82613a7d565b604082019050919050565b6000613006601a83613607565b915061301182613acc565b602082019050919050565b6000613029601883613607565b915061303482613af5565b602082019050919050565b600061304c601783613607565b915061305782613b1e565b602082019050919050565b600061306f601a83613607565b915061307a82613b47565b602082019050919050565b6000613092601783613618565b915061309d82613b70565b601782019050919050565b60006130b5601b83613607565b91506130c082613b99565b602082019050919050565b60006130d8601f83613607565b91506130e382613bc2565b602082019050919050565b60006130fb602283613607565b915061310682613beb565b604082019050919050565b600061311e601183613618565b915061312982613c3a565b601182019050919050565b6000613141601883613607565b915061314c82613c63565b602082019050919050565b6000613164602f83613607565b915061316f82613c8c565b604082019050919050565b6131838161378e565b82525050565b61319281613798565b82525050565b60006131a382613085565b91506131af8285612ef6565b91506131ba82613111565b91506131c68284612ef6565b91508190509392505050565b60006020820190506131e76000830184612e81565b92915050565b60006040820190506132026000830185612e81565b61320f6020830184612e81565b9392505050565b600060608201905061322b6000830186612e81565b6132386020830185612e81565b613245604083018461317a565b949350505050565b600060a0820190506132626000830188612e81565b61326f602083018761317a565b61327c6040830186613189565b818103606083015261328e8185612ebd565b905081810360808301526132a28184612ebd565b90509695505050505050565b60006020820190506132c36000830184612e90565b92915050565b60006020820190506132de6000830184612e9f565b92915050565b600060208201905081810360008301526132fe8184612ebd565b905092915050565b6000602082019050818103600083015261331f81612f27565b9050919050565b6000602082019050818103600083015261333f81612f4a565b9050919050565b6000602082019050818103600083015261335f81612f6d565b9050919050565b6000602082019050818103600083015261337f81612f90565b9050919050565b6000602082019050818103600083015261339f81612fb3565b9050919050565b600060208201905081810360008301526133bf81612fd6565b9050919050565b600060208201905081810360008301526133df81612ff9565b9050919050565b600060208201905081810360008301526133ff8161301c565b9050919050565b6000602082019050818103600083015261341f8161303f565b9050919050565b6000602082019050818103600083015261343f81613062565b9050919050565b6000602082019050818103600083015261345f816130a8565b9050919050565b6000602082019050818103600083015261347f816130cb565b9050919050565b6000602082019050818103600083015261349f816130ee565b9050919050565b600060208201905081810360008301526134bf81613134565b9050919050565b600060208201905081810360008301526134df81613157565b9050919050565b60006020820190506134fb600083018461317a565b92915050565b6000604082019050613516600083018561317a565b613523602083018461317a565b9392505050565b600060608201905061353f600083018661317a565b61354c602083018561317a565b6135596040830184612e81565b949350505050565b6000608082019050613576600083018761317a565b613583602083018661317a565b6135906040830185612eae565b61359d606083018461317a565b95945050505050565b60006135b06135c1565b90506135bc8282613823565b919050565b6000604051905090565b600067ffffffffffffffff8211156135e6576135e5613910565b5b6135ef82613953565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061362e8261378e565b91506136398361378e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561366e5761366d613854565b5b828201905092915050565b60006136848261378e565b915061368f8361378e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136c8576136c7613854565b5b828202905092915050565b60006136de8261378e565b91506136e98361378e565b9250828210156136fc576136fb613854565b5b828203905092915050565b60006137128261376e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061376982613cdb565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006137b08261375b565b9050919050565b82818337600083830152505050565b60005b838110156137e45780820151818401526020810190506137c9565b838111156137f3576000848401525b50505050565b60006138048261378e565b9150600082141561381857613817613854565b5b600182039050919050565b61382c82613953565b810181811067ffffffffffffffff8211171561384b5761384a613910565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f496e76616c69642047656e650000000000000000000000000000000000000000600082015250565b7f43616e6e6f7420526566657272616c20596f757273656c660000000000000000600082015250565b7f4e6f7420416c6c6f7720456e6f756768204b6f746b657420546f6b656e20546f60008201527f2042726564204e46540000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564206b6f746b657420746f6b656e207075726368617360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f7720746f2062726564206d6f7265204e4654206f6620746860008201527f69732067656e6500000000000000000000000000000000000000000000000000602082015250565b7f496e6163746976656420526566657272616c2041646472657373000000000000600082015250565b7f496e76616c696420526566657272616c20416464726573730000000000000000600082015250565b7f696e73756666696369656e742077656920616d6f756e74000000000000000000600082015250565b7f4e6f7420616c6c6f77656420656d707479207265666572726572000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f446f6e7420686176652041646d696e207065726d697373696f6e210000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e74204b6f746b657420546f6b656e2042616c616e6360008201527f6521000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f4e6f7420616c6c6f776564207765692070757263686173650000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60078110613cec57613ceb613883565b5b50565b613cf881613707565b8114613d0357600080fd5b50565b613d0f81613719565b8114613d1a57600080fd5b50565b613d2681613725565b8114613d3157600080fd5b50565b613d3d8161372f565b8114613d4857600080fd5b50565b60078110613d5857600080fd5b50565b613d648161378e565b8114613d6f57600080fd5b50565b613d7b81613798565b8114613d8657600080fd5b5056fea2646970667358221220fa30553f9a109e8d8fccd1eff76b262cb4e8bd8d363ccc0bff93cb021f8d7e3f64736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f3ad02357fa97a7835c6643269af7f2094b02fed
-----Decoded View---------------
Arg [0] : _governanceAdress (address): 0xF3ad02357fa97a7835c6643269af7f2094b02Fed
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f3ad02357fa97a7835c6643269af7f2094b02fed
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.