Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.0001 ETH
Eth Value
$0.34 (@ $3,440.83/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 173 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16023720 | 609 days ago | IN | 0 ETH | 0.00044809 | ||||
Set Approval For... | 15918302 | 624 days ago | IN | 0 ETH | 0.00067154 | ||||
Set Base URI | 15917178 | 624 days ago | IN | 0 ETH | 0.00033156 | ||||
Set Approval For... | 15895959 | 627 days ago | IN | 0 ETH | 0.00067466 | ||||
Set Approval For... | 15882237 | 629 days ago | IN | 0 ETH | 0.00049683 | ||||
Set Approval For... | 15724116 | 651 days ago | IN | 0 ETH | 0.00116282 | ||||
Set Approval For... | 15724110 | 651 days ago | IN | 0 ETH | 0.00101571 | ||||
Set Approval For... | 15724091 | 651 days ago | IN | 0 ETH | 0.00113618 | ||||
Set Approval For... | 15723982 | 651 days ago | IN | 0 ETH | 0.00115972 | ||||
Set Approval For... | 15723974 | 651 days ago | IN | 0 ETH | 0.00114548 | ||||
Set Approval For... | 15723960 | 651 days ago | IN | 0 ETH | 0.00128244 | ||||
Set Approval For... | 15623873 | 665 days ago | IN | 0 ETH | 0.00035364 | ||||
Claim Props | 15617051 | 666 days ago | IN | 0 ETH | 0.00071971 | ||||
Claim Props | 15617051 | 666 days ago | IN | 0 ETH | 0.000648 | ||||
Claim Props | 15617051 | 666 days ago | IN | 0 ETH | 0.000648 | ||||
Claim Props | 15617051 | 666 days ago | IN | 0 ETH | 0.000648 | ||||
Claim Props | 15617032 | 666 days ago | IN | 0 ETH | 0.00057121 | ||||
Claim Props | 15617032 | 666 days ago | IN | 0 ETH | 0.00057121 | ||||
Claim Props | 15617032 | 666 days ago | IN | 0 ETH | 0.00052278 | ||||
Claim Props | 15617032 | 666 days ago | IN | 0 ETH | 0.00052278 | ||||
Claim Props | 15617032 | 666 days ago | IN | 0 ETH | 0.00060352 | ||||
Claim Props | 15617021 | 666 days ago | IN | 0 ETH | 0.0005679 | ||||
Claim Props | 15617020 | 666 days ago | IN | 0 ETH | 0.00030501 | ||||
Claim Props | 15617008 | 666 days ago | IN | 0 ETH | 0.0006815 | ||||
Claim Props | 15617008 | 666 days ago | IN | 0 ETH | 0.00057998 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MixVersePasscard
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-22 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } 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; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } pragma solidity ^0.8.0; contract PermissionGroup is Ownable { // List of authorized address to perform some restricted actions mapping(address => bool) public operators; modifier onlyOperator() { require(operators[msg.sender], "PermissionGroup: not operator"); _; } /** * @notice Adds an address as operator. */ function addOperator(address operator) external onlyOwner { operators[operator] = true; } /** * @notice Removes an address as operator. */ function removeOperator(address operator) external onlyOwner { operators[operator] = false; } } 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; } } // pragma solidity ^0.8.0; // contract AcceptedToken is PermissionGroup { // using SafeERC20 for IERC20; // // Token to be used in the ecosystem. // IERC20 public acceptedToken; // constructor(IERC20 tokenAddress) { // acceptedToken = tokenAddress; // } // modifier collectTokenAsFee(uint amount, address destAddr) { // require(acceptedToken.balanceOf(msg.sender) >= amount, "AcceptedToken: insufficient token balance"); // _; // acceptedToken.safeTransferFrom(msg.sender, destAddr, amount); // } // /** // * @dev Sets accepted token using in the ecosystem. // */ // function setAcceptedTokenContract(IERC20 tokenAddr) external onlyOwner { // require(address(tokenAddr) != address(0)); // acceptedToken = tokenAddr; // } // } interface IStaking { function balanceOf(address account) external view returns (uint); } pragma solidity ^0.8.0; interface IMixVersePasscard { struct Passcard { uint level; uint expiration; uint gameCostDiscount; // 消费折扣 uint chaosIncrease; // CHAOS产出 uint physicalIncrease; // 体力获得 uint transferDecrease; // 传送减免 uint earnIncrease; // 质押增益 uint stakeIncrease; // 质押收益增加 uint composeDiscount; // 合成费用减免 uint land1; // land 1*1空投 uint land2; // land 2*2空投 uint land3; // land 3*3空投 uint jointlyRewards; // 联名奖励权重 uint revenueShare; // 项目收益分成 bool isFree; } struct Level { uint maxSupply; uint minted; uint activateFee; uint renewalFee; uint validDays; } event PasscardCreated(uint indexed cardId, uint level); event PasscardPropsSet(uint indexed cardId, Passcard props); event PasscardRenewal(uint indexed cardId, uint expiration); event PasscardSetWhitelist(address[] addresses, bool isWhitelist); event PasscardActivate(uint indexed cardId); /** * @notice Claims passcard when it's on presale phase. */ function claim(uint level, uint amount) external payable returns(uint[] memory); /** * @notice Gets card information. */ function getCard(uint cardId) external view returns (Passcard memory); /** * @notice Gets current level of given card. */ function getCardLevel(uint cardId) external view returns (uint); } pragma solidity ^0.8.0; contract MixVersePasscard is IMixVersePasscard, ERC721, PermissionGroup, ReentrancyGuard { using SafeERC20 for IERC20; // using EnumerableSet for EnumerableSet.AddressSet; uint public initialValidDays = 365; uint public mintUpperLimit = 5; string private _uri; mapping(uint => uint) public cardsOnSale; mapping(uint => mapping(address => uint)) public cardsWithOffers; Passcard[] private _cards; mapping(uint => Level) public levels; // 在mintBefore之前mint的card,有效期截止时间统一为mintExpiration uint256 public mintBefore; uint256 public mintExpiration; mapping(address => bool) public whitelist; struct Period { uint maxSupply; uint minted; uint start; uint end; uint price; bool onlyWhitelist; uint whitelistDiscount; } mapping(uint => Period) public mintPeriods; constructor( string memory baseURI ) ERC721("MixVersePasscard", "Passcard") { _uri = baseURI; } modifier onlyCardOwner(uint cardId) { require(ownerOf(cardId) == msg.sender, "MixVersePasscard: not card owner"); _; } // ######## Restricted Functions ########## function setBaseURI(string memory baseURI) external onlyOwner { _uri = baseURI; } function setLevel(uint maxSupply, uint level, uint activateFee, uint renewalFee, uint validDays) external onlyOwner { // require(levels[level].minted == 0, 'MixVersePasscard: minted'); Level memory _level = levels[level]; levels[level] = Level(maxSupply, _level.minted, activateFee, renewalFee, validDays); } function claimProps(uint cardId, Passcard memory props) external onlyOperator { Passcard memory card = _cards[cardId]; require(card.level > 0, 'MixVersePasscard: card not exist'); _cards[cardId] = props; _cards[cardId].level = card.level; _cards[cardId].expiration = card.expiration; _cards[cardId].isFree = card.isFree; emit PasscardPropsSet(cardId, props); } function setMintPeriod(uint level, uint maxSupply, uint start, uint end, uint price, bool onlyWhitelist, uint whitelistDiscount) external onlyOwner { require(block.timestamp >= mintPeriods[level].end, 'MixVersePasscard: last mint period not finish.'); mintPeriods[level] = Period(maxSupply, 0, start, end, price, onlyWhitelist, whitelistDiscount); } function setMintBeforeAndExpiration(uint _mintBefore, uint _mintExpiration) external onlyOwner { require(_mintExpiration > block.timestamp && _mintExpiration > _mintBefore, "MixVersePasscard: invalid time"); mintBefore = _mintBefore; mintExpiration = _mintExpiration; } function setWhitelist(address[] memory addresses, bool isWhitelist) external onlyOwner { uint len = addresses.length; for (uint i = 0; i < len; i++) { whitelist[addresses[i]] = isWhitelist; } emit PasscardSetWhitelist(addresses, isWhitelist); } // ######## Public Functions ############ function claim(uint level, uint amount) external override payable nonReentrant returns (uint[] memory) { require(amount <= mintUpperLimit, 'MixVersePasscard: exceed single mint upper limit'); Level memory _level = levels[level]; require(_level.minted + amount <= _level.maxSupply, 'MixVersePasscard: exceed max supply'); Period memory _period = mintPeriods[level]; require(block.timestamp >= _period.start, 'MixVersePasscard: mint not start'); require(block.timestamp <= _period.end, 'MixVersePasscard: mint ended'); require(_period.minted + amount <= _period.maxSupply, 'MixVersePasscard: exceed period max supply'); uint price = _period.price; bool isWhitelist = whitelist[msg.sender]; require((isWhitelist && amount == 1) || !isWhitelist, 'MixVersePasscard: invalid whitelist amount'); require(!_period.onlyWhitelist || (_period.onlyWhitelist && isWhitelist), 'MixVersePasscard: not in whitelist'); uint value = price * amount; if (isWhitelist && _period.whitelistDiscount > 0) { value = price * _period.whitelistDiscount / 100; } uint[] memory tokenIds = new uint[](amount); for (uint i = 0; i < amount; i++) { uint cardId = _createCard(level, price == 0); _safeMint(msg.sender, cardId); tokenIds[i] = cardId; } levels[level].minted += amount; mintPeriods[level].minted += amount; (bool isSuccess,) = owner().call{value: value}(""); require(isSuccess); if (isWhitelist) { whitelist[msg.sender] = false; } return tokenIds; } function claimTo(address[] memory addresses, uint level) external nonReentrant onlyOperator returns (uint[] memory) { uint len = addresses.length; Level memory _level = levels[level]; require(_level.minted + len <= _level.maxSupply, 'MixVersePasscard: exceed max supply'); uint[] memory tokenIds = new uint[](len); for (uint i = 0; i < len; i++) { uint cardId = _createCard(level, true); _safeMint(addresses[i], cardId); tokenIds[i] = cardId; } levels[level].minted += len; return tokenIds; } function renewal(uint cardId) external payable { uint level = _cards[cardId].level; uint validDays = levels[level].validDays; uint fee = levels[level].renewalFee; uint expiration = _cards[cardId].expiration; expiration = block.timestamp > expiration ? block.timestamp : expiration; expiration = expiration + validDays * 24 * 3600; (bool isSuccess,) = owner().call{value: fee}(""); require(isSuccess); _cards[cardId].expiration = expiration; emit PasscardRenewal(cardId, expiration); } function activate(uint cardId) external payable { Passcard memory card = _cards[cardId]; require(card.isFree, 'MixVersePasscard: activated'); Level memory level = levels[card.level]; uint fee = level.activateFee; (bool isSuccess,) = owner().call{value: fee}(""); require(isSuccess); _cards[cardId].isFree = false; emit PasscardActivate(cardId); } function _createCard(uint level, bool isFree) private returns (uint cardId) { uint expiration = mintBefore > 0 && mintExpiration > 0 && block.timestamp < mintBefore ? mintExpiration : block.timestamp + (initialValidDays * 24 * 3600); _cards.push(Passcard(level, expiration, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, isFree)); cardId = _cards.length - 1; emit PasscardCreated(cardId, level); } // ######## View Functions ########## function getCard(uint tokenId) external view override returns (Passcard memory) { return _cards[tokenId]; } function getCardLevel(uint cardId) external view override returns (uint) { return _cards[cardId].level; } function totalSupply() external view returns (uint) { return _cards.length; } function _baseURI() internal view override returns (string memory) { return _uri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"PasscardActivate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"level","type":"uint256"}],"name":"PasscardCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"cardId","type":"uint256"},{"components":[{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"uint256","name":"gameCostDiscount","type":"uint256"},{"internalType":"uint256","name":"chaosIncrease","type":"uint256"},{"internalType":"uint256","name":"physicalIncrease","type":"uint256"},{"internalType":"uint256","name":"transferDecrease","type":"uint256"},{"internalType":"uint256","name":"earnIncrease","type":"uint256"},{"internalType":"uint256","name":"stakeIncrease","type":"uint256"},{"internalType":"uint256","name":"composeDiscount","type":"uint256"},{"internalType":"uint256","name":"land1","type":"uint256"},{"internalType":"uint256","name":"land2","type":"uint256"},{"internalType":"uint256","name":"land3","type":"uint256"},{"internalType":"uint256","name":"jointlyRewards","type":"uint256"},{"internalType":"uint256","name":"revenueShare","type":"uint256"},{"internalType":"bool","name":"isFree","type":"bool"}],"indexed":false,"internalType":"struct IMixVersePasscard.Passcard","name":"props","type":"tuple"}],"name":"PasscardPropsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"PasscardRenewal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"addresses","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isWhitelist","type":"bool"}],"name":"PasscardSetWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"activate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardsOnSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"cardsWithOffers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"},{"components":[{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"uint256","name":"gameCostDiscount","type":"uint256"},{"internalType":"uint256","name":"chaosIncrease","type":"uint256"},{"internalType":"uint256","name":"physicalIncrease","type":"uint256"},{"internalType":"uint256","name":"transferDecrease","type":"uint256"},{"internalType":"uint256","name":"earnIncrease","type":"uint256"},{"internalType":"uint256","name":"stakeIncrease","type":"uint256"},{"internalType":"uint256","name":"composeDiscount","type":"uint256"},{"internalType":"uint256","name":"land1","type":"uint256"},{"internalType":"uint256","name":"land2","type":"uint256"},{"internalType":"uint256","name":"land3","type":"uint256"},{"internalType":"uint256","name":"jointlyRewards","type":"uint256"},{"internalType":"uint256","name":"revenueShare","type":"uint256"},{"internalType":"bool","name":"isFree","type":"bool"}],"internalType":"struct IMixVersePasscard.Passcard","name":"props","type":"tuple"}],"name":"claimProps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"claimTo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCard","outputs":[{"components":[{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"uint256","name":"gameCostDiscount","type":"uint256"},{"internalType":"uint256","name":"chaosIncrease","type":"uint256"},{"internalType":"uint256","name":"physicalIncrease","type":"uint256"},{"internalType":"uint256","name":"transferDecrease","type":"uint256"},{"internalType":"uint256","name":"earnIncrease","type":"uint256"},{"internalType":"uint256","name":"stakeIncrease","type":"uint256"},{"internalType":"uint256","name":"composeDiscount","type":"uint256"},{"internalType":"uint256","name":"land1","type":"uint256"},{"internalType":"uint256","name":"land2","type":"uint256"},{"internalType":"uint256","name":"land3","type":"uint256"},{"internalType":"uint256","name":"jointlyRewards","type":"uint256"},{"internalType":"uint256","name":"revenueShare","type":"uint256"},{"internalType":"bool","name":"isFree","type":"bool"}],"internalType":"struct IMixVersePasscard.Passcard","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"getCardLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialValidDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levels","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint256","name":"activateFee","type":"uint256"},{"internalType":"uint256","name":"renewalFee","type":"uint256"},{"internalType":"uint256","name":"validDays","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintBefore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintExpiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintPeriods","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"onlyWhitelist","type":"bool"},{"internalType":"uint256","name":"whitelistDiscount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintUpperLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"renewal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"activateFee","type":"uint256"},{"internalType":"uint256","name":"renewalFee","type":"uint256"},{"internalType":"uint256","name":"validDays","type":"uint256"}],"name":"setLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintBefore","type":"uint256"},{"internalType":"uint256","name":"_mintExpiration","type":"uint256"}],"name":"setMintBeforeAndExpiration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"onlyWhitelist","type":"bool"},{"internalType":"uint256","name":"whitelistDiscount","type":"uint256"}],"name":"setMintPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isWhitelist","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405261016d6009556005600a553480156200001c57600080fd5b5060405162003acc38038062003acc8339810160408190526200003f91620001dc565b604080518082018252601081526f135a5e15995c9cd954185cdcd8d85c9960821b60208083019182528351808501909452600884526714185cdcd8d85c9960c21b908401528151919291620000979160009162000136565b508051620000ad90600190602084019062000136565b5050506000620000c26200013260201b60201c565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600160085580516200012a90600b90602084019062000136565b50506200030b565b3390565b8280546200014490620002b8565b90600052602060002090601f016020900481019282620001685760008555620001b3565b82601f106200018357805160ff1916838001178555620001b3565b82800160010185558215620001b3579182015b82811115620001b357825182559160200191906001019062000196565b50620001c1929150620001c5565b5090565b5b80821115620001c15760008155600101620001c6565b60006020808385031215620001f057600080fd5b82516001600160401b03808211156200020857600080fd5b818501915085601f8301126200021d57600080fd5b815181811115620002325762000232620002f5565b604051601f8201601f19908116603f011681019083821181831017156200025d576200025d620002f5565b8160405282815288868487010111156200027657600080fd5b600093505b828410156200029a57848401860151818501870152928501926200027b565b82841115620002ac5760008684830101525b98975050505050505050565b600181811c90821680620002cd57607f821691505b60208210811415620002ef57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6137b1806200031b6000396000f3fe6080604052600436106102465760003560e01c80638eaef72711610139578063b88d4fde116100b6578063d540d7101161007a578063d540d710146107ae578063dea09912146107c4578063e985e9c5146107d7578063ebbeda7114610820578063f23e274314610840578063f2fde38b1461086057600080fd5b8063b88d4fde1461070d578063b891ae521461072d578063c075769914610743578063c34902631461077b578063c87b56dd1461078e57600080fd5b8063a22cb465116100fd578063a22cb46514610628578063ac8a584a14610648578063b2596a6714610668578063b260c42a146106da578063b6236f61146106ed57600080fd5b80638eaef727146105765780639188d3121461059657806395d89b41146105c35780639870d7fe146105d85780639b19251a146105f857600080fd5b80634506c9ec116101c75780636bfe377d1161018b5780636bfe377d146104e05780636e7413de146104f657806370a0823114610523578063715018a6146105435780638da5cb5b1461055857600080fd5b80634506c9ec1461043d578063499a04601461045357806355f804b31461047357806358053ac8146104935780636352211e146104c057600080fd5b806318160ddd1161020e57806318160ddd1461032c57806323b872dd1461034b5780633c271a051461036b5780633cba1af01461038b57806342842e0e1461041d57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806313e7c9d8146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004613052565b610880565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956108d2565b60405161027791906133e6565b3480156102ae57600080fd5b506102c26102bd3660046130d5565b610964565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612f9e565b6109fe565b005b34801561030857600080fd5b5061026b610317366004612e6e565b60076020526000908152604090205460ff1681565b34801561033857600080fd5b50600e545b604051908152602001610277565b34801561035757600080fd5b506102fa610366366004612ebc565b610b14565b34801561037757600080fd5b506102fa610386366004612fc8565b610b45565b34801561039757600080fd5b506103e66103a63660046130d5565b60136020526000908152604090208054600182015460028301546003840154600485015460058601546006909601549495939492939192909160ff169087565b6040805197885260208801969096529486019390935260608501919091526080840152151560a083015260c082015260e001610277565b34801561042957600080fd5b506102fa610438366004612ebc565b610c16565b34801561044957600080fd5b5061033d600a5481565b34801561045f57600080fd5b5061033d61046e3660046130d5565b610c31565b34801561047f57600080fd5b506102fa61048e36600461308c565b610c5f565b34801561049f57600080fd5b506104b36104ae36600461300d565b610ca0565b60405161027791906133a2565b3480156104cc57600080fd5b506102c26104db3660046130d5565b610ebb565b3480156104ec57600080fd5b5061033d60105481565b34801561050257600080fd5b5061033d6105113660046130d5565b600c6020526000908152604090205481565b34801561052f57600080fd5b5061033d61053e366004612e6e565b610f32565b34801561054f57600080fd5b506102fa610fb9565b34801561056457600080fd5b506006546001600160a01b03166102c2565b34801561058257600080fd5b506102fa610591366004613111565b61102d565b3480156105a257600080fd5b506105b66105b13660046130d5565b611351565b6040516102779190613514565b3480156105cf57600080fd5b506102956114a1565b3480156105e457600080fd5b506102fa6105f3366004612e6e565b6114b0565b34801561060457600080fd5b5061026b610613366004612e6e565b60126020526000908152604090205460ff1681565b34801561063457600080fd5b506102fa610643366004612f74565b6114fe565b34801561065457600080fd5b506102fa610663366004612e6e565b6115c3565b34801561067457600080fd5b506106b26106833660046130d5565b600f60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610277565b6102fa6106e83660046130d5565b61160e565b3480156106f957600080fd5b506102fa6107083660046131fd565b611851565b34801561071957600080fd5b506102fa610728366004612ef8565b6118e0565b34801561073957600080fd5b5061033d60115481565b34801561074f57600080fd5b5061033d61075e3660046130ee565b600d60209081526000928352604080842090915290825290205481565b6104b36107893660046131fd565b611918565b34801561079a57600080fd5b506102956107a93660046130d5565b611e85565b3480156107ba57600080fd5b5061033d60095481565b6102fa6107d23660046130d5565b611f60565b3480156107e357600080fd5b5061026b6107f2366004612e89565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082c57600080fd5b506102fa61083b36600461325a565b6120dd565b34801561084c57600080fd5b506102fa61085b36600461321f565b612201565b34801561086c57600080fd5b506102fa61087b366004612e6e565b6122fa565b60006001600160e01b031982166380ac58cd60e01b14806108b157506001600160e01b03198216635b5e139f60e01b145b806108cc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546108e1906136a0565b80601f016020809104026020016040519081016040528092919081815260200182805461090d906136a0565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a0982610ebb565b9050806001600160a01b0316836001600160a01b03161415610a775760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d9565b336001600160a01b0382161480610a935750610a9381336107f2565b610b055760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109d9565b610b0f83836123e5565b505050565b610b1e3382612453565b610b3a5760405162461bcd60e51b81526004016109d990613480565b610b0f83838361254a565b6006546001600160a01b03163314610b6f5760405162461bcd60e51b81526004016109d99061344b565b815160005b81811015610bd7578260126000868481518110610b9357610b93613736565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610bcf816136db565b915050610b74565b507f892667037517ef24182a08aadbfe08b3fc63a1aa644256c97b6b478007339c5c8383604051610c0992919061334e565b60405180910390a1505050565b610b0f838383604051806020016040528060008152506118e0565b6000600e8281548110610c4657610c46613736565b90600052602060002090600f0201600001549050919050565b6006546001600160a01b03163314610c895760405162461bcd60e51b81526004016109d99061344b565b8051610c9c90600b906020840190612cc4565b5050565b606060026008541415610cf55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109d9565b60026008553360009081526007602052604090205460ff16610d595760405162461bcd60e51b815260206004820152601d60248201527f5065726d697373696f6e47726f75703a206e6f74206f70657261746f7200000060448201526064016109d9565b82516000838152600f6020908152604091829020825160a081018452815480825260018301549382018490526002830154948201949094526003820154606082015260049091015460808201529190610db3908490613612565b1115610dd15760405162461bcd60e51b81526004016109d9906134d1565b60008267ffffffffffffffff811115610dec57610dec61374c565b604051908082528060200260200182016040528015610e15578160200160208202803683370190505b50905060005b83811015610e86576000610e308760016126ea565b9050610e55888381518110610e4757610e47613736565b6020026020010151826128e8565b80838381518110610e6857610e68613736565b60209081029190910101525080610e7e816136db565b915050610e1b565b506000858152600f602052604081206001018054859290610ea8908490613612565b9091555050600160085595945050505050565b6000818152600260205260408120546001600160a01b0316806108cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109d9565b60006001600160a01b038216610f9d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109d9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610fe35760405162461bcd60e51b81526004016109d99061344b565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b3360009081526007602052604090205460ff1661108c5760405162461bcd60e51b815260206004820152601d60248201527f5065726d697373696f6e47726f75703a206e6f74206f70657261746f7200000060448201526064016109d9565b6000600e83815481106110a1576110a1613736565b6000918252602091829020604080516101e081018252600f90930290910180548084526001820154948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a810154610140830152600b810154610160830152600c810154610180830152600d8101546101a0830152600e015460ff1615156101c082015291506111ad5760405162461bcd60e51b815260206004820181905260248201527f4d6978566572736550617373636172643a2063617264206e6f7420657869737460448201526064016109d9565b81600e84815481106111c1576111c1613736565b60009182526020918290208351600f929092020190815590820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820155610140820151600a820155610160820151600b820155610180820151600c8201556101a0820151600d8201556101c090910151600e918201805460ff1916911515919091179055815181549091908590811061129157611291613736565b90600052602060002090600f0201600001819055508060200151600e84815481106112be576112be613736565b90600052602060002090600f020160010181905550806101c00151600e84815481106112ec576112ec613736565b90600052602060002090600f0201600e0160006101000a81548160ff021916908315150217905550827fb0aced443ea1d69e576a3275eeb0de7a48b4acb25f80f0eaefbbce786f75e067836040516113449190613514565b60405180910390a2505050565b6113cc604051806101e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b600e82815481106113df576113df613736565b6000918252602091829020604080516101e081018252600f909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c820154610180820152600d8201546101a0820152600e9091015460ff1615156101c082015292915050565b6060600180546108e1906136a0565b6006546001600160a01b031633146114da5760405162461bcd60e51b81526004016109d99061344b565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6001600160a01b0382163314156115575760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146115ed5760405162461bcd60e51b81526004016109d99061344b565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000600e828154811061162357611623613736565b6000918252602091829020604080516101e081018252600f909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c820154610180820152600d8201546101a0820152600e9091015460ff1615156101c082018190529091506117305760405162461bcd60e51b815260206004820152601b60248201527f4d6978566572736550617373636172643a20616374697661746564000000000060448201526064016109d9565b80516000908152600f60209081526040808320815160a08101835281548152600182015493810193909352600281015491830182905260038101546060840152600401546080830152909161178d6006546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d80600081146117d7576040519150601f19603f3d011682016040523d82523d6000602084013e6117dc565b606091505b50509050806117ea57600080fd5b6000600e86815481106117ff576117ff613736565b600091825260208220600f9190910201600e01805460ff19169215159290921790915560405186917f792b00c411e4e036dc5f20b09970e2e969ec1bf6edf39b90e5b0849490aac7a591a25050505050565b6006546001600160a01b0316331461187b5760405162461bcd60e51b81526004016109d99061344b565b428111801561188957508181115b6118d55760405162461bcd60e51b815260206004820152601e60248201527f4d6978566572736550617373636172643a20696e76616c69642074696d65000060448201526064016109d9565b601091909155601155565b6118ea3383612453565b6119065760405162461bcd60e51b81526004016109d990613480565b61191284848484612902565b50505050565b60606002600854141561196d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109d9565b6002600855600a548211156119dd5760405162461bcd60e51b815260206004820152603060248201527f4d6978566572736550617373636172643a206578636565642073696e676c652060448201526f1b5a5b9d081d5c1c195c881b1a5b5a5d60821b60648201526084016109d9565b6000838152600f6020908152604091829020825160a081018452815480825260018301549382018490526002830154948201949094526003820154606082015260049091015460808201529190611a35908590613612565b1115611a535760405162461bcd60e51b81526004016109d9906134d1565b600084815260136020908152604091829020825160e0810184528154815260018201549281019290925260028101549282018390526003810154606083015260048101546080830152600581015460ff16151560a08301526006015460c082015290421015611b045760405162461bcd60e51b815260206004820181905260248201527f4d6978566572736550617373636172643a206d696e74206e6f7420737461727460448201526064016109d9565b8060600151421115611b585760405162461bcd60e51b815260206004820152601c60248201527f4d6978566572736550617373636172643a206d696e7420656e6465640000000060448201526064016109d9565b80516020820151611b6a908690613612565b1115611bcb5760405162461bcd60e51b815260206004820152602a60248201527f4d6978566572736550617373636172643a2065786365656420706572696f64206044820152696d617820737570706c7960b01b60648201526084016109d9565b60808101513360009081526012602052604090205460ff16808015611bf05750856001145b80611bf9575080155b611c585760405162461bcd60e51b815260206004820152602a60248201527f4d6978566572736550617373636172643a20696e76616c69642077686974656c6044820152691a5cdd08185b5bdd5b9d60b21b60648201526084016109d9565b8260a001511580611c7257508260a001518015611c725750805b611cc95760405162461bcd60e51b815260206004820152602260248201527f4d6978566572736550617373636172643a206e6f7420696e2077686974656c696044820152611cdd60f21b60648201526084016109d9565b6000611cd5878461363e565b9050818015611ce8575060008460c00151115b15611d0c5760648460c0015184611cff919061363e565b611d09919061362a565b90505b60008767ffffffffffffffff811115611d2757611d2761374c565b604051908082528060200260200182016040528015611d50578160200160208202803683370190505b50905060005b88811015611da8576000611d6b8b87156126ea565b9050611d7733826128e8565b80838381518110611d8a57611d8a613736565b60209081029190910101525080611da0816136db565b915050611d56565b506000898152600f6020526040812060010180548a9290611dca908490613612565b9091555050600089815260136020526040812060010180548a9290611df0908490613612565b90915550506006546040516000916001600160a01b03169084908381818185875af1925050503d8060008114611e42576040519150601f19603f3d011682016040523d82523d6000602084013e611e47565b606091505b5050905080611e5557600080fd5b8315611e7357336000908152601260205260409020805460ff191690555b50600160085598975050505050505050565b6000818152600260205260409020546060906001600160a01b0316611f045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d9565b6000611f0e612935565b90506000815111611f2e5760405180602001604052806000815250611f59565b80611f3884612944565b604051602001611f499291906132e2565b6040516020818303038152906040525b9392505050565b6000600e8281548110611f7557611f75613736565b60009182526020808320600f9283020154808452919052604082206004810154600390910154600e80549395509193909290919086908110611fb957611fb9613736565b90600052602060002090600f0201600101549050804211611fda5780611fdc565b425b9050611fe983601861363e565b611ff590610e1061363e565b611fff9082613612565b905060006120156006546001600160a01b031690565b6001600160a01b03168360405160006040518083038185875af1925050503d806000811461205f576040519150601f19603f3d011682016040523d82523d6000602084013e612064565b606091505b505090508061207257600080fd5b81600e878154811061208657612086613736565b90600052602060002090600f020160010181905550857f1e273426ac0d5def76ed5188efa1e24d5e8017eaeea324e65888bc13c1886a5a836040516120cd91815260200190565b60405180910390a2505050505050565b6006546001600160a01b031633146121075760405162461bcd60e51b81526004016109d99061344b565b60008781526013602052604090206003015442101561217f5760405162461bcd60e51b815260206004820152602e60248201527f4d6978566572736550617373636172643a206c617374206d696e74207065726960448201526d37b2103737ba103334b734b9b41760911b60648201526084016109d9565b6040805160e0810182529687526000602080890182815289840198895260608a0197885260808a0196875294151560a08a0190815260c08a01948552998252601390522095518655905160018601559251600285015590516003840155516004830155915160058201805460ff19169115159190911790559051600690910155565b6006546001600160a01b0316331461222b5760405162461bcd60e51b81526004016109d99061344b565b6000600f60008681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506040518060a001604052808781526020018260200151815260200185815260200184815260200183815250600f60008781526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155905050505050505050565b6006546001600160a01b031633146123245760405162461bcd60e51b81526004016109d99061344b565b6001600160a01b0381166123895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d9565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061241a82610ebb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124cc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d9565b60006124d783610ebb565b9050806001600160a01b0316846001600160a01b031614806125125750836001600160a01b031661250784610964565b6001600160a01b0316145b8061254257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661255d82610ebb565b6001600160a01b0316146125c55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109d9565b6001600160a01b0382166126275760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d9565b6126326000826123e5565b6001600160a01b038316600090815260036020526040812080546001929061265b90849061365d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612689908490613612565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080600060105411801561270157506000601154115b801561270e575060105442105b61273b5760095461272090601861363e565b61272c90610e1061363e565b6127369042613612565b61273f565b6011545b9050600e604051806101e0016040528086815260200183815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200185151581525090806001815401808255809150506001900390600052602060002090600f0201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01556101a082015181600d01556101c082015181600e0160006101000a81548160ff02191690831515021790555050506001600e805490506128a5919061365d565b9150817f40430705fbc3d39595c4d8df283ba7e5e09c9b733586a206925e3d2af0a146d1856040516128d991815260200190565b60405180910390a25092915050565b610c9c828260405180602001604052806000815250612a42565b61290d84848461254a565b61291984848484612a75565b6119125760405162461bcd60e51b81526004016109d9906133f9565b6060600b80546108e1906136a0565b6060816129685750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612992578061297c816136db565b915061298b9050600a8361362a565b915061296c565b60008167ffffffffffffffff8111156129ad576129ad61374c565b6040519080825280601f01601f1916602001820160405280156129d7576020820181803683370190505b5090505b8415612542576129ec60018361365d565b91506129f9600a866136f6565b612a04906030613612565b60f81b818381518110612a1957612a19613736565b60200101906001600160f81b031916908160001a905350612a3b600a8661362a565b94506129db565b612a4c8383612b82565b612a596000848484612a75565b610b0f5760405162461bcd60e51b81526004016109d9906133f9565b60006001600160a01b0384163b15612b7757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ab9903390899088908890600401613311565b602060405180830381600087803b158015612ad357600080fd5b505af1925050508015612b03575060408051601f3d908101601f19168201909252612b009181019061306f565b60015b612b5d573d808015612b31576040519150601f19603f3d011682016040523d82523d6000602084013e612b36565b606091505b508051612b555760405162461bcd60e51b81526004016109d9906133f9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612542565b506001949350505050565b6001600160a01b038216612bd85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d9565b6000818152600260205260409020546001600160a01b031615612c3d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d9565b6001600160a01b0382166000908152600360205260408120805460019290612c66908490613612565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612cd0906136a0565b90600052602060002090601f016020900481019282612cf25760008555612d38565b82601f10612d0b57805160ff1916838001178555612d38565b82800160010185558215612d38579182015b82811115612d38578251825591602001919060010190612d1d565b50612d44929150612d48565b5090565b5b80821115612d445760008155600101612d49565b600067ffffffffffffffff831115612d7757612d7761374c565b612d8a601f8401601f19166020016135e1565b9050828152838383011115612d9e57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612dcc57600080fd5b919050565b600082601f830112612de257600080fd5b8135602067ffffffffffffffff821115612dfe57612dfe61374c565b8160051b612e0d8282016135e1565b838152828101908684018388018501891015612e2857600080fd5b600093505b85841015612e5257612e3e81612db5565b835260019390930192918401918401612e2d565b50979650505050505050565b80358015158114612dcc57600080fd5b600060208284031215612e8057600080fd5b611f5982612db5565b60008060408385031215612e9c57600080fd5b612ea583612db5565b9150612eb360208401612db5565b90509250929050565b600080600060608486031215612ed157600080fd5b612eda84612db5565b9250612ee860208501612db5565b9150604084013590509250925092565b60008060008060808587031215612f0e57600080fd5b612f1785612db5565b9350612f2560208601612db5565b925060408501359150606085013567ffffffffffffffff811115612f4857600080fd5b8501601f81018713612f5957600080fd5b612f6887823560208401612d5d565b91505092959194509250565b60008060408385031215612f8757600080fd5b612f9083612db5565b9150612eb360208401612e5e565b60008060408385031215612fb157600080fd5b612fba83612db5565b946020939093013593505050565b60008060408385031215612fdb57600080fd5b823567ffffffffffffffff811115612ff257600080fd5b612ffe85828601612dd1565b925050612eb360208401612e5e565b6000806040838503121561302057600080fd5b823567ffffffffffffffff81111561303757600080fd5b61304385828601612dd1565b95602094909401359450505050565b60006020828403121561306457600080fd5b8135611f5981613762565b60006020828403121561308157600080fd5b8151611f5981613762565b60006020828403121561309e57600080fd5b813567ffffffffffffffff8111156130b557600080fd5b8201601f810184136130c657600080fd5b61254284823560208401612d5d565b6000602082840312156130e757600080fd5b5035919050565b6000806040838503121561310157600080fd5b82359150612eb360208401612db5565b60008082840361020081121561312657600080fd5b833592506101e080601f198301121561313e57600080fd5b6131466135b7565b91506020850135825260408501356020830152606085013560408301526080850135606083015260a0850135608083015260c085013560a083015260e085013560c08301526101008086013560e084015261012080870135828501526101409150818701358185015250610160808701358285015261018091508187013581850152506101a080870135828501526101c091508187013581850152506131ed828701612e5e565b9083015250919491935090915050565b6000806040838503121561321057600080fd5b50508035926020909101359150565b600080600080600060a0868803121561323757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600080600080600060e0888a03121561327557600080fd5b87359650602088013595506040880135945060608801359350608088013592506132a160a08901612e5e565b915060c0880135905092959891949750929550565b600081518084526132ce816020860160208601613674565b601f01601f19169290920160200192915050565b600083516132f4818460208801613674565b835190830190613308818360208801613674565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613344908301846132b6565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b828110156133905781516001600160a01b03168452928401929084019060010161336b565b50505093151592019190915250919050565b6020808252825182820181905260009190848201906040850190845b818110156133da578351835292840192918401916001016133be565b50909695505050505050565b602081526000611f5960208301846132b6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526023908201527f4d6978566572736550617373636172643a20657863656564206d617820737570604082015262706c7960e81b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c0918201511515918101919091526101e00190565b6040516101e0810167ffffffffffffffff811182821017156135db576135db61374c565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561360a5761360a61374c565b604052919050565b600082198211156136255761362561370a565b500190565b60008261363957613639613720565b500490565b60008160001904831182151516156136585761365861370a565b500290565b60008282101561366f5761366f61370a565b500390565b60005b8381101561368f578181015183820152602001613677565b838111156119125750506000910152565b600181811c908216806136b457607f821691505b602082108114156136d557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136ef576136ef61370a565b5060010190565b60008261370557613705613720565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461377857600080fd5b5056fea2646970667358221220f2d3424c7e076e48b5391381afc0079927821faca8170f7bdda7ec95dec590c264736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000029687474703a2f2f6d697876657273652e636f6d2f6170692f5a325630546b5a553f746f6b656e49643d0000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102465760003560e01c80638eaef72711610139578063b88d4fde116100b6578063d540d7101161007a578063d540d710146107ae578063dea09912146107c4578063e985e9c5146107d7578063ebbeda7114610820578063f23e274314610840578063f2fde38b1461086057600080fd5b8063b88d4fde1461070d578063b891ae521461072d578063c075769914610743578063c34902631461077b578063c87b56dd1461078e57600080fd5b8063a22cb465116100fd578063a22cb46514610628578063ac8a584a14610648578063b2596a6714610668578063b260c42a146106da578063b6236f61146106ed57600080fd5b80638eaef727146105765780639188d3121461059657806395d89b41146105c35780639870d7fe146105d85780639b19251a146105f857600080fd5b80634506c9ec116101c75780636bfe377d1161018b5780636bfe377d146104e05780636e7413de146104f657806370a0823114610523578063715018a6146105435780638da5cb5b1461055857600080fd5b80634506c9ec1461043d578063499a04601461045357806355f804b31461047357806358053ac8146104935780636352211e146104c057600080fd5b806318160ddd1161020e57806318160ddd1461032c57806323b872dd1461034b5780633c271a051461036b5780633cba1af01461038b57806342842e0e1461041d57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806313e7c9d8146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004613052565b610880565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956108d2565b60405161027791906133e6565b3480156102ae57600080fd5b506102c26102bd3660046130d5565b610964565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612f9e565b6109fe565b005b34801561030857600080fd5b5061026b610317366004612e6e565b60076020526000908152604090205460ff1681565b34801561033857600080fd5b50600e545b604051908152602001610277565b34801561035757600080fd5b506102fa610366366004612ebc565b610b14565b34801561037757600080fd5b506102fa610386366004612fc8565b610b45565b34801561039757600080fd5b506103e66103a63660046130d5565b60136020526000908152604090208054600182015460028301546003840154600485015460058601546006909601549495939492939192909160ff169087565b6040805197885260208801969096529486019390935260608501919091526080840152151560a083015260c082015260e001610277565b34801561042957600080fd5b506102fa610438366004612ebc565b610c16565b34801561044957600080fd5b5061033d600a5481565b34801561045f57600080fd5b5061033d61046e3660046130d5565b610c31565b34801561047f57600080fd5b506102fa61048e36600461308c565b610c5f565b34801561049f57600080fd5b506104b36104ae36600461300d565b610ca0565b60405161027791906133a2565b3480156104cc57600080fd5b506102c26104db3660046130d5565b610ebb565b3480156104ec57600080fd5b5061033d60105481565b34801561050257600080fd5b5061033d6105113660046130d5565b600c6020526000908152604090205481565b34801561052f57600080fd5b5061033d61053e366004612e6e565b610f32565b34801561054f57600080fd5b506102fa610fb9565b34801561056457600080fd5b506006546001600160a01b03166102c2565b34801561058257600080fd5b506102fa610591366004613111565b61102d565b3480156105a257600080fd5b506105b66105b13660046130d5565b611351565b6040516102779190613514565b3480156105cf57600080fd5b506102956114a1565b3480156105e457600080fd5b506102fa6105f3366004612e6e565b6114b0565b34801561060457600080fd5b5061026b610613366004612e6e565b60126020526000908152604090205460ff1681565b34801561063457600080fd5b506102fa610643366004612f74565b6114fe565b34801561065457600080fd5b506102fa610663366004612e6e565b6115c3565b34801561067457600080fd5b506106b26106833660046130d5565b600f60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610277565b6102fa6106e83660046130d5565b61160e565b3480156106f957600080fd5b506102fa6107083660046131fd565b611851565b34801561071957600080fd5b506102fa610728366004612ef8565b6118e0565b34801561073957600080fd5b5061033d60115481565b34801561074f57600080fd5b5061033d61075e3660046130ee565b600d60209081526000928352604080842090915290825290205481565b6104b36107893660046131fd565b611918565b34801561079a57600080fd5b506102956107a93660046130d5565b611e85565b3480156107ba57600080fd5b5061033d60095481565b6102fa6107d23660046130d5565b611f60565b3480156107e357600080fd5b5061026b6107f2366004612e89565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082c57600080fd5b506102fa61083b36600461325a565b6120dd565b34801561084c57600080fd5b506102fa61085b36600461321f565b612201565b34801561086c57600080fd5b506102fa61087b366004612e6e565b6122fa565b60006001600160e01b031982166380ac58cd60e01b14806108b157506001600160e01b03198216635b5e139f60e01b145b806108cc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546108e1906136a0565b80601f016020809104026020016040519081016040528092919081815260200182805461090d906136a0565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a0982610ebb565b9050806001600160a01b0316836001600160a01b03161415610a775760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d9565b336001600160a01b0382161480610a935750610a9381336107f2565b610b055760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109d9565b610b0f83836123e5565b505050565b610b1e3382612453565b610b3a5760405162461bcd60e51b81526004016109d990613480565b610b0f83838361254a565b6006546001600160a01b03163314610b6f5760405162461bcd60e51b81526004016109d99061344b565b815160005b81811015610bd7578260126000868481518110610b9357610b93613736565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610bcf816136db565b915050610b74565b507f892667037517ef24182a08aadbfe08b3fc63a1aa644256c97b6b478007339c5c8383604051610c0992919061334e565b60405180910390a1505050565b610b0f838383604051806020016040528060008152506118e0565b6000600e8281548110610c4657610c46613736565b90600052602060002090600f0201600001549050919050565b6006546001600160a01b03163314610c895760405162461bcd60e51b81526004016109d99061344b565b8051610c9c90600b906020840190612cc4565b5050565b606060026008541415610cf55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109d9565b60026008553360009081526007602052604090205460ff16610d595760405162461bcd60e51b815260206004820152601d60248201527f5065726d697373696f6e47726f75703a206e6f74206f70657261746f7200000060448201526064016109d9565b82516000838152600f6020908152604091829020825160a081018452815480825260018301549382018490526002830154948201949094526003820154606082015260049091015460808201529190610db3908490613612565b1115610dd15760405162461bcd60e51b81526004016109d9906134d1565b60008267ffffffffffffffff811115610dec57610dec61374c565b604051908082528060200260200182016040528015610e15578160200160208202803683370190505b50905060005b83811015610e86576000610e308760016126ea565b9050610e55888381518110610e4757610e47613736565b6020026020010151826128e8565b80838381518110610e6857610e68613736565b60209081029190910101525080610e7e816136db565b915050610e1b565b506000858152600f602052604081206001018054859290610ea8908490613612565b9091555050600160085595945050505050565b6000818152600260205260408120546001600160a01b0316806108cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109d9565b60006001600160a01b038216610f9d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109d9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610fe35760405162461bcd60e51b81526004016109d99061344b565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b3360009081526007602052604090205460ff1661108c5760405162461bcd60e51b815260206004820152601d60248201527f5065726d697373696f6e47726f75703a206e6f74206f70657261746f7200000060448201526064016109d9565b6000600e83815481106110a1576110a1613736565b6000918252602091829020604080516101e081018252600f90930290910180548084526001820154948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a810154610140830152600b810154610160830152600c810154610180830152600d8101546101a0830152600e015460ff1615156101c082015291506111ad5760405162461bcd60e51b815260206004820181905260248201527f4d6978566572736550617373636172643a2063617264206e6f7420657869737460448201526064016109d9565b81600e84815481106111c1576111c1613736565b60009182526020918290208351600f929092020190815590820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820155610140820151600a820155610160820151600b820155610180820151600c8201556101a0820151600d8201556101c090910151600e918201805460ff1916911515919091179055815181549091908590811061129157611291613736565b90600052602060002090600f0201600001819055508060200151600e84815481106112be576112be613736565b90600052602060002090600f020160010181905550806101c00151600e84815481106112ec576112ec613736565b90600052602060002090600f0201600e0160006101000a81548160ff021916908315150217905550827fb0aced443ea1d69e576a3275eeb0de7a48b4acb25f80f0eaefbbce786f75e067836040516113449190613514565b60405180910390a2505050565b6113cc604051806101e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b600e82815481106113df576113df613736565b6000918252602091829020604080516101e081018252600f909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c820154610180820152600d8201546101a0820152600e9091015460ff1615156101c082015292915050565b6060600180546108e1906136a0565b6006546001600160a01b031633146114da5760405162461bcd60e51b81526004016109d99061344b565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6001600160a01b0382163314156115575760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146115ed5760405162461bcd60e51b81526004016109d99061344b565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000600e828154811061162357611623613736565b6000918252602091829020604080516101e081018252600f909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c820154610180820152600d8201546101a0820152600e9091015460ff1615156101c082018190529091506117305760405162461bcd60e51b815260206004820152601b60248201527f4d6978566572736550617373636172643a20616374697661746564000000000060448201526064016109d9565b80516000908152600f60209081526040808320815160a08101835281548152600182015493810193909352600281015491830182905260038101546060840152600401546080830152909161178d6006546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d80600081146117d7576040519150601f19603f3d011682016040523d82523d6000602084013e6117dc565b606091505b50509050806117ea57600080fd5b6000600e86815481106117ff576117ff613736565b600091825260208220600f9190910201600e01805460ff19169215159290921790915560405186917f792b00c411e4e036dc5f20b09970e2e969ec1bf6edf39b90e5b0849490aac7a591a25050505050565b6006546001600160a01b0316331461187b5760405162461bcd60e51b81526004016109d99061344b565b428111801561188957508181115b6118d55760405162461bcd60e51b815260206004820152601e60248201527f4d6978566572736550617373636172643a20696e76616c69642074696d65000060448201526064016109d9565b601091909155601155565b6118ea3383612453565b6119065760405162461bcd60e51b81526004016109d990613480565b61191284848484612902565b50505050565b60606002600854141561196d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109d9565b6002600855600a548211156119dd5760405162461bcd60e51b815260206004820152603060248201527f4d6978566572736550617373636172643a206578636565642073696e676c652060448201526f1b5a5b9d081d5c1c195c881b1a5b5a5d60821b60648201526084016109d9565b6000838152600f6020908152604091829020825160a081018452815480825260018301549382018490526002830154948201949094526003820154606082015260049091015460808201529190611a35908590613612565b1115611a535760405162461bcd60e51b81526004016109d9906134d1565b600084815260136020908152604091829020825160e0810184528154815260018201549281019290925260028101549282018390526003810154606083015260048101546080830152600581015460ff16151560a08301526006015460c082015290421015611b045760405162461bcd60e51b815260206004820181905260248201527f4d6978566572736550617373636172643a206d696e74206e6f7420737461727460448201526064016109d9565b8060600151421115611b585760405162461bcd60e51b815260206004820152601c60248201527f4d6978566572736550617373636172643a206d696e7420656e6465640000000060448201526064016109d9565b80516020820151611b6a908690613612565b1115611bcb5760405162461bcd60e51b815260206004820152602a60248201527f4d6978566572736550617373636172643a2065786365656420706572696f64206044820152696d617820737570706c7960b01b60648201526084016109d9565b60808101513360009081526012602052604090205460ff16808015611bf05750856001145b80611bf9575080155b611c585760405162461bcd60e51b815260206004820152602a60248201527f4d6978566572736550617373636172643a20696e76616c69642077686974656c6044820152691a5cdd08185b5bdd5b9d60b21b60648201526084016109d9565b8260a001511580611c7257508260a001518015611c725750805b611cc95760405162461bcd60e51b815260206004820152602260248201527f4d6978566572736550617373636172643a206e6f7420696e2077686974656c696044820152611cdd60f21b60648201526084016109d9565b6000611cd5878461363e565b9050818015611ce8575060008460c00151115b15611d0c5760648460c0015184611cff919061363e565b611d09919061362a565b90505b60008767ffffffffffffffff811115611d2757611d2761374c565b604051908082528060200260200182016040528015611d50578160200160208202803683370190505b50905060005b88811015611da8576000611d6b8b87156126ea565b9050611d7733826128e8565b80838381518110611d8a57611d8a613736565b60209081029190910101525080611da0816136db565b915050611d56565b506000898152600f6020526040812060010180548a9290611dca908490613612565b9091555050600089815260136020526040812060010180548a9290611df0908490613612565b90915550506006546040516000916001600160a01b03169084908381818185875af1925050503d8060008114611e42576040519150601f19603f3d011682016040523d82523d6000602084013e611e47565b606091505b5050905080611e5557600080fd5b8315611e7357336000908152601260205260409020805460ff191690555b50600160085598975050505050505050565b6000818152600260205260409020546060906001600160a01b0316611f045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d9565b6000611f0e612935565b90506000815111611f2e5760405180602001604052806000815250611f59565b80611f3884612944565b604051602001611f499291906132e2565b6040516020818303038152906040525b9392505050565b6000600e8281548110611f7557611f75613736565b60009182526020808320600f9283020154808452919052604082206004810154600390910154600e80549395509193909290919086908110611fb957611fb9613736565b90600052602060002090600f0201600101549050804211611fda5780611fdc565b425b9050611fe983601861363e565b611ff590610e1061363e565b611fff9082613612565b905060006120156006546001600160a01b031690565b6001600160a01b03168360405160006040518083038185875af1925050503d806000811461205f576040519150601f19603f3d011682016040523d82523d6000602084013e612064565b606091505b505090508061207257600080fd5b81600e878154811061208657612086613736565b90600052602060002090600f020160010181905550857f1e273426ac0d5def76ed5188efa1e24d5e8017eaeea324e65888bc13c1886a5a836040516120cd91815260200190565b60405180910390a2505050505050565b6006546001600160a01b031633146121075760405162461bcd60e51b81526004016109d99061344b565b60008781526013602052604090206003015442101561217f5760405162461bcd60e51b815260206004820152602e60248201527f4d6978566572736550617373636172643a206c617374206d696e74207065726960448201526d37b2103737ba103334b734b9b41760911b60648201526084016109d9565b6040805160e0810182529687526000602080890182815289840198895260608a0197885260808a0196875294151560a08a0190815260c08a01948552998252601390522095518655905160018601559251600285015590516003840155516004830155915160058201805460ff19169115159190911790559051600690910155565b6006546001600160a01b0316331461222b5760405162461bcd60e51b81526004016109d99061344b565b6000600f60008681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506040518060a001604052808781526020018260200151815260200185815260200184815260200183815250600f60008781526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155905050505050505050565b6006546001600160a01b031633146123245760405162461bcd60e51b81526004016109d99061344b565b6001600160a01b0381166123895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d9565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061241a82610ebb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124cc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d9565b60006124d783610ebb565b9050806001600160a01b0316846001600160a01b031614806125125750836001600160a01b031661250784610964565b6001600160a01b0316145b8061254257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661255d82610ebb565b6001600160a01b0316146125c55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109d9565b6001600160a01b0382166126275760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d9565b6126326000826123e5565b6001600160a01b038316600090815260036020526040812080546001929061265b90849061365d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612689908490613612565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080600060105411801561270157506000601154115b801561270e575060105442105b61273b5760095461272090601861363e565b61272c90610e1061363e565b6127369042613612565b61273f565b6011545b9050600e604051806101e0016040528086815260200183815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200185151581525090806001815401808255809150506001900390600052602060002090600f0201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01556101a082015181600d01556101c082015181600e0160006101000a81548160ff02191690831515021790555050506001600e805490506128a5919061365d565b9150817f40430705fbc3d39595c4d8df283ba7e5e09c9b733586a206925e3d2af0a146d1856040516128d991815260200190565b60405180910390a25092915050565b610c9c828260405180602001604052806000815250612a42565b61290d84848461254a565b61291984848484612a75565b6119125760405162461bcd60e51b81526004016109d9906133f9565b6060600b80546108e1906136a0565b6060816129685750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612992578061297c816136db565b915061298b9050600a8361362a565b915061296c565b60008167ffffffffffffffff8111156129ad576129ad61374c565b6040519080825280601f01601f1916602001820160405280156129d7576020820181803683370190505b5090505b8415612542576129ec60018361365d565b91506129f9600a866136f6565b612a04906030613612565b60f81b818381518110612a1957612a19613736565b60200101906001600160f81b031916908160001a905350612a3b600a8661362a565b94506129db565b612a4c8383612b82565b612a596000848484612a75565b610b0f5760405162461bcd60e51b81526004016109d9906133f9565b60006001600160a01b0384163b15612b7757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ab9903390899088908890600401613311565b602060405180830381600087803b158015612ad357600080fd5b505af1925050508015612b03575060408051601f3d908101601f19168201909252612b009181019061306f565b60015b612b5d573d808015612b31576040519150601f19603f3d011682016040523d82523d6000602084013e612b36565b606091505b508051612b555760405162461bcd60e51b81526004016109d9906133f9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612542565b506001949350505050565b6001600160a01b038216612bd85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d9565b6000818152600260205260409020546001600160a01b031615612c3d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d9565b6001600160a01b0382166000908152600360205260408120805460019290612c66908490613612565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612cd0906136a0565b90600052602060002090601f016020900481019282612cf25760008555612d38565b82601f10612d0b57805160ff1916838001178555612d38565b82800160010185558215612d38579182015b82811115612d38578251825591602001919060010190612d1d565b50612d44929150612d48565b5090565b5b80821115612d445760008155600101612d49565b600067ffffffffffffffff831115612d7757612d7761374c565b612d8a601f8401601f19166020016135e1565b9050828152838383011115612d9e57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612dcc57600080fd5b919050565b600082601f830112612de257600080fd5b8135602067ffffffffffffffff821115612dfe57612dfe61374c565b8160051b612e0d8282016135e1565b838152828101908684018388018501891015612e2857600080fd5b600093505b85841015612e5257612e3e81612db5565b835260019390930192918401918401612e2d565b50979650505050505050565b80358015158114612dcc57600080fd5b600060208284031215612e8057600080fd5b611f5982612db5565b60008060408385031215612e9c57600080fd5b612ea583612db5565b9150612eb360208401612db5565b90509250929050565b600080600060608486031215612ed157600080fd5b612eda84612db5565b9250612ee860208501612db5565b9150604084013590509250925092565b60008060008060808587031215612f0e57600080fd5b612f1785612db5565b9350612f2560208601612db5565b925060408501359150606085013567ffffffffffffffff811115612f4857600080fd5b8501601f81018713612f5957600080fd5b612f6887823560208401612d5d565b91505092959194509250565b60008060408385031215612f8757600080fd5b612f9083612db5565b9150612eb360208401612e5e565b60008060408385031215612fb157600080fd5b612fba83612db5565b946020939093013593505050565b60008060408385031215612fdb57600080fd5b823567ffffffffffffffff811115612ff257600080fd5b612ffe85828601612dd1565b925050612eb360208401612e5e565b6000806040838503121561302057600080fd5b823567ffffffffffffffff81111561303757600080fd5b61304385828601612dd1565b95602094909401359450505050565b60006020828403121561306457600080fd5b8135611f5981613762565b60006020828403121561308157600080fd5b8151611f5981613762565b60006020828403121561309e57600080fd5b813567ffffffffffffffff8111156130b557600080fd5b8201601f810184136130c657600080fd5b61254284823560208401612d5d565b6000602082840312156130e757600080fd5b5035919050565b6000806040838503121561310157600080fd5b82359150612eb360208401612db5565b60008082840361020081121561312657600080fd5b833592506101e080601f198301121561313e57600080fd5b6131466135b7565b91506020850135825260408501356020830152606085013560408301526080850135606083015260a0850135608083015260c085013560a083015260e085013560c08301526101008086013560e084015261012080870135828501526101409150818701358185015250610160808701358285015261018091508187013581850152506101a080870135828501526101c091508187013581850152506131ed828701612e5e565b9083015250919491935090915050565b6000806040838503121561321057600080fd5b50508035926020909101359150565b600080600080600060a0868803121561323757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600080600080600060e0888a03121561327557600080fd5b87359650602088013595506040880135945060608801359350608088013592506132a160a08901612e5e565b915060c0880135905092959891949750929550565b600081518084526132ce816020860160208601613674565b601f01601f19169290920160200192915050565b600083516132f4818460208801613674565b835190830190613308818360208801613674565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613344908301846132b6565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b828110156133905781516001600160a01b03168452928401929084019060010161336b565b50505093151592019190915250919050565b6020808252825182820181905260009190848201906040850190845b818110156133da578351835292840192918401916001016133be565b50909695505050505050565b602081526000611f5960208301846132b6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526023908201527f4d6978566572736550617373636172643a20657863656564206d617820737570604082015262706c7960e81b606082015260800190565b815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c0918201511515918101919091526101e00190565b6040516101e0810167ffffffffffffffff811182821017156135db576135db61374c565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561360a5761360a61374c565b604052919050565b600082198211156136255761362561370a565b500190565b60008261363957613639613720565b500490565b60008160001904831182151516156136585761365861370a565b500290565b60008282101561366f5761366f61370a565b500390565b60005b8381101561368f578181015183820152602001613677565b838111156119125750506000910152565b600181811c908216806136b457607f821691505b602082108114156136d557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136ef576136ef61370a565b5060010190565b60008261370557613705613720565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461377857600080fd5b5056fea2646970667358221220f2d3424c7e076e48b5391381afc0079927821faca8170f7bdda7ec95dec590c264736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000029687474703a2f2f6d697876657273652e636f6d2f6170692f5a325630546b5a553f746f6b656e49643d0000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): http://mixverse.com/api/Z2V0TkZU?tokenId=
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [2] : 687474703a2f2f6d697876657273652e636f6d2f6170692f5a325630546b5a55
Arg [3] : 3f746f6b656e49643d0000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
57045:7544:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39262:292;;;;;;;;;;-1:-1:-1;39262:292:0;;;;;:::i;:::-;;:::i;:::-;;;11854:14:1;;11847:22;11829:41;;11817:2;11802:18;39262:292:0;;;;;;;;40194:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41661:221::-;;;;;;;;;;-1:-1:-1;41661:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9769:32:1;;;9751:51;;9739:2;9724:18;41661:221:0;9605:203:1;41191:404:0;;;;;;;;;;-1:-1:-1;41191:404:0;;;;;:::i;:::-;;:::i;:::-;;51220:41;;;;;;;;;;-1:-1:-1;51220:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;64390:91;;;;;;;;;;-1:-1:-1;64460:6:0;:13;64390:91;;;24927:25:1;;;24915:2;24900:18;64390:91:0;24781:177:1;42551:305:0;;;;;;;;;;-1:-1:-1;42551:305:0;;;;;:::i;:::-;;:::i;59897:298::-;;;;;;;;;;-1:-1:-1;59897:298:0;;;;;:::i;:::-;;:::i;57937:42::-;;;;;;;;;;-1:-1:-1;57937:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25740:25:1;;;25796:2;25781:18;;25774:34;;;;25824:18;;;25817:34;;;;25882:2;25867:18;;25860:34;;;;25925:3;25910:19;;25903:35;25982:14;25975:22;25969:3;25954:19;;25947:51;26029:3;26014:19;;26007:35;25727:3;25712:19;57937:42:0;25431:617:1;42927:151:0;;;;;;;;;;-1:-1:-1;42927:151:0;;;;;:::i;:::-;;:::i;57275:30::-;;;;;;;;;;;;;;;;64263:119;;;;;;;;;;-1:-1:-1;64263:119:0;;;;;:::i;:::-;;:::i;58319:95::-;;;;;;;;;;-1:-1:-1;58319:95:0;;;;;:::i;:::-;;:::i;61996:618::-;;;;;;;;;;-1:-1:-1;61996:618:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39888:239::-;;;;;;;;;;-1:-1:-1;39888:239:0;;;;;:::i;:::-;;:::i;57619:25::-;;;;;;;;;;;;;;;;57340:40;;;;;;;;;;-1:-1:-1;57340:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;39618:208;;;;;;;;;;-1:-1:-1;39618:208:0;;;;;:::i;:::-;;:::i;30413:148::-;;;;;;;;;;;;;:::i;29762:87::-;;;;;;;;;;-1:-1:-1;29835:6:0;;-1:-1:-1;;;;;29835:6:0;29762:87;;58770:430;;;;;;;;;;-1:-1:-1;58770:430:0;;;;;:::i;:::-;;:::i;64134:121::-;;;;;;;;;;-1:-1:-1;64134:121:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40363:104::-;;;;;;;;;;;;;:::i;51459:103::-;;;;;;;;;;-1:-1:-1;51459:103:0;;;;;:::i;:::-;;:::i;57689:41::-;;;;;;;;;;-1:-1:-1;57689:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41954:295;;;;;;;;;;-1:-1:-1;41954:295:0;;;;;:::i;:::-;;:::i;51634:107::-;;;;;;;;;;-1:-1:-1;51634:107:0;;;;;:::i;:::-;;:::i;57490:36::-;;;;;;;;;;-1:-1:-1;57490:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25222:25:1;;;25278:2;25263:18;;25256:34;;;;25306:18;;;25299:34;;;;25364:2;25349:18;;25342:34;25407:3;25392:19;;25385:35;25209:3;25194:19;57490:36:0;24963:463:1;63215:431:0;;;;;;:::i;:::-;;:::i;59588:301::-;;;;;;;;;;-1:-1:-1;59588:301:0;;;;;:::i;:::-;;:::i;43149:285::-;;;;;;;;;;-1:-1:-1;43149:285:0;;;;;:::i;:::-;;:::i;57651:29::-;;;;;;;;;;;;;;;;57387:64;;;;;;;;;;-1:-1:-1;57387:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;60252:1736;;;;;;:::i;:::-;;:::i;40538:360::-;;;;;;;;;;-1:-1:-1;40538:360:0;;;;;:::i;:::-;;:::i;57234:34::-;;;;;;;;;;;;;;;;62622:585;;;;;;:::i;:::-;;:::i;42320:164::-;;;;;;;;;;-1:-1:-1;42320:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42441:25:0;;;42417:4;42441:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42320:164;59208:372;;;;;;;;;;-1:-1:-1;59208:372:0;;;;;:::i;:::-;;:::i;58422:340::-;;;;;;;;;;-1:-1:-1;58422:340:0;;;;;:::i;:::-;;:::i;30716:244::-;;;;;;;;;;-1:-1:-1;30716:244:0;;;;;:::i;:::-;;:::i;39262:292::-;39364:4;-1:-1:-1;;;;;;39388:40:0;;-1:-1:-1;;;39388:40:0;;:105;;-1:-1:-1;;;;;;;39445:48:0;;-1:-1:-1;;;39445:48:0;39388:105;:158;;;-1:-1:-1;;;;;;;;;;28672:40:0;;;39510:36;39381:165;39262:292;-1:-1:-1;;39262:292:0:o;40194:100::-;40248:13;40281:5;40274:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40194:100;:::o;41661:221::-;41737:7;44990:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44990:16:0;41757:73;;;;-1:-1:-1;;;41757:73:0;;19292:2:1;41757:73:0;;;19274:21:1;19331:2;19311:18;;;19304:30;19370:34;19350:18;;;19343:62;-1:-1:-1;;;19421:18:1;;;19414:42;19473:19;;41757:73:0;;;;;;;;;-1:-1:-1;41850:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41850:24:0;;41661:221::o;41191:404::-;41272:13;41288:23;41303:7;41288:14;:23::i;:::-;41272:39;;41336:5;-1:-1:-1;;;;;41330:11:0;:2;-1:-1:-1;;;;;41330:11:0;;;41322:57;;;;-1:-1:-1;;;41322:57:0;;21250:2:1;41322:57:0;;;21232:21:1;21289:2;21269:18;;;21262:30;21328:34;21308:18;;;21301:62;-1:-1:-1;;;21379:18:1;;;21372:31;21420:19;;41322:57:0;21048:397:1;41322:57:0;26793:10;-1:-1:-1;;;;;41400:21:0;;;;:69;;-1:-1:-1;41425:44:0;41449:5;26793:10;42320:164;:::i;41425:44::-;41392:161;;;;-1:-1:-1;;;41392:161:0;;16909:2:1;41392:161:0;;;16891:21:1;16948:2;16928:18;;;16921:30;16987:34;16967:18;;;16960:62;17058:26;17038:18;;;17031:54;17102:19;;41392:161:0;16707:420:1;41392:161:0;41566:21;41575:2;41579:7;41566:8;:21::i;:::-;41261:334;41191:404;;:::o;42551:305::-;42712:41;26793:10;42745:7;42712:18;:41::i;:::-;42704:103;;;;-1:-1:-1;;;42704:103:0;;;;;;;:::i;:::-;42820:28;42830:4;42836:2;42840:7;42820:9;:28::i;59897:298::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;60006:16;;59995:8:::1;60033:95;60054:3;60050:1;:7;60033:95;;;60105:11;60079:9;:23;60089:9;60099:1;60089:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;60079:23:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;60079:23:0;:37;;-1:-1:-1;;60079:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60059:3;::::1;::::0;::::1;:::i;:::-;;;;60033:95;;;;60143:44;60164:9;60175:11;60143:44;;;;;;;:::i;:::-;;;;;;;;59984:211;59897:298:::0;;:::o;42927:151::-;43031:39;43048:4;43054:2;43058:7;43031:39;;;;;;;;;;;;:16;:39::i;64263:119::-;64330:4;64354:6;64361;64354:14;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;64347:27;;64263:119;;;:::o;58319:95::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;58392:14;;::::1;::::0;:4:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58319:95:::0;:::o;61996:618::-;62097:13;53426:1;54023:7;;:19;;54015:63;;;;-1:-1:-1;;;54015:63:0;;23302:2:1;54015:63:0;;;23284:21:1;23341:2;23321:18;;;23314:30;23380:33;23360:18;;;23353:61;23431:18;;54015:63:0;23100:355:1;54015:63:0;53426:1;54156:7;:18;51323:10:::1;51313:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;51305:63;;;::::0;-1:-1:-1;;;51305:63:0;;20892:2:1;51305:63:0::1;::::0;::::1;20874:21:1::0;20931:2;20911:18;;;20904:30;20970:31;20950:18;;;20943:59;21019:18;;51305:63:0::1;20690:353:1::0;51305:63:0::1;62134:16:::0;;62123:8:::2;62185:13:::0;;;:6:::2;:13;::::0;;;;;;;;62163:35;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;;;;;;;62217:19:::2;::::0;62134:16;;62217:19:::2;:::i;:::-;:39;;62209:87;;;;-1:-1:-1::0;;;62209:87:0::2;;;;;;;:::i;:::-;62309:22;62345:3;62334:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;62334:15:0::2;;62309:40;;62367:6;62362:177;62383:3;62379:1;:7;62362:177;;;62408:11;62422:24;62434:5;62441:4;62422:11;:24::i;:::-;62408:38;;62461:31;62471:9;62481:1;62471:12;;;;;;;;:::i;:::-;;;;;;;62485:6;62461:9;:31::i;:::-;62521:6;62507:8;62516:1;62507:11;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;:20;-1:-1:-1;62388:3:0;::::2;::::0;::::2;:::i;:::-;;;;62362:177;;;-1:-1:-1::0;62551:13:0::2;::::0;;;:6:::2;:13;::::0;;;;:20:::2;;:27:::0;;62575:3;;62551:13;:27:::2;::::0;62575:3;;62551:27:::2;:::i;:::-;::::0;;;-1:-1:-1;;53382:1:0;54335:7;:22;62598:8;61996:618;-1:-1:-1;;;;;61996:618:0:o;39888:239::-;39960:7;39996:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39996:16:0;40031:19;40023:73;;;;-1:-1:-1;;;40023:73:0;;18160:2:1;40023:73:0;;;18142:21:1;18199:2;18179:18;;;18172:30;18238:34;18218:18;;;18211:62;-1:-1:-1;;;18289:18:1;;;18282:39;18338:19;;40023:73:0;17958:405:1;39618:208:0;39690:7;-1:-1:-1;;;;;39718:19:0;;39710:74;;;;-1:-1:-1;;;39710:74:0;;17334:2:1;39710:74:0;;;17316:21:1;17373:2;17353:18;;;17346:30;17412:34;17392:18;;;17385:62;-1:-1:-1;;;17463:18:1;;;17456:40;17513:19;;39710:74:0;17132:406:1;39710:74:0;-1:-1:-1;;;;;;39802:16:0;;;;;:9;:16;;;;;;;39618:208::o;30413:148::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;30504:6:::1;::::0;30483:40:::1;::::0;30520:1:::1;::::0;-1:-1:-1;;;;;30504:6:0::1;::::0;30483:40:::1;::::0;30520:1;;30483:40:::1;30534:6;:19:::0;;-1:-1:-1;;;;;;30534:19:0::1;::::0;;30413:148::o;58770:430::-;51323:10;51313:21;;;;:9;:21;;;;;;;;51305:63;;;;-1:-1:-1;;;51305:63:0;;20892:2:1;51305:63:0;;;20874:21:1;20931:2;20911:18;;;20904:30;20970:31;20950:18;;;20943:59;21019:18;;51305:63:0;20690:353:1;51305:63:0;58859:20:::1;58882:6;58889;58882:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;58859:37:::1;::::0;;::::1;::::0;::::1;::::0;;58882:14:::1;::::0;;::::1;::::0;;::::1;58859:37:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;::::1;;;;::::0;;;;;-1:-1:-1;58907:59:0::1;;;::::0;-1:-1:-1;;;58907:59:0;;12726:2:1;58907:59:0::1;::::0;::::1;12708:21:1::0;;;12745:18;;;12738:30;12804:34;12784:18;;;12777:62;12856:18;;58907:59:0::1;12524:356:1::0;58907:59:0::1;58996:5;58979:6;58986;58979:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;:22;;:14:::1;::::0;;;::::1;;:22:::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;58979:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59035:10;;59012:14;;59035:10;;58979:22;59019:6;;59012:14;::::1;;;;;:::i;:::-;;;;;;;;;;;:20;;:33;;;;59084:4;:15;;;59056:6;59063;59056:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:43;;;;59134:4;:11;;;59110:6;59117;59110:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;:35;;;;;;;;;;;;;;;;;;59178:6;59161:31;59186:5;59161:31;;;;;;:::i;:::-;;;;;;;;58848:352;58770:430:::0;;:::o;64134:121::-;64197:15;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64197:15:0;64232:6;64239:7;64232:15;;;;;;;;:::i;:::-;;;;;;;;;;64225:22;;;;;;;;64232:15;;;;;;;64225:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64134:121;-1:-1:-1;;64134:121:0:o;40363:104::-;40419:13;40452:7;40445:14;;;;;:::i;51459:103::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51528:19:0::1;;::::0;;;:9:::1;:19;::::0;;;;:26;;-1:-1:-1;;51528:26:0::1;51550:4;51528:26;::::0;;51459:103::o;41954:295::-;-1:-1:-1;;;;;42057:24:0;;26793:10;42057:24;;42049:62;;;;-1:-1:-1;;;42049:62:0;;14613:2:1;42049:62:0;;;14595:21:1;14652:2;14632:18;;;14625:30;14691:27;14671:18;;;14664:55;14736:18;;42049:62:0;14411:349:1;42049:62:0;26793:10;42124:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42124:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42124:53:0;;;;;;;;;;42193:48;;11829:41:1;;;42124:42:0;;26793:10;42193:48;;11802:18:1;42193:48:0;;;;;;;41954:295;;:::o;51634:107::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51706:19:0::1;51728:5;51706:19:::0;;;:9:::1;:19;::::0;;;;:27;;-1:-1:-1;;51706:27:0::1;::::0;;51634:107::o;63215:431::-;63274:20;63297:6;63304;63297:14;;;;;;;;:::i;:::-;;;;;;;;;;63274:37;;;;;;;;63297:14;;;;;;;63274:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63322:51:0;;;;-1:-1:-1;;;63322:51:0;;16553:2:1;63322:51:0;;;16535:21:1;16592:2;16572:18;;;16565:30;16631:29;16611:18;;;16604:57;16678:18;;63322:51:0;16351:351:1;63322:51:0;63414:10;;63386:18;63407;;;:6;:18;;;;;;;;63386:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63497:7;29835:6;;-1:-1:-1;;;;;29835:6:0;;29762:87;63497:7;-1:-1:-1;;;;;63497:12:0;63517:3;63497:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63477:48;;;63544:9;63536:18;;;;;;63591:5;63567:6;63574;63567:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;;:29;;-1:-1:-1;;63567:29:0;;;;;;;;;;;63614:24;;63631:6;;63614:24;;;63263:383;;;;63215:431;:::o;59588:301::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;59720:15:::1;59702;:33;:66;;;;;59757:11;59739:15;:29;59702:66;59694:109;;;::::0;-1:-1:-1;;;59694:109:0;;15783:2:1;59694:109:0::1;::::0;::::1;15765:21:1::0;15822:2;15802:18;;;15795:30;15861:32;15841:18;;;15834:60;15911:18;;59694:109:0::1;15581:354:1::0;59694:109:0::1;59814:10;:24:::0;;;;59849:14:::1;:32:::0;59588:301::o;43149:285::-;43281:41;26793:10;43314:7;43281:18;:41::i;:::-;43273:103;;;;-1:-1:-1;;;43273:103:0;;;;;;;:::i;:::-;43387:39;43401:4;43407:2;43411:7;43420:5;43387:13;:39::i;:::-;43149:285;;;;:::o;60252:1736::-;60340:13;53426:1;54023:7;;:19;;54015:63;;;;-1:-1:-1;;;54015:63:0;;23302:2:1;54015:63:0;;;23284:21:1;23341:2;23321:18;;;23314:30;23380:33;23360:18;;;23353:61;23431:18;;54015:63:0;23100:355:1;54015:63:0;53426:1;54156:7;:18;60384:14:::1;::::0;60374:24;::::1;;60366:85;;;::::0;-1:-1:-1;;;60366:85:0;;21652:2:1;60366:85:0::1;::::0;::::1;21634:21:1::0;21691:2;21671:18;;;21664:30;21730:34;21710:18;;;21703:62;-1:-1:-1;;;21781:18:1;;;21774:46;21837:19;;60366:85:0::1;21450:412:1::0;60366:85:0::1;60464:19;60486:13:::0;;;:6:::1;:13;::::0;;;;;;;;60464:35;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;60518:22:::1;::::0;60534:6;;60518:22:::1;:::i;:::-;:42;;60510:90;;;;-1:-1:-1::0;;;60510:90:0::1;;;;;;;:::i;:::-;60613:21;60637:18:::0;;;:11:::1;:18;::::0;;;;;;;;60613:42;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;::::1;;::::0;;;;;;60674:15:::1;:32;;60666:77;;;::::0;-1:-1:-1;;;60666:77:0;;18570:2:1;60666:77:0::1;::::0;::::1;18552:21:1::0;;;18589:18;;;18582:30;18648:34;18628:18;;;18621:62;18700:18;;60666:77:0::1;18368:356:1::0;60666:77:0::1;60781:7;:11;;;60762:15;:30;;60754:71;;;::::0;-1:-1:-1;;;60754:71:0;;13851:2:1;60754:71:0::1;::::0;::::1;13833:21:1::0;13890:2;13870:18;;;13863:30;13929;13909:18;;;13902:58;13977:18;;60754:71:0::1;13649:352:1::0;60754:71:0::1;60871:17:::0;;60844:14:::1;::::0;::::1;::::0;:23:::1;::::0;60861:6;;60844:23:::1;:::i;:::-;:44;;60836:99;;;::::0;-1:-1:-1;;;60836:99:0;;16142:2:1;60836:99:0::1;::::0;::::1;16124:21:1::0;16181:2;16161:18;;;16154:30;16220:34;16200:18;;;16193:62;-1:-1:-1;;;16271:18:1;;;16264:40;16321:19;;60836:99:0::1;15940:406:1::0;60836:99:0::1;60961:13;::::0;::::1;::::0;61016:10:::1;60948;61006:21:::0;;;:9:::1;:21;::::0;;;;;::::1;;::::0;61047:26;::::1;;;;61062:6;61072:1;61062:11;61047:26;61046:44;;;;61079:11;61078:12;61046:44;61038:99;;;::::0;-1:-1:-1;;;61038:99:0;;22487:2:1;61038:99:0::1;::::0;::::1;22469:21:1::0;22526:2;22506:18;;;22499:30;22565:34;22545:18;;;22538:62;-1:-1:-1;;;22616:18:1;;;22609:40;22666:19;;61038:99:0::1;22285:406:1::0;61038:99:0::1;61157:7;:21;;;61156:22;:64;;;;61183:7;:21;;;:36;;;;;61208:11;61183:36;61148:111;;;::::0;-1:-1:-1;;;61148:111:0;;14967:2:1;61148:111:0::1;::::0;::::1;14949:21:1::0;15006:2;14986:18;;;14979:30;15045:34;15025:18;;;15018:62;-1:-1:-1;;;15096:18:1;;;15089:32;15138:19;;61148:111:0::1;14765:398:1::0;61148:111:0::1;61272:10;61285:14;61293:6:::0;61285:5;:14:::1;:::i;:::-;61272:27;;61314:11;:44;;;;;61357:1;61329:7;:25;;;:29;61314:44;61310:124;;;61419:3;61391:7;:25;;;61383:5;:33;;;;:::i;:::-;:39;;;;:::i;:::-;61375:47;;61310:124;61446:22;61482:6;61471:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;61471:18:0::1;;61446:43;;61507:6;61502:184;61523:6;61519:1;:10;61502:184;;;61551:11;61565:30;61577:5:::0;61584:10;;61565:11:::1;:30::i;:::-;61551:44;;61610:29;61620:10;61632:6;61610:9;:29::i;:::-;61668:6;61654:8;61663:1;61654:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:20;-1:-1:-1;61531:3:0;::::1;::::0;::::1;:::i;:::-;;;;61502:184;;;-1:-1:-1::0;61698:13:0::1;::::0;;;:6:::1;:13;::::0;;;;:20:::1;;:30:::0;;61722:6;;61698:13;:30:::1;::::0;61722:6;;61698:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;61739:18:0::1;::::0;;;:11:::1;:18;::::0;;;;:25:::1;;:35:::0;;61768:6;;61739:18;:35:::1;::::0;61768:6;;61739:35:::1;:::i;:::-;::::0;;;-1:-1:-1;;29835:6:0;;61808:30:::1;::::0;61789:14:::1;::::0;-1:-1:-1;;;;;29835:6:0;;61828:5;;61789:14;61808:30;61789:14;61808:30;61828:5;29835:6;61808:30:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61788:50;;;61857:9;61849:18;;;::::0;::::1;;61884:11;61880:73;;;61922:10;61936:5;61912:21:::0;;;:9:::1;:21;::::0;;;;:29;;-1:-1:-1;;61912:29:0::1;::::0;;61880:73:::1;-1:-1:-1::0;53382:1:0;54335:7;:22;61972:8;60252:1736;-1:-1:-1;;;;;;;;60252:1736:0:o;40538:360::-;44966:4;44990:16;;;:7;:16;;;;;;40611:13;;-1:-1:-1;;;;;44990:16:0;40637:76;;;;-1:-1:-1;;;40637:76:0;;20476:2:1;40637:76:0;;;20458:21:1;20515:2;20495:18;;;20488:30;20554:34;20534:18;;;20527:62;-1:-1:-1;;;20605:18:1;;;20598:45;20660:19;;40637:76:0;20274:411:1;40637:76:0;40726:21;40750:10;:8;:10::i;:::-;40726:34;;40802:1;40784:7;40778:21;:25;:112;;;;;;;;;;;;;;;;;40843:7;40852:18;:7;:16;:18::i;:::-;40826:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40778:112;40771:119;40538:360;-1:-1:-1;;;40538:360:0:o;62622:585::-;62680:10;62693:6;62700;62693:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:20;62741:13;;;;;;;;;:23;;;;62786:24;;;;;62841:6;:14;;62693:20;;-1:-1:-1;62741:23:0;;62786:24;;62693:14;;62841:6;62848;;62841:14;;;;;;:::i;:::-;;;;;;;;;;;:25;;;62823:43;;62908:10;62890:15;:28;:59;;62939:10;62890:59;;;62921:15;62890:59;62877:72;-1:-1:-1;62986:14:0;:9;62998:2;62986:14;:::i;:::-;:21;;63003:4;62986:21;:::i;:::-;62973:34;;:10;:34;:::i;:::-;62960:47;;63021:14;63040:7;29835:6;;-1:-1:-1;;;;;29835:6:0;;29762:87;63040:7;-1:-1:-1;;;;;63040:12:0;63060:3;63040:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63020:48;;;63087:9;63079:18;;;;;;63138:10;63110:6;63117;63110:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:38;;;;63180:6;63164:35;63188:10;63164:35;;;;24927:25:1;;24915:2;24900:18;;24781:177;63164:35:0;;;;;;;;62669:538;;;;;62622:585;:::o;59208:372::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;59394:18:::1;::::0;;;:11:::1;:18;::::0;;;;:22:::1;;::::0;59375:15:::1;:41;;59367:100;;;::::0;-1:-1:-1;;;59367:100:0;;17745:2:1;59367:100:0::1;::::0;::::1;17727:21:1::0;17784:2;17764:18;;;17757:30;17823:34;17803:18;;;17796:62;-1:-1:-1;;;17874:18:1;;;17867:44;17928:19;;59367:100:0::1;17543:410:1::0;59367:100:0::1;59499:73;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;59499:73:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;;::::0;;;;;;;;;;;;59478:18;;;:11:::1;:18:::0;;;:94;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;59478:94:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;59208:372::o;58422:340::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;58625:19:::1;58647:6;:13;58654:5;58647:13;;;;;;;;;;;58625:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;58687:67;;;;;;;;58693:9;58687:67;;;;58704:6;:13;;;58687:67;;;;58719:11;58687:67;;;;58732:10;58687:67;;;;58744:9;58687:67;;::::0;58671:6:::1;:13;58678:5;58671:13;;;;;;;;;;;:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58538:224;58422:340:::0;;;;;:::o;30716:244::-;29835:6;;-1:-1:-1;;;;;29835:6:0;26793:10;29982:23;29974:68;;;;-1:-1:-1;;;29974:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30805:22:0;::::1;30797:73;;;::::0;-1:-1:-1;;;30797:73:0;;13087:2:1;30797:73:0::1;::::0;::::1;13069:21:1::0;13126:2;13106:18;;;13099:30;13165:34;13145:18;;;13138:62;-1:-1:-1;;;13216:18:1;;;13209:36;13262:19;;30797:73:0::1;12885:402:1::0;30797:73:0::1;30907:6;::::0;30886:38:::1;::::0;-1:-1:-1;;;;;30886:38:0;;::::1;::::0;30907:6:::1;::::0;30886:38:::1;::::0;30907:6:::1;::::0;30886:38:::1;30935:6;:17:::0;;-1:-1:-1;;;;;;30935:17:0::1;-1:-1:-1::0;;;;;30935:17:0;;;::::1;::::0;;;::::1;::::0;;30716:244::o;48785:174::-;48860:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;48860:29:0;-1:-1:-1;;;;;48860:29:0;;;;;;;;:24;;48914:23;48860:24;48914:14;:23::i;:::-;-1:-1:-1;;;;;48905:46:0;;;;;;;;;;;48785:174;;:::o;45195:355::-;45288:4;44990:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44990:16:0;45305:73;;;;-1:-1:-1;;;45305:73:0;;15370:2:1;45305:73:0;;;15352:21:1;15409:2;15389:18;;;15382:30;15448:34;15428:18;;;15421:62;-1:-1:-1;;;15499:18:1;;;15492:42;15551:19;;45305:73:0;15168:408:1;45305:73:0;45389:13;45405:23;45420:7;45405:14;:23::i;:::-;45389:39;;45458:5;-1:-1:-1;;;;;45447:16:0;:7;-1:-1:-1;;;;;45447:16:0;;:51;;;;45491:7;-1:-1:-1;;;;;45467:31:0;:20;45479:7;45467:11;:20::i;:::-;-1:-1:-1;;;;;45467:31:0;;45447:51;:94;;;-1:-1:-1;;;;;;42441:25:0;;;42417:4;42441:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;45502:39;45439:103;45195:355;-1:-1:-1;;;;45195:355:0:o;48123:544::-;48248:4;-1:-1:-1;;;;;48221:31:0;:23;48236:7;48221:14;:23::i;:::-;-1:-1:-1;;;;;48221:31:0;;48213:85;;;;-1:-1:-1;;;48213:85:0;;20066:2:1;48213:85:0;;;20048:21:1;20105:2;20085:18;;;20078:30;20144:34;20124:18;;;20117:62;-1:-1:-1;;;20195:18:1;;;20188:39;20244:19;;48213:85:0;19864:405:1;48213:85:0;-1:-1:-1;;;;;48317:16:0;;48309:65;;;;-1:-1:-1;;;48309:65:0;;14208:2:1;48309:65:0;;;14190:21:1;14247:2;14227:18;;;14220:30;14286:34;14266:18;;;14259:62;-1:-1:-1;;;14337:18:1;;;14330:34;14381:19;;48309:65:0;14006:400:1;48309:65:0;48491:29;48508:1;48512:7;48491:8;:29::i;:::-;-1:-1:-1;;;;;48533:15:0;;;;;;:9;:15;;;;;:20;;48552:1;;48533:15;:20;;48552:1;;48533:20;:::i;:::-;;;;-1:-1:-1;;;;;;;48564:13:0;;;;;;:9;:13;;;;;:18;;48581:1;;48564:13;:18;;48581:1;;48564:18;:::i;:::-;;;;-1:-1:-1;;48593:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48593:21:0;-1:-1:-1;;;;;48593:21:0;;;;;;;;;48632:27;;48593:16;;48632:27;;;;;;;48123:544;;;:::o;63654:427::-;63717:11;63741:15;63772:1;63759:10;;:14;:36;;;;;63794:1;63777:14;;:18;63759:36;:68;;;;;63817:10;;63799:15;:28;63759:68;:136;;63866:16;;:21;;63885:2;63866:21;:::i;:::-;:28;;63890:4;63866:28;:::i;:::-;63847:48;;:15;:48;:::i;:::-;63759:136;;;63830:14;;63759:136;63741:154;;63906:6;63918:71;;;;;;;;63927:5;63918:71;;;;63934:10;63918:71;;;;63946:1;63918:71;;;;63949:1;63918:71;;;;63952:1;63918:71;;;;63955:1;63918:71;;;;63958:1;63918:71;;;;63961:1;63918:71;;;;63964:1;63918:71;;;;63967:1;63918:71;;;;63970:1;63918:71;;;;63973:1;63918:71;;;;63976:1;63918:71;;;;63979:1;63918:71;;;;63982:6;63918:71;;;;;63906:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64026:1;64010:6;:13;;;;:17;;;;:::i;:::-;64001:26;;64059:6;64043:30;64067:5;64043:30;;;;24927:25:1;;24915:2;24900:18;;24781:177;64043:30:0;;;;;;;;63730:351;63654:427;;;;:::o;45892:110::-;45968:26;45978:2;45982:7;45968:26;;;;;;;;;;;;:9;:26::i;44316:272::-;44430:28;44440:4;44446:2;44450:7;44430:9;:28::i;:::-;44477:48;44500:4;44506:2;44510:7;44519:5;44477:22;:48::i;:::-;44469:111;;;;-1:-1:-1;;;44469:111:0;;;;;;;:::i;64489:97::-;64541:13;64574:4;64567:11;;;;;:::i;284:723::-;340:13;561:10;557:53;;-1:-1:-1;;588:10:0;;;;;;;;;;;;-1:-1:-1;;;588:10:0;;;;;284:723::o;557:53::-;635:5;620:12;676:78;683:9;;676:78;;709:8;;;;:::i;:::-;;-1:-1:-1;732:10:0;;-1:-1:-1;740:2:0;732:10;;:::i;:::-;;;676:78;;;764:19;796:6;786:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;786:17:0;;764:39;;814:154;821:10;;814:154;;848:11;858:1;848:11;;:::i;:::-;;-1:-1:-1;917:10:0;925:2;917:5;:10;:::i;:::-;904:24;;:2;:24;:::i;:::-;891:39;;874:6;881;874:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;874:56:0;;;;;;;;-1:-1:-1;945:11:0;954:2;945:11;;:::i;:::-;;;814:154;;46229:250;46325:18;46331:2;46335:7;46325:5;:18::i;:::-;46362:54;46393:1;46397:2;46401:7;46410:5;46362:22;:54::i;:::-;46354:117;;;;-1:-1:-1;;;46354:117:0;;;;;;;:::i;49524:843::-;49645:4;-1:-1:-1;;;;;49671:13:0;;12760:20;12799:8;49667:693;;49707:72;;-1:-1:-1;;;49707:72:0;;-1:-1:-1;;;;;49707:36:0;;;;;:72;;26793:10;;49758:4;;49764:7;;49773:5;;49707:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49707:72:0;;;;;;;;-1:-1:-1;;49707:72:0;;;;;;;;;;;;:::i;:::-;;;49703:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49953:13:0;;49949:341;;49996:60;;-1:-1:-1;;;49996:60:0;;;;;;;:::i;49949:341::-;50240:6;50234:13;50225:6;50221:2;50217:15;50210:38;49703:602;-1:-1:-1;;;;;;49830:55:0;-1:-1:-1;;;49830:55:0;;-1:-1:-1;49823:62:0;;49667:693;-1:-1:-1;50344:4:0;49524:843;;;;;;:::o;46815:382::-;-1:-1:-1;;;;;46895:16:0;;46887:61;;;;-1:-1:-1;;;46887:61:0;;18931:2:1;46887:61:0;;;18913:21:1;;;18950:18;;;18943:30;19009:34;18989:18;;;18982:62;19061:18;;46887:61:0;18729:356:1;46887:61:0;44966:4;44990:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44990:16:0;:30;46959:58;;;;-1:-1:-1;;;46959:58:0;;13494:2:1;46959:58:0;;;13476:21:1;13533:2;13513:18;;;13506:30;13572;13552:18;;;13545:58;13620:18;;46959:58:0;13292:352:1;46959:58:0;-1:-1:-1;;;;;47088:13:0;;;;;;:9;:13;;;;;:18;;47105:1;;47088:13;:18;;47105:1;;47088:18;:::i;:::-;;;;-1:-1:-1;;47117:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47117:21:0;-1:-1:-1;;;;;47117:21:0;;;;;;;;47156:33;;47117:16;;;47156:33;;47117:16;;47156:33;46815:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:729::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;813:18;809:2;806:26;803:52;;;835:18;;:::i;:::-;881:2;878:1;874:10;904:28;928:2;924;920:11;904:28;:::i;:::-;966:15;;;997:12;;;;1029:15;;;1063;;;1059:24;;1056:33;-1:-1:-1;1053:53:1;;;1102:1;1099;1092:12;1053:53;1124:1;1115:10;;1134:169;1148:2;1145:1;1142:9;1134:169;;;1205:23;1224:3;1205:23;:::i;:::-;1193:36;;1166:1;1159:9;;;;;1249:12;;;;1281;;1134:169;;;-1:-1:-1;1321:5:1;603:729;-1:-1:-1;;;;;;;603:729:1:o;1337:160::-;1402:20;;1458:13;;1451:21;1441:32;;1431:60;;1487:1;1484;1477:12;1502:186;1561:6;1614:2;1602:9;1593:7;1589:23;1585:32;1582:52;;;1630:1;1627;1620:12;1582:52;1653:29;1672:9;1653:29;:::i;1693:260::-;1761:6;1769;1822:2;1810:9;1801:7;1797:23;1793:32;1790:52;;;1838:1;1835;1828:12;1790:52;1861:29;1880:9;1861:29;:::i;:::-;1851:39;;1909:38;1943:2;1932:9;1928:18;1909:38;:::i;:::-;1899:48;;1693:260;;;;;:::o;1958:328::-;2035:6;2043;2051;2104:2;2092:9;2083:7;2079:23;2075:32;2072:52;;;2120:1;2117;2110:12;2072:52;2143:29;2162:9;2143:29;:::i;:::-;2133:39;;2191:38;2225:2;2214:9;2210:18;2191:38;:::i;:::-;2181:48;;2276:2;2265:9;2261:18;2248:32;2238:42;;1958:328;;;;;:::o;2291:666::-;2386:6;2394;2402;2410;2463:3;2451:9;2442:7;2438:23;2434:33;2431:53;;;2480:1;2477;2470:12;2431:53;2503:29;2522:9;2503:29;:::i;:::-;2493:39;;2551:38;2585:2;2574:9;2570:18;2551:38;:::i;:::-;2541:48;;2636:2;2625:9;2621:18;2608:32;2598:42;;2691:2;2680:9;2676:18;2663:32;2718:18;2710:6;2707:30;2704:50;;;2750:1;2747;2740:12;2704:50;2773:22;;2826:4;2818:13;;2814:27;-1:-1:-1;2804:55:1;;2855:1;2852;2845:12;2804:55;2878:73;2943:7;2938:2;2925:16;2920:2;2916;2912:11;2878:73;:::i;:::-;2868:83;;;2291:666;;;;;;;:::o;2962:254::-;3027:6;3035;3088:2;3076:9;3067:7;3063:23;3059:32;3056:52;;;3104:1;3101;3094:12;3056:52;3127:29;3146:9;3127:29;:::i;:::-;3117:39;;3175:35;3206:2;3195:9;3191:18;3175:35;:::i;3221:254::-;3289:6;3297;3350:2;3338:9;3329:7;3325:23;3321:32;3318:52;;;3366:1;3363;3356:12;3318:52;3389:29;3408:9;3389:29;:::i;:::-;3379:39;3465:2;3450:18;;;;3437:32;;-1:-1:-1;;;3221:254:1:o;3480:416::-;3570:6;3578;3631:2;3619:9;3610:7;3606:23;3602:32;3599:52;;;3647:1;3644;3637:12;3599:52;3687:9;3674:23;3720:18;3712:6;3709:30;3706:50;;;3752:1;3749;3742:12;3706:50;3775:61;3828:7;3819:6;3808:9;3804:22;3775:61;:::i;:::-;3765:71;;;3855:35;3886:2;3875:9;3871:18;3855:35;:::i;3901:416::-;3994:6;4002;4055:2;4043:9;4034:7;4030:23;4026:32;4023:52;;;4071:1;4068;4061:12;4023:52;4111:9;4098:23;4144:18;4136:6;4133:30;4130:50;;;4176:1;4173;4166:12;4130:50;4199:61;4252:7;4243:6;4232:9;4228:22;4199:61;:::i;:::-;4189:71;4307:2;4292:18;;;;4279:32;;-1:-1:-1;;;;3901:416:1:o;4322:245::-;4380:6;4433:2;4421:9;4412:7;4408:23;4404:32;4401:52;;;4449:1;4446;4439:12;4401:52;4488:9;4475:23;4507:30;4531:5;4507:30;:::i;4572:249::-;4641:6;4694:2;4682:9;4673:7;4669:23;4665:32;4662:52;;;4710:1;4707;4700:12;4662:52;4742:9;4736:16;4761:30;4785:5;4761:30;:::i;4826:450::-;4895:6;4948:2;4936:9;4927:7;4923:23;4919:32;4916:52;;;4964:1;4961;4954:12;4916:52;5004:9;4991:23;5037:18;5029:6;5026:30;5023:50;;;5069:1;5066;5059:12;5023:50;5092:22;;5145:4;5137:13;;5133:27;-1:-1:-1;5123:55:1;;5174:1;5171;5164:12;5123:55;5197:73;5262:7;5257:2;5244:16;5239:2;5235;5231:11;5197:73;:::i;5281:180::-;5340:6;5393:2;5381:9;5372:7;5368:23;5364:32;5361:52;;;5409:1;5406;5399:12;5361:52;-1:-1:-1;5432:23:1;;5281:180;-1:-1:-1;5281:180:1:o;5466:254::-;5534:6;5542;5595:2;5583:9;5574:7;5570:23;5566:32;5563:52;;;5611:1;5608;5601:12;5563:52;5647:9;5634:23;5624:33;;5676:38;5710:2;5699:9;5695:18;5676:38;:::i;5725:1523::-;5819:6;5827;5871:9;5862:7;5858:23;5901:3;5897:2;5893:12;5890:32;;;5918:1;5915;5908:12;5890:32;5954:9;5941:23;5931:33;;5983:6;6023:2;6017;6013:7;6009:2;6005:16;6001:25;5998:45;;;6039:1;6036;6029:12;5998:45;6065:22;;:::i;:::-;6052:35;;6138:2;6127:9;6123:18;6110:32;6103:5;6096:47;6203:2;6192:9;6188:18;6175:32;6170:2;6163:5;6159:14;6152:56;6268:2;6257:9;6253:18;6240:32;6235:2;6228:5;6224:14;6217:56;6333:3;6322:9;6318:19;6305:33;6300:2;6293:5;6289:14;6282:57;6400:3;6389:9;6385:19;6372:33;6366:3;6359:5;6355:15;6348:58;6467:3;6456:9;6452:19;6439:33;6433:3;6426:5;6422:15;6415:58;6534:3;6523:9;6519:19;6506:33;6500:3;6493:5;6489:15;6482:58;6559:3;6623:2;6612:9;6608:18;6595:32;6589:3;6582:5;6578:15;6571:57;6647:3;6710:2;6699:9;6695:18;6682:32;6677:2;6670:5;6666:14;6659:56;6734:3;6724:13;;6797:2;6786:9;6782:18;6769:32;6764:2;6757:5;6753:14;6746:56;;6821:3;6884:2;6873:9;6869:18;6856:32;6851:2;6844:5;6840:14;6833:56;6908:3;6898:13;;6971:2;6960:9;6956:18;6943:32;6938:2;6931:5;6927:14;6920:56;;6995:3;7058:2;7047:9;7043:18;7030:32;7025:2;7018:5;7014:14;7007:56;7082:3;7072:13;;7145:2;7134:9;7130:18;7117:32;7112:2;7105:5;7101:14;7094:56;;7182:35;7213:2;7202:9;7198:18;7182:35;:::i;:::-;7166:14;;;7159:59;-1:-1:-1;5725:1523:1;;7170:5;;-1:-1:-1;5725:1523:1;;-1:-1:-1;;5725:1523:1:o;7253:248::-;7321:6;7329;7382:2;7370:9;7361:7;7357:23;7353:32;7350:52;;;7398:1;7395;7388:12;7350:52;-1:-1:-1;;7421:23:1;;;7491:2;7476:18;;;7463:32;;-1:-1:-1;7253:248:1:o;7506:454::-;7601:6;7609;7617;7625;7633;7686:3;7674:9;7665:7;7661:23;7657:33;7654:53;;;7703:1;7700;7693:12;7654:53;-1:-1:-1;;7726:23:1;;;7796:2;7781:18;;7768:32;;-1:-1:-1;7847:2:1;7832:18;;7819:32;;7898:2;7883:18;;7870:32;;-1:-1:-1;7949:3:1;7934:19;7921:33;;-1:-1:-1;7506:454:1;-1:-1:-1;7506:454:1:o;7965:592::-;8075:6;8083;8091;8099;8107;8115;8123;8176:3;8164:9;8155:7;8151:23;8147:33;8144:53;;;8193:1;8190;8183:12;8144:53;8229:9;8216:23;8206:33;;8286:2;8275:9;8271:18;8258:32;8248:42;;8337:2;8326:9;8322:18;8309:32;8299:42;;8388:2;8377:9;8373:18;8360:32;8350:42;;8439:3;8428:9;8424:19;8411:33;8401:43;;8463:36;8494:3;8483:9;8479:19;8463:36;:::i;:::-;8453:46;;8546:3;8535:9;8531:19;8518:33;8508:43;;7965:592;;;;;;;;;;:::o;8658:257::-;8699:3;8737:5;8731:12;8764:6;8759:3;8752:19;8780:63;8836:6;8829:4;8824:3;8820:14;8813:4;8806:5;8802:16;8780:63;:::i;:::-;8897:2;8876:15;-1:-1:-1;;8872:29:1;8863:39;;;;8904:4;8859:50;;8658:257;-1:-1:-1;;8658:257:1:o;8920:470::-;9099:3;9137:6;9131:13;9153:53;9199:6;9194:3;9187:4;9179:6;9175:17;9153:53;:::i;:::-;9269:13;;9228:16;;;;9291:57;9269:13;9228:16;9325:4;9313:17;;9291:57;:::i;:::-;9364:20;;8920:470;-1:-1:-1;;;;8920:470:1:o;9813:488::-;-1:-1:-1;;;;;10082:15:1;;;10064:34;;10134:15;;10129:2;10114:18;;10107:43;10181:2;10166:18;;10159:34;;;10229:3;10224:2;10209:18;;10202:31;;;10007:4;;10250:45;;10275:19;;10267:6;10250:45;:::i;:::-;10242:53;9813:488;-1:-1:-1;;;;;;9813:488:1:o;10306:741::-;10518:2;10530:21;;;10600:13;;10503:18;;;10622:22;;;10470:4;;10697;;10675:2;10660:18;;;10724:15;;;10470:4;10767:195;10781:6;10778:1;10775:13;10767:195;;;10846:13;;-1:-1:-1;;;;;10842:39:1;10830:52;;10902:12;;;;10937:15;;;;10878:1;10796:9;10767:195;;;-1:-1:-1;;;11025:14:1;;11018:22;10998:18;;10991:50;;;;-1:-1:-1;10979:3:1;10306:741;-1:-1:-1;10306:741:1:o;11052:632::-;11223:2;11275:21;;;11345:13;;11248:18;;;11367:22;;;11194:4;;11223:2;11446:15;;;;11420:2;11405:18;;;11194:4;11489:169;11503:6;11500:1;11497:13;11489:169;;;11564:13;;11552:26;;11633:15;;;;11598:12;;;;11525:1;11518:9;11489:169;;;-1:-1:-1;11675:3:1;;11052:632;-1:-1:-1;;;;;;11052:632:1:o;11881:219::-;12030:2;12019:9;12012:21;11993:4;12050:44;12090:2;12079:9;12075:18;12067:6;12050:44;:::i;12105:414::-;12307:2;12289:21;;;12346:2;12326:18;;;12319:30;12385:34;12380:2;12365:18;;12358:62;-1:-1:-1;;;12451:2:1;12436:18;;12429:48;12509:3;12494:19;;12105:414::o;19503:356::-;19705:2;19687:21;;;19724:18;;;19717:30;19783:34;19778:2;19763:18;;19756:62;19850:2;19835:18;;19503:356::o;21867:413::-;22069:2;22051:21;;;22108:2;22088:18;;;22081:30;22147:34;22142:2;22127:18;;22120:62;-1:-1:-1;;;22213:2:1;22198:18;;22191:47;22270:3;22255:19;;21867:413::o;22696:399::-;22898:2;22880:21;;;22937:2;22917:18;;;22910:30;22976:34;22971:2;22956:18;;22949:62;-1:-1:-1;;;23042:2:1;23027:18;;23020:33;23085:3;23070:19;;22696:399::o;23460:1316::-;23677:13;;23659:32;;23747:4;23735:17;;;23729:24;23707:20;;;23700:54;23810:4;23798:17;;;23792:24;23770:20;;;23763:54;23873:4;23861:17;;;23855:24;23833:20;;;23826:54;23936:4;23924:17;;;23918:24;23896:20;;;23889:54;23999:4;23987:17;;;23981:24;23959:20;;;23952:54;24062:4;24050:17;;;24044:24;24022:20;;;24015:54;24125:4;24113:17;;;24107:24;24085:20;;;24078:54;24151:6;24199:15;;;24193:22;24173:18;;;24166:50;24235:6;24283:15;;;24277:22;24257:18;;;24250:50;24319:6;24367:15;;;24361:22;24341:18;;;24334:50;24403:6;24451:15;;;24445:22;24425:18;;;24418:50;24487:6;24535:15;;;24529:22;24509:18;;;24502:50;24571:6;24619:15;;;24613:22;24593:18;;;24586:50;24655:6;24696:15;;;24690:22;8632:13;8625:21;24751:18;;;8613:34;;;;23646:3;23631:19;;23460:1316::o;26053:255::-;26125:2;26119:9;26167:6;26155:19;;26204:18;26189:34;;26225:22;;;26186:62;26183:88;;;26251:18;;:::i;:::-;26287:2;26280:22;26053:255;:::o;26313:275::-;26384:2;26378:9;26449:2;26430:13;;-1:-1:-1;;26426:27:1;26414:40;;26484:18;26469:34;;26505:22;;;26466:62;26463:88;;;26531:18;;:::i;:::-;26567:2;26560:22;26313:275;;-1:-1:-1;26313:275:1:o;26593:128::-;26633:3;26664:1;26660:6;26657:1;26654:13;26651:39;;;26670:18;;:::i;:::-;-1:-1:-1;26706:9:1;;26593:128::o;26726:120::-;26766:1;26792;26782:35;;26797:18;;:::i;:::-;-1:-1:-1;26831:9:1;;26726:120::o;26851:168::-;26891:7;26957:1;26953;26949:6;26945:14;26942:1;26939:21;26934:1;26927:9;26920:17;26916:45;26913:71;;;26964:18;;:::i;:::-;-1:-1:-1;27004:9:1;;26851:168::o;27024:125::-;27064:4;27092:1;27089;27086:8;27083:34;;;27097:18;;:::i;:::-;-1:-1:-1;27134:9:1;;27024:125::o;27154:258::-;27226:1;27236:113;27250:6;27247:1;27244:13;27236:113;;;27326:11;;;27320:18;27307:11;;;27300:39;27272:2;27265:10;27236:113;;;27367:6;27364:1;27361:13;27358:48;;;-1:-1:-1;;27402:1:1;27384:16;;27377:27;27154:258::o;27417:380::-;27496:1;27492:12;;;;27539;;;27560:61;;27614:4;27606:6;27602:17;27592:27;;27560:61;27667:2;27659:6;27656:14;27636:18;27633:38;27630:161;;;27713:10;27708:3;27704:20;27701:1;27694:31;27748:4;27745:1;27738:15;27776:4;27773:1;27766:15;27630:161;;27417:380;;;:::o;27802:135::-;27841:3;-1:-1:-1;;27862:17:1;;27859:43;;;27882:18;;:::i;:::-;-1:-1:-1;27929:1:1;27918:13;;27802:135::o;27942:112::-;27974:1;28000;27990:35;;28005:18;;:::i;:::-;-1:-1:-1;28039:9:1;;27942:112::o;28059:127::-;28120:10;28115:3;28111:20;28108:1;28101:31;28151:4;28148:1;28141:15;28175:4;28172:1;28165:15;28191:127;28252:10;28247:3;28243:20;28240:1;28233:31;28283:4;28280:1;28273:15;28307:4;28304:1;28297:15;28323:127;28384:10;28379:3;28375:20;28372:1;28365:31;28415:4;28412:1;28405:15;28439:4;28436:1;28429:15;28455:127;28516:10;28511:3;28507:20;28504:1;28497:31;28547:4;28544:1;28537:15;28571:4;28568:1;28561:15;28587:131;-1:-1:-1;;;;;;28661:32:1;;28651:43;;28641:71;;28708:1;28705;28698:12;28641:71;28587:131;:::o
Swarm Source
ipfs://f2d3424c7e076e48b5391381afc0079927821faca8170f7bdda7ec95dec590c2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,440.83 | 0.0001 | $0.344083 |
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.