Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Overview
Max Total Supply
15 Schrodinger's Box Alpha I
Holders
9
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract contains unverified libraries: ERC1155Lib
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
TicketNFT1155
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-28 */ // Sources flattened with hardhat v2.10.2 https://hardhat.org // File contracts/utils/Context.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) 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() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) 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 making 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; } } // File contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File contracts/access/IAccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File contracts/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) 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); } // File contracts/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) 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; } } // File contracts/access/AccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File contracts/structs/EnumerableSet.sol // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // 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); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // 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)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // 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)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File contracts/access/AccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // File contracts/erc1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File contracts/erc1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File contracts/erc1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/erc1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256 tokenId) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File contracts/erc1155/ERC1155Lib.sol pragma solidity ^0.8.0; //import "./IERC1155.sol"; //import "./IERC1155Receiver.sol"; //import "./extensions/IERC1155MetadataURI.sol"; //import "../utils/Address.sol"; //import "../utils/Context.sol"; //import "../introspection/ERC165.sol"; //import "../utils/Strings.sol"; //import "./ERC1155.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ library ERC1155Lib //is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; using Strings for uint256; struct ERC1155Entity { bool _paused; mapping(uint256 => uint256) _totalSupply; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string _uri; uint256 _tokenIdTracker; uint256 MINT_MAX; bool saleIsActive; uint256 _price; } /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); // /** // * @dev See {IERC1155MetadataURI-uri}. // * // * This implementation returns the same URI for *all* token types. It relies // * on the token type ID substitution mechanism // * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. // * // * Clients calling this function must replace the `\{id\}` substring with the // * actual token type ID. // */ // function uri(ERC1155Entity storage self, uint256 tokenId) public view returns (string memory) { // return self._uri; // } function uri(ERC1155Entity storage self, uint256 tokenId) public view returns (string memory) { require(exists(self, tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = self._uri; return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(ERC1155Entity storage self, address account, uint256 id) internal view returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return self._balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(ERC1155Entity storage self, address[] memory accounts, uint256[] memory ids) internal view returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(self, accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(ERC1155Entity storage self, address account, address operator) internal view returns (bool) { return self._operatorApprovals[account][operator]; } function _safeTransferFrom( ERC1155Entity storage self, address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) public { require(to != address(0), "ERC1155: transfer to the zero address"); // address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(self, operator, from, to, ids, amounts, data); uint256 fromBalance = self._balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { self._balances[id][from] = fromBalance - amount; } self._balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(self, operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } function _safeBatchTransferFrom( ERC1155Entity storage self, address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); // address operator = _msgSender(); _beforeTokenTransfer(self, operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = self._balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { self._balances[id][from] = fromBalance - amount; } self._balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(self, operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } function _setURI(ERC1155Entity storage self, string memory newuri) public { self._uri = newuri; } function _mint( ERC1155Entity storage self, address operator, address to, uint256 id, uint256 amount, bytes memory data ) public { require(to != address(0), "ERC1155: mint to the zero address"); // address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(self, operator, address(0), to, ids, amounts, data); self._balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(self, operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } function _mintBatch( ERC1155Entity storage self, address operator, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); // address operator = _msgSender(); _beforeTokenTransfer(self, operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { self._balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(self, operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } function flipSaleState(ERC1155Entity storage self) public { self.saleIsActive = !self.saleIsActive; } function isSaleActive(ERC1155Entity storage self) internal view returns (bool){ return self.saleIsActive; } function setMintMax(ERC1155Entity storage self, uint256 number) public { self.MINT_MAX = number; } function setMintPrice(ERC1155Entity storage self, uint256 price) public { self._price = price; } function mintBatch(ERC1155Entity storage self, address operator, address to, uint number) public { // require(_price * number <= msg.value, "Ether value sent is not correct."); //检查最大数量数 require(totalSupply(self) + number <= self.MINT_MAX, "Purchase would exceed max supply of tokens"); //奖票合约是否锁定 require(self.saleIsActive, "Sale must be active to mint Token"); uint256[] memory mintTokenIds = new uint256[](number); uint256[] memory mintAmounts = new uint256[](number); uint256 _tokenIdCurrent = self._tokenIdTracker; //进行批量 MINT for (uint i = 0; i < number; i++) { mintTokenIds[i] = _tokenIdCurrent; mintAmounts[i] = 1; _tokenIdCurrent ++; } self._tokenIdTracker = _tokenIdCurrent; _mintBatch(self, operator, to, mintTokenIds, mintAmounts, ""); } function _burn( ERC1155Entity storage self, address operator, address from, uint256 id, uint256 amount ) public { require(from != address(0), "ERC1155: burn from the zero address"); // address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(self, operator, from, address(0), ids, amounts, ""); uint256 fromBalance = self._balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { self._balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(self, operator, from, address(0), ids, amounts, ""); } function _burnBatch( ERC1155Entity storage self, address operator, address from, uint256[] memory ids, uint256[] memory amounts ) public { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); // address operator = _msgSender(); _beforeTokenTransfer(self, operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = self._balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { self._balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(self, operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( ERC1155Entity storage self, address owner, address operator, bool approved ) public { require(owner != operator, "ERC1155: setting approval status for self"); self._operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused(ERC1155Entity storage self) internal view returns (bool) { return self._paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused(ERC1155Entity storage self) { require(!paused(self), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused(ERC1155Entity storage self) { require(paused(self), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause(ERC1155Entity storage self, address operator) public whenNotPaused(self) { self._paused = true; emit Paused(operator); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause(ERC1155Entity storage self, address operator) public whenPaused(self) { self._paused = false; emit Unpaused(operator); } function totalSupply(ERC1155Entity storage self) internal view returns (uint256) { return self._tokenIdTracker; } /** * @dev Total amount of tokens in with a given id. */ function totalSupply(ERC1155Entity storage self, uint256 id) internal view returns (uint256) { return self._totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(ERC1155Entity storage self, uint256 id) internal view returns (bool) { return totalSupply(self, id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( ERC1155Entity storage self, address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal { require(!paused(self), "ERC1155Pausable: token transfer while paused"); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { self._totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = self._totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { self._totalSupply[id] = supply - amount; } } } } function _afterTokenTransfer( ERC1155Entity storage self, address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File contracts/erc1155/presets/ERC1155PresetMinterPauser.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/presets/ERC1155PresetMinterPauser.sol) pragma solidity ^0.8.0; //import "../ERC1155.sol"; //import "../extensions/ERC1155Burnable.sol"; //import "../extensions/ERC1155Pausable.sol"; //import "../extensions/ERC1155Supply.sol"; //import "../../security/Pausable.sol"; ///** // * @dev {ERC1155} token, including: // * // * - ability for holders to burn (destroy) their tokens // * - a minter role that allows for token minting (creation) // * - a pauser role that allows to stop all token transfers // * // * This contract uses {AccessControl} to lock permissioned functions using the // * different roles - head to its documentation for details. // * // * The account that deploys the contract will be granted the minter and pauser // * roles, as well as the default admin role, which will let it grant both minter // * and pauser roles to other accounts. // * // * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ // */ contract ERC1155PresetMinterPauser is Context,ERC165,IERC1155, IERC1155MetadataURI, AccessControlEnumerable{ using Address for address; using ERC1155Lib for ERC1155Lib.ERC1155Entity; ERC1155Lib.ERC1155Entity _eRC1155Entity; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); event FundsRetrieved(uint256 amount); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE`, and `PAUSER_ROLE` to the account that * deploys the contract. */ constructor(string memory uri) { _eRC1155Entity._paused = false; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); ERC1155Lib._setURI(_eRC1155Entity, uri); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165,AccessControlEnumerable) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burnBatch(account, ids, values); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}. */ function mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { _mintBatch(to, ids, amounts, data); } /** * @dev Pauses all token transfers. * * See {ERC1155Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { address operator = _msgSender(); require(hasRole(PAUSER_ROLE, operator), "ERC1155PresetMinterPauser: must have pauser role to pause"); ERC1155Lib._pause(_eRC1155Entity,operator); } /** * @dev Unpauses all token transfers. * * See {ERC1155Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { address operator = _msgSender(); require(hasRole(PAUSER_ROLE, operator), "ERC1155PresetMinterPauser: must have pauser role to unpause"); ERC1155Lib._unpause(_eRC1155Entity,operator); } /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return ERC1155Lib.totalSupply(_eRC1155Entity,id); } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Lib.exists(_eRC1155Entity,id); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256 tokenId) public view virtual override returns (string memory) { return ERC1155Lib.uri(_eRC1155Entity, tokenId); } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { return ERC1155Lib.balanceOf(_eRC1155Entity, account, id); } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { return ERC1155Lib.balanceOfBatch(_eRC1155Entity, accounts, ids); } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return ERC1155Lib.isApprovedForAll(_eRC1155Entity, account, operator); } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); // ERC1155Lib.safeTransferFrom(_eRC1155Entity,operator,from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); // ERC1155Lib._safeBatchTransferFrom(_eRC1155Entity,from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { address operator = _msgSender(); ERC1155Lib._safeTransferFrom(_eRC1155Entity,operator, from, to, id, amount, data); } function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { address operator = _msgSender(); ERC1155Lib._safeBatchTransferFrom(_eRC1155Entity, operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { // _uri = newuri; ERC1155Lib._setURI(_eRC1155Entity, newuri); } function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { address operator = _msgSender(); ERC1155Lib._mint(_eRC1155Entity, operator, to, id, amount, data); } function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { address operator = _msgSender(); ERC1155Lib._mintBatch(_eRC1155Entity, operator, to, ids, amounts, data); } function _burn( address from, uint256 id, uint256 amount ) internal virtual { address operator = _msgSender(); ERC1155Lib._burn(_eRC1155Entity, operator, from, id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { address operator = _msgSender(); ERC1155Lib._burnBatch(_eRC1155Entity, operator, from, ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { ERC1155Lib._setApprovalForAll(_eRC1155Entity, owner, operator, approved); } function retrieveFunds() external virtual { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have admin role to retrieve funds"); uint256 amount = address(this).balance; payable(address(msg.sender)).transfer(amount); emit FundsRetrieved(amount); } } // File contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File contracts/TicketNFT1155Factory.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) pragma solidity ^0.8.0; //import "./ITicketNFT.sol"; //import "./erc1155/extensions/ERC1155Supply.sol"; contract TicketNFT1155 is ERC1155PresetMinterPauser, Ownable, ReentrancyGuard { string public name; string public symbol; constructor(string memory _name, string memory _symbol, string memory uri) public ERC1155PresetMinterPauser(uri) { name = _name; symbol = _symbol; _eRC1155Entity.saleIsActive = false; } function setMintBatch(address to, uint number) external payable nonReentrant { require(_eRC1155Entity._price * number <= msg.value, "Ether value sent is not correct."); ERC1155Lib.mintBatch(_eRC1155Entity, _msgSender(), to, number); } function setMintMax(uint256 number) external { require(!ERC1155Lib.isSaleActive(_eRC1155Entity), "Sale Is Active"); require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "web3 CLI: must have minter role to update tokenURI"); ERC1155Lib.setMintMax(_eRC1155Entity, number); } function flipSaleState() public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "web3 CLI: must have minter role to update tokenURI"); ERC1155Lib.flipSaleState(_eRC1155Entity); } function setMintPrice(uint256 price) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "web3 CLI: must have minter role to update tokenURI"); ERC1155Lib.setMintPrice(_eRC1155Entity, price); } function queryCurrentTokenId() public view returns (uint){ return _eRC1155Entity._tokenIdTracker; } function totalSupply() public view returns (uint256) { return ERC1155Lib.totalSupply(_eRC1155Entity); } function totalSupply(uint256 id) public view override returns (uint256) { return super.totalSupply(id); } function MINT_MAX() public view returns (uint256){ return _eRC1155Entity.MINT_MAX; } function saleIsActive() public view returns (bool){ return ERC1155Lib.isSaleActive(_eRC1155Entity); } function _price() public view returns(uint256){ return _eRC1155Entity._price; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsRetrieved","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"queryCurrentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieveFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMintBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMintMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004be138038062004be1833981810160405281019062000037919062000795565b806000600260000160006101000a81548160ff0219169083151502179055506200007a6000801b6200006e620001ec60201b60201c565b620001f460201b60201c565b620000bb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000af620001ec60201b60201c565b620001f460201b60201c565b620000fc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620000f0620001ec60201b60201c565b620001f460201b60201c565b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063c482a2a86002836040518363ffffffff1660e01b815260040162000138929190620008b2565b60006040518083038186803b1580156200015157600080fd5b505af415801562000166573d6000803e3d6000fd5b50505050506200018b6200017f620001ec60201b60201c565b6200020a60201b60201c565b6001600c8190555082600d9080519060200190620001ab92919062000548565b5081600e9080519060200190620001c492919062000548565b506000600260070160006101000a81548160ff0219169083151502179055505050506200094a565b600033905090565b620002068282620002d060201b60201c565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e782826200031860201b620018b61760201c565b6200031381600160008581526020019081526020016000206200040960201b620019961790919060201c565b505050565b6200032a82826200044160201b60201c565b6200040557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003aa620001ec60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000439836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620004ab60201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620004bf83836200052560201b60201c565b6200051a5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200051f565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620005569062000915565b90600052602060002090601f0160209004810192826200057a5760008555620005c6565b82601f106200059557805160ff1916838001178555620005c6565b82800160010185558215620005c6579182015b82811115620005c5578251825591602001919060010190620005a8565b5b509050620005d59190620005d9565b5090565b5b80821115620005f4576000816000905550600101620005da565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006618262000616565b810181811067ffffffffffffffff8211171562000683576200068262000627565b5b80604052505050565b600062000698620005f8565b9050620006a6828262000656565b919050565b600067ffffffffffffffff821115620006c957620006c862000627565b5b620006d48262000616565b9050602081019050919050565b60005b8381101562000701578082015181840152602081019050620006e4565b8381111562000711576000848401525b50505050565b60006200072e6200072884620006ab565b6200068c565b9050828152602081018484840111156200074d576200074c62000611565b5b6200075a848285620006e1565b509392505050565b600082601f8301126200077a57620007796200060c565b5b81516200078c84826020860162000717565b91505092915050565b600080600060608486031215620007b157620007b062000602565b5b600084015167ffffffffffffffff811115620007d257620007d162000607565b5b620007e08682870162000762565b935050602084015167ffffffffffffffff81111562000804576200080362000607565b5b620008128682870162000762565b925050604084015167ffffffffffffffff81111562000836576200083562000607565b5b620008448682870162000762565b9150509250925092565b8082525050565b600081519050919050565b600082825260208201905092915050565b60006200087e8262000855565b6200088a818562000860565b93506200089c818560208601620006e1565b620008a78162000616565b840191505092915050565b6000604082019050620008c960008301856200084e565b8181036020830152620008dd818462000871565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200092e57607f821691505b602082108103620009445762000943620008e6565b5b50919050565b614287806200095a6000396000f3fe60806040526004361061022f5760003560e01c80639010d07c1161012e578063ca15c873116100ab578063eb8d24441161006f578063eb8d24441461082f578063f242432a1461085a578063f2fde38b14610883578063f4a0a528146108ac578063f5298aca146108d55761022f565b8063ca15c87314610736578063d539139314610773578063d547741f1461079e578063e63ab1e9146107c7578063e985e9c5146107f25761022f565b8063a217fddf116100f2578063a217fddf14610660578063a22cb4651461068b578063afc3cb49146106b4578063bd85b039146106dd578063c2f118751461071a5761022f565b80639010d07c1461056557806391d14854146105a257806395183a08146105df57806395d89b411461060a5780639f6d2f40146106355761022f565b806334918dfd116101bc57806361b20d8c1161018057806361b20d8c146104cc5780636b20c454146104e3578063715018a61461050c5780638456cb59146105235780638da5cb5b1461053a5761022f565b806334918dfd146103fb57806336568abe146104125780633f4ba83a1461043b5780634e1273f4146104525780634f558e791461048f5761022f565b806318160ddd1161020357806318160ddd14610316578063235b6ea114610341578063248a9ca31461036c5780632eb2c2d6146103a95780632f2ff15d146103d25761022f565b8062fdd58e1461023457806301ffc9a71461027157806306fdde03146102ae5780630e89341c146102d9575b600080fd5b34801561024057600080fd5b5061025b60048036038101906102569190612876565b6108fe565b60405161026891906128c5565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612938565b610914565b6040516102a59190612980565b60405180910390f35b3480156102ba57600080fd5b506102c36109f6565b6040516102d09190612a34565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb9190612a56565b610a84565b60405161030d9190612a34565b60405180910390f35b34801561032257600080fd5b5061032b610b0d565b60405161033891906128c5565b60405180910390f35b34801561034d57600080fd5b50610356610b1e565b60405161036391906128c5565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190612ab9565b610b2b565b6040516103a09190612af5565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190612d0d565b610b4a565b005b3480156103de57600080fd5b506103f960048036038101906103f49190612ddc565b610beb565b005b34801561040757600080fd5b50610410610c14565b005b34801561041e57600080fd5b5061043960048036038101906104349190612ddc565b610cd1565b005b34801561044757600080fd5b50610450610d54565b005b34801561045e57600080fd5b5061047960048036038101906104749190612edf565b610e36565b6040516104869190613015565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190612a56565b610e4c565b6040516104c39190612980565b60405180910390f35b3480156104d857600080fd5b506104e1610e60565b005b3480156104ef57600080fd5b5061050a60048036038101906105059190613037565b610f39565b005b34801561051857600080fd5b50610521610fd6565b005b34801561052f57600080fd5b5061053861105e565b005b34801561054657600080fd5b5061054f611140565b60405161055c91906130d1565b60405180910390f35b34801561057157600080fd5b5061058c600480360381019061058791906130ec565b61116a565b60405161059991906130d1565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190612ddc565b611199565b6040516105d69190612980565b60405180910390f35b3480156105eb57600080fd5b506105f4611203565b60405161060191906128c5565b60405180910390f35b34801561061657600080fd5b5061061f611210565b60405161062c9190612a34565b60405180910390f35b34801561064157600080fd5b5061064a61129e565b60405161065791906128c5565b60405180910390f35b34801561066c57600080fd5b506106756112ab565b6040516106829190612af5565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad9190613158565b6112b2565b005b3480156106c057600080fd5b506106db60048036038101906106d69190612a56565b6112c8565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190612a56565b6113d2565b60405161071191906128c5565b60405180910390f35b610734600480360381019061072f9190612876565b6113e4565b005b34801561074257600080fd5b5061075d60048036038101906107589190612ab9565b611505565b60405161076a91906128c5565b60405180910390f35b34801561077f57600080fd5b50610788611529565b6040516107959190612af5565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190612ddc565b61154d565b005b3480156107d357600080fd5b506107dc611576565b6040516107e99190612af5565b60405180910390f35b3480156107fe57600080fd5b5061081960048036038101906108149190613198565b61159a565b6040516108269190612980565b60405180910390f35b34801561083b57600080fd5b506108446115b0565b6040516108519190612980565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c91906131d8565b6115c1565b005b34801561088f57600080fd5b506108aa60048036038101906108a5919061326f565b611662565b005b3480156108b857600080fd5b506108d360048036038101906108ce9190612a56565b611759565b005b3480156108e157600080fd5b506108fc60048036038101906108f7919061329c565b611819565b005b600061090c600284846119c6565b905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109df57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109ef57506109ee82611a92565b5b9050919050565b600d8054610a039061331e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2f9061331e565b8015610a7c5780601f10610a5157610100808354040283529160200191610a7c565b820191906000526020600020905b815481529060010190602001808311610a5f57829003601f168201915b505050505081565b60607300d2063d1e388bd0f28a13ddeb311cb22a819ae0634ea025166002846040518363ffffffff1660e01b8152600401610ac0929190613365565b600060405180830381865af4158015610add573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b06919061342f565b9050919050565b6000610b196002611b0c565b905090565b6000600260080154905090565b6000806000838152602001908152602001600020600101549050919050565b610b52611b1a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b985750610b9785610b92611b1a565b61159a565b5b610bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bce906134ea565b60405180910390fd5b610be48585858585611b22565b5050505050565b610bf482610b2b565b610c0581610c00611b1a565b611baa565b610c0f8383611c47565b505050565b610c286000801b610c23611b1a565b611199565b610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e9061357c565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063886d58e560026040518263ffffffff1660e01b8152600401610c9f919061359c565b60006040518083038186803b158015610cb757600080fd5b505af4158015610ccb573d6000803e3d6000fd5b50505050565b610cd9611b1a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d90613629565b60405180910390fd5b610d508282611c7b565b5050565b6000610d5e611b1a565b9050610d8a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611199565b610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906136bb565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae0634a58e8d06002836040518363ffffffff1660e01b8152600401610e039291906136ea565b60006040518083038186803b158015610e1b57600080fd5b505af4158015610e2f573d6000803e3d6000fd5b5050505050565b6060610e4460028484611caf565b905092915050565b6000610e59600283611dca565b9050919050565b610e746000801b610e6f611b1a565b611199565b610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa906137ab565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610efe573d6000803e3d6000fd5b507fae2f9495e4eb15d60eced7f3c7944eb4558245d5d9089f1b32c17b493ed5830681604051610f2e91906128c5565b60405180910390a150565b610f41611b1a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610f875750610f8683610f81611b1a565b61159a565b5b610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd906134ea565b60405180910390fd5b610fd1838383611de0565b505050565b610fde611b1a565b73ffffffffffffffffffffffffffffffffffffffff16610ffc611140565b73ffffffffffffffffffffffffffffffffffffffff1614611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104990613817565b60405180910390fd5b61105c6000611e62565b565b6000611068611b1a565b90506110947f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611199565b6110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca906138a9565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063d7291cfd6002836040518363ffffffff1660e01b815260040161110d9291906136ea565b60006040518083038186803b15801561112557600080fd5b505af4158015611139573d6000803e3d6000fd5b5050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006111918260016000868152602001908152602001600020611f2890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600260060154905090565b600e805461121d9061331e565b80601f01602080910402602001604051908101604052809291908181526020018280546112499061331e565b80156112965780601f1061126b57610100808354040283529160200191611296565b820191906000526020600020905b81548152906001019060200180831161127957829003601f168201915b505050505081565b6000600260050154905090565b6000801b81565b6112c46112bd611b1a565b8383611f42565b5050565b6112d26002611fb5565b15611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613915565b60405180910390fd5b6113266000801b611321611b1a565b611199565b611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c9061357c565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063bf9b091c6002836040518363ffffffff1660e01b815260040161139f929190613365565b60006040518083038186803b1580156113b757600080fd5b505af41580156113cb573d6000803e3d6000fd5b5050505050565b60006113dd82611fd0565b9050919050565b6002600c5403611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090613981565b60405180910390fd5b6002600c81905550348160026008015461144391906139d0565b1115611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90613a76565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063e1d28cd460026114a8611b1a565b85856040518563ffffffff1660e01b81526004016114c99493929190613a96565b60006040518083038186803b1580156114e157600080fd5b505af41580156114f5573d6000803e3d6000fd5b505050506001600c819055505050565b600061152260016000848152602001908152602001600020611fe4565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61155682610b2b565b61156781611562611b1a565b611baa565b6115718383611c7b565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60006115a860028484611ff9565b905092915050565b60006115bc6002611fb5565b905090565b6115c9611b1a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061160f575061160e85611609611b1a565b61159a565b5b61164e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611645906134ea565b60405180910390fd5b61165b8585858585612090565b5050505050565b61166a611b1a565b73ffffffffffffffffffffffffffffffffffffffff16611688611140565b73ffffffffffffffffffffffffffffffffffffffff16146116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590613817565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361174d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174490613b4d565b60405180910390fd5b61175681611e62565b50565b61176d6000801b611768611b1a565b611199565b6117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a39061357c565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae06324ebcf536002836040518363ffffffff1660e01b81526004016117e6929190613365565b60006040518083038186803b1580156117fe57600080fd5b505af4158015611812573d6000803e3d6000fd5b5050505050565b611821611b1a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611867575061186683611861611b1a565b61159a565b5b6118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d906134ea565b60405180910390fd5b6118b1838383612118565b505050565b6118c08282611199565b61199257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611937611b1a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006119be836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61219a565b905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613bdf565b60405180910390fd5b83600201600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b055750611b048261220a565b5b9050919050565b600081600501549050919050565b600033905090565b6000611b2c611b1a565b90507300d2063d1e388bd0f28a13ddeb311cb22a819ae063f8234d8d60028389898989896040518863ffffffff1660e01b8152600401611b729796959493929190613cea565b60006040518083038186803b158015611b8a57600080fd5b505af4158015611b9e573d6000803e3d6000fd5b50505050505050505050565b611bb48282611199565b611c4357611bd98173ffffffffffffffffffffffffffffffffffffffff166014612284565b611be78360001c6020612284565b604051602001611bf8929190613e42565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a9190612a34565b60405180910390fd5b5050565b611c5182826118b6565b611c76816001600085815260200190815260200160002061199690919063ffffffff16565b505050565b611c8582826124c0565b611caa81600160008581526020019081526020016000206125a190919063ffffffff16565b505050565b60608151835114611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec90613eee565b60405180910390fd5b6000835167ffffffffffffffff811115611d1257611d11612b15565b5b604051908082528060200260200182016040528015611d405781602001602082028036833780820191505090505b50905060005b8451811015611dbe57611d8e86868381518110611d6657611d65613f0e565b5b6020026020010151868481518110611d8157611d80613f0e565b5b60200260200101516119c6565b828281518110611da157611da0613f0e565b5b60200260200101818152505080611db790613f3d565b9050611d46565b50809150509392505050565b600080611dd784846125d1565b11905092915050565b6000611dea611b1a565b90507300d2063d1e388bd0f28a13ddeb311cb22a819ae063d59ddf506002838787876040518663ffffffff1660e01b8152600401611e2c959493929190613f85565b60006040518083038186803b158015611e4457600080fd5b505af4158015611e58573d6000803e3d6000fd5b5050505050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611f3783600001836125f1565b60001c905092915050565b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063be889c6f60028585856040518563ffffffff1660e01b8152600401611f809493929190613ff5565b60006040518083038186803b158015611f9857600080fd5b505af4158015611fac573d6000803e3d6000fd5b50505050505050565b60008160070160009054906101000a900460ff169050919050565b6000611fdd6002836125d1565b9050919050565b6000611ff28260000161261c565b9050919050565b60008360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b600061209a611b1a565b90507300d2063d1e388bd0f28a13ddeb311cb22a819ae063cdf9f6aa60028389898989896040518863ffffffff1660e01b81526004016120e0979695949392919061403a565b60006040518083038186803b1580156120f857600080fd5b505af415801561210c573d6000803e3d6000fd5b50505050505050505050565b6000612122611b1a565b90507300d2063d1e388bd0f28a13ddeb311cb22a819ae06389b82a846002838787876040518663ffffffff1660e01b81526004016121649594939291906140b0565b60006040518083038186803b15801561217c57600080fd5b505af4158015612190573d6000803e3d6000fd5b5050505050505050565b60006121a6838361262d565b6121ff578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612204565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061227d575061227c82612650565b5b9050919050565b60606000600283600261229791906139d0565b6122a19190614103565b67ffffffffffffffff8111156122ba576122b9612b15565b5b6040519080825280601f01601f1916602001820160405280156122ec5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061232457612323613f0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061238857612387613f0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026123c891906139d0565b6123d29190614103565b90505b6001811115612472577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061241457612413613f0e565b5b1a60f81b82828151811061242b5761242a613f0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061246b90614159565b90506123d5565b50600084146124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ad906141ce565b60405180910390fd5b8091505092915050565b6124ca8282611199565b1561259d57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612542611b1a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006125c9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6126ba565b905092915050565b600082600101600083815260200190815260200160002054905092915050565b600082600001828154811061260957612608613f0e565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020549050600081146127c25760006001826126ec91906141ee565b905060006001866000018054905061270491906141ee565b905081811461277357600086600001828154811061272557612724613f0e565b5b906000526020600020015490508087600001848154811061274957612748613f0e565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061278757612786614222565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506127c8565b60009150505b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061280d826127e2565b9050919050565b61281d81612802565b811461282857600080fd5b50565b60008135905061283a81612814565b92915050565b6000819050919050565b61285381612840565b811461285e57600080fd5b50565b6000813590506128708161284a565b92915050565b6000806040838503121561288d5761288c6127d8565b5b600061289b8582860161282b565b92505060206128ac85828601612861565b9150509250929050565b6128bf81612840565b82525050565b60006020820190506128da60008301846128b6565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612915816128e0565b811461292057600080fd5b50565b6000813590506129328161290c565b92915050565b60006020828403121561294e5761294d6127d8565b5b600061295c84828501612923565b91505092915050565b60008115159050919050565b61297a81612965565b82525050565b60006020820190506129956000830184612971565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129d55780820151818401526020810190506129ba565b838111156129e4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a068261299b565b612a1081856129a6565b9350612a208185602086016129b7565b612a29816129ea565b840191505092915050565b60006020820190508181036000830152612a4e81846129fb565b905092915050565b600060208284031215612a6c57612a6b6127d8565b5b6000612a7a84828501612861565b91505092915050565b6000819050919050565b612a9681612a83565b8114612aa157600080fd5b50565b600081359050612ab381612a8d565b92915050565b600060208284031215612acf57612ace6127d8565b5b6000612add84828501612aa4565b91505092915050565b612aef81612a83565b82525050565b6000602082019050612b0a6000830184612ae6565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b4d826129ea565b810181811067ffffffffffffffff82111715612b6c57612b6b612b15565b5b80604052505050565b6000612b7f6127ce565b9050612b8b8282612b44565b919050565b600067ffffffffffffffff821115612bab57612baa612b15565b5b602082029050602081019050919050565b600080fd5b6000612bd4612bcf84612b90565b612b75565b90508083825260208201905060208402830185811115612bf757612bf6612bbc565b5b835b81811015612c205780612c0c8882612861565b845260208401935050602081019050612bf9565b5050509392505050565b600082601f830112612c3f57612c3e612b10565b5b8135612c4f848260208601612bc1565b91505092915050565b600080fd5b600067ffffffffffffffff821115612c7857612c77612b15565b5b612c81826129ea565b9050602081019050919050565b82818337600083830152505050565b6000612cb0612cab84612c5d565b612b75565b905082815260208101848484011115612ccc57612ccb612c58565b5b612cd7848285612c8e565b509392505050565b600082601f830112612cf457612cf3612b10565b5b8135612d04848260208601612c9d565b91505092915050565b600080600080600060a08688031215612d2957612d286127d8565b5b6000612d378882890161282b565b9550506020612d488882890161282b565b945050604086013567ffffffffffffffff811115612d6957612d686127dd565b5b612d7588828901612c2a565b935050606086013567ffffffffffffffff811115612d9657612d956127dd565b5b612da288828901612c2a565b925050608086013567ffffffffffffffff811115612dc357612dc26127dd565b5b612dcf88828901612cdf565b9150509295509295909350565b60008060408385031215612df357612df26127d8565b5b6000612e0185828601612aa4565b9250506020612e128582860161282b565b9150509250929050565b600067ffffffffffffffff821115612e3757612e36612b15565b5b602082029050602081019050919050565b6000612e5b612e5684612e1c565b612b75565b90508083825260208201905060208402830185811115612e7e57612e7d612bbc565b5b835b81811015612ea75780612e93888261282b565b845260208401935050602081019050612e80565b5050509392505050565b600082601f830112612ec657612ec5612b10565b5b8135612ed6848260208601612e48565b91505092915050565b60008060408385031215612ef657612ef56127d8565b5b600083013567ffffffffffffffff811115612f1457612f136127dd565b5b612f2085828601612eb1565b925050602083013567ffffffffffffffff811115612f4157612f406127dd565b5b612f4d85828601612c2a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f8c81612840565b82525050565b6000612f9e8383612f83565b60208301905092915050565b6000602082019050919050565b6000612fc282612f57565b612fcc8185612f62565b9350612fd783612f73565b8060005b83811015613008578151612fef8882612f92565b9750612ffa83612faa565b925050600181019050612fdb565b5085935050505092915050565b6000602082019050818103600083015261302f8184612fb7565b905092915050565b6000806000606084860312156130505761304f6127d8565b5b600061305e8682870161282b565b935050602084013567ffffffffffffffff81111561307f5761307e6127dd565b5b61308b86828701612c2a565b925050604084013567ffffffffffffffff8111156130ac576130ab6127dd565b5b6130b886828701612c2a565b9150509250925092565b6130cb81612802565b82525050565b60006020820190506130e660008301846130c2565b92915050565b60008060408385031215613103576131026127d8565b5b600061311185828601612aa4565b925050602061312285828601612861565b9150509250929050565b61313581612965565b811461314057600080fd5b50565b6000813590506131528161312c565b92915050565b6000806040838503121561316f5761316e6127d8565b5b600061317d8582860161282b565b925050602061318e85828601613143565b9150509250929050565b600080604083850312156131af576131ae6127d8565b5b60006131bd8582860161282b565b92505060206131ce8582860161282b565b9150509250929050565b600080600080600060a086880312156131f4576131f36127d8565b5b60006132028882890161282b565b95505060206132138882890161282b565b945050604061322488828901612861565b935050606061323588828901612861565b925050608086013567ffffffffffffffff811115613256576132556127dd565b5b61326288828901612cdf565b9150509295509295909350565b600060208284031215613285576132846127d8565b5b60006132938482850161282b565b91505092915050565b6000806000606084860312156132b5576132b46127d8565b5b60006132c38682870161282b565b93505060206132d486828701612861565b92505060406132e586828701612861565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061333657607f821691505b602082108103613349576133486132ef565b5b50919050565b8082525050565b61335f81612840565b82525050565b600060408201905061337a600083018561334f565b6133876020830184613356565b9392505050565b600067ffffffffffffffff8211156133a9576133a8612b15565b5b6133b2826129ea565b9050602081019050919050565b60006133d26133cd8461338e565b612b75565b9050828152602081018484840111156133ee576133ed612c58565b5b6133f98482856129b7565b509392505050565b600082601f83011261341657613415612b10565b5b81516134268482602086016133bf565b91505092915050565b600060208284031215613445576134446127d8565b5b600082015167ffffffffffffffff811115613463576134626127dd565b5b61346f84828501613401565b91505092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006134d4602e836129a6565b91506134df82613478565b604082019050919050565b60006020820190508181036000830152613503816134c7565b9050919050565b7f7765623320434c493a206d7573742068617665206d696e74657220726f6c652060008201527f746f2075706461746520746f6b656e5552490000000000000000000000000000602082015250565b60006135666032836129a6565b91506135718261350a565b604082019050919050565b6000602082019050818103600083015261359581613559565b9050919050565b60006020820190506135b1600083018461334f565b92915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613613602f836129a6565b915061361e826135b7565b604082019050919050565b6000602082019050818103600083015261364281613606565b9050919050565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b60006136a5603b836129a6565b91506136b082613649565b604082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b6136e481612802565b82525050565b60006040820190506136ff600083018561334f565b61370c60208301846136db565b9392505050565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652061646d696e20726f6c6520746f20726574726965766560208201527f2066756e64730000000000000000000000000000000000000000000000000000604082015250565b60006137956046836129a6565b91506137a082613713565b606082019050919050565b600060208201905081810360008301526137c481613788565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138016020836129a6565b915061380c826137cb565b602082019050919050565b60006020820190508181036000830152613830816137f4565b9050919050565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b60006138936039836129a6565b915061389e82613837565b604082019050919050565b600060208201905081810360008301526138c281613886565b9050919050565b7f53616c6520497320416374697665000000000000000000000000000000000000600082015250565b60006138ff600e836129a6565b915061390a826138c9565b602082019050919050565b6000602082019050818103600083015261392e816138f2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061396b601f836129a6565b915061397682613935565b602082019050919050565b6000602082019050818103600083015261399a8161395e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139db82612840565b91506139e683612840565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1f57613a1e6139a1565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f72726563742e600082015250565b6000613a606020836129a6565b9150613a6b82613a2a565b602082019050919050565b60006020820190508181036000830152613a8f81613a53565b9050919050565b6000608082019050613aab600083018761334f565b613ab860208301866136db565b613ac560408301856136db565b613ad26060830184613356565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b376026836129a6565b9150613b4282613adb565b604082019050919050565b60006020820190508181036000830152613b6681613b2a565b9050919050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613bc9602a836129a6565b9150613bd482613b6d565b604082019050919050565b60006020820190508181036000830152613bf881613bbc565b9050919050565b600082825260208201905092915050565b613c1981612840565b82525050565b6000613c2b8383613c10565b60208301905092915050565b6000613c4282612f57565b613c4c8185613bff565b9350613c5783612f73565b8060005b83811015613c88578151613c6f8882613c1f565b9750613c7a83612faa565b925050600181019050613c5b565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000613cbc82613c95565b613cc68185613ca0565b9350613cd68185602086016129b7565b613cdf816129ea565b840191505092915050565b600060e082019050613cff600083018a61334f565b613d0c60208301896136db565b613d1960408301886136db565b613d2660608301876136db565b8181036080830152613d388186613c37565b905081810360a0830152613d4c8185613c37565b905081810360c0830152613d608184613cb1565b905098975050505050505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613daf601783613d6e565b9150613dba82613d79565b601782019050919050565b6000613dd08261299b565b613dda8185613d6e565b9350613dea8185602086016129b7565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613e2c601183613d6e565b9150613e3782613df6565b601182019050919050565b6000613e4d82613da2565b9150613e598285613dc5565b9150613e6482613e1f565b9150613e708284613dc5565b91508190509392505050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613ed86029836129a6565b9150613ee382613e7c565b604082019050919050565b60006020820190508181036000830152613f0781613ecb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f4882612840565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f7a57613f796139a1565b5b600182019050919050565b600060a082019050613f9a600083018861334f565b613fa760208301876136db565b613fb460408301866136db565b8181036060830152613fc68185613c37565b90508181036080830152613fda8184613c37565b90509695505050505050565b613fef81612965565b82525050565b600060808201905061400a600083018761334f565b61401760208301866136db565b61402460408301856136db565b6140316060830184613fe6565b95945050505050565b600060e08201905061404f600083018a61334f565b61405c60208301896136db565b61406960408301886136db565b61407660608301876136db565b6140836080830186613356565b61409060a0830185613356565b81810360c08301526140a28184613cb1565b905098975050505050505050565b600060a0820190506140c5600083018861334f565b6140d260208301876136db565b6140df60408301866136db565b6140ec6060830185613356565b6140f96080830184613356565b9695505050505050565b600061410e82612840565b915061411983612840565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561414e5761414d6139a1565b5b828201905092915050565b600061416482612840565b915060008203614177576141766139a1565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006141b86020836129a6565b91506141c382614182565b602082019050919050565b600060208201905081810360008301526141e7816141ab565b9050919050565b60006141f982612840565b915061420483612840565b925082821015614217576142166139a1565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122069b479a587a8ffd850385e1ef833e5095c32e4ef0b44ee9fa511c38489cff68364736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000019536368726f64696e676572277320426f7820416c7068612049000000000000000000000000000000000000000000000000000000000000000000000000000019536368726f64696e676572277320426f7820416c706861204900000000000000000000000000000000000000000000000000000000000000000000000000009668747470733a2f2f6170702e666c65656b2e636f2f232f7465616d732f65646636333837332d313165662d346135632d623736622d6565666339613431353136302f73746f726167652f65646636333837332d313165662d346135632d623736622d6565666339613431353136302d6275636b65742f6f626a6563742f7362782d616c7068612d312f736278616c706861316a736f6e00000000000000000000
Deployed Bytecode
0x60806040526004361061022f5760003560e01c80639010d07c1161012e578063ca15c873116100ab578063eb8d24441161006f578063eb8d24441461082f578063f242432a1461085a578063f2fde38b14610883578063f4a0a528146108ac578063f5298aca146108d55761022f565b8063ca15c87314610736578063d539139314610773578063d547741f1461079e578063e63ab1e9146107c7578063e985e9c5146107f25761022f565b8063a217fddf116100f2578063a217fddf14610660578063a22cb4651461068b578063afc3cb49146106b4578063bd85b039146106dd578063c2f118751461071a5761022f565b80639010d07c1461056557806391d14854146105a257806395183a08146105df57806395d89b411461060a5780639f6d2f40146106355761022f565b806334918dfd116101bc57806361b20d8c1161018057806361b20d8c146104cc5780636b20c454146104e3578063715018a61461050c5780638456cb59146105235780638da5cb5b1461053a5761022f565b806334918dfd146103fb57806336568abe146104125780633f4ba83a1461043b5780634e1273f4146104525780634f558e791461048f5761022f565b806318160ddd1161020357806318160ddd14610316578063235b6ea114610341578063248a9ca31461036c5780632eb2c2d6146103a95780632f2ff15d146103d25761022f565b8062fdd58e1461023457806301ffc9a71461027157806306fdde03146102ae5780630e89341c146102d9575b600080fd5b34801561024057600080fd5b5061025b60048036038101906102569190612876565b6108fe565b60405161026891906128c5565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612938565b610914565b6040516102a59190612980565b60405180910390f35b3480156102ba57600080fd5b506102c36109f6565b6040516102d09190612a34565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb9190612a56565b610a84565b60405161030d9190612a34565b60405180910390f35b34801561032257600080fd5b5061032b610b0d565b60405161033891906128c5565b60405180910390f35b34801561034d57600080fd5b50610356610b1e565b60405161036391906128c5565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190612ab9565b610b2b565b6040516103a09190612af5565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190612d0d565b610b4a565b005b3480156103de57600080fd5b506103f960048036038101906103f49190612ddc565b610beb565b005b34801561040757600080fd5b50610410610c14565b005b34801561041e57600080fd5b5061043960048036038101906104349190612ddc565b610cd1565b005b34801561044757600080fd5b50610450610d54565b005b34801561045e57600080fd5b5061047960048036038101906104749190612edf565b610e36565b6040516104869190613015565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190612a56565b610e4c565b6040516104c39190612980565b60405180910390f35b3480156104d857600080fd5b506104e1610e60565b005b3480156104ef57600080fd5b5061050a60048036038101906105059190613037565b610f39565b005b34801561051857600080fd5b50610521610fd6565b005b34801561052f57600080fd5b5061053861105e565b005b34801561054657600080fd5b5061054f611140565b60405161055c91906130d1565b60405180910390f35b34801561057157600080fd5b5061058c600480360381019061058791906130ec565b61116a565b60405161059991906130d1565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190612ddc565b611199565b6040516105d69190612980565b60405180910390f35b3480156105eb57600080fd5b506105f4611203565b60405161060191906128c5565b60405180910390f35b34801561061657600080fd5b5061061f611210565b60405161062c9190612a34565b60405180910390f35b34801561064157600080fd5b5061064a61129e565b60405161065791906128c5565b60405180910390f35b34801561066c57600080fd5b506106756112ab565b6040516106829190612af5565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad9190613158565b6112b2565b005b3480156106c057600080fd5b506106db60048036038101906106d69190612a56565b6112c8565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190612a56565b6113d2565b60405161071191906128c5565b60405180910390f35b610734600480360381019061072f9190612876565b6113e4565b005b34801561074257600080fd5b5061075d60048036038101906107589190612ab9565b611505565b60405161076a91906128c5565b60405180910390f35b34801561077f57600080fd5b50610788611529565b6040516107959190612af5565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190612ddc565b61154d565b005b3480156107d357600080fd5b506107dc611576565b6040516107e99190612af5565b60405180910390f35b3480156107fe57600080fd5b5061081960048036038101906108149190613198565b61159a565b6040516108269190612980565b60405180910390f35b34801561083b57600080fd5b506108446115b0565b6040516108519190612980565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c91906131d8565b6115c1565b005b34801561088f57600080fd5b506108aa60048036038101906108a5919061326f565b611662565b005b3480156108b857600080fd5b506108d360048036038101906108ce9190612a56565b611759565b005b3480156108e157600080fd5b506108fc60048036038101906108f7919061329c565b611819565b005b600061090c600284846119c6565b905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109df57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109ef57506109ee82611a92565b5b9050919050565b600d8054610a039061331e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2f9061331e565b8015610a7c5780601f10610a5157610100808354040283529160200191610a7c565b820191906000526020600020905b815481529060010190602001808311610a5f57829003601f168201915b505050505081565b60607300d2063d1e388bd0f28a13ddeb311cb22a819ae0634ea025166002846040518363ffffffff1660e01b8152600401610ac0929190613365565b600060405180830381865af4158015610add573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b06919061342f565b9050919050565b6000610b196002611b0c565b905090565b6000600260080154905090565b6000806000838152602001908152602001600020600101549050919050565b610b52611b1a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b985750610b9785610b92611b1a565b61159a565b5b610bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bce906134ea565b60405180910390fd5b610be48585858585611b22565b5050505050565b610bf482610b2b565b610c0581610c00611b1a565b611baa565b610c0f8383611c47565b505050565b610c286000801b610c23611b1a565b611199565b610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e9061357c565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063886d58e560026040518263ffffffff1660e01b8152600401610c9f919061359c565b60006040518083038186803b158015610cb757600080fd5b505af4158015610ccb573d6000803e3d6000fd5b50505050565b610cd9611b1a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d90613629565b60405180910390fd5b610d508282611c7b565b5050565b6000610d5e611b1a565b9050610d8a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611199565b610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906136bb565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae0634a58e8d06002836040518363ffffffff1660e01b8152600401610e039291906136ea565b60006040518083038186803b158015610e1b57600080fd5b505af4158015610e2f573d6000803e3d6000fd5b5050505050565b6060610e4460028484611caf565b905092915050565b6000610e59600283611dca565b9050919050565b610e746000801b610e6f611b1a565b611199565b610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa906137ab565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610efe573d6000803e3d6000fd5b507fae2f9495e4eb15d60eced7f3c7944eb4558245d5d9089f1b32c17b493ed5830681604051610f2e91906128c5565b60405180910390a150565b610f41611b1a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610f875750610f8683610f81611b1a565b61159a565b5b610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd906134ea565b60405180910390fd5b610fd1838383611de0565b505050565b610fde611b1a565b73ffffffffffffffffffffffffffffffffffffffff16610ffc611140565b73ffffffffffffffffffffffffffffffffffffffff1614611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104990613817565b60405180910390fd5b61105c6000611e62565b565b6000611068611b1a565b90506110947f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611199565b6110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca906138a9565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063d7291cfd6002836040518363ffffffff1660e01b815260040161110d9291906136ea565b60006040518083038186803b15801561112557600080fd5b505af4158015611139573d6000803e3d6000fd5b5050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006111918260016000868152602001908152602001600020611f2890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600260060154905090565b600e805461121d9061331e565b80601f01602080910402602001604051908101604052809291908181526020018280546112499061331e565b80156112965780601f1061126b57610100808354040283529160200191611296565b820191906000526020600020905b81548152906001019060200180831161127957829003601f168201915b505050505081565b6000600260050154905090565b6000801b81565b6112c46112bd611b1a565b8383611f42565b5050565b6112d26002611fb5565b15611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613915565b60405180910390fd5b6113266000801b611321611b1a565b611199565b611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c9061357c565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063bf9b091c6002836040518363ffffffff1660e01b815260040161139f929190613365565b60006040518083038186803b1580156113b757600080fd5b505af41580156113cb573d6000803e3d6000fd5b5050505050565b60006113dd82611fd0565b9050919050565b6002600c5403611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090613981565b60405180910390fd5b6002600c81905550348160026008015461144391906139d0565b1115611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90613a76565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063e1d28cd460026114a8611b1a565b85856040518563ffffffff1660e01b81526004016114c99493929190613a96565b60006040518083038186803b1580156114e157600080fd5b505af41580156114f5573d6000803e3d6000fd5b505050506001600c819055505050565b600061152260016000848152602001908152602001600020611fe4565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61155682610b2b565b61156781611562611b1a565b611baa565b6115718383611c7b565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60006115a860028484611ff9565b905092915050565b60006115bc6002611fb5565b905090565b6115c9611b1a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061160f575061160e85611609611b1a565b61159a565b5b61164e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611645906134ea565b60405180910390fd5b61165b8585858585612090565b5050505050565b61166a611b1a565b73ffffffffffffffffffffffffffffffffffffffff16611688611140565b73ffffffffffffffffffffffffffffffffffffffff16146116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590613817565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361174d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174490613b4d565b60405180910390fd5b61175681611e62565b50565b61176d6000801b611768611b1a565b611199565b6117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a39061357c565b60405180910390fd5b7300d2063d1e388bd0f28a13ddeb311cb22a819ae06324ebcf536002836040518363ffffffff1660e01b81526004016117e6929190613365565b60006040518083038186803b1580156117fe57600080fd5b505af4158015611812573d6000803e3d6000fd5b5050505050565b611821611b1a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611867575061186683611861611b1a565b61159a565b5b6118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d906134ea565b60405180910390fd5b6118b1838383612118565b505050565b6118c08282611199565b61199257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611937611b1a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006119be836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61219a565b905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613bdf565b60405180910390fd5b83600201600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b055750611b048261220a565b5b9050919050565b600081600501549050919050565b600033905090565b6000611b2c611b1a565b90507300d2063d1e388bd0f28a13ddeb311cb22a819ae063f8234d8d60028389898989896040518863ffffffff1660e01b8152600401611b729796959493929190613cea565b60006040518083038186803b158015611b8a57600080fd5b505af4158015611b9e573d6000803e3d6000fd5b50505050505050505050565b611bb48282611199565b611c4357611bd98173ffffffffffffffffffffffffffffffffffffffff166014612284565b611be78360001c6020612284565b604051602001611bf8929190613e42565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a9190612a34565b60405180910390fd5b5050565b611c5182826118b6565b611c76816001600085815260200190815260200160002061199690919063ffffffff16565b505050565b611c8582826124c0565b611caa81600160008581526020019081526020016000206125a190919063ffffffff16565b505050565b60608151835114611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec90613eee565b60405180910390fd5b6000835167ffffffffffffffff811115611d1257611d11612b15565b5b604051908082528060200260200182016040528015611d405781602001602082028036833780820191505090505b50905060005b8451811015611dbe57611d8e86868381518110611d6657611d65613f0e565b5b6020026020010151868481518110611d8157611d80613f0e565b5b60200260200101516119c6565b828281518110611da157611da0613f0e565b5b60200260200101818152505080611db790613f3d565b9050611d46565b50809150509392505050565b600080611dd784846125d1565b11905092915050565b6000611dea611b1a565b90507300d2063d1e388bd0f28a13ddeb311cb22a819ae063d59ddf506002838787876040518663ffffffff1660e01b8152600401611e2c959493929190613f85565b60006040518083038186803b158015611e4457600080fd5b505af4158015611e58573d6000803e3d6000fd5b5050505050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611f3783600001836125f1565b60001c905092915050565b7300d2063d1e388bd0f28a13ddeb311cb22a819ae063be889c6f60028585856040518563ffffffff1660e01b8152600401611f809493929190613ff5565b60006040518083038186803b158015611f9857600080fd5b505af4158015611fac573d6000803e3d6000fd5b50505050505050565b60008160070160009054906101000a900460ff169050919050565b6000611fdd6002836125d1565b9050919050565b6000611ff28260000161261c565b9050919050565b60008360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b600061209a611b1a565b90507300d2063d1e388bd0f28a13ddeb311cb22a819ae063cdf9f6aa60028389898989896040518863ffffffff1660e01b81526004016120e0979695949392919061403a565b60006040518083038186803b1580156120f857600080fd5b505af415801561210c573d6000803e3d6000fd5b50505050505050505050565b6000612122611b1a565b90507300d2063d1e388bd0f28a13ddeb311cb22a819ae06389b82a846002838787876040518663ffffffff1660e01b81526004016121649594939291906140b0565b60006040518083038186803b15801561217c57600080fd5b505af4158015612190573d6000803e3d6000fd5b5050505050505050565b60006121a6838361262d565b6121ff578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612204565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061227d575061227c82612650565b5b9050919050565b60606000600283600261229791906139d0565b6122a19190614103565b67ffffffffffffffff8111156122ba576122b9612b15565b5b6040519080825280601f01601f1916602001820160405280156122ec5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061232457612323613f0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061238857612387613f0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026123c891906139d0565b6123d29190614103565b90505b6001811115612472577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061241457612413613f0e565b5b1a60f81b82828151811061242b5761242a613f0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061246b90614159565b90506123d5565b50600084146124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ad906141ce565b60405180910390fd5b8091505092915050565b6124ca8282611199565b1561259d57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612542611b1a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006125c9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6126ba565b905092915050565b600082600101600083815260200190815260200160002054905092915050565b600082600001828154811061260957612608613f0e565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020549050600081146127c25760006001826126ec91906141ee565b905060006001866000018054905061270491906141ee565b905081811461277357600086600001828154811061272557612724613f0e565b5b906000526020600020015490508087600001848154811061274957612748613f0e565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061278757612786614222565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506127c8565b60009150505b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061280d826127e2565b9050919050565b61281d81612802565b811461282857600080fd5b50565b60008135905061283a81612814565b92915050565b6000819050919050565b61285381612840565b811461285e57600080fd5b50565b6000813590506128708161284a565b92915050565b6000806040838503121561288d5761288c6127d8565b5b600061289b8582860161282b565b92505060206128ac85828601612861565b9150509250929050565b6128bf81612840565b82525050565b60006020820190506128da60008301846128b6565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612915816128e0565b811461292057600080fd5b50565b6000813590506129328161290c565b92915050565b60006020828403121561294e5761294d6127d8565b5b600061295c84828501612923565b91505092915050565b60008115159050919050565b61297a81612965565b82525050565b60006020820190506129956000830184612971565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129d55780820151818401526020810190506129ba565b838111156129e4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a068261299b565b612a1081856129a6565b9350612a208185602086016129b7565b612a29816129ea565b840191505092915050565b60006020820190508181036000830152612a4e81846129fb565b905092915050565b600060208284031215612a6c57612a6b6127d8565b5b6000612a7a84828501612861565b91505092915050565b6000819050919050565b612a9681612a83565b8114612aa157600080fd5b50565b600081359050612ab381612a8d565b92915050565b600060208284031215612acf57612ace6127d8565b5b6000612add84828501612aa4565b91505092915050565b612aef81612a83565b82525050565b6000602082019050612b0a6000830184612ae6565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b4d826129ea565b810181811067ffffffffffffffff82111715612b6c57612b6b612b15565b5b80604052505050565b6000612b7f6127ce565b9050612b8b8282612b44565b919050565b600067ffffffffffffffff821115612bab57612baa612b15565b5b602082029050602081019050919050565b600080fd5b6000612bd4612bcf84612b90565b612b75565b90508083825260208201905060208402830185811115612bf757612bf6612bbc565b5b835b81811015612c205780612c0c8882612861565b845260208401935050602081019050612bf9565b5050509392505050565b600082601f830112612c3f57612c3e612b10565b5b8135612c4f848260208601612bc1565b91505092915050565b600080fd5b600067ffffffffffffffff821115612c7857612c77612b15565b5b612c81826129ea565b9050602081019050919050565b82818337600083830152505050565b6000612cb0612cab84612c5d565b612b75565b905082815260208101848484011115612ccc57612ccb612c58565b5b612cd7848285612c8e565b509392505050565b600082601f830112612cf457612cf3612b10565b5b8135612d04848260208601612c9d565b91505092915050565b600080600080600060a08688031215612d2957612d286127d8565b5b6000612d378882890161282b565b9550506020612d488882890161282b565b945050604086013567ffffffffffffffff811115612d6957612d686127dd565b5b612d7588828901612c2a565b935050606086013567ffffffffffffffff811115612d9657612d956127dd565b5b612da288828901612c2a565b925050608086013567ffffffffffffffff811115612dc357612dc26127dd565b5b612dcf88828901612cdf565b9150509295509295909350565b60008060408385031215612df357612df26127d8565b5b6000612e0185828601612aa4565b9250506020612e128582860161282b565b9150509250929050565b600067ffffffffffffffff821115612e3757612e36612b15565b5b602082029050602081019050919050565b6000612e5b612e5684612e1c565b612b75565b90508083825260208201905060208402830185811115612e7e57612e7d612bbc565b5b835b81811015612ea75780612e93888261282b565b845260208401935050602081019050612e80565b5050509392505050565b600082601f830112612ec657612ec5612b10565b5b8135612ed6848260208601612e48565b91505092915050565b60008060408385031215612ef657612ef56127d8565b5b600083013567ffffffffffffffff811115612f1457612f136127dd565b5b612f2085828601612eb1565b925050602083013567ffffffffffffffff811115612f4157612f406127dd565b5b612f4d85828601612c2a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f8c81612840565b82525050565b6000612f9e8383612f83565b60208301905092915050565b6000602082019050919050565b6000612fc282612f57565b612fcc8185612f62565b9350612fd783612f73565b8060005b83811015613008578151612fef8882612f92565b9750612ffa83612faa565b925050600181019050612fdb565b5085935050505092915050565b6000602082019050818103600083015261302f8184612fb7565b905092915050565b6000806000606084860312156130505761304f6127d8565b5b600061305e8682870161282b565b935050602084013567ffffffffffffffff81111561307f5761307e6127dd565b5b61308b86828701612c2a565b925050604084013567ffffffffffffffff8111156130ac576130ab6127dd565b5b6130b886828701612c2a565b9150509250925092565b6130cb81612802565b82525050565b60006020820190506130e660008301846130c2565b92915050565b60008060408385031215613103576131026127d8565b5b600061311185828601612aa4565b925050602061312285828601612861565b9150509250929050565b61313581612965565b811461314057600080fd5b50565b6000813590506131528161312c565b92915050565b6000806040838503121561316f5761316e6127d8565b5b600061317d8582860161282b565b925050602061318e85828601613143565b9150509250929050565b600080604083850312156131af576131ae6127d8565b5b60006131bd8582860161282b565b92505060206131ce8582860161282b565b9150509250929050565b600080600080600060a086880312156131f4576131f36127d8565b5b60006132028882890161282b565b95505060206132138882890161282b565b945050604061322488828901612861565b935050606061323588828901612861565b925050608086013567ffffffffffffffff811115613256576132556127dd565b5b61326288828901612cdf565b9150509295509295909350565b600060208284031215613285576132846127d8565b5b60006132938482850161282b565b91505092915050565b6000806000606084860312156132b5576132b46127d8565b5b60006132c38682870161282b565b93505060206132d486828701612861565b92505060406132e586828701612861565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061333657607f821691505b602082108103613349576133486132ef565b5b50919050565b8082525050565b61335f81612840565b82525050565b600060408201905061337a600083018561334f565b6133876020830184613356565b9392505050565b600067ffffffffffffffff8211156133a9576133a8612b15565b5b6133b2826129ea565b9050602081019050919050565b60006133d26133cd8461338e565b612b75565b9050828152602081018484840111156133ee576133ed612c58565b5b6133f98482856129b7565b509392505050565b600082601f83011261341657613415612b10565b5b81516134268482602086016133bf565b91505092915050565b600060208284031215613445576134446127d8565b5b600082015167ffffffffffffffff811115613463576134626127dd565b5b61346f84828501613401565b91505092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006134d4602e836129a6565b91506134df82613478565b604082019050919050565b60006020820190508181036000830152613503816134c7565b9050919050565b7f7765623320434c493a206d7573742068617665206d696e74657220726f6c652060008201527f746f2075706461746520746f6b656e5552490000000000000000000000000000602082015250565b60006135666032836129a6565b91506135718261350a565b604082019050919050565b6000602082019050818103600083015261359581613559565b9050919050565b60006020820190506135b1600083018461334f565b92915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613613602f836129a6565b915061361e826135b7565b604082019050919050565b6000602082019050818103600083015261364281613606565b9050919050565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b60006136a5603b836129a6565b91506136b082613649565b604082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b6136e481612802565b82525050565b60006040820190506136ff600083018561334f565b61370c60208301846136db565b9392505050565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652061646d696e20726f6c6520746f20726574726965766560208201527f2066756e64730000000000000000000000000000000000000000000000000000604082015250565b60006137956046836129a6565b91506137a082613713565b606082019050919050565b600060208201905081810360008301526137c481613788565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138016020836129a6565b915061380c826137cb565b602082019050919050565b60006020820190508181036000830152613830816137f4565b9050919050565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b60006138936039836129a6565b915061389e82613837565b604082019050919050565b600060208201905081810360008301526138c281613886565b9050919050565b7f53616c6520497320416374697665000000000000000000000000000000000000600082015250565b60006138ff600e836129a6565b915061390a826138c9565b602082019050919050565b6000602082019050818103600083015261392e816138f2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061396b601f836129a6565b915061397682613935565b602082019050919050565b6000602082019050818103600083015261399a8161395e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139db82612840565b91506139e683612840565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1f57613a1e6139a1565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f72726563742e600082015250565b6000613a606020836129a6565b9150613a6b82613a2a565b602082019050919050565b60006020820190508181036000830152613a8f81613a53565b9050919050565b6000608082019050613aab600083018761334f565b613ab860208301866136db565b613ac560408301856136db565b613ad26060830184613356565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b376026836129a6565b9150613b4282613adb565b604082019050919050565b60006020820190508181036000830152613b6681613b2a565b9050919050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613bc9602a836129a6565b9150613bd482613b6d565b604082019050919050565b60006020820190508181036000830152613bf881613bbc565b9050919050565b600082825260208201905092915050565b613c1981612840565b82525050565b6000613c2b8383613c10565b60208301905092915050565b6000613c4282612f57565b613c4c8185613bff565b9350613c5783612f73565b8060005b83811015613c88578151613c6f8882613c1f565b9750613c7a83612faa565b925050600181019050613c5b565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000613cbc82613c95565b613cc68185613ca0565b9350613cd68185602086016129b7565b613cdf816129ea565b840191505092915050565b600060e082019050613cff600083018a61334f565b613d0c60208301896136db565b613d1960408301886136db565b613d2660608301876136db565b8181036080830152613d388186613c37565b905081810360a0830152613d4c8185613c37565b905081810360c0830152613d608184613cb1565b905098975050505050505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613daf601783613d6e565b9150613dba82613d79565b601782019050919050565b6000613dd08261299b565b613dda8185613d6e565b9350613dea8185602086016129b7565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613e2c601183613d6e565b9150613e3782613df6565b601182019050919050565b6000613e4d82613da2565b9150613e598285613dc5565b9150613e6482613e1f565b9150613e708284613dc5565b91508190509392505050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613ed86029836129a6565b9150613ee382613e7c565b604082019050919050565b60006020820190508181036000830152613f0781613ecb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f4882612840565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f7a57613f796139a1565b5b600182019050919050565b600060a082019050613f9a600083018861334f565b613fa760208301876136db565b613fb460408301866136db565b8181036060830152613fc68185613c37565b90508181036080830152613fda8184613c37565b90509695505050505050565b613fef81612965565b82525050565b600060808201905061400a600083018761334f565b61401760208301866136db565b61402460408301856136db565b6140316060830184613fe6565b95945050505050565b600060e08201905061404f600083018a61334f565b61405c60208301896136db565b61406960408301886136db565b61407660608301876136db565b6140836080830186613356565b61409060a0830185613356565b81810360c08301526140a28184613cb1565b905098975050505050505050565b600060a0820190506140c5600083018861334f565b6140d260208301876136db565b6140df60408301866136db565b6140ec6060830185613356565b6140f96080830184613356565b9695505050505050565b600061410e82612840565b915061411983612840565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561414e5761414d6139a1565b5b828201905092915050565b600061416482612840565b915060008203614177576141766139a1565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006141b86020836129a6565b91506141c382614182565b602082019050919050565b600060208201905081810360008301526141e7816141ab565b9050919050565b60006141f982612840565b915061420483612840565b925082821015614217576142166139a1565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122069b479a587a8ffd850385e1ef833e5095c32e4ef0b44ee9fa511c38489cff68364736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000019536368726f64696e676572277320426f7820416c7068612049000000000000000000000000000000000000000000000000000000000000000000000000000019536368726f64696e676572277320426f7820416c706861204900000000000000000000000000000000000000000000000000000000000000000000000000009668747470733a2f2f6170702e666c65656b2e636f2f232f7465616d732f65646636333837332d313165662d346135632d623736622d6565666339613431353136302f73746f726167652f65646636333837332d313165662d346135632d623736622d6565666339613431353136302d6275636b65742f6f626a6563742f7362782d616c7068612d312f736278616c706861316a736f6e00000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Schrodinger's Box Alpha I
Arg [1] : _symbol (string): Schrodinger's Box Alpha I
Arg [2] : uri (string): https://app.fleek.co/#/teams/edf63873-11ef-4a5c-b76b-eefc9a415160/storage/edf63873-11ef-4a5c-b76b-eefc9a415160-bucket/object/sbx-alpha-1/sbxalpha1json
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 536368726f64696e676572277320426f7820416c706861204900000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [6] : 536368726f64696e676572277320426f7820416c706861204900000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000096
Arg [8] : 68747470733a2f2f6170702e666c65656b2e636f2f232f7465616d732f656466
Arg [9] : 36333837332d313165662d346135632d623736622d6565666339613431353136
Arg [10] : 302f73746f726167652f65646636333837332d313165662d346135632d623736
Arg [11] : 622d6565666339613431353136302d6275636b65742f6f626a6563742f736278
Arg [12] : 2d616c7068612d312f736278616c706861316a736f6e00000000000000000000
Deployed Bytecode Sourcemap
102197:2140:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94031:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90535:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102288:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93732:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103754:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104235:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18507:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95761:537;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18892:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103176:206;;;;;;;;;;;;;:::i;:::-;;19940:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92581:252;;;;;;;;;;;;;:::i;:::-;;94367:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93155:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100139:328;;;;;;;;;;;;;:::i;:::-;;91201:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2672:103;;;;;;;;;;;;;:::i;:::-;;92115:246;;;;;;;;;;;;;:::i;:::-;;2021:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35977:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17392:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104006:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102313:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103631:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16483:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94681:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102859:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103879:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102588:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36296:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89851:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19284:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89920:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94908:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104112:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95173:511;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2930:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103392:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90867:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94031:170;94117:7;94144:49;94165:14;94181:7;94190:2;94144:20;:49::i;:::-;94137:56;;94031:170;;;;:::o;90535:322::-;90661:4;90709:26;90694:41;;;:11;:41;;;;:106;;;;90763:37;90748:52;;;:11;:52;;;;90694:106;:155;;;;90813:36;90837:11;90813:23;:36::i;:::-;90694:155;90678:171;;90535:322;;;:::o;102288:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;93732:148::-;93800:13;93833:10;:14;93848;93864:7;93833:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;93826:46;;93732:148;;;:::o;103754:117::-;103798:7;103825:38;103848:14;103825:22;:38::i;:::-;103818:45;;103754:117;:::o;104235:93::-;104273:7;104299:14;:21;;;104292:28;;104235:93;:::o;18507:123::-;18573:7;18600:6;:12;18607:4;18600:12;;;;;;;;;;;:22;;;18593:29;;18507:123;;;:::o;95761:537::-;96002:12;:10;:12::i;:::-;95994:20;;:4;:20;;;:60;;;;96018:36;96035:4;96041:12;:10;:12::i;:::-;96018:16;:36::i;:::-;95994:60;95972:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;96139:52;96162:4;96168:2;96172:3;96177:7;96186:4;96139:22;:52::i;:::-;95761:537;;;;;:::o;18892:147::-;18975:18;18988:4;18975:12;:18::i;:::-;16974:30;16985:4;16991:12;:10;:12::i;:::-;16974:10;:30::i;:::-;19006:25:::1;19017:4;19023:7;19006:10;:25::i;:::-;18892:147:::0;;;:::o;103176:206::-;103227:41;16528:4;103235:18;;103255:12;:10;:12::i;:::-;103227:7;:41::i;:::-;103219:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;103334:10;:24;103359:14;103334:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103176:206::o;19940:218::-;20047:12;:10;:12::i;:::-;20036:23;;:7;:23;;;20028:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;20124:26;20136:4;20142:7;20124:11;:26::i;:::-;19940:218;;:::o;92581:252::-;92626:16;92645:12;:10;:12::i;:::-;92626:31;;92676:30;89958:24;92697:8;92676:7;:30::i;:::-;92668:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;92781:10;:19;92801:14;92816:8;92781:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92615:218;92581:252::o;94367:241::-;94503:16;94544:56;94570:14;94586:8;94596:3;94544:25;:56::i;:::-;94537:63;;94367:241;;;;:::o;93155:125::-;93212:4;93236:36;93254:14;93269:2;93236:17;:36::i;:::-;93229:43;;93155:125;;;:::o;100139:328::-;100200:41;16528:4;100208:18;;100228:12;:10;:12::i;:::-;100200:7;:41::i;:::-;100192:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;100327:14;100344:21;100327:38;;100392:10;100376:37;;:45;100414:6;100376:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100437:22;100452:6;100437:22;;;;;;:::i;:::-;;;;;;;;100181:286;100139:328::o;91201:358::-;91377:12;:10;:12::i;:::-;91366:23;;:7;:23;;;:66;;;;91393:39;91410:7;91419:12;:10;:12::i;:::-;91393:16;:39::i;:::-;91366:66;91344:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;91519:32;91530:7;91539:3;91544:6;91519:10;:32::i;:::-;91201:358;;;:::o;2672:103::-;2252:12;:10;:12::i;:::-;2241:23;;:7;:5;:7::i;:::-;:23;;;2233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2737:30:::1;2764:1;2737:18;:30::i;:::-;2672:103::o:0;92115:246::-;92158:16;92177:12;:10;:12::i;:::-;92158:31;;92208:30;89958:24;92229:8;92208:7;:30::i;:::-;92200:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;92311:10;:17;92329:14;92344:8;92311:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92147:214;92115:246::o;2021:87::-;2067:7;2094:6;;;;;;;;;;;2087:13;;2021:87;:::o;35977:145::-;36059:7;36086:28;36108:5;36086:12;:18;36099:4;36086:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;36079:35;;35977:145;;;;:::o;17392:139::-;17470:4;17494:6;:12;17501:4;17494:12;;;;;;;;;;;:20;;:29;17515:7;17494:29;;;;;;;;;;;;;;;;;;;;;;;;;17487:36;;17392:139;;;;:::o;104006:98::-;104047:7;104073:14;:23;;;104066:30;;104006:98;:::o;102313:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;103631:113::-;103683:4;103706:14;:30;;;103699:37;;103631:113;:::o;16483:49::-;16528:4;16483:49;;;:::o;94681:155::-;94776:52;94795:12;:10;:12::i;:::-;94809:8;94819;94776:18;:52::i;:::-;94681:155;;:::o;102859:307::-;102929:39;102953:14;102929:23;:39::i;:::-;102928:40;102920:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;103006:41;16528:4;103014:18;;103034:12;:10;:12::i;:::-;103006:7;:41::i;:::-;102998:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;103113:10;:21;103135:14;103151:6;103113:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102859:307;:::o;103879:119::-;103942:7;103969:21;103987:2;103969:17;:21::i;:::-;103962:28;;103879:119;;;:::o;102588:261::-;5290:1;5888:7;;:19;5880:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5290:1;6021:7;:18;;;;102720:9:::1;102710:6;102686:14;:21;;;:30;;;;:::i;:::-;:43;;102678:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;102777:10;:20;102798:14;102814:12;:10;:12::i;:::-;102828:2;102832:6;102777:62;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5246:1:::0;6200:7;:22;;;;102588:261;;:::o;36296:134::-;36368:7;36395:27;:12;:18;36408:4;36395:18;;;;;;;;;;;:25;:27::i;:::-;36388:34;;36296:134;;;:::o;89851:62::-;89889:24;89851:62;:::o;19284:149::-;19368:18;19381:4;19368:12;:18::i;:::-;16974:30;16985:4;16991:12;:10;:12::i;:::-;16974:10;:30::i;:::-;19399:26:::1;19411:4;19417:7;19399:11;:26::i;:::-;19284:149:::0;;;:::o;89920:62::-;89958:24;89920:62;:::o;94908:193::-;95007:4;95031:62;95059:14;95075:7;95084:8;95031:27;:62::i;:::-;95024:69;;94908:193;;;;:::o;104112:115::-;104157:4;104180:39;104204:14;104180:23;:39::i;:::-;104173:46;;104112:115;:::o;95173:511::-;95391:12;:10;:12::i;:::-;95383:20;;:4;:20;;;:60;;;;95407:36;95424:4;95430:12;:10;:12::i;:::-;95407:16;:36::i;:::-;95383:60;95361:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;95528:45;95546:4;95552:2;95556;95560:6;95568:4;95528:17;:45::i;:::-;95173:511;;;;;:::o;2930:201::-;2252:12;:10;:12::i;:::-;2241:23;;:7;:5;:7::i;:::-;:23;;;2233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3039:1:::1;3019:22;;:8;:22;;::::0;3011:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3095:28;3114:8;3095:18;:28::i;:::-;2930:201:::0;:::o;103392:231::-;103462:41;16528:4;103470:18;;103490:12;:10;:12::i;:::-;103462:7;:41::i;:::-;103454:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;103569:10;:23;103593:14;103609:5;103569:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103392:231;:::o;90867:326::-;91018:12;:10;:12::i;:::-;91007:23;;:7;:23;;;:66;;;;91034:39;91051:7;91060:12;:10;:12::i;:::-;91034:16;:39::i;:::-;91007:66;90985:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;91160:25;91166:7;91175:2;91179:5;91160;:25::i;:::-;90867:326;;;:::o;21441:238::-;21525:22;21533:4;21539:7;21525;:22::i;:::-;21520:152;;21596:4;21564:6;:12;21571:4;21564:12;;;;;;;;;;;:20;;:29;21585:7;21564:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;21647:12;:10;:12::i;:::-;21620:40;;21638:7;21620:40;;21632:4;21620:40;;;;;;;;;;21520:152;21441:238;;:::o;29910:152::-;29980:4;30004:50;30009:3;:10;;30045:5;30029:23;;30021:32;;30004:4;:50::i;:::-;29997:57;;29910:152;;;;:::o;73737:248::-;73836:7;73883:1;73864:21;;:7;:21;;;73856:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;73950:4;:14;;:18;73965:2;73950:18;;;;;;;;;;;:27;73969:7;73950:27;;;;;;;;;;;;;;;;73943:34;;73737:248;;;;;:::o;35164:214::-;35249:4;35288:42;35273:57;;;:11;:57;;;;:97;;;;35334:36;35358:11;35334:23;:36::i;:::-;35273:97;35266:104;;35164:214;;;:::o;84717:127::-;84789:7;84816:4;:20;;;84809:27;;84717:127;;;:::o;760:98::-;813:7;840:10;833:17;;760:98;:::o;97087:348::-;97294:16;97313:12;:10;:12::i;:::-;97294:31;;97336:10;:33;97370:14;97386:8;97396:4;97402:2;97406:3;97411:7;97420:4;97336:89;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97281:154;97087:348;;;;;:::o;17821:497::-;17902:22;17910:4;17916:7;17902;:22::i;:::-;17897:414;;18090:41;18118:7;18090:41;;18128:2;18090:19;:41::i;:::-;18204:38;18232:4;18224:13;;18239:2;18204:19;:38::i;:::-;17995:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17941:358;;;;;;;;;;;:::i;:::-;;;;;;;;17897:414;17821:497;;:::o;36523:169::-;36611:31;36628:4;36634:7;36611:16;:31::i;:::-;36653;36676:7;36653:12;:18;36666:4;36653:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;36523:169;;:::o;36786:174::-;36875:32;36893:4;36899:7;36875:17;:32::i;:::-;36918:34;36944:7;36918:12;:18;36931:4;36918:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;36786:174;;:::o;74151:513::-;74290:16;74351:3;:10;74332:8;:15;:29;74324:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;74420:30;74467:8;:15;74453:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74420:63;;74501:9;74496:128;74520:8;:15;74516:1;:19;74496:128;;;74576:36;74586:4;74592:8;74601:1;74592:11;;;;;;;;:::i;:::-;;;;;;;;74605:3;74609:1;74605:6;;;;;;;;:::i;:::-;;;;;;;;74576:9;:36::i;:::-;74557:13;74571:1;74557:16;;;;;;;;:::i;:::-;;;;;;;:55;;;;;74537:3;;;;:::i;:::-;;;74496:128;;;;74643:13;74636:20;;;74151:513;;;;;:::o;85164:136::-;85243:4;85291:1;85267:21;85279:4;85285:2;85267:11;:21::i;:::-;:25;85260:32;;85164:136;;;;:::o;99497:265::-;99643:16;99662:12;:10;:12::i;:::-;99643:31;;99685:10;:21;99707:14;99723:8;99733:4;99739:3;99744:7;99685:67;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99630:132;99497:265;;;:::o;3291:191::-;3365:16;3384:6;;;;;;;;;;;3365:25;;3410:8;3401:6;;:17;;;;;;;;;;;;;;;;;;3465:8;3434:40;;3455:8;3434:40;;;;;;;;;;;;3354:128;3291:191;:::o;31206:158::-;31280:7;31331:22;31335:3;:10;;31347:5;31331:3;:22::i;:::-;31323:31;;31300:56;;31206:158;;;;:::o;99907:220::-;100047:10;:29;100077:14;100093:5;100100:8;100110;100047:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99907:220;;;:::o;79208:121::-;79281:4;79304;:17;;;;;;;;;;;;79297:24;;79208:121;;;:::o;92919:138::-;92981:7;93008:41;93031:14;93046:2;93008:22;:41::i;:::-;93001:48;;92919:138;;;:::o;30735:117::-;30798:7;30825:19;30833:3;:10;;30825:7;:19::i;:::-;30818:26;;30735:117;;;:::o;74738:186::-;74850:4;74874;:23;;:32;74898:7;74874:32;;;;;;;;;;;;;;;:42;74907:8;74874:42;;;;;;;;;;;;;;;;;;;;;;;;;74867:49;;74738:186;;;;;:::o;96762:315::-;96944:16;96963:12;:10;:12::i;:::-;96944:31;;96986:10;:28;97015:14;97030:8;97040:4;97046:2;97050;97054:6;97062:4;96986:81;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96931:146;96762:315;;;;;:::o;99014:233::-;99135:16;99154:12;:10;:12::i;:::-;99135:31;;99177:10;:16;99194:14;99210:8;99220:4;99226:2;99230:6;99177:60;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99122:125;99014:233;;;:::o;23825:414::-;23888:4;23910:21;23920:3;23925:5;23910:9;:21::i;:::-;23905:327;;23948:3;:11;;23965:5;23948:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24131:3;:11;;:18;;;;24109:3;:12;;:19;24122:5;24109:19;;;;;;;;;;;:40;;;;24171:4;24164:11;;;;23905:327;24215:5;24208:12;;23825:414;;;;;:::o;17096:204::-;17181:4;17220:32;17205:47;;;:11;:47;;;;:87;;;;17256:36;17280:11;17256:23;:36::i;:::-;17205:87;17198:94;;17096:204;;;:::o;12173:451::-;12248:13;12274:19;12319:1;12310:6;12306:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;12296:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12274:47;;12332:15;:6;12339:1;12332:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;12358;:6;12365:1;12358:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;12389:9;12414:1;12405:6;12401:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;12389:26;;12384:135;12421:1;12417;:5;12384:135;;;12456:12;12477:3;12469:5;:11;12456:25;;;;;;;:::i;:::-;;;;;12444:6;12451:1;12444:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;12506:1;12496:11;;;;;12424:3;;;;:::i;:::-;;;12384:135;;;;12546:1;12537:5;:10;12529:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;12609:6;12595:21;;;12173:451;;;;:::o;21811:239::-;21895:22;21903:4;21909:7;21895;:22::i;:::-;21891:152;;;21966:5;21934:6;:12;21941:4;21934:12;;;;;;;;;;;:20;;:29;21955:7;21934:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;22018:12;:10;:12::i;:::-;21991:40;;22009:7;21991:40;;22003:4;21991:40;;;;;;;;;;21891:152;21811:239;;:::o;30238:158::-;30311:4;30335:53;30343:3;:10;;30379:5;30363:23;;30355:32;;30335:7;:53::i;:::-;30328:60;;30238:158;;;;:::o;84926:140::-;85010:7;85037:4;:17;;:21;85055:2;85037:21;;;;;;;;;;;;85030:28;;84926:140;;;;:::o;26599:120::-;26666:7;26693:3;:11;;26705:5;26693:18;;;;;;;;:::i;:::-;;;;;;;;;;26686:25;;26599:120;;;;:::o;26136:109::-;26192:7;26219:3;:11;;:18;;;;26212:25;;26136:109;;;:::o;25921:129::-;25994:4;26041:1;26018:3;:12;;:19;26031:5;26018:19;;;;;;;;;;;;:24;;26011:31;;25921:129;;;;:::o;14373:157::-;14458:4;14497:25;14482:40;;;:11;:40;;;;14475:47;;14373:157;;;:::o;24415:1420::-;24481:4;24599:18;24620:3;:12;;:19;24633:5;24620:19;;;;;;;;;;;;24599:40;;24670:1;24656:10;:15;24652:1176;;25031:21;25068:1;25055:10;:14;;;;:::i;:::-;25031:38;;25084:17;25125:1;25104:3;:11;;:18;;;;:22;;;;:::i;:::-;25084:42;;25160:13;25147:9;:26;25143:405;;25194:17;25214:3;:11;;25226:9;25214:22;;;;;;;;:::i;:::-;;;;;;;;;;25194:42;;25368:9;25339:3;:11;;25351:13;25339:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;25479:10;25453:3;:12;;:23;25466:9;25453:23;;;;;;;;;;;:36;;;;25175:373;25143:405;25629:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25724:3;:12;;:19;25737:5;25724:19;;;;;;;;;;;25717:26;;;25767:4;25760:11;;;;;;;24652:1176;25811:5;25804:12;;;24415:1420;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:307::-;3561:1;3571:113;3585:6;3582:1;3579:13;3571:113;;;3670:1;3665:3;3661:11;3655:18;3651:1;3646:3;3642:11;3635:39;3607:2;3604:1;3600:10;3595:15;;3571:113;;;3702:6;3699:1;3696:13;3693:101;;;3782:1;3773:6;3768:3;3764:16;3757:27;3693:101;3542:258;3493:307;;;:::o;3806:102::-;3847:6;3898:2;3894:7;3889:2;3882:5;3878:14;3874:28;3864:38;;3806:102;;;:::o;3914:364::-;4002:3;4030:39;4063:5;4030:39;:::i;:::-;4085:71;4149:6;4144:3;4085:71;:::i;:::-;4078:78;;4165:52;4210:6;4205:3;4198:4;4191:5;4187:16;4165:52;:::i;:::-;4242:29;4264:6;4242:29;:::i;:::-;4237:3;4233:39;4226:46;;4006:272;3914:364;;;;:::o;4284:313::-;4397:4;4435:2;4424:9;4420:18;4412:26;;4484:9;4478:4;4474:20;4470:1;4459:9;4455:17;4448:47;4512:78;4585:4;4576:6;4512:78;:::i;:::-;4504:86;;4284:313;;;;:::o;4603:329::-;4662:6;4711:2;4699:9;4690:7;4686:23;4682:32;4679:119;;;4717:79;;:::i;:::-;4679:119;4837:1;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4808:117;4603:329;;;;:::o;4938:77::-;4975:7;5004:5;4993:16;;4938:77;;;:::o;5021:122::-;5094:24;5112:5;5094:24;:::i;:::-;5087:5;5084:35;5074:63;;5133:1;5130;5123:12;5074:63;5021:122;:::o;5149:139::-;5195:5;5233:6;5220:20;5211:29;;5249:33;5276:5;5249:33;:::i;:::-;5149:139;;;;:::o;5294:329::-;5353:6;5402:2;5390:9;5381:7;5377:23;5373:32;5370:119;;;5408:79;;:::i;:::-;5370:119;5528:1;5553:53;5598:7;5589:6;5578:9;5574:22;5553:53;:::i;:::-;5543:63;;5499:117;5294:329;;;;:::o;5629:118::-;5716:24;5734:5;5716:24;:::i;:::-;5711:3;5704:37;5629:118;;:::o;5753:222::-;5846:4;5884:2;5873:9;5869:18;5861:26;;5897:71;5965:1;5954:9;5950:17;5941:6;5897:71;:::i;:::-;5753:222;;;;:::o;5981:117::-;6090:1;6087;6080:12;6104:180;6152:77;6149:1;6142:88;6249:4;6246:1;6239:15;6273:4;6270:1;6263:15;6290:281;6373:27;6395:4;6373:27;:::i;:::-;6365:6;6361:40;6503:6;6491:10;6488:22;6467:18;6455:10;6452:34;6449:62;6446:88;;;6514:18;;:::i;:::-;6446:88;6554:10;6550:2;6543:22;6333:238;6290:281;;:::o;6577:129::-;6611:6;6638:20;;:::i;:::-;6628:30;;6667:33;6695:4;6687:6;6667:33;:::i;:::-;6577:129;;;:::o;6712:311::-;6789:4;6879:18;6871:6;6868:30;6865:56;;;6901:18;;:::i;:::-;6865:56;6951:4;6943:6;6939:17;6931:25;;7011:4;7005;7001:15;6993:23;;6712:311;;;:::o;7029:117::-;7138:1;7135;7128:12;7169:710;7265:5;7290:81;7306:64;7363:6;7306:64;:::i;:::-;7290:81;:::i;:::-;7281:90;;7391:5;7420:6;7413:5;7406:21;7454:4;7447:5;7443:16;7436:23;;7507:4;7499:6;7495:17;7487:6;7483:30;7536:3;7528:6;7525:15;7522:122;;;7555:79;;:::i;:::-;7522:122;7670:6;7653:220;7687:6;7682:3;7679:15;7653:220;;;7762:3;7791:37;7824:3;7812:10;7791:37;:::i;:::-;7786:3;7779:50;7858:4;7853:3;7849:14;7842:21;;7729:144;7713:4;7708:3;7704:14;7697:21;;7653:220;;;7657:21;7271:608;;7169:710;;;;;:::o;7902:370::-;7973:5;8022:3;8015:4;8007:6;8003:17;7999:27;7989:122;;8030:79;;:::i;:::-;7989:122;8147:6;8134:20;8172:94;8262:3;8254:6;8247:4;8239:6;8235:17;8172:94;:::i;:::-;8163:103;;7979:293;7902:370;;;;:::o;8278:117::-;8387:1;8384;8377:12;8401:307;8462:4;8552:18;8544:6;8541:30;8538:56;;;8574:18;;:::i;:::-;8538:56;8612:29;8634:6;8612:29;:::i;:::-;8604:37;;8696:4;8690;8686:15;8678:23;;8401:307;;;:::o;8714:154::-;8798:6;8793:3;8788;8775:30;8860:1;8851:6;8846:3;8842:16;8835:27;8714:154;;;:::o;8874:410::-;8951:5;8976:65;8992:48;9033:6;8992:48;:::i;:::-;8976:65;:::i;:::-;8967:74;;9064:6;9057:5;9050:21;9102:4;9095:5;9091:16;9140:3;9131:6;9126:3;9122:16;9119:25;9116:112;;;9147:79;;:::i;:::-;9116:112;9237:41;9271:6;9266:3;9261;9237:41;:::i;:::-;8957:327;8874:410;;;;;:::o;9303:338::-;9358:5;9407:3;9400:4;9392:6;9388:17;9384:27;9374:122;;9415:79;;:::i;:::-;9374:122;9532:6;9519:20;9557:78;9631:3;9623:6;9616:4;9608:6;9604:17;9557:78;:::i;:::-;9548:87;;9364:277;9303:338;;;;:::o;9647:1509::-;9801:6;9809;9817;9825;9833;9882:3;9870:9;9861:7;9857:23;9853:33;9850:120;;;9889:79;;:::i;:::-;9850:120;10009:1;10034:53;10079:7;10070:6;10059:9;10055:22;10034:53;:::i;:::-;10024:63;;9980:117;10136:2;10162:53;10207:7;10198:6;10187:9;10183:22;10162:53;:::i;:::-;10152:63;;10107:118;10292:2;10281:9;10277:18;10264:32;10323:18;10315:6;10312:30;10309:117;;;10345:79;;:::i;:::-;10309:117;10450:78;10520:7;10511:6;10500:9;10496:22;10450:78;:::i;:::-;10440:88;;10235:303;10605:2;10594:9;10590:18;10577:32;10636:18;10628:6;10625:30;10622:117;;;10658:79;;:::i;:::-;10622:117;10763:78;10833:7;10824:6;10813:9;10809:22;10763:78;:::i;:::-;10753:88;;10548:303;10918:3;10907:9;10903:19;10890:33;10950:18;10942:6;10939:30;10936:117;;;10972:79;;:::i;:::-;10936:117;11077:62;11131:7;11122:6;11111:9;11107:22;11077:62;:::i;:::-;11067:72;;10861:288;9647:1509;;;;;;;;:::o;11162:474::-;11230:6;11238;11287:2;11275:9;11266:7;11262:23;11258:32;11255:119;;;11293:79;;:::i;:::-;11255:119;11413:1;11438:53;11483:7;11474:6;11463:9;11459:22;11438:53;:::i;:::-;11428:63;;11384:117;11540:2;11566:53;11611:7;11602:6;11591:9;11587:22;11566:53;:::i;:::-;11556:63;;11511:118;11162:474;;;;;:::o;11642:311::-;11719:4;11809:18;11801:6;11798:30;11795:56;;;11831:18;;:::i;:::-;11795:56;11881:4;11873:6;11869:17;11861:25;;11941:4;11935;11931:15;11923:23;;11642:311;;;:::o;11976:710::-;12072:5;12097:81;12113:64;12170:6;12113:64;:::i;:::-;12097:81;:::i;:::-;12088:90;;12198:5;12227:6;12220:5;12213:21;12261:4;12254:5;12250:16;12243:23;;12314:4;12306:6;12302:17;12294:6;12290:30;12343:3;12335:6;12332:15;12329:122;;;12362:79;;:::i;:::-;12329:122;12477:6;12460:220;12494:6;12489:3;12486:15;12460:220;;;12569:3;12598:37;12631:3;12619:10;12598:37;:::i;:::-;12593:3;12586:50;12665:4;12660:3;12656:14;12649:21;;12536:144;12520:4;12515:3;12511:14;12504:21;;12460:220;;;12464:21;12078:608;;11976:710;;;;;:::o;12709:370::-;12780:5;12829:3;12822:4;12814:6;12810:17;12806:27;12796:122;;12837:79;;:::i;:::-;12796:122;12954:6;12941:20;12979:94;13069:3;13061:6;13054:4;13046:6;13042:17;12979:94;:::i;:::-;12970:103;;12786:293;12709:370;;;;:::o;13085:894::-;13203:6;13211;13260:2;13248:9;13239:7;13235:23;13231:32;13228:119;;;13266:79;;:::i;:::-;13228:119;13414:1;13403:9;13399:17;13386:31;13444:18;13436:6;13433:30;13430:117;;;13466:79;;:::i;:::-;13430:117;13571:78;13641:7;13632:6;13621:9;13617:22;13571:78;:::i;:::-;13561:88;;13357:302;13726:2;13715:9;13711:18;13698:32;13757:18;13749:6;13746:30;13743:117;;;13779:79;;:::i;:::-;13743:117;13884:78;13954:7;13945:6;13934:9;13930:22;13884:78;:::i;:::-;13874:88;;13669:303;13085:894;;;;;:::o;13985:114::-;14052:6;14086:5;14080:12;14070:22;;13985:114;;;:::o;14105:184::-;14204:11;14238:6;14233:3;14226:19;14278:4;14273:3;14269:14;14254:29;;14105:184;;;;:::o;14295:132::-;14362:4;14385:3;14377:11;;14415:4;14410:3;14406:14;14398:22;;14295:132;;;:::o;14433:108::-;14510:24;14528:5;14510:24;:::i;:::-;14505:3;14498:37;14433:108;;:::o;14547:179::-;14616:10;14637:46;14679:3;14671:6;14637:46;:::i;:::-;14715:4;14710:3;14706:14;14692:28;;14547:179;;;;:::o;14732:113::-;14802:4;14834;14829:3;14825:14;14817:22;;14732:113;;;:::o;14881:732::-;15000:3;15029:54;15077:5;15029:54;:::i;:::-;15099:86;15178:6;15173:3;15099:86;:::i;:::-;15092:93;;15209:56;15259:5;15209:56;:::i;:::-;15288:7;15319:1;15304:284;15329:6;15326:1;15323:13;15304:284;;;15405:6;15399:13;15432:63;15491:3;15476:13;15432:63;:::i;:::-;15425:70;;15518:60;15571:6;15518:60;:::i;:::-;15508:70;;15364:224;15351:1;15348;15344:9;15339:14;;15304:284;;;15308:14;15604:3;15597:10;;15005:608;;;14881:732;;;;:::o;15619:373::-;15762:4;15800:2;15789:9;15785:18;15777:26;;15849:9;15843:4;15839:20;15835:1;15824:9;15820:17;15813:47;15877:108;15980:4;15971:6;15877:108;:::i;:::-;15869:116;;15619:373;;;;:::o;15998:1039::-;16125:6;16133;16141;16190:2;16178:9;16169:7;16165:23;16161:32;16158:119;;;16196:79;;:::i;:::-;16158:119;16316:1;16341:53;16386:7;16377:6;16366:9;16362:22;16341:53;:::i;:::-;16331:63;;16287:117;16471:2;16460:9;16456:18;16443:32;16502:18;16494:6;16491:30;16488:117;;;16524:79;;:::i;:::-;16488:117;16629:78;16699:7;16690:6;16679:9;16675:22;16629:78;:::i;:::-;16619:88;;16414:303;16784:2;16773:9;16769:18;16756:32;16815:18;16807:6;16804:30;16801:117;;;16837:79;;:::i;:::-;16801:117;16942:78;17012:7;17003:6;16992:9;16988:22;16942:78;:::i;:::-;16932:88;;16727:303;15998:1039;;;;;:::o;17043:118::-;17130:24;17148:5;17130:24;:::i;:::-;17125:3;17118:37;17043:118;;:::o;17167:222::-;17260:4;17298:2;17287:9;17283:18;17275:26;;17311:71;17379:1;17368:9;17364:17;17355:6;17311:71;:::i;:::-;17167:222;;;;:::o;17395:474::-;17463:6;17471;17520:2;17508:9;17499:7;17495:23;17491:32;17488:119;;;17526:79;;:::i;:::-;17488:119;17646:1;17671:53;17716:7;17707:6;17696:9;17692:22;17671:53;:::i;:::-;17661:63;;17617:117;17773:2;17799:53;17844:7;17835:6;17824:9;17820:22;17799:53;:::i;:::-;17789:63;;17744:118;17395:474;;;;;:::o;17875:116::-;17945:21;17960:5;17945:21;:::i;:::-;17938:5;17935:32;17925:60;;17981:1;17978;17971:12;17925:60;17875:116;:::o;17997:133::-;18040:5;18078:6;18065:20;18056:29;;18094:30;18118:5;18094:30;:::i;:::-;17997:133;;;;:::o;18136:468::-;18201:6;18209;18258:2;18246:9;18237:7;18233:23;18229:32;18226:119;;;18264:79;;:::i;:::-;18226:119;18384:1;18409:53;18454:7;18445:6;18434:9;18430:22;18409:53;:::i;:::-;18399:63;;18355:117;18511:2;18537:50;18579:7;18570:6;18559:9;18555:22;18537:50;:::i;:::-;18527:60;;18482:115;18136:468;;;;;:::o;18610:474::-;18678:6;18686;18735:2;18723:9;18714:7;18710:23;18706:32;18703:119;;;18741:79;;:::i;:::-;18703:119;18861:1;18886:53;18931:7;18922:6;18911:9;18907:22;18886:53;:::i;:::-;18876:63;;18832:117;18988:2;19014:53;19059:7;19050:6;19039:9;19035:22;19014:53;:::i;:::-;19004:63;;18959:118;18610:474;;;;;:::o;19090:1089::-;19194:6;19202;19210;19218;19226;19275:3;19263:9;19254:7;19250:23;19246:33;19243:120;;;19282:79;;:::i;:::-;19243:120;19402:1;19427:53;19472:7;19463:6;19452:9;19448:22;19427:53;:::i;:::-;19417:63;;19373:117;19529:2;19555:53;19600:7;19591:6;19580:9;19576:22;19555:53;:::i;:::-;19545:63;;19500:118;19657:2;19683:53;19728:7;19719:6;19708:9;19704:22;19683:53;:::i;:::-;19673:63;;19628:118;19785:2;19811:53;19856:7;19847:6;19836:9;19832:22;19811:53;:::i;:::-;19801:63;;19756:118;19941:3;19930:9;19926:19;19913:33;19973:18;19965:6;19962:30;19959:117;;;19995:79;;:::i;:::-;19959:117;20100:62;20154:7;20145:6;20134:9;20130:22;20100:62;:::i;:::-;20090:72;;19884:288;19090:1089;;;;;;;;:::o;20185:329::-;20244:6;20293:2;20281:9;20272:7;20268:23;20264:32;20261:119;;;20299:79;;:::i;:::-;20261:119;20419:1;20444:53;20489:7;20480:6;20469:9;20465:22;20444:53;:::i;:::-;20434:63;;20390:117;20185:329;;;;:::o;20520:619::-;20597:6;20605;20613;20662:2;20650:9;20641:7;20637:23;20633:32;20630:119;;;20668:79;;:::i;:::-;20630:119;20788:1;20813:53;20858:7;20849:6;20838:9;20834:22;20813:53;:::i;:::-;20803:63;;20759:117;20915:2;20941:53;20986:7;20977:6;20966:9;20962:22;20941:53;:::i;:::-;20931:63;;20886:118;21043:2;21069:53;21114:7;21105:6;21094:9;21090:22;21069:53;:::i;:::-;21059:63;;21014:118;20520:619;;;;;:::o;21145:180::-;21193:77;21190:1;21183:88;21290:4;21287:1;21280:15;21314:4;21311:1;21304:15;21331:320;21375:6;21412:1;21406:4;21402:12;21392:22;;21459:1;21453:4;21449:12;21480:18;21470:81;;21536:4;21528:6;21524:17;21514:27;;21470:81;21598:2;21590:6;21587:14;21567:18;21564:38;21561:84;;21617:18;;:::i;:::-;21561:84;21382:269;21331:320;;;:::o;21657:135::-;21780:5;21775:3;21768:18;21657:135;;:::o;21798:126::-;21893:24;21911:5;21893:24;:::i;:::-;21888:3;21881:37;21798:126;;:::o;21930:412::-;22087:4;22125:2;22114:9;22110:18;22102:26;;22138:107;22242:1;22231:9;22227:17;22218:6;22138:107;:::i;:::-;22255:80;22331:2;22320:9;22316:18;22307:6;22255:80;:::i;:::-;21930:412;;;;;:::o;22348:308::-;22410:4;22500:18;22492:6;22489:30;22486:56;;;22522:18;;:::i;:::-;22486:56;22560:29;22582:6;22560:29;:::i;:::-;22552:37;;22644:4;22638;22634:15;22626:23;;22348:308;;;:::o;22662:421::-;22751:5;22776:66;22792:49;22834:6;22792:49;:::i;:::-;22776:66;:::i;:::-;22767:75;;22865:6;22858:5;22851:21;22903:4;22896:5;22892:16;22941:3;22932:6;22927:3;22923:16;22920:25;22917:112;;;22948:79;;:::i;:::-;22917:112;23038:39;23070:6;23065:3;23060;23038:39;:::i;:::-;22757:326;22662:421;;;;;:::o;23103:355::-;23170:5;23219:3;23212:4;23204:6;23200:17;23196:27;23186:122;;23227:79;;:::i;:::-;23186:122;23337:6;23331:13;23362:90;23448:3;23440:6;23433:4;23425:6;23421:17;23362:90;:::i;:::-;23353:99;;23176:282;23103:355;;;;:::o;23464:524::-;23544:6;23593:2;23581:9;23572:7;23568:23;23564:32;23561:119;;;23599:79;;:::i;:::-;23561:119;23740:1;23729:9;23725:17;23719:24;23770:18;23762:6;23759:30;23756:117;;;23792:79;;:::i;:::-;23756:117;23897:74;23963:7;23954:6;23943:9;23939:22;23897:74;:::i;:::-;23887:84;;23690:291;23464:524;;;;:::o;23994:233::-;24134:34;24130:1;24122:6;24118:14;24111:58;24203:16;24198:2;24190:6;24186:15;24179:41;23994:233;:::o;24233:366::-;24375:3;24396:67;24460:2;24455:3;24396:67;:::i;:::-;24389:74;;24472:93;24561:3;24472:93;:::i;:::-;24590:2;24585:3;24581:12;24574:19;;24233:366;;;:::o;24605:419::-;24771:4;24809:2;24798:9;24794:18;24786:26;;24858:9;24852:4;24848:20;24844:1;24833:9;24829:17;24822:47;24886:131;25012:4;24886:131;:::i;:::-;24878:139;;24605:419;;;:::o;25030:237::-;25170:34;25166:1;25158:6;25154:14;25147:58;25239:20;25234:2;25226:6;25222:15;25215:45;25030:237;:::o;25273:366::-;25415:3;25436:67;25500:2;25495:3;25436:67;:::i;:::-;25429:74;;25512:93;25601:3;25512:93;:::i;:::-;25630:2;25625:3;25621:12;25614:19;;25273:366;;;:::o;25645:419::-;25811:4;25849:2;25838:9;25834:18;25826:26;;25898:9;25892:4;25888:20;25884:1;25873:9;25869:17;25862:47;25926:131;26052:4;25926:131;:::i;:::-;25918:139;;25645:419;;;:::o;26070:294::-;26199:4;26237:2;26226:9;26222:18;26214:26;;26250:107;26354:1;26343:9;26339:17;26330:6;26250:107;:::i;:::-;26070:294;;;;:::o;26370:234::-;26510:34;26506:1;26498:6;26494:14;26487:58;26579:17;26574:2;26566:6;26562:15;26555:42;26370:234;:::o;26610:366::-;26752:3;26773:67;26837:2;26832:3;26773:67;:::i;:::-;26766:74;;26849:93;26938:3;26849:93;:::i;:::-;26967:2;26962:3;26958:12;26951:19;;26610:366;;;:::o;26982:419::-;27148:4;27186:2;27175:9;27171:18;27163:26;;27235:9;27229:4;27225:20;27221:1;27210:9;27206:17;27199:47;27263:131;27389:4;27263:131;:::i;:::-;27255:139;;26982:419;;;:::o;27407:246::-;27547:34;27543:1;27535:6;27531:14;27524:58;27616:29;27611:2;27603:6;27599:15;27592:54;27407:246;:::o;27659:366::-;27801:3;27822:67;27886:2;27881:3;27822:67;:::i;:::-;27815:74;;27898:93;27987:3;27898:93;:::i;:::-;28016:2;28011:3;28007:12;28000:19;;27659:366;;;:::o;28031:419::-;28197:4;28235:2;28224:9;28220:18;28212:26;;28284:9;28278:4;28274:20;28270:1;28259:9;28255:17;28248:47;28312:131;28438:4;28312:131;:::i;:::-;28304:139;;28031:419;;;:::o;28456:126::-;28551:24;28569:5;28551:24;:::i;:::-;28546:3;28539:37;28456:126;;:::o;28588:412::-;28745:4;28783:2;28772:9;28768:18;28760:26;;28796:107;28900:1;28889:9;28885:17;28876:6;28796:107;:::i;:::-;28913:80;28989:2;28978:9;28974:18;28965:6;28913:80;:::i;:::-;28588:412;;;;;:::o;29006:294::-;29146:34;29142:1;29134:6;29130:14;29123:58;29215:34;29210:2;29202:6;29198:15;29191:59;29284:8;29279:2;29271:6;29267:15;29260:33;29006:294;:::o;29306:366::-;29448:3;29469:67;29533:2;29528:3;29469:67;:::i;:::-;29462:74;;29545:93;29634:3;29545:93;:::i;:::-;29663:2;29658:3;29654:12;29647:19;;29306:366;;;:::o;29678:419::-;29844:4;29882:2;29871:9;29867:18;29859:26;;29931:9;29925:4;29921:20;29917:1;29906:9;29902:17;29895:47;29959:131;30085:4;29959:131;:::i;:::-;29951:139;;29678:419;;;:::o;30103:182::-;30243:34;30239:1;30231:6;30227:14;30220:58;30103:182;:::o;30291:366::-;30433:3;30454:67;30518:2;30513:3;30454:67;:::i;:::-;30447:74;;30530:93;30619:3;30530:93;:::i;:::-;30648:2;30643:3;30639:12;30632:19;;30291:366;;;:::o;30663:419::-;30829:4;30867:2;30856:9;30852:18;30844:26;;30916:9;30910:4;30906:20;30902:1;30891:9;30887:17;30880:47;30944:131;31070:4;30944:131;:::i;:::-;30936:139;;30663:419;;;:::o;31088:244::-;31228:34;31224:1;31216:6;31212:14;31205:58;31297:27;31292:2;31284:6;31280:15;31273:52;31088:244;:::o;31338:366::-;31480:3;31501:67;31565:2;31560:3;31501:67;:::i;:::-;31494:74;;31577:93;31666:3;31577:93;:::i;:::-;31695:2;31690:3;31686:12;31679:19;;31338:366;;;:::o;31710:419::-;31876:4;31914:2;31903:9;31899:18;31891:26;;31963:9;31957:4;31953:20;31949:1;31938:9;31934:17;31927:47;31991:131;32117:4;31991:131;:::i;:::-;31983:139;;31710:419;;;:::o;32135:164::-;32275:16;32271:1;32263:6;32259:14;32252:40;32135:164;:::o;32305:366::-;32447:3;32468:67;32532:2;32527:3;32468:67;:::i;:::-;32461:74;;32544:93;32633:3;32544:93;:::i;:::-;32662:2;32657:3;32653:12;32646:19;;32305:366;;;:::o;32677:419::-;32843:4;32881:2;32870:9;32866:18;32858:26;;32930:9;32924:4;32920:20;32916:1;32905:9;32901:17;32894:47;32958:131;33084:4;32958:131;:::i;:::-;32950:139;;32677:419;;;:::o;33102:181::-;33242:33;33238:1;33230:6;33226:14;33219:57;33102:181;:::o;33289:366::-;33431:3;33452:67;33516:2;33511:3;33452:67;:::i;:::-;33445:74;;33528:93;33617:3;33528:93;:::i;:::-;33646:2;33641:3;33637:12;33630:19;;33289:366;;;:::o;33661:419::-;33827:4;33865:2;33854:9;33850:18;33842:26;;33914:9;33908:4;33904:20;33900:1;33889:9;33885:17;33878:47;33942:131;34068:4;33942:131;:::i;:::-;33934:139;;33661:419;;;:::o;34086:180::-;34134:77;34131:1;34124:88;34231:4;34228:1;34221:15;34255:4;34252:1;34245:15;34272:348;34312:7;34335:20;34353:1;34335:20;:::i;:::-;34330:25;;34369:20;34387:1;34369:20;:::i;:::-;34364:25;;34557:1;34489:66;34485:74;34482:1;34479:81;34474:1;34467:9;34460:17;34456:105;34453:131;;;34564:18;;:::i;:::-;34453:131;34612:1;34609;34605:9;34594:20;;34272:348;;;;:::o;34626:182::-;34766:34;34762:1;34754:6;34750:14;34743:58;34626:182;:::o;34814:366::-;34956:3;34977:67;35041:2;35036:3;34977:67;:::i;:::-;34970:74;;35053:93;35142:3;35053:93;:::i;:::-;35171:2;35166:3;35162:12;35155:19;;34814:366;;;:::o;35186:419::-;35352:4;35390:2;35379:9;35375:18;35367:26;;35439:9;35433:4;35429:20;35425:1;35414:9;35410:17;35403:47;35467:131;35593:4;35467:131;:::i;:::-;35459:139;;35186:419;;;:::o;35611:649::-;35824:4;35862:3;35851:9;35847:19;35839:27;;35876:107;35980:1;35969:9;35965:17;35956:6;35876:107;:::i;:::-;35993:80;36069:2;36058:9;36054:18;36045:6;35993:80;:::i;:::-;36083;36159:2;36148:9;36144:18;36135:6;36083:80;:::i;:::-;36173;36249:2;36238:9;36234:18;36225:6;36173:80;:::i;:::-;35611:649;;;;;;;:::o;36266:225::-;36406:34;36402:1;36394:6;36390:14;36383:58;36475:8;36470:2;36462:6;36458:15;36451:33;36266:225;:::o;36497:366::-;36639:3;36660:67;36724:2;36719:3;36660:67;:::i;:::-;36653:74;;36736:93;36825:3;36736:93;:::i;:::-;36854:2;36849:3;36845:12;36838:19;;36497:366;;;:::o;36869:419::-;37035:4;37073:2;37062:9;37058:18;37050:26;;37122:9;37116:4;37112:20;37108:1;37097:9;37093:17;37086:47;37150:131;37276:4;37150:131;:::i;:::-;37142:139;;36869:419;;;:::o;37294:229::-;37434:34;37430:1;37422:6;37418:14;37411:58;37503:12;37498:2;37490:6;37486:15;37479:37;37294:229;:::o;37529:366::-;37671:3;37692:67;37756:2;37751:3;37692:67;:::i;:::-;37685:74;;37768:93;37857:3;37768:93;:::i;:::-;37886:2;37881:3;37877:12;37870:19;;37529:366;;;:::o;37901:419::-;38067:4;38105:2;38094:9;38090:18;38082:26;;38154:9;38148:4;38144:20;38140:1;38129:9;38125:17;38118:47;38182:131;38308:4;38182:131;:::i;:::-;38174:139;;37901:419;;;:::o;38326:192::-;38433:11;38467:6;38462:3;38455:19;38507:4;38502:3;38498:14;38483:29;;38326:192;;;;:::o;38524:116::-;38609:24;38627:5;38609:24;:::i;:::-;38604:3;38597:37;38524:116;;:::o;38646:195::-;38723:10;38744:54;38794:3;38786:6;38744:54;:::i;:::-;38830:4;38825:3;38821:14;38807:28;;38646:195;;;;:::o;38877:756::-;39004:3;39033:54;39081:5;39033:54;:::i;:::-;39103:94;39190:6;39185:3;39103:94;:::i;:::-;39096:101;;39221:56;39271:5;39221:56;:::i;:::-;39300:7;39331:1;39316:292;39341:6;39338:1;39335:13;39316:292;;;39417:6;39411:13;39444:71;39511:3;39496:13;39444:71;:::i;:::-;39437:78;;39538:60;39591:6;39538:60;:::i;:::-;39528:70;;39376:232;39363:1;39360;39356:9;39351:14;;39316:292;;;39320:14;39624:3;39617:10;;39009:624;;;38877:756;;;;:::o;39639:98::-;39690:6;39724:5;39718:12;39708:22;;39639:98;;;:::o;39743:176::-;39834:11;39868:6;39863:3;39856:19;39908:4;39903:3;39899:14;39884:29;;39743:176;;;;:::o;39925:376::-;40019:3;40047:38;40079:5;40047:38;:::i;:::-;40101:78;40172:6;40167:3;40101:78;:::i;:::-;40094:85;;40188:52;40233:6;40228:3;40221:4;40214:5;40210:16;40188:52;:::i;:::-;40265:29;40287:6;40265:29;:::i;:::-;40260:3;40256:39;40249:46;;40023:278;39925:376;;;;:::o;40307:1395::-;40722:4;40760:3;40749:9;40745:19;40737:27;;40774:107;40878:1;40867:9;40863:17;40854:6;40774:107;:::i;:::-;40891:80;40967:2;40956:9;40952:18;40943:6;40891:80;:::i;:::-;40981;41057:2;41046:9;41042:18;41033:6;40981:80;:::i;:::-;41071;41147:2;41136:9;41132:18;41123:6;41071:80;:::i;:::-;41199:9;41193:4;41189:20;41183:3;41172:9;41168:19;41161:49;41227:116;41338:4;41329:6;41227:116;:::i;:::-;41219:124;;41391:9;41385:4;41381:20;41375:3;41364:9;41360:19;41353:49;41419:116;41530:4;41521:6;41419:116;:::i;:::-;41411:124;;41583:9;41577:4;41573:20;41567:3;41556:9;41552:19;41545:49;41611:84;41690:4;41681:6;41611:84;:::i;:::-;41603:92;;40307:1395;;;;;;;;;;:::o;41708:148::-;41810:11;41847:3;41832:18;;41708:148;;;;:::o;41862:173::-;42002:25;41998:1;41990:6;41986:14;41979:49;41862:173;:::o;42041:402::-;42201:3;42222:85;42304:2;42299:3;42222:85;:::i;:::-;42215:92;;42316:93;42405:3;42316:93;:::i;:::-;42434:2;42429:3;42425:12;42418:19;;42041:402;;;:::o;42449:377::-;42555:3;42583:39;42616:5;42583:39;:::i;:::-;42638:89;42720:6;42715:3;42638:89;:::i;:::-;42631:96;;42736:52;42781:6;42776:3;42769:4;42762:5;42758:16;42736:52;:::i;:::-;42813:6;42808:3;42804:16;42797:23;;42559:267;42449:377;;;;:::o;42832:167::-;42972:19;42968:1;42960:6;42956:14;42949:43;42832:167;:::o;43005:402::-;43165:3;43186:85;43268:2;43263:3;43186:85;:::i;:::-;43179:92;;43280:93;43369:3;43280:93;:::i;:::-;43398:2;43393:3;43389:12;43382:19;;43005:402;;;:::o;43413:967::-;43795:3;43817:148;43961:3;43817:148;:::i;:::-;43810:155;;43982:95;44073:3;44064:6;43982:95;:::i;:::-;43975:102;;44094:148;44238:3;44094:148;:::i;:::-;44087:155;;44259:95;44350:3;44341:6;44259:95;:::i;:::-;44252:102;;44371:3;44364:10;;43413:967;;;;;:::o;44386:228::-;44526:34;44522:1;44514:6;44510:14;44503:58;44595:11;44590:2;44582:6;44578:15;44571:36;44386:228;:::o;44620:366::-;44762:3;44783:67;44847:2;44842:3;44783:67;:::i;:::-;44776:74;;44859:93;44948:3;44859:93;:::i;:::-;44977:2;44972:3;44968:12;44961:19;;44620:366;;;:::o;44992:419::-;45158:4;45196:2;45185:9;45181:18;45173:26;;45245:9;45239:4;45235:20;45231:1;45220:9;45216:17;45209:47;45273:131;45399:4;45273:131;:::i;:::-;45265:139;;44992:419;;;:::o;45417:180::-;45465:77;45462:1;45455:88;45562:4;45559:1;45552:15;45586:4;45583:1;45576:15;45603:233;45642:3;45665:24;45683:5;45665:24;:::i;:::-;45656:33;;45711:66;45704:5;45701:77;45698:103;;45781:18;;:::i;:::-;45698:103;45828:1;45821:5;45817:13;45810:20;;45603:233;;;:::o;45842:1070::-;46183:4;46221:3;46210:9;46206:19;46198:27;;46235:107;46339:1;46328:9;46324:17;46315:6;46235:107;:::i;:::-;46352:80;46428:2;46417:9;46413:18;46404:6;46352:80;:::i;:::-;46442;46518:2;46507:9;46503:18;46494:6;46442:80;:::i;:::-;46569:9;46563:4;46559:20;46554:2;46543:9;46539:18;46532:48;46597:116;46708:4;46699:6;46597:116;:::i;:::-;46589:124;;46761:9;46755:4;46751:20;46745:3;46734:9;46730:19;46723:49;46789:116;46900:4;46891:6;46789:116;:::i;:::-;46781:124;;45842:1070;;;;;;;;:::o;46918:117::-;47007:21;47022:5;47007:21;:::i;:::-;47002:3;46995:34;46918:117;;:::o;47041:637::-;47248:4;47286:3;47275:9;47271:19;47263:27;;47300:107;47404:1;47393:9;47389:17;47380:6;47300:107;:::i;:::-;47417:80;47493:2;47482:9;47478:18;47469:6;47417:80;:::i;:::-;47507;47583:2;47572:9;47568:18;47559:6;47507:80;:::i;:::-;47597:74;47667:2;47656:9;47652:18;47643:6;47597:74;:::i;:::-;47041:637;;;;;;;:::o;47684:1093::-;47999:4;48037:3;48026:9;48022:19;48014:27;;48051:107;48155:1;48144:9;48140:17;48131:6;48051:107;:::i;:::-;48168:80;48244:2;48233:9;48229:18;48220:6;48168:80;:::i;:::-;48258;48334:2;48323:9;48319:18;48310:6;48258:80;:::i;:::-;48348;48424:2;48413:9;48409:18;48400:6;48348:80;:::i;:::-;48438:81;48514:3;48503:9;48499:19;48490:6;48438:81;:::i;:::-;48529;48605:3;48594:9;48590:19;48581:6;48529:81;:::i;:::-;48658:9;48652:4;48648:20;48642:3;48631:9;48627:19;48620:49;48686:84;48765:4;48756:6;48686:84;:::i;:::-;48678:92;;47684:1093;;;;;;;;;;:::o;48783:768::-;49024:4;49062:3;49051:9;49047:19;49039:27;;49076:107;49180:1;49169:9;49165:17;49156:6;49076:107;:::i;:::-;49193:80;49269:2;49258:9;49254:18;49245:6;49193:80;:::i;:::-;49283;49359:2;49348:9;49344:18;49335:6;49283:80;:::i;:::-;49373;49449:2;49438:9;49434:18;49425:6;49373:80;:::i;:::-;49463:81;49539:3;49528:9;49524:19;49515:6;49463:81;:::i;:::-;48783:768;;;;;;;;:::o;49557:305::-;49597:3;49616:20;49634:1;49616:20;:::i;:::-;49611:25;;49650:20;49668:1;49650:20;:::i;:::-;49645:25;;49804:1;49736:66;49732:74;49729:1;49726:81;49723:107;;;49810:18;;:::i;:::-;49723:107;49854:1;49851;49847:9;49840:16;;49557:305;;;;:::o;49868:171::-;49907:3;49930:24;49948:5;49930:24;:::i;:::-;49921:33;;49976:4;49969:5;49966:15;49963:41;;49984:18;;:::i;:::-;49963:41;50031:1;50024:5;50020:13;50013:20;;49868:171;;;:::o;50045:182::-;50185:34;50181:1;50173:6;50169:14;50162:58;50045:182;:::o;50233:366::-;50375:3;50396:67;50460:2;50455:3;50396:67;:::i;:::-;50389:74;;50472:93;50561:3;50472:93;:::i;:::-;50590:2;50585:3;50581:12;50574:19;;50233:366;;;:::o;50605:419::-;50771:4;50809:2;50798:9;50794:18;50786:26;;50858:9;50852:4;50848:20;50844:1;50833:9;50829:17;50822:47;50886:131;51012:4;50886:131;:::i;:::-;50878:139;;50605:419;;;:::o;51030:191::-;51070:4;51090:20;51108:1;51090:20;:::i;:::-;51085:25;;51124:20;51142:1;51124:20;:::i;:::-;51119:25;;51163:1;51160;51157:8;51154:34;;;51168:18;;:::i;:::-;51154:34;51213:1;51210;51206:9;51198:17;;51030:191;;;;:::o;51227:180::-;51275:77;51272:1;51265:88;51372:4;51369:1;51362:15;51396:4;51393:1;51386:15
Swarm Source
ipfs://69b479a587a8ffd850385e1ef833e5095c32e4ef0b44ee9fa511c38489cff683
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.