More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 2 from a total of 2 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 296300660 | 95 days ago | IN | 0 ETH | 0.00000073 | ||||
Approve | 268862700 | 175 days ago | IN | 0 ETH | 0.00000083 |
Loading...
Loading
Contract Name:
MTS
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2023-03-28 */ // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.7.0) (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. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ 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; /// @solidity memory-safe-assembly 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; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/utils/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: @openzeppelin/contracts/utils/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: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/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: @openzeppelin/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: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (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); _; } /** * @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 virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @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 virtual { 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 virtual 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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ 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`. * * May emit a {RoleRevoked} event. */ 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. * * May emit a {RoleGranted} event. * * [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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/AccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (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 virtual 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 virtual 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: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: contracts/SecurityBase.sol pragma solidity ^0.8.17; contract SecurityBase is AccessControlEnumerable, Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); modifier onlyMinter() { _checkRole(MINTER_ROLE, _msgSender()); _; } modifier onlyAdmin() { _checkRole(DEFAULT_ADMIN_ROLE, _msgSender()); _; } constructor() { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); } function pause() external onlyMinter { _pause(); } function unpause() external onlyMinter { _unpause(); } function grantMinter(address account) external virtual onlyMinter { _setupRole(MINTER_ROLE, account); } function revokeMinter(address account) external virtual onlyMinter { _revokeRole(MINTER_ROLE, account); } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable) returns (bool) { return super.supportsInterface(interfaceId); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC20Pausable is ERC20, Pausable { /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: contracts/MTS.sol pragma solidity ^0.8.17; // MTS: Moon touch symbol contract MTS is ERC20, ERC20Pausable, ERC20Burnable, SecurityBase { string constant TOKEN_NAME = "Moon Touch Symbol"; string constant TOKEN_SYMBOL = "MTS"; uint256 constant TOKEN_INITIAL_SUPPLY = 10*100000000; mapping (address => bool) private _isBlackListed; event AddedBlackList(address[] list); event RemovedBlackList(address[] list); event TransferEx(address from, address to, uint256 value); event Paid(address from, address to, uint256 value, string action); constructor() ERC20(TOKEN_NAME, TOKEN_SYMBOL) { uint _totalSupply = TOKEN_INITIAL_SUPPLY * (10 ** decimals()); _mint(_msgSender(), _totalSupply); } function mint(address, uint256) external view onlyMinter { revert("MTS: minting is not allowed"); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override (ERC20, ERC20Pausable) { require(!_isBlackListed[from], "MTS: from is blacklisted"); super._beforeTokenTransfer(from, to, amount); } function _transfer(address from, address to, uint256 amount) internal override { super._transfer(from, to, amount); emit TransferEx(from, to, amount); } function isBlackListed(address _user) external view returns (bool) { return _isBlackListed[_user]; } function addBlackList (address[] calldata _userList) external onlyMinter { require(_userList.length > 0, "MTS: bad request"); for (uint i=0; i<_userList.length; i++) { _isBlackListed[_userList[i]] = true; } emit AddedBlackList(_userList); } function removeBlackList (address[] calldata _userList) external onlyMinter { require(_userList.length > 0, "MTS: bad request"); for (uint i=0; i<_userList.length; i++) { _isBlackListed[_userList[i]] = false; } emit RemovedBlackList(_userList); } function pay(address to, uint256 amount, string memory action) external { address owner = _msgSender(); super._transfer(owner, to, amount); emit Paid(owner, to, amount, action); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"list","type":"address[]"}],"name":"AddedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"action","type":"string"}],"name":"Paid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"list","type":"address[]"}],"name":"RemovedBlackList","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferEx","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":[{"internalType":"address[]","name":"_userList","type":"address[]"}],"name":"addBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"address","name":"account","type":"address"}],"name":"grantMinter","outputs":[],"stateMutability":"nonpayable","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":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isBlackListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"action","type":"string"}],"name":"pay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userList","type":"address[]"}],"name":"removeBlackList","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":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeMinter","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":"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601181526020017f4d6f6f6e20546f7563682053796d626f6c0000000000000000000000000000008152506040518060400160405280600381526020017f4d5453000000000000000000000000000000000000000000000000000000000081525081600390816200008f919062000950565b508060049081620000a1919062000950565b5050506000600760006101000a81548160ff021916908315150217905550620000e36000801b620000d76200017f60201b60201c565b6200018760201b60201c565b620001247f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001186200017f60201b60201c565b6200018760201b60201c565b6000620001366200019d60201b60201c565b600a62000144919062000bc7565b633b9aca0062000155919062000c18565b9050620001786200016b6200017f60201b60201c565b82620001a660201b60201c565b5062000e59565b600033905090565b6200019982826200031e60201b60201c565b5050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000218576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200020f9062000cc4565b60405180910390fd5b6200022c600083836200036660201b60201c565b806002600082825462000240919062000ce6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000297919062000ce6565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002fe919062000d32565b60405180910390a36200031a600083836200041360201b60201c565b5050565b6200033582826200041860201b620010d61760201c565b6200036181600660008581526020019081526020016000206200050a60201b620011b71790919060201c565b505050565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615620003f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ed9062000d9f565b60405180910390fd5b6200040e8383836200054260201b620011e71760201c565b505050565b505050565b6200042a8282620005b260201b60201c565b620005065760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004ab6200017f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200053a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200061d60201b60201c565b905092915050565b6200055a8383836200069760201b6200123f1760201c565b6200056a6200069c60201b60201c565b15620005ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005a49062000e37565b60405180910390fd5b505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620006318383620006b360201b60201c565b6200068c57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000691565b600090505b92915050565b505050565b6000600760009054906101000a900460ff16905090565b600080836001016000848152602001908152602001600020541415905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200075857607f821691505b6020821081036200076e576200076d62000710565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000799565b620007e4868362000799565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008316200082b6200082584620007fc565b62000806565b620007fc565b9050919050565b6000819050919050565b6200084d8362000810565b620008656200085c8262000838565b848454620007a6565b825550505050565b600090565b6200087c6200086d565b6200088981848462000842565b505050565b5b81811015620008b157620008a560008262000872565b6001810190506200088f565b5050565b601f8211156200090057620008ca8162000774565b620008d58462000789565b81016020851015620008e5578190505b620008fd620008f48562000789565b8301826200088e565b50505b505050565b600082821c905092915050565b6000620009256000198460080262000905565b1980831691505092915050565b600062000940838362000912565b9150826002028217905092915050565b6200095b82620006d6565b67ffffffffffffffff811115620009775762000976620006e1565b5b6200098382546200073f565b62000990828285620008b5565b600060209050601f831160018114620009c85760008415620009b3578287015190505b620009bf858262000932565b86555062000a2f565b601f198416620009d88662000774565b60005b8281101562000a0257848901518255600182019150602085019450602081019050620009db565b8683101562000a22578489015162000a1e601f89168262000912565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000ac55780860481111562000a9d5762000a9c62000a37565b5b600185161562000aad5780820291505b808102905062000abd8562000a66565b945062000a7d565b94509492505050565b60008262000ae0576001905062000bb3565b8162000af0576000905062000bb3565b816001811462000b09576002811462000b145762000b4a565b600191505062000bb3565b60ff84111562000b295762000b2862000a37565b5b8360020a91508482111562000b435762000b4262000a37565b5b5062000bb3565b5060208310610133831016604e8410600b841016171562000b845782820a90508381111562000b7e5762000b7d62000a37565b5b62000bb3565b62000b93848484600162000a73565b9250905081840481111562000bad5762000bac62000a37565b5b81810290505b9392505050565b600060ff82169050919050565b600062000bd482620007fc565b915062000be18362000bba565b925062000c107fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000ace565b905092915050565b600062000c2582620007fc565b915062000c3283620007fc565b925082820262000c4281620007fc565b9150828204841483151762000c5c5762000c5b62000a37565b5b5092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000cac601f8362000c63565b915062000cb98262000c74565b602082019050919050565b6000602082019050818103600083015262000cdf8162000c9d565b9050919050565b600062000cf382620007fc565b915062000d0083620007fc565b925082820190508082111562000d1b5762000d1a62000a37565b5b92915050565b62000d2c81620007fc565b82525050565b600060208201905062000d49600083018462000d21565b92915050565b7f4d54533a2066726f6d20697320626c61636b6c69737465640000000000000000600082015250565b600062000d8760188362000c63565b915062000d948262000d4f565b602082019050919050565b6000602082019050818103600083015262000dba8162000d78565b9050919050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600062000e1f602a8362000c63565b915062000e2c8262000dc1565b604082019050919050565b6000602082019050818103600083015262000e528162000e10565b9050919050565b6137aa8062000e696000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370a082311161011a578063a457c2d7116100ad578063d338faf31161007c578063d338faf3146105d4578063d5391393146105f0578063d547741f1461060e578063dd62ed3e1461062a578063e47d60601461065a576101fb565b8063a457c2d714610528578063a9059cbb14610558578063ca15c87314610588578063cfbd4885146105b8576101fb565b806391d14854116100e957806391d14854146104a057806395d89b41146104d05780639bf41135146104ee578063a217fddf1461050a576101fb565b806370a082311461041a57806379cc67901461044a5780638456cb59146104665780639010d07c14610470576101fb565b8063313ce5671161019257806340c10f191161016157806340c10f19146103a857806342966c68146103c45780634a4bdb30146103e05780635c975abb146103fc576101fb565b8063313ce5671461033457806336568abe14610352578063395093511461036e5780633f4ba83a1461039e576101fb565b806323b872dd116101ce57806323b872dd1461029c578063248a9ca3146102cc578063261707fa146102fc5780632f2ff15d14610318576101fb565b806301ffc9a71461020057806306fdde0314610230578063095ea7b31461024e57806318160ddd1461027e575b600080fd5b61021a6004803603810190610215919061238d565b61068a565b60405161022791906123d5565b60405180910390f35b61023861069c565b6040516102459190612480565b60405180910390f35b61026860048036038101906102639190612536565b61072e565b60405161027591906123d5565b60405180910390f35b610286610751565b6040516102939190612585565b60405180910390f35b6102b660048036038101906102b191906125a0565b61075b565b6040516102c391906123d5565b60405180910390f35b6102e660048036038101906102e19190612629565b61078a565b6040516102f39190612665565b60405180910390f35b61031660048036038101906103119190612680565b6107aa565b005b610332600480360381019061032d91906126ad565b610808565b005b61033c610829565b6040516103499190612709565b60405180910390f35b61036c600480360381019061036791906126ad565b610832565b005b61038860048036038101906103839190612536565b6108b5565b60405161039591906123d5565b60405180910390f35b6103a66108ec565b005b6103c260048036038101906103bd9190612536565b610927565b005b6103de60048036038101906103d99190612724565b610993565b005b6103fa60048036038101906103f59190612886565b6109a7565b005b610404610a01565b60405161041191906123d5565b60405180910390f35b610434600480360381019061042f9190612680565b610a18565b6040516104419190612585565b60405180910390f35b610464600480360381019061045f9190612536565b610a60565b005b61046e610a80565b005b61048a600480360381019061048591906128f5565b610abb565b6040516104979190612944565b60405180910390f35b6104ba60048036038101906104b591906126ad565b610aea565b6040516104c791906123d5565b60405180910390f35b6104d8610b55565b6040516104e59190612480565b60405180910390f35b610508600480360381019061050391906129bf565b610be7565b005b610512610d3c565b60405161051f9190612665565b60405180910390f35b610542600480360381019061053d9190612536565b610d43565b60405161054f91906123d5565b60405180910390f35b610572600480360381019061056d9190612536565b610dba565b60405161057f91906123d5565b60405180910390f35b6105a2600480360381019061059d9190612629565b610ddd565b6040516105af9190612585565b60405180910390f35b6105d260048036038101906105cd9190612680565b610e01565b005b6105ee60048036038101906105e991906129bf565b610e5f565b005b6105f8610fb4565b6040516106059190612665565b60405180910390f35b610628600480360381019061062391906126ad565b610fd8565b005b610644600480360381019061063f9190612a0c565b610ff9565b6040516106519190612585565b60405180910390f35b610674600480360381019061066f9190612680565b611080565b60405161068191906123d5565b60405180910390f35b600061069582611244565b9050919050565b6060600380546106ab90612a7b565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790612a7b565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050505050905090565b6000806107396112be565b90506107468185856112c6565b600191505092915050565b6000600254905090565b6000806107666112be565b905061077385828561148f565b61077e85858561151b565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b6107db7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66107d66112be565b611566565b6108057f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682611603565b50565b6108118261078a565b61081a81611611565b6108248383611625565b505050565b60006012905090565b61083a6112be565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e90612b1e565b60405180910390fd5b6108b18282611659565b5050565b6000806108c06112be565b90506108e18185856108d28589610ff9565b6108dc9190612b6d565b6112c6565b600191505092915050565b61091d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109186112be565b611566565b61092561168d565b565b6109587f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109536112be565b611566565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098a90612bed565b60405180910390fd5b6109a461099e6112be565b826116f0565b50565b60006109b16112be565b90506109be8185856118c6565b7ff438e2c4a3356a8b7d1d49f07f1c48399c11eb019c9fa7343bacc0371dade022818585856040516109f39493929190612c0d565b60405180910390a150505050565b6000600760009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a7282610a6c6112be565b8361148f565b610a7c82826116f0565b5050565b610ab17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610aac6112be565b611566565b610ab9611b45565b565b6000610ae28260066000868152602001908152602001600020611ba890919063ffffffff16565b905092915050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610b6490612a7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9090612a7b565b8015610bdd5780601f10610bb257610100808354040283529160200191610bdd565b820191906000526020600020905b815481529060010190602001808311610bc057829003601f168201915b5050505050905090565b610c187f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610c136112be565b611566565b60008282905011610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590612ca5565b60405180910390fd5b60005b82829050811015610cfe57600060086000858585818110610c8557610c84612cc5565b5b9050602002016020810190610c9a9190612680565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610cf690612cf4565b915050610c61565b507fc7fbc572be4056b0092861a4ee4aaee0409170720aae27c22734952bb628c4bf8282604051610d30929190612dff565b60405180910390a15050565b6000801b81565b600080610d4e6112be565b90506000610d5c8286610ff9565b905083811015610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890612e95565b60405180910390fd5b610dae82868684036112c6565b60019250505092915050565b600080610dc56112be565b9050610dd281858561151b565b600191505092915050565b6000610dfa60066000848152602001908152602001600020611bc2565b9050919050565b610e327f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e2d6112be565b611566565b610e5c7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682611659565b50565b610e907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e8b6112be565b611566565b60008282905011610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90612ca5565b60405180910390fd5b60005b82829050811015610f7657600160086000858585818110610efd57610efc612cc5565b5b9050602002016020810190610f129190612680565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f6e90612cf4565b915050610ed9565b507f2a477b33c86b18045b009435d934544df9a71786e0c01b0efec561e58d21a2938282604051610fa8929190612dff565b60405180910390a15050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610fe18261078a565b610fea81611611565b610ff48383611659565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6110e08282610aea565b6111b35760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506111586112be565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006111df836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611bd7565b905092915050565b6111f283838361123f565b6111fa610a01565b1561123a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123190612f27565b60405180910390fd5b505050565b505050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112b757506112b682611c47565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90612fb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b9061304b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114829190612585565b60405180910390a3505050565b600061149b8484610ff9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115155781811015611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe906130b7565b60405180910390fd5b61151484848484036112c6565b5b50505050565b6115268383836118c6565b7fce767d6f40c84a3a08a69ee3c201b93b685c136173765cd40115678ed7d653ad838383604051611559939291906130d7565b60405180910390a1505050565b6115708282610aea565b6115ff576115958173ffffffffffffffffffffffffffffffffffffffff166014611cc1565b6115a38360001c6020611cc1565b6040516020016115b49291906131e2565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69190612480565b60405180910390fd5b5050565b61160d8282611625565b5050565b6116228161161d6112be565b611566565b50565b61162f82826110d6565b61165481600660008581526020019081526020016000206111b790919063ffffffff16565b505050565b6116638282611efd565b6116888160066000858152602001908152602001600020611fdf90919063ffffffff16565b505050565b61169561200f565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6116d96112be565b6040516116e69190612944565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361175f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117569061328e565b60405180910390fd5b61176b82600083612058565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613320565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546118489190613340565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118ad9190612585565b60405180910390a36118c1836000846120f5565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c906133e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199b90613478565b60405180910390fd5b6119af838383612058565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2c9061350a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ac89190612b6d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b2c9190612585565b60405180910390a3611b3f8484846120f5565b50505050565b611b4d6120fa565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b916112be565b604051611b9e9190612944565b60405180910390a1565b6000611bb78360000183612144565b60001c905092915050565b6000611bd08260000161216f565b9050919050565b6000611be38383612180565b611c3c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611c41565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cba5750611cb9826121a3565b5b9050919050565b606060006002836002611cd4919061352a565b611cde9190612b6d565b67ffffffffffffffff811115611cf757611cf661275b565b5b6040519080825280601f01601f191660200182016040528015611d295781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611d6157611d60612cc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611dc557611dc4612cc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611e05919061352a565b611e0f9190612b6d565b90505b6001811115611eaf577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611e5157611e50612cc5565b5b1a60f81b828281518110611e6857611e67612cc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611ea89061356c565b9050611e12565b5060008414611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea906135e1565b60405180910390fd5b8091505092915050565b611f078282610aea565b15611fdb5760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f806112be565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612007836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61220d565b905092915050565b612017610a01565b612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d9061364d565b60405180910390fd5b565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120dc906136b9565b60405180910390fd5b6120f08383836111e7565b505050565b505050565b612102610a01565b15612142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213990613725565b60405180910390fd5b565b600082600001828154811061215c5761215b612cc5565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808360010160008481526020019081526020016000205490506000811461231557600060018261223f9190613340565b90506000600186600001805490506122579190613340565b90508181146122c657600086600001828154811061227857612277612cc5565b5b906000526020600020015490508087600001848154811061229c5761229b612cc5565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806122da576122d9613745565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061231b565b60009150505b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61236a81612335565b811461237557600080fd5b50565b60008135905061238781612361565b92915050565b6000602082840312156123a3576123a261232b565b5b60006123b184828501612378565b91505092915050565b60008115159050919050565b6123cf816123ba565b82525050565b60006020820190506123ea60008301846123c6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561242a57808201518184015260208101905061240f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612452826123f0565b61245c81856123fb565b935061246c81856020860161240c565b61247581612436565b840191505092915050565b6000602082019050818103600083015261249a8184612447565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124cd826124a2565b9050919050565b6124dd816124c2565b81146124e857600080fd5b50565b6000813590506124fa816124d4565b92915050565b6000819050919050565b61251381612500565b811461251e57600080fd5b50565b6000813590506125308161250a565b92915050565b6000806040838503121561254d5761254c61232b565b5b600061255b858286016124eb565b925050602061256c85828601612521565b9150509250929050565b61257f81612500565b82525050565b600060208201905061259a6000830184612576565b92915050565b6000806000606084860312156125b9576125b861232b565b5b60006125c7868287016124eb565b93505060206125d8868287016124eb565b92505060406125e986828701612521565b9150509250925092565b6000819050919050565b612606816125f3565b811461261157600080fd5b50565b600081359050612623816125fd565b92915050565b60006020828403121561263f5761263e61232b565b5b600061264d84828501612614565b91505092915050565b61265f816125f3565b82525050565b600060208201905061267a6000830184612656565b92915050565b6000602082840312156126965761269561232b565b5b60006126a4848285016124eb565b91505092915050565b600080604083850312156126c4576126c361232b565b5b60006126d285828601612614565b92505060206126e3858286016124eb565b9150509250929050565b600060ff82169050919050565b612703816126ed565b82525050565b600060208201905061271e60008301846126fa565b92915050565b60006020828403121561273a5761273961232b565b5b600061274884828501612521565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61279382612436565b810181811067ffffffffffffffff821117156127b2576127b161275b565b5b80604052505050565b60006127c5612321565b90506127d1828261278a565b919050565b600067ffffffffffffffff8211156127f1576127f061275b565b5b6127fa82612436565b9050602081019050919050565b82818337600083830152505050565b6000612829612824846127d6565b6127bb565b90508281526020810184848401111561284557612844612756565b5b612850848285612807565b509392505050565b600082601f83011261286d5761286c612751565b5b813561287d848260208601612816565b91505092915050565b60008060006060848603121561289f5761289e61232b565b5b60006128ad868287016124eb565b93505060206128be86828701612521565b925050604084013567ffffffffffffffff8111156128df576128de612330565b5b6128eb86828701612858565b9150509250925092565b6000806040838503121561290c5761290b61232b565b5b600061291a85828601612614565b925050602061292b85828601612521565b9150509250929050565b61293e816124c2565b82525050565b60006020820190506129596000830184612935565b92915050565b600080fd5b600080fd5b60008083601f84011261297f5761297e612751565b5b8235905067ffffffffffffffff81111561299c5761299b61295f565b5b6020830191508360208202830111156129b8576129b7612964565b5b9250929050565b600080602083850312156129d6576129d561232b565b5b600083013567ffffffffffffffff8111156129f4576129f3612330565b5b612a0085828601612969565b92509250509250929050565b60008060408385031215612a2357612a2261232b565b5b6000612a31858286016124eb565b9250506020612a42858286016124eb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a9357607f821691505b602082108103612aa657612aa5612a4c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612b08602f836123fb565b9150612b1382612aac565b604082019050919050565b60006020820190508181036000830152612b3781612afb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b7882612500565b9150612b8383612500565b9250828201905080821115612b9b57612b9a612b3e565b5b92915050565b7f4d54533a206d696e74696e67206973206e6f7420616c6c6f7765640000000000600082015250565b6000612bd7601b836123fb565b9150612be282612ba1565b602082019050919050565b60006020820190508181036000830152612c0681612bca565b9050919050565b6000608082019050612c226000830187612935565b612c2f6020830186612935565b612c3c6040830185612576565b8181036060830152612c4e8184612447565b905095945050505050565b7f4d54533a20626164207265717565737400000000000000000000000000000000600082015250565b6000612c8f6010836123fb565b9150612c9a82612c59565b602082019050919050565b60006020820190508181036000830152612cbe81612c82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612cff82612500565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d3157612d30612b3e565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b612d60816124c2565b82525050565b6000612d728383612d57565b60208301905092915050565b6000612d8d60208401846124eb565b905092915050565b6000602082019050919050565b6000612dae8385612d3c565b9350612db982612d4d565b8060005b85811015612df257612dcf8284612d7e565b612dd98882612d66565b9750612de483612d95565b925050600181019050612dbd565b5085925050509392505050565b60006020820190508181036000830152612e1a818486612da2565b90509392505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e7f6025836123fb565b9150612e8a82612e23565b604082019050919050565b60006020820190508181036000830152612eae81612e72565b9050919050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612f11602a836123fb565b9150612f1c82612eb5565b604082019050919050565b60006020820190508181036000830152612f4081612f04565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612fa36024836123fb565b9150612fae82612f47565b604082019050919050565b60006020820190508181036000830152612fd281612f96565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006130356022836123fb565b915061304082612fd9565b604082019050919050565b6000602082019050818103600083015261306481613028565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006130a1601d836123fb565b91506130ac8261306b565b602082019050919050565b600060208201905081810360008301526130d081613094565b9050919050565b60006060820190506130ec6000830186612935565b6130f96020830185612935565b6131066040830184612576565b949350505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061314f60178361310e565b915061315a82613119565b601782019050919050565b6000613170826123f0565b61317a818561310e565b935061318a81856020860161240c565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006131cc60118361310e565b91506131d782613196565b601182019050919050565b60006131ed82613142565b91506131f98285613165565b9150613204826131bf565b91506132108284613165565b91508190509392505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006132786021836123fb565b91506132838261321c565b604082019050919050565b600060208201905081810360008301526132a78161326b565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061330a6022836123fb565b9150613315826132ae565b604082019050919050565b60006020820190508181036000830152613339816132fd565b9050919050565b600061334b82612500565b915061335683612500565b925082820390508181111561336e5761336d612b3e565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006133d06025836123fb565b91506133db82613374565b604082019050919050565b600060208201905081810360008301526133ff816133c3565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006134626023836123fb565b915061346d82613406565b604082019050919050565b6000602082019050818103600083015261349181613455565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006134f46026836123fb565b91506134ff82613498565b604082019050919050565b60006020820190508181036000830152613523816134e7565b9050919050565b600061353582612500565b915061354083612500565b925082820261354e81612500565b9150828204841483151761356557613564612b3e565b5b5092915050565b600061357782612500565b91506000820361358a57613589612b3e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006135cb6020836123fb565b91506135d682613595565b602082019050919050565b600060208201905081810360008301526135fa816135be565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006136376014836123fb565b915061364282613601565b602082019050919050565b600060208201905081810360008301526136668161362a565b9050919050565b7f4d54533a2066726f6d20697320626c61636b6c69737465640000000000000000600082015250565b60006136a36018836123fb565b91506136ae8261366d565b602082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061370f6010836123fb565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220986d2e3a5adb473d17fbc24cc51da5385a02513f085bf49c7941de97b418496f64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370a082311161011a578063a457c2d7116100ad578063d338faf31161007c578063d338faf3146105d4578063d5391393146105f0578063d547741f1461060e578063dd62ed3e1461062a578063e47d60601461065a576101fb565b8063a457c2d714610528578063a9059cbb14610558578063ca15c87314610588578063cfbd4885146105b8576101fb565b806391d14854116100e957806391d14854146104a057806395d89b41146104d05780639bf41135146104ee578063a217fddf1461050a576101fb565b806370a082311461041a57806379cc67901461044a5780638456cb59146104665780639010d07c14610470576101fb565b8063313ce5671161019257806340c10f191161016157806340c10f19146103a857806342966c68146103c45780634a4bdb30146103e05780635c975abb146103fc576101fb565b8063313ce5671461033457806336568abe14610352578063395093511461036e5780633f4ba83a1461039e576101fb565b806323b872dd116101ce57806323b872dd1461029c578063248a9ca3146102cc578063261707fa146102fc5780632f2ff15d14610318576101fb565b806301ffc9a71461020057806306fdde0314610230578063095ea7b31461024e57806318160ddd1461027e575b600080fd5b61021a6004803603810190610215919061238d565b61068a565b60405161022791906123d5565b60405180910390f35b61023861069c565b6040516102459190612480565b60405180910390f35b61026860048036038101906102639190612536565b61072e565b60405161027591906123d5565b60405180910390f35b610286610751565b6040516102939190612585565b60405180910390f35b6102b660048036038101906102b191906125a0565b61075b565b6040516102c391906123d5565b60405180910390f35b6102e660048036038101906102e19190612629565b61078a565b6040516102f39190612665565b60405180910390f35b61031660048036038101906103119190612680565b6107aa565b005b610332600480360381019061032d91906126ad565b610808565b005b61033c610829565b6040516103499190612709565b60405180910390f35b61036c600480360381019061036791906126ad565b610832565b005b61038860048036038101906103839190612536565b6108b5565b60405161039591906123d5565b60405180910390f35b6103a66108ec565b005b6103c260048036038101906103bd9190612536565b610927565b005b6103de60048036038101906103d99190612724565b610993565b005b6103fa60048036038101906103f59190612886565b6109a7565b005b610404610a01565b60405161041191906123d5565b60405180910390f35b610434600480360381019061042f9190612680565b610a18565b6040516104419190612585565b60405180910390f35b610464600480360381019061045f9190612536565b610a60565b005b61046e610a80565b005b61048a600480360381019061048591906128f5565b610abb565b6040516104979190612944565b60405180910390f35b6104ba60048036038101906104b591906126ad565b610aea565b6040516104c791906123d5565b60405180910390f35b6104d8610b55565b6040516104e59190612480565b60405180910390f35b610508600480360381019061050391906129bf565b610be7565b005b610512610d3c565b60405161051f9190612665565b60405180910390f35b610542600480360381019061053d9190612536565b610d43565b60405161054f91906123d5565b60405180910390f35b610572600480360381019061056d9190612536565b610dba565b60405161057f91906123d5565b60405180910390f35b6105a2600480360381019061059d9190612629565b610ddd565b6040516105af9190612585565b60405180910390f35b6105d260048036038101906105cd9190612680565b610e01565b005b6105ee60048036038101906105e991906129bf565b610e5f565b005b6105f8610fb4565b6040516106059190612665565b60405180910390f35b610628600480360381019061062391906126ad565b610fd8565b005b610644600480360381019061063f9190612a0c565b610ff9565b6040516106519190612585565b60405180910390f35b610674600480360381019061066f9190612680565b611080565b60405161068191906123d5565b60405180910390f35b600061069582611244565b9050919050565b6060600380546106ab90612a7b565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790612a7b565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050505050905090565b6000806107396112be565b90506107468185856112c6565b600191505092915050565b6000600254905090565b6000806107666112be565b905061077385828561148f565b61077e85858561151b565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b6107db7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66107d66112be565b611566565b6108057f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682611603565b50565b6108118261078a565b61081a81611611565b6108248383611625565b505050565b60006012905090565b61083a6112be565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e90612b1e565b60405180910390fd5b6108b18282611659565b5050565b6000806108c06112be565b90506108e18185856108d28589610ff9565b6108dc9190612b6d565b6112c6565b600191505092915050565b61091d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109186112be565b611566565b61092561168d565b565b6109587f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109536112be565b611566565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098a90612bed565b60405180910390fd5b6109a461099e6112be565b826116f0565b50565b60006109b16112be565b90506109be8185856118c6565b7ff438e2c4a3356a8b7d1d49f07f1c48399c11eb019c9fa7343bacc0371dade022818585856040516109f39493929190612c0d565b60405180910390a150505050565b6000600760009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a7282610a6c6112be565b8361148f565b610a7c82826116f0565b5050565b610ab17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610aac6112be565b611566565b610ab9611b45565b565b6000610ae28260066000868152602001908152602001600020611ba890919063ffffffff16565b905092915050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610b6490612a7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9090612a7b565b8015610bdd5780601f10610bb257610100808354040283529160200191610bdd565b820191906000526020600020905b815481529060010190602001808311610bc057829003601f168201915b5050505050905090565b610c187f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610c136112be565b611566565b60008282905011610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590612ca5565b60405180910390fd5b60005b82829050811015610cfe57600060086000858585818110610c8557610c84612cc5565b5b9050602002016020810190610c9a9190612680565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610cf690612cf4565b915050610c61565b507fc7fbc572be4056b0092861a4ee4aaee0409170720aae27c22734952bb628c4bf8282604051610d30929190612dff565b60405180910390a15050565b6000801b81565b600080610d4e6112be565b90506000610d5c8286610ff9565b905083811015610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890612e95565b60405180910390fd5b610dae82868684036112c6565b60019250505092915050565b600080610dc56112be565b9050610dd281858561151b565b600191505092915050565b6000610dfa60066000848152602001908152602001600020611bc2565b9050919050565b610e327f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e2d6112be565b611566565b610e5c7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682611659565b50565b610e907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e8b6112be565b611566565b60008282905011610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90612ca5565b60405180910390fd5b60005b82829050811015610f7657600160086000858585818110610efd57610efc612cc5565b5b9050602002016020810190610f129190612680565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f6e90612cf4565b915050610ed9565b507f2a477b33c86b18045b009435d934544df9a71786e0c01b0efec561e58d21a2938282604051610fa8929190612dff565b60405180910390a15050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610fe18261078a565b610fea81611611565b610ff48383611659565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6110e08282610aea565b6111b35760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506111586112be565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006111df836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611bd7565b905092915050565b6111f283838361123f565b6111fa610a01565b1561123a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123190612f27565b60405180910390fd5b505050565b505050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112b757506112b682611c47565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90612fb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b9061304b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114829190612585565b60405180910390a3505050565b600061149b8484610ff9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115155781811015611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe906130b7565b60405180910390fd5b61151484848484036112c6565b5b50505050565b6115268383836118c6565b7fce767d6f40c84a3a08a69ee3c201b93b685c136173765cd40115678ed7d653ad838383604051611559939291906130d7565b60405180910390a1505050565b6115708282610aea565b6115ff576115958173ffffffffffffffffffffffffffffffffffffffff166014611cc1565b6115a38360001c6020611cc1565b6040516020016115b49291906131e2565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69190612480565b60405180910390fd5b5050565b61160d8282611625565b5050565b6116228161161d6112be565b611566565b50565b61162f82826110d6565b61165481600660008581526020019081526020016000206111b790919063ffffffff16565b505050565b6116638282611efd565b6116888160066000858152602001908152602001600020611fdf90919063ffffffff16565b505050565b61169561200f565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6116d96112be565b6040516116e69190612944565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361175f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117569061328e565b60405180910390fd5b61176b82600083612058565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613320565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546118489190613340565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118ad9190612585565b60405180910390a36118c1836000846120f5565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c906133e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199b90613478565b60405180910390fd5b6119af838383612058565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2c9061350a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ac89190612b6d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b2c9190612585565b60405180910390a3611b3f8484846120f5565b50505050565b611b4d6120fa565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b916112be565b604051611b9e9190612944565b60405180910390a1565b6000611bb78360000183612144565b60001c905092915050565b6000611bd08260000161216f565b9050919050565b6000611be38383612180565b611c3c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611c41565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cba5750611cb9826121a3565b5b9050919050565b606060006002836002611cd4919061352a565b611cde9190612b6d565b67ffffffffffffffff811115611cf757611cf661275b565b5b6040519080825280601f01601f191660200182016040528015611d295781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611d6157611d60612cc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611dc557611dc4612cc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611e05919061352a565b611e0f9190612b6d565b90505b6001811115611eaf577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611e5157611e50612cc5565b5b1a60f81b828281518110611e6857611e67612cc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611ea89061356c565b9050611e12565b5060008414611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea906135e1565b60405180910390fd5b8091505092915050565b611f078282610aea565b15611fdb5760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f806112be565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612007836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61220d565b905092915050565b612017610a01565b612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d9061364d565b60405180910390fd5b565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120dc906136b9565b60405180910390fd5b6120f08383836111e7565b505050565b505050565b612102610a01565b15612142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213990613725565b60405180910390fd5b565b600082600001828154811061215c5761215b612cc5565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808360010160008481526020019081526020016000205490506000811461231557600060018261223f9190613340565b90506000600186600001805490506122579190613340565b90508181146122c657600086600001828154811061227857612277612cc5565b5b906000526020600020015490508087600001848154811061229c5761229b612cc5565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806122da576122d9613745565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061231b565b60009150505b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61236a81612335565b811461237557600080fd5b50565b60008135905061238781612361565b92915050565b6000602082840312156123a3576123a261232b565b5b60006123b184828501612378565b91505092915050565b60008115159050919050565b6123cf816123ba565b82525050565b60006020820190506123ea60008301846123c6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561242a57808201518184015260208101905061240f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612452826123f0565b61245c81856123fb565b935061246c81856020860161240c565b61247581612436565b840191505092915050565b6000602082019050818103600083015261249a8184612447565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124cd826124a2565b9050919050565b6124dd816124c2565b81146124e857600080fd5b50565b6000813590506124fa816124d4565b92915050565b6000819050919050565b61251381612500565b811461251e57600080fd5b50565b6000813590506125308161250a565b92915050565b6000806040838503121561254d5761254c61232b565b5b600061255b858286016124eb565b925050602061256c85828601612521565b9150509250929050565b61257f81612500565b82525050565b600060208201905061259a6000830184612576565b92915050565b6000806000606084860312156125b9576125b861232b565b5b60006125c7868287016124eb565b93505060206125d8868287016124eb565b92505060406125e986828701612521565b9150509250925092565b6000819050919050565b612606816125f3565b811461261157600080fd5b50565b600081359050612623816125fd565b92915050565b60006020828403121561263f5761263e61232b565b5b600061264d84828501612614565b91505092915050565b61265f816125f3565b82525050565b600060208201905061267a6000830184612656565b92915050565b6000602082840312156126965761269561232b565b5b60006126a4848285016124eb565b91505092915050565b600080604083850312156126c4576126c361232b565b5b60006126d285828601612614565b92505060206126e3858286016124eb565b9150509250929050565b600060ff82169050919050565b612703816126ed565b82525050565b600060208201905061271e60008301846126fa565b92915050565b60006020828403121561273a5761273961232b565b5b600061274884828501612521565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61279382612436565b810181811067ffffffffffffffff821117156127b2576127b161275b565b5b80604052505050565b60006127c5612321565b90506127d1828261278a565b919050565b600067ffffffffffffffff8211156127f1576127f061275b565b5b6127fa82612436565b9050602081019050919050565b82818337600083830152505050565b6000612829612824846127d6565b6127bb565b90508281526020810184848401111561284557612844612756565b5b612850848285612807565b509392505050565b600082601f83011261286d5761286c612751565b5b813561287d848260208601612816565b91505092915050565b60008060006060848603121561289f5761289e61232b565b5b60006128ad868287016124eb565b93505060206128be86828701612521565b925050604084013567ffffffffffffffff8111156128df576128de612330565b5b6128eb86828701612858565b9150509250925092565b6000806040838503121561290c5761290b61232b565b5b600061291a85828601612614565b925050602061292b85828601612521565b9150509250929050565b61293e816124c2565b82525050565b60006020820190506129596000830184612935565b92915050565b600080fd5b600080fd5b60008083601f84011261297f5761297e612751565b5b8235905067ffffffffffffffff81111561299c5761299b61295f565b5b6020830191508360208202830111156129b8576129b7612964565b5b9250929050565b600080602083850312156129d6576129d561232b565b5b600083013567ffffffffffffffff8111156129f4576129f3612330565b5b612a0085828601612969565b92509250509250929050565b60008060408385031215612a2357612a2261232b565b5b6000612a31858286016124eb565b9250506020612a42858286016124eb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a9357607f821691505b602082108103612aa657612aa5612a4c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612b08602f836123fb565b9150612b1382612aac565b604082019050919050565b60006020820190508181036000830152612b3781612afb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b7882612500565b9150612b8383612500565b9250828201905080821115612b9b57612b9a612b3e565b5b92915050565b7f4d54533a206d696e74696e67206973206e6f7420616c6c6f7765640000000000600082015250565b6000612bd7601b836123fb565b9150612be282612ba1565b602082019050919050565b60006020820190508181036000830152612c0681612bca565b9050919050565b6000608082019050612c226000830187612935565b612c2f6020830186612935565b612c3c6040830185612576565b8181036060830152612c4e8184612447565b905095945050505050565b7f4d54533a20626164207265717565737400000000000000000000000000000000600082015250565b6000612c8f6010836123fb565b9150612c9a82612c59565b602082019050919050565b60006020820190508181036000830152612cbe81612c82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612cff82612500565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d3157612d30612b3e565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b612d60816124c2565b82525050565b6000612d728383612d57565b60208301905092915050565b6000612d8d60208401846124eb565b905092915050565b6000602082019050919050565b6000612dae8385612d3c565b9350612db982612d4d565b8060005b85811015612df257612dcf8284612d7e565b612dd98882612d66565b9750612de483612d95565b925050600181019050612dbd565b5085925050509392505050565b60006020820190508181036000830152612e1a818486612da2565b90509392505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e7f6025836123fb565b9150612e8a82612e23565b604082019050919050565b60006020820190508181036000830152612eae81612e72565b9050919050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612f11602a836123fb565b9150612f1c82612eb5565b604082019050919050565b60006020820190508181036000830152612f4081612f04565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612fa36024836123fb565b9150612fae82612f47565b604082019050919050565b60006020820190508181036000830152612fd281612f96565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006130356022836123fb565b915061304082612fd9565b604082019050919050565b6000602082019050818103600083015261306481613028565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006130a1601d836123fb565b91506130ac8261306b565b602082019050919050565b600060208201905081810360008301526130d081613094565b9050919050565b60006060820190506130ec6000830186612935565b6130f96020830185612935565b6131066040830184612576565b949350505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061314f60178361310e565b915061315a82613119565b601782019050919050565b6000613170826123f0565b61317a818561310e565b935061318a81856020860161240c565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006131cc60118361310e565b91506131d782613196565b601182019050919050565b60006131ed82613142565b91506131f98285613165565b9150613204826131bf565b91506132108284613165565b91508190509392505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006132786021836123fb565b91506132838261321c565b604082019050919050565b600060208201905081810360008301526132a78161326b565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061330a6022836123fb565b9150613315826132ae565b604082019050919050565b60006020820190508181036000830152613339816132fd565b9050919050565b600061334b82612500565b915061335683612500565b925082820390508181111561336e5761336d612b3e565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006133d06025836123fb565b91506133db82613374565b604082019050919050565b600060208201905081810360008301526133ff816133c3565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006134626023836123fb565b915061346d82613406565b604082019050919050565b6000602082019050818103600083015261349181613455565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006134f46026836123fb565b91506134ff82613498565b604082019050919050565b60006020820190508181036000830152613523816134e7565b9050919050565b600061353582612500565b915061354083612500565b925082820261354e81612500565b9150828204841483151761356557613564612b3e565b5b5092915050565b600061357782612500565b91506000820361358a57613589612b3e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006135cb6020836123fb565b91506135d682613595565b602082019050919050565b600060208201905081810360008301526135fa816135be565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006136376014836123fb565b915061364282613601565b602082019050919050565b600060208201905081810360008301526136668161362a565b9050919050565b7f4d54533a2066726f6d20697320626c61636b6c69737465640000000000000000600082015250565b60006136a36018836123fb565b91506136ae8261366d565b602082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061370f6010836123fb565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220986d2e3a5adb473d17fbc24cc51da5385a02513f085bf49c7941de97b418496f64736f6c63430008120033
Deployed Bytecode Sourcemap
56049:2271:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37060:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43053:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45404:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44173:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46185:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27149:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36741:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27590:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44015:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28734:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46889:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36665:68;;;:::i;:::-;;56769:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55371:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58106:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35066:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44344:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55781:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36593:64;;;:::i;:::-;;32387:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25609:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43272:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57798:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24714:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47630:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44677:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32714:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36901:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57496:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36187:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28030:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44933:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57374:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37060:228;37215:4;37244:36;37268:11;37244:23;:36::i;:::-;37237:43;;37060:228;;;:::o;43053:100::-;43107:13;43140:5;43133:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43053:100;:::o;45404:201::-;45487:4;45504:13;45520:12;:10;:12::i;:::-;45504:28;;45543:32;45552:5;45559:7;45568:6;45543:8;:32::i;:::-;45593:4;45586:11;;;45404:201;;;;:::o;44173:108::-;44234:7;44261:12;;44254:19;;44173:108;:::o;46185:295::-;46316:4;46333:15;46351:12;:10;:12::i;:::-;46333:30;;46374:38;46390:4;46396:7;46405:6;46374:15;:38::i;:::-;46423:27;46433:4;46439:2;46443:6;46423:9;:27::i;:::-;46468:4;46461:11;;;46185:295;;;;;:::o;27149:131::-;27223:7;27250:6;:12;27257:4;27250:12;;;;;;;;;;;:22;;;27243:29;;27149:131;;;:::o;36741:152::-;36291:37;36225:24;36315:12;:10;:12::i;:::-;36291:10;:37::i;:::-;36853:32:::1;36225:24;36877:7;36853:10;:32::i;:::-;36741:152:::0;:::o;27590:147::-;27673:18;27686:4;27673:12;:18::i;:::-;25205:16;25216:4;25205:10;:16::i;:::-;27704:25:::1;27715:4;27721:7;27704:10;:25::i;:::-;27590:147:::0;;;:::o;44015:93::-;44073:5;44098:2;44091:9;;44015:93;:::o;28734:218::-;28841:12;:10;:12::i;:::-;28830:23;;:7;:23;;;28822:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;28918:26;28930:4;28936:7;28918:11;:26::i;:::-;28734:218;;:::o;46889:238::-;46977:4;46994:13;47010:12;:10;:12::i;:::-;46994:28;;47033:64;47042:5;47049:7;47086:10;47058:25;47068:5;47075:7;47058:9;:25::i;:::-;:38;;;;:::i;:::-;47033:8;:64::i;:::-;47115:4;47108:11;;;46889:238;;;;:::o;36665:68::-;36291:37;36225:24;36315:12;:10;:12::i;:::-;36291:10;:37::i;:::-;36715:10:::1;:8;:10::i;:::-;36665:68::o:0;56769:113::-;36291:37;36225:24;36315:12;:10;:12::i;:::-;36291:10;:37::i;:::-;56837::::1;;;;;;;;;;:::i;:::-;;;;;;;;55371:91:::0;55427:27;55433:12;:10;:12::i;:::-;55447:6;55427:5;:27::i;:::-;55371:91;:::o;58106:211::-;58189:13;58205:12;:10;:12::i;:::-;58189:28;;58228:34;58244:5;58251:2;58255:6;58228:15;:34::i;:::-;58278:31;58283:5;58290:2;58294:6;58302;58278:31;;;;;;;;;:::i;:::-;;;;;;;;58178:139;58106:211;;;:::o;35066:86::-;35113:4;35137:7;;;;;;;;;;;35130:14;;35066:86;:::o;44344:127::-;44418:7;44445:9;:18;44455:7;44445:18;;;;;;;;;;;;;;;;44438:25;;44344:127;;;:::o;55781:164::-;55858:46;55874:7;55883:12;:10;:12::i;:::-;55897:6;55858:15;:46::i;:::-;55915:22;55921:7;55930:6;55915:5;:22::i;:::-;55781:164;;:::o;36593:64::-;36291:37;36225:24;36315:12;:10;:12::i;:::-;36291:10;:37::i;:::-;36641:8:::1;:6;:8::i;:::-;36593:64::o:0;32387:153::-;32477:7;32504:28;32526:5;32504:12;:18;32517:4;32504:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;32497:35;;32387:153;;;;:::o;25609:147::-;25695:4;25719:6;:12;25726:4;25719:12;;;;;;;;;;;:20;;:29;25740:7;25719:29;;;;;;;;;;;;;;;;;;;;;;;;;25712:36;;25609:147;;;;:::o;43272:104::-;43328:13;43361:7;43354:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43272:104;:::o;57798:300::-;36291:37;36225:24;36315:12;:10;:12::i;:::-;36291:10;:37::i;:::-;57912:1:::1;57893:9;;:16;;:20;57885:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57950:6;57945:103;57962:9;;:16;;57960:1;:18;57945:103;;;58031:5;58000:14;:28;58015:9;;58025:1;58015:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58000:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;57980:3;;;;;:::i;:::-;;;;57945:103;;;;58063:27;58080:9;;58063:27;;;;;;;:::i;:::-;;;;;;;;57798:300:::0;;:::o;24714:49::-;24759:4;24714:49;;;:::o;47630:436::-;47723:4;47740:13;47756:12;:10;:12::i;:::-;47740:28;;47779:24;47806:25;47816:5;47823:7;47806:9;:25::i;:::-;47779:52;;47870:15;47850:16;:35;;47842:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;47963:60;47972:5;47979:7;48007:15;47988:16;:34;47963:8;:60::i;:::-;48054:4;48047:11;;;;47630:436;;;;:::o;44677:193::-;44756:4;44773:13;44789:12;:10;:12::i;:::-;44773:28;;44812;44822:5;44829:2;44833:6;44812:9;:28::i;:::-;44858:4;44851:11;;;44677:193;;;;:::o;32714:142::-;32794:7;32821:27;:12;:18;32834:4;32821:18;;;;;;;;;;;:25;:27::i;:::-;32814:34;;32714:142;;;:::o;36901:151::-;36291:37;36225:24;36315:12;:10;:12::i;:::-;36291:10;:37::i;:::-;37011:33:::1;36225:24;37036:7;37011:11;:33::i;:::-;36901:151:::0;:::o;57496:294::-;36291:37;36225:24;36315:12;:10;:12::i;:::-;36291:10;:37::i;:::-;57607:1:::1;57588:9;;:16;;:20;57580:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57645:6;57640:102;57657:9;;:16;;57655:1;:18;57640:102;;;57726:4;57695:14;:28;57710:9;;57720:1;57710:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57695:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;57675:3;;;;;:::i;:::-;;;;57640:102;;;;57757:25;57772:9;;57757:25;;;;;;;:::i;:::-;;;;;;;;57496:294:::0;;:::o;36187:62::-;36225:24;36187:62;:::o;28030:149::-;28114:18;28127:4;28114:12;:18::i;:::-;25205:16;25216:4;25205:10;:16::i;:::-;28145:26:::1;28157:4;28163:7;28145:11;:26::i;:::-;28030:149:::0;;;:::o;44933:151::-;45022:7;45049:11;:18;45061:5;45049:18;;;;;;;;;;;;;;;:27;45068:7;45049:27;;;;;;;;;;;;;;;;45042:34;;44933:151;;;;:::o;57374:114::-;57435:4;57459:14;:21;57474:5;57459:21;;;;;;;;;;;;;;;;;;;;;;;;;57452:28;;57374:114;;;:::o;30331:238::-;30415:22;30423:4;30429:7;30415;:22::i;:::-;30410:152;;30486:4;30454:6;:12;30461:4;30454:12;;;;;;;;;;;:20;;:29;30475:7;30454:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;30537:12;:10;:12::i;:::-;30510:40;;30528:7;30510:40;;30522:4;30510:40;;;;;;;;;;30410:152;30331:238;;:::o;8296:152::-;8366:4;8390:50;8395:3;:10;;8431:5;8415:23;;8407:32;;8390:4;:50::i;:::-;8383:57;;8296:152;;;;:::o;54509:272::-;54652:44;54679:4;54685:2;54689:6;54652:26;:44::i;:::-;54718:8;:6;:8::i;:::-;54717:9;54709:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54509:272;;;:::o;52979:125::-;;;;:::o;31574:214::-;31659:4;31698:42;31683:57;;;:11;:57;;;;:97;;;;31744:36;31768:11;31744:23;:36::i;:::-;31683:97;31676:104;;31574:214;;;:::o;22522:98::-;22575:7;22602:10;22595:17;;22522:98;:::o;51255:380::-;51408:1;51391:19;;:5;:19;;;51383:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51489:1;51470:21;;:7;:21;;;51462:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51573:6;51543:11;:18;51555:5;51543:18;;;;;;;;;;;;;;;:27;51562:7;51543:27;;;;;;;;;;;;;;;:36;;;;51611:7;51595:32;;51604:5;51595:32;;;51620:6;51595:32;;;;;;:::i;:::-;;;;;;;;51255:380;;;:::o;51926:453::-;52061:24;52088:25;52098:5;52105:7;52088:9;:25::i;:::-;52061:52;;52148:17;52128:16;:37;52124:248;;52210:6;52190:16;:26;;52182:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52294:51;52303:5;52310:7;52338:6;52319:16;:25;52294:8;:51::i;:::-;52124:248;52050:329;51926:453;;;:::o;57191:175::-;57281:33;57297:4;57303:2;57307:6;57281:15;:33::i;:::-;57330:28;57341:4;57347:2;57351:6;57330:28;;;;;;;;:::i;:::-;;;;;;;;57191:175;;;:::o;26455:505::-;26544:22;26552:4;26558:7;26544;:22::i;:::-;26539:414;;26732:41;26760:7;26732:41;;26770:2;26732:19;:41::i;:::-;26846:38;26874:4;26866:13;;26881:2;26846:19;:38::i;:::-;26637:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26583:358;;;;;;;;;;;:::i;:::-;;;;;;;;26539:414;26455:505;;:::o;29659:112::-;29738:25;29749:4;29755:7;29738:10;:25::i;:::-;29659:112;;:::o;26060:105::-;26127:30;26138:4;26144:12;:10;:12::i;:::-;26127:10;:30::i;:::-;26060:105;:::o;32949:169::-;33037:31;33054:4;33060:7;33037:16;:31::i;:::-;33079;33102:7;33079:12;:18;33092:4;33079:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;32949:169;;:::o;33212:174::-;33301:32;33319:4;33325:7;33301:17;:32::i;:::-;33344:34;33370:7;33344:12;:18;33357:4;33344:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;33212:174;;:::o;35921:120::-;34930:16;:14;:16::i;:::-;35990:5:::1;35980:7;;:15;;;;;;;;;;;;;;;;;;36011:22;36020:12;:10;:12::i;:::-;36011:22;;;;;;:::i;:::-;;;;;;;;35921:120::o:0;50226:591::-;50329:1;50310:21;;:7;:21;;;50302:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;50382:49;50403:7;50420:1;50424:6;50382:20;:49::i;:::-;50444:22;50469:9;:18;50479:7;50469:18;;;;;;;;;;;;;;;;50444:43;;50524:6;50506:14;:24;;50498:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50643:6;50626:14;:23;50605:9;:18;50615:7;50605:18;;;;;;;;;;;;;;;:44;;;;50687:6;50671:12;;:22;;;;;;;:::i;:::-;;;;;;;;50737:1;50711:37;;50720:7;50711:37;;;50741:6;50711:37;;;;;;:::i;:::-;;;;;;;;50761:48;50781:7;50798:1;50802:6;50761:19;:48::i;:::-;50291:526;50226:591;;:::o;48536:671::-;48683:1;48667:18;;:4;:18;;;48659:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48760:1;48746:16;;:2;:16;;;48738:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48815:38;48836:4;48842:2;48846:6;48815:20;:38::i;:::-;48866:19;48888:9;:15;48898:4;48888:15;;;;;;;;;;;;;;;;48866:37;;48937:6;48922:11;:21;;48914:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49054:6;49040:11;:20;49022:9;:15;49032:4;49022:15;;;;;;;;;;;;;;;:38;;;;49099:6;49082:9;:13;49092:2;49082:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;49138:2;49123:26;;49132:4;49123:26;;;49142:6;49123:26;;;;;;:::i;:::-;;;;;;;;49162:37;49182:4;49188:2;49192:6;49162:19;:37::i;:::-;48648:559;48536:671;;;:::o;35662:118::-;34671:19;:17;:19::i;:::-;35732:4:::1;35722:7;;:14;;;;;;;;;;;;;;;;;;35752:20;35759:12;:10;:12::i;:::-;35752:20;;;;;;:::i;:::-;;;;;;;;35662:118::o:0;9592:158::-;9666:7;9717:22;9721:3;:10;;9733:5;9717:3;:22::i;:::-;9709:31;;9686:56;;9592:158;;;;:::o;9121:117::-;9184:7;9211:19;9219:3;:10;;9211:7;:19::i;:::-;9204:26;;9121:117;;;:::o;2211:414::-;2274:4;2296:21;2306:3;2311:5;2296:9;:21::i;:::-;2291:327;;2334:3;:11;;2351:5;2334:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:3;:11;;:18;;;;2495:3;:12;;:19;2508:5;2495:19;;;;;;;;;;;:40;;;;2557:4;2550:11;;;;2291:327;2601:5;2594:12;;2211:414;;;;;:::o;25313:204::-;25398:4;25437:32;25422:47;;;:11;:47;;;;:87;;;;25473:36;25497:11;25473:23;:36::i;:::-;25422:87;25415:94;;25313:204;;;:::o;16766:451::-;16841:13;16867:19;16912:1;16903:6;16899:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16889:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16867:47;;16925:15;:6;16932:1;16925:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16951;:6;16958:1;16951:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16982:9;17007:1;16998:6;16994:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16982:26;;16977:135;17014:1;17010;:5;16977:135;;;17049:12;17070:3;17062:5;:11;17049:25;;;;;;;:::i;:::-;;;;;17037:6;17044:1;17037:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;17099:1;17089:11;;;;;17017:3;;;;:::i;:::-;;;16977:135;;;;17139:1;17130:5;:10;17122:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17202:6;17188:21;;;16766:451;;;;:::o;30749:239::-;30833:22;30841:4;30847:7;30833;:22::i;:::-;30829:152;;;30904:5;30872:6;:12;30879:4;30872:12;;;;;;;;;;;:20;;:29;30893:7;30872:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;30956:12;:10;:12::i;:::-;30929:40;;30947:7;30929:40;;30941:4;30929:40;;;;;;;;;;30829:152;30749:239;;:::o;8624:158::-;8697:4;8721:53;8729:3;:10;;8765:5;8749:23;;8741:32;;8721:7;:53::i;:::-;8714:60;;8624:158;;;;:::o;35410:108::-;35477:8;:6;:8::i;:::-;35469:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;35410:108::o;56890:289::-;57065:14;:20;57080:4;57065:20;;;;;;;;;;;;;;;;;;;;;;;;;57064:21;57056:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57127:44;57154:4;57160:2;57164:6;57127:26;:44::i;:::-;56890:289;;;:::o;53708:124::-;;;;:::o;35225:108::-;35296:8;:6;:8::i;:::-;35295:9;35287:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35225:108::o;4985:120::-;5052:7;5079:3;:11;;5091:5;5079:18;;;;;;;;:::i;:::-;;;;;;;;;;5072:25;;4985:120;;;;:::o;4522:109::-;4578:7;4605:3;:11;;:18;;;;4598:25;;4522:109;;;:::o;4307:129::-;4380:4;4427:1;4404:3;:12;;:19;4417:5;4404:19;;;;;;;;;;;;:24;;4397:31;;4307:129;;;;:::o;14871:157::-;14956:4;14995:25;14980:40;;;:11;:40;;;;14973:47;;14871:157;;;:::o;2801:1420::-;2867:4;2985:18;3006:3;:12;;:19;3019:5;3006:19;;;;;;;;;;;;2985:40;;3056:1;3042:10;:15;3038:1176;;3417:21;3454:1;3441:10;:14;;;;:::i;:::-;3417:38;;3470:17;3511:1;3490:3;:11;;:18;;;;:22;;;;:::i;:::-;3470:42;;3546:13;3533:9;:26;3529:405;;3580:17;3600:3;:11;;3612:9;3600:22;;;;;;;;:::i;:::-;;;;;;;;;;3580:42;;3754:9;3725:3;:11;;3737:13;3725:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3865:10;3839:3;:12;;:23;3852:9;3839:23;;;;;;;;;;;:36;;;;3561:373;3529:405;4015:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4110:3;:12;;:19;4123:5;4110:19;;;;;;;;;;;4103:26;;;4153:4;4146:11;;;;;;;3038:1176;4197:5;4190:12;;;2801: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:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:118::-;4290:24;4308:5;4290:24;:::i;:::-;4285:3;4278:37;4203:118;;:::o;4327:222::-;4420:4;4458:2;4447:9;4443:18;4435:26;;4471:71;4539:1;4528:9;4524:17;4515:6;4471:71;:::i;:::-;4327:222;;;;:::o;4555:619::-;4632:6;4640;4648;4697:2;4685:9;4676:7;4672:23;4668:32;4665:119;;;4703:79;;:::i;:::-;4665:119;4823:1;4848:53;4893:7;4884:6;4873:9;4869:22;4848:53;:::i;:::-;4838:63;;4794:117;4950:2;4976:53;5021:7;5012:6;5001:9;4997:22;4976:53;:::i;:::-;4966:63;;4921:118;5078:2;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5049:118;4555:619;;;;;:::o;5180:77::-;5217:7;5246:5;5235:16;;5180:77;;;:::o;5263:122::-;5336:24;5354:5;5336:24;:::i;:::-;5329:5;5326:35;5316:63;;5375:1;5372;5365:12;5316:63;5263:122;:::o;5391:139::-;5437:5;5475:6;5462:20;5453:29;;5491:33;5518:5;5491:33;:::i;:::-;5391:139;;;;:::o;5536:329::-;5595:6;5644:2;5632:9;5623:7;5619:23;5615:32;5612:119;;;5650:79;;:::i;:::-;5612:119;5770:1;5795:53;5840:7;5831:6;5820:9;5816:22;5795:53;:::i;:::-;5785:63;;5741:117;5536:329;;;;:::o;5871:118::-;5958:24;5976:5;5958:24;:::i;:::-;5953:3;5946:37;5871:118;;:::o;5995:222::-;6088:4;6126:2;6115:9;6111:18;6103:26;;6139:71;6207:1;6196:9;6192:17;6183:6;6139:71;:::i;:::-;5995:222;;;;:::o;6223:329::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6223:329;;;;:::o;6558:474::-;6626:6;6634;6683:2;6671:9;6662:7;6658:23;6654:32;6651:119;;;6689:79;;:::i;:::-;6651:119;6809:1;6834:53;6879:7;6870:6;6859:9;6855:22;6834:53;:::i;:::-;6824:63;;6780:117;6936:2;6962:53;7007:7;6998:6;6987:9;6983:22;6962:53;:::i;:::-;6952:63;;6907:118;6558:474;;;;;:::o;7038:86::-;7073:7;7113:4;7106:5;7102:16;7091:27;;7038:86;;;:::o;7130:112::-;7213:22;7229:5;7213:22;:::i;:::-;7208:3;7201:35;7130:112;;:::o;7248:214::-;7337:4;7375:2;7364:9;7360:18;7352:26;;7388:67;7452:1;7441:9;7437:17;7428:6;7388:67;:::i;:::-;7248:214;;;;:::o;7468:329::-;7527:6;7576:2;7564:9;7555:7;7551:23;7547:32;7544:119;;;7582:79;;:::i;:::-;7544:119;7702:1;7727:53;7772:7;7763:6;7752:9;7748:22;7727:53;:::i;:::-;7717:63;;7673:117;7468:329;;;;:::o;7803:117::-;7912:1;7909;7902:12;7926:117;8035:1;8032;8025:12;8049:180;8097:77;8094:1;8087:88;8194:4;8191:1;8184:15;8218:4;8215:1;8208:15;8235:281;8318:27;8340:4;8318:27;:::i;:::-;8310:6;8306:40;8448:6;8436:10;8433:22;8412:18;8400:10;8397:34;8394:62;8391:88;;;8459:18;;:::i;:::-;8391:88;8499:10;8495:2;8488:22;8278:238;8235:281;;:::o;8522:129::-;8556:6;8583:20;;:::i;:::-;8573:30;;8612:33;8640:4;8632:6;8612:33;:::i;:::-;8522:129;;;:::o;8657:308::-;8719:4;8809:18;8801:6;8798:30;8795:56;;;8831:18;;:::i;:::-;8795:56;8869:29;8891:6;8869:29;:::i;:::-;8861:37;;8953:4;8947;8943:15;8935:23;;8657:308;;;:::o;8971:146::-;9068:6;9063:3;9058;9045:30;9109:1;9100:6;9095:3;9091:16;9084:27;8971:146;;;:::o;9123:425::-;9201:5;9226:66;9242:49;9284:6;9242:49;:::i;:::-;9226:66;:::i;:::-;9217:75;;9315:6;9308:5;9301:21;9353:4;9346:5;9342:16;9391:3;9382:6;9377:3;9373:16;9370:25;9367:112;;;9398:79;;:::i;:::-;9367:112;9488:54;9535:6;9530:3;9525;9488:54;:::i;:::-;9207:341;9123:425;;;;;:::o;9568:340::-;9624:5;9673:3;9666:4;9658:6;9654:17;9650:27;9640:122;;9681:79;;:::i;:::-;9640:122;9798:6;9785:20;9823:79;9898:3;9890:6;9883:4;9875:6;9871:17;9823:79;:::i;:::-;9814:88;;9630:278;9568:340;;;;:::o;9914:799::-;10001:6;10009;10017;10066:2;10054:9;10045:7;10041:23;10037:32;10034:119;;;10072:79;;:::i;:::-;10034:119;10192:1;10217:53;10262:7;10253:6;10242:9;10238:22;10217:53;:::i;:::-;10207:63;;10163:117;10319:2;10345:53;10390:7;10381:6;10370:9;10366:22;10345:53;:::i;:::-;10335:63;;10290:118;10475:2;10464:9;10460:18;10447:32;10506:18;10498:6;10495:30;10492:117;;;10528:79;;:::i;:::-;10492:117;10633:63;10688:7;10679:6;10668:9;10664:22;10633:63;:::i;:::-;10623:73;;10418:288;9914:799;;;;;:::o;10719:474::-;10787:6;10795;10844:2;10832:9;10823:7;10819:23;10815:32;10812:119;;;10850:79;;:::i;:::-;10812:119;10970:1;10995:53;11040:7;11031:6;11020:9;11016:22;10995:53;:::i;:::-;10985:63;;10941:117;11097:2;11123:53;11168:7;11159:6;11148:9;11144:22;11123:53;:::i;:::-;11113:63;;11068:118;10719:474;;;;;:::o;11199:118::-;11286:24;11304:5;11286:24;:::i;:::-;11281:3;11274:37;11199:118;;:::o;11323:222::-;11416:4;11454:2;11443:9;11439:18;11431:26;;11467:71;11535:1;11524:9;11520:17;11511:6;11467:71;:::i;:::-;11323:222;;;;:::o;11551:117::-;11660:1;11657;11650:12;11674:117;11783:1;11780;11773:12;11814:568;11887:8;11897:6;11947:3;11940:4;11932:6;11928:17;11924:27;11914:122;;11955:79;;:::i;:::-;11914:122;12068:6;12055:20;12045:30;;12098:18;12090:6;12087:30;12084:117;;;12120:79;;:::i;:::-;12084:117;12234:4;12226:6;12222:17;12210:29;;12288:3;12280:4;12272:6;12268:17;12258:8;12254:32;12251:41;12248:128;;;12295:79;;:::i;:::-;12248:128;11814:568;;;;;:::o;12388:559::-;12474:6;12482;12531:2;12519:9;12510:7;12506:23;12502:32;12499:119;;;12537:79;;:::i;:::-;12499:119;12685:1;12674:9;12670:17;12657:31;12715:18;12707:6;12704:30;12701:117;;;12737:79;;:::i;:::-;12701:117;12850:80;12922:7;12913:6;12902:9;12898:22;12850:80;:::i;:::-;12832:98;;;;12628:312;12388:559;;;;;:::o;12953:474::-;13021:6;13029;13078:2;13066:9;13057:7;13053:23;13049:32;13046:119;;;13084:79;;:::i;:::-;13046:119;13204:1;13229:53;13274:7;13265:6;13254:9;13250:22;13229:53;:::i;:::-;13219:63;;13175:117;13331:2;13357:53;13402:7;13393:6;13382:9;13378:22;13357:53;:::i;:::-;13347:63;;13302:118;12953:474;;;;;:::o;13433:180::-;13481:77;13478:1;13471:88;13578:4;13575:1;13568:15;13602:4;13599:1;13592:15;13619:320;13663:6;13700:1;13694:4;13690:12;13680:22;;13747:1;13741:4;13737:12;13768:18;13758:81;;13824:4;13816:6;13812:17;13802:27;;13758:81;13886:2;13878:6;13875:14;13855:18;13852:38;13849:84;;13905:18;;:::i;:::-;13849:84;13670:269;13619:320;;;:::o;13945:234::-;14085:34;14081:1;14073:6;14069:14;14062:58;14154:17;14149:2;14141:6;14137:15;14130:42;13945:234;:::o;14185:366::-;14327:3;14348:67;14412:2;14407:3;14348:67;:::i;:::-;14341:74;;14424:93;14513:3;14424:93;:::i;:::-;14542:2;14537:3;14533:12;14526:19;;14185:366;;;:::o;14557:419::-;14723:4;14761:2;14750:9;14746:18;14738:26;;14810:9;14804:4;14800:20;14796:1;14785:9;14781:17;14774:47;14838:131;14964:4;14838:131;:::i;:::-;14830:139;;14557:419;;;:::o;14982:180::-;15030:77;15027:1;15020:88;15127:4;15124:1;15117:15;15151:4;15148:1;15141:15;15168:191;15208:3;15227:20;15245:1;15227:20;:::i;:::-;15222:25;;15261:20;15279:1;15261:20;:::i;:::-;15256:25;;15304:1;15301;15297:9;15290:16;;15325:3;15322:1;15319:10;15316:36;;;15332:18;;:::i;:::-;15316:36;15168:191;;;;:::o;15365:177::-;15505:29;15501:1;15493:6;15489:14;15482:53;15365:177;:::o;15548:366::-;15690:3;15711:67;15775:2;15770:3;15711:67;:::i;:::-;15704:74;;15787:93;15876:3;15787:93;:::i;:::-;15905:2;15900:3;15896:12;15889:19;;15548:366;;;:::o;15920:419::-;16086:4;16124:2;16113:9;16109:18;16101:26;;16173:9;16167:4;16163:20;16159:1;16148:9;16144:17;16137:47;16201:131;16327:4;16201:131;:::i;:::-;16193:139;;15920:419;;;:::o;16345:644::-;16542:4;16580:3;16569:9;16565:19;16557:27;;16594:71;16662:1;16651:9;16647:17;16638:6;16594:71;:::i;:::-;16675:72;16743:2;16732:9;16728:18;16719:6;16675:72;:::i;:::-;16757;16825:2;16814:9;16810:18;16801:6;16757:72;:::i;:::-;16876:9;16870:4;16866:20;16861:2;16850:9;16846:18;16839:48;16904:78;16977:4;16968:6;16904:78;:::i;:::-;16896:86;;16345:644;;;;;;;:::o;16995:166::-;17135:18;17131:1;17123:6;17119:14;17112:42;16995:166;:::o;17167:366::-;17309:3;17330:67;17394:2;17389:3;17330:67;:::i;:::-;17323:74;;17406:93;17495:3;17406:93;:::i;:::-;17524:2;17519:3;17515:12;17508:19;;17167:366;;;:::o;17539:419::-;17705:4;17743:2;17732:9;17728:18;17720:26;;17792:9;17786:4;17782:20;17778:1;17767:9;17763:17;17756:47;17820:131;17946:4;17820:131;:::i;:::-;17812:139;;17539:419;;;:::o;17964:180::-;18012:77;18009:1;18002:88;18109:4;18106:1;18099:15;18133:4;18130:1;18123:15;18150:233;18189:3;18212:24;18230:5;18212:24;:::i;:::-;18203:33;;18258:66;18251:5;18248:77;18245:103;;18328:18;;:::i;:::-;18245:103;18375:1;18368:5;18364:13;18357:20;;18150:233;;;:::o;18389:184::-;18488:11;18522:6;18517:3;18510:19;18562:4;18557:3;18553:14;18538:29;;18389:184;;;;:::o;18579:102::-;18648:4;18671:3;18663:11;;18579:102;;;:::o;18687:108::-;18764:24;18782:5;18764:24;:::i;:::-;18759:3;18752:37;18687:108;;:::o;18801:179::-;18870:10;18891:46;18933:3;18925:6;18891:46;:::i;:::-;18969:4;18964:3;18960:14;18946:28;;18801:179;;;;:::o;18986:122::-;19038:5;19063:39;19098:2;19093:3;19089:12;19084:3;19063:39;:::i;:::-;19054:48;;18986:122;;;;:::o;19114:115::-;19186:4;19218;19213:3;19209:14;19201:22;;19114:115;;;:::o;19265:699::-;19394:3;19417:86;19496:6;19491:3;19417:86;:::i;:::-;19410:93;;19527:58;19579:5;19527:58;:::i;:::-;19608:7;19639:1;19624:315;19649:6;19646:1;19643:13;19624:315;;;19719:42;19754:6;19745:7;19719:42;:::i;:::-;19781:63;19840:3;19825:13;19781:63;:::i;:::-;19774:70;;19867:62;19922:6;19867:62;:::i;:::-;19857:72;;19684:255;19671:1;19668;19664:9;19659:14;;19624:315;;;19628:14;19955:3;19948:10;;19399:565;;19265:699;;;;;:::o;19970:393::-;20123:4;20161:2;20150:9;20146:18;20138:26;;20210:9;20204:4;20200:20;20196:1;20185:9;20181:17;20174:47;20238:118;20351:4;20342:6;20334;20238:118;:::i;:::-;20230:126;;19970:393;;;;;:::o;20369:224::-;20509:34;20505:1;20497:6;20493:14;20486:58;20578:7;20573:2;20565:6;20561:15;20554:32;20369:224;:::o;20599:366::-;20741:3;20762:67;20826:2;20821:3;20762:67;:::i;:::-;20755:74;;20838:93;20927:3;20838:93;:::i;:::-;20956:2;20951:3;20947:12;20940:19;;20599:366;;;:::o;20971:419::-;21137:4;21175:2;21164:9;21160:18;21152:26;;21224:9;21218:4;21214:20;21210:1;21199:9;21195:17;21188:47;21252:131;21378:4;21252:131;:::i;:::-;21244:139;;20971:419;;;:::o;21396:229::-;21536:34;21532:1;21524:6;21520:14;21513:58;21605:12;21600:2;21592:6;21588:15;21581:37;21396:229;:::o;21631:366::-;21773:3;21794:67;21858:2;21853:3;21794:67;:::i;:::-;21787:74;;21870:93;21959:3;21870:93;:::i;:::-;21988:2;21983:3;21979:12;21972:19;;21631:366;;;:::o;22003:419::-;22169:4;22207:2;22196:9;22192:18;22184:26;;22256:9;22250:4;22246:20;22242:1;22231:9;22227:17;22220:47;22284:131;22410:4;22284:131;:::i;:::-;22276:139;;22003:419;;;:::o;22428:223::-;22568:34;22564:1;22556:6;22552:14;22545:58;22637:6;22632:2;22624:6;22620:15;22613:31;22428:223;:::o;22657:366::-;22799:3;22820:67;22884:2;22879:3;22820:67;:::i;:::-;22813:74;;22896:93;22985:3;22896:93;:::i;:::-;23014:2;23009:3;23005:12;22998:19;;22657:366;;;:::o;23029:419::-;23195:4;23233:2;23222:9;23218:18;23210:26;;23282:9;23276:4;23272:20;23268:1;23257:9;23253:17;23246:47;23310:131;23436:4;23310:131;:::i;:::-;23302:139;;23029:419;;;:::o;23454:221::-;23594:34;23590:1;23582:6;23578:14;23571:58;23663:4;23658:2;23650:6;23646:15;23639:29;23454:221;:::o;23681:366::-;23823:3;23844:67;23908:2;23903:3;23844:67;:::i;:::-;23837:74;;23920:93;24009:3;23920:93;:::i;:::-;24038:2;24033:3;24029:12;24022:19;;23681:366;;;:::o;24053:419::-;24219:4;24257:2;24246:9;24242:18;24234:26;;24306:9;24300:4;24296:20;24292:1;24281:9;24277:17;24270:47;24334:131;24460:4;24334:131;:::i;:::-;24326:139;;24053:419;;;:::o;24478:179::-;24618:31;24614:1;24606:6;24602:14;24595:55;24478:179;:::o;24663:366::-;24805:3;24826:67;24890:2;24885:3;24826:67;:::i;:::-;24819:74;;24902:93;24991:3;24902:93;:::i;:::-;25020:2;25015:3;25011:12;25004:19;;24663:366;;;:::o;25035:419::-;25201:4;25239:2;25228:9;25224:18;25216:26;;25288:9;25282:4;25278:20;25274:1;25263:9;25259:17;25252:47;25316:131;25442:4;25316:131;:::i;:::-;25308:139;;25035:419;;;:::o;25460:442::-;25609:4;25647:2;25636:9;25632:18;25624:26;;25660:71;25728:1;25717:9;25713:17;25704:6;25660:71;:::i;:::-;25741:72;25809:2;25798:9;25794:18;25785:6;25741:72;:::i;:::-;25823;25891:2;25880:9;25876:18;25867:6;25823:72;:::i;:::-;25460:442;;;;;;:::o;25908:148::-;26010:11;26047:3;26032:18;;25908:148;;;;:::o;26062:173::-;26202:25;26198:1;26190:6;26186:14;26179:49;26062:173;:::o;26241:402::-;26401:3;26422:85;26504:2;26499:3;26422:85;:::i;:::-;26415:92;;26516:93;26605:3;26516:93;:::i;:::-;26634:2;26629:3;26625:12;26618:19;;26241:402;;;:::o;26649:390::-;26755:3;26783:39;26816:5;26783:39;:::i;:::-;26838:89;26920:6;26915:3;26838:89;:::i;:::-;26831:96;;26936:65;26994:6;26989:3;26982:4;26975:5;26971:16;26936:65;:::i;:::-;27026:6;27021:3;27017:16;27010:23;;26759:280;26649:390;;;;:::o;27045:167::-;27185:19;27181:1;27173:6;27169:14;27162:43;27045:167;:::o;27218:402::-;27378:3;27399:85;27481:2;27476:3;27399:85;:::i;:::-;27392:92;;27493:93;27582:3;27493:93;:::i;:::-;27611:2;27606:3;27602:12;27595:19;;27218:402;;;:::o;27626:967::-;28008:3;28030:148;28174:3;28030:148;:::i;:::-;28023:155;;28195:95;28286:3;28277:6;28195:95;:::i;:::-;28188:102;;28307:148;28451:3;28307:148;:::i;:::-;28300:155;;28472:95;28563:3;28554:6;28472:95;:::i;:::-;28465:102;;28584:3;28577:10;;27626:967;;;;;:::o;28599:220::-;28739:34;28735:1;28727:6;28723:14;28716:58;28808:3;28803:2;28795:6;28791:15;28784:28;28599:220;:::o;28825:366::-;28967:3;28988:67;29052:2;29047:3;28988:67;:::i;:::-;28981:74;;29064:93;29153:3;29064:93;:::i;:::-;29182:2;29177:3;29173:12;29166:19;;28825:366;;;:::o;29197:419::-;29363:4;29401:2;29390:9;29386:18;29378:26;;29450:9;29444:4;29440:20;29436:1;29425:9;29421:17;29414:47;29478:131;29604:4;29478:131;:::i;:::-;29470:139;;29197:419;;;:::o;29622:221::-;29762:34;29758:1;29750:6;29746:14;29739:58;29831:4;29826:2;29818:6;29814:15;29807:29;29622:221;:::o;29849:366::-;29991:3;30012:67;30076:2;30071:3;30012:67;:::i;:::-;30005:74;;30088:93;30177:3;30088:93;:::i;:::-;30206:2;30201:3;30197:12;30190:19;;29849:366;;;:::o;30221:419::-;30387:4;30425:2;30414:9;30410:18;30402:26;;30474:9;30468:4;30464:20;30460:1;30449:9;30445:17;30438:47;30502:131;30628:4;30502:131;:::i;:::-;30494:139;;30221:419;;;:::o;30646:194::-;30686:4;30706:20;30724:1;30706:20;:::i;:::-;30701:25;;30740:20;30758:1;30740:20;:::i;:::-;30735:25;;30784:1;30781;30777:9;30769:17;;30808:1;30802:4;30799:11;30796:37;;;30813:18;;:::i;:::-;30796:37;30646:194;;;;:::o;30846:224::-;30986:34;30982:1;30974:6;30970:14;30963:58;31055:7;31050:2;31042:6;31038:15;31031:32;30846:224;:::o;31076:366::-;31218:3;31239:67;31303:2;31298:3;31239:67;:::i;:::-;31232:74;;31315:93;31404:3;31315:93;:::i;:::-;31433:2;31428:3;31424:12;31417:19;;31076:366;;;:::o;31448:419::-;31614:4;31652:2;31641:9;31637:18;31629:26;;31701:9;31695:4;31691:20;31687:1;31676:9;31672:17;31665:47;31729:131;31855:4;31729:131;:::i;:::-;31721:139;;31448:419;;;:::o;31873:222::-;32013:34;32009:1;32001:6;31997:14;31990:58;32082:5;32077:2;32069:6;32065:15;32058:30;31873:222;:::o;32101:366::-;32243:3;32264:67;32328:2;32323:3;32264:67;:::i;:::-;32257:74;;32340:93;32429:3;32340:93;:::i;:::-;32458:2;32453:3;32449:12;32442:19;;32101:366;;;:::o;32473:419::-;32639:4;32677:2;32666:9;32662:18;32654:26;;32726:9;32720:4;32716:20;32712:1;32701:9;32697:17;32690:47;32754:131;32880:4;32754:131;:::i;:::-;32746:139;;32473:419;;;:::o;32898:225::-;33038:34;33034:1;33026:6;33022:14;33015:58;33107:8;33102:2;33094:6;33090:15;33083:33;32898:225;:::o;33129:366::-;33271:3;33292:67;33356:2;33351:3;33292:67;:::i;:::-;33285:74;;33368:93;33457:3;33368:93;:::i;:::-;33486:2;33481:3;33477:12;33470:19;;33129:366;;;:::o;33501:419::-;33667:4;33705:2;33694:9;33690:18;33682:26;;33754:9;33748:4;33744:20;33740:1;33729:9;33725:17;33718:47;33782:131;33908:4;33782:131;:::i;:::-;33774:139;;33501:419;;;:::o;33926:410::-;33966:7;33989:20;34007:1;33989:20;:::i;:::-;33984:25;;34023:20;34041:1;34023:20;:::i;:::-;34018:25;;34078:1;34075;34071:9;34100:30;34118:11;34100:30;:::i;:::-;34089:41;;34279:1;34270:7;34266:15;34263:1;34260:22;34240:1;34233:9;34213:83;34190:139;;34309:18;;:::i;:::-;34190:139;33974:362;33926:410;;;;:::o;34342:171::-;34381:3;34404:24;34422:5;34404:24;:::i;:::-;34395:33;;34450:4;34443:5;34440:15;34437:41;;34458:18;;:::i;:::-;34437:41;34505:1;34498:5;34494:13;34487:20;;34342:171;;;:::o;34519:182::-;34659:34;34655:1;34647:6;34643:14;34636:58;34519:182;:::o;34707:366::-;34849:3;34870:67;34934:2;34929:3;34870:67;:::i;:::-;34863:74;;34946:93;35035:3;34946:93;:::i;:::-;35064:2;35059:3;35055:12;35048:19;;34707:366;;;:::o;35079:419::-;35245:4;35283:2;35272:9;35268:18;35260:26;;35332:9;35326:4;35322:20;35318:1;35307:9;35303:17;35296:47;35360:131;35486:4;35360:131;:::i;:::-;35352:139;;35079:419;;;:::o;35504:170::-;35644:22;35640:1;35632:6;35628:14;35621:46;35504:170;:::o;35680:366::-;35822:3;35843:67;35907:2;35902:3;35843:67;:::i;:::-;35836:74;;35919:93;36008:3;35919:93;:::i;:::-;36037:2;36032:3;36028:12;36021:19;;35680:366;;;:::o;36052:419::-;36218:4;36256:2;36245:9;36241:18;36233:26;;36305:9;36299:4;36295:20;36291:1;36280:9;36276:17;36269:47;36333:131;36459:4;36333:131;:::i;:::-;36325:139;;36052:419;;;:::o;36477:174::-;36617:26;36613:1;36605:6;36601:14;36594:50;36477:174;:::o;36657:366::-;36799:3;36820:67;36884:2;36879:3;36820:67;:::i;:::-;36813:74;;36896:93;36985:3;36896:93;:::i;:::-;37014:2;37009:3;37005:12;36998:19;;36657:366;;;:::o;37029:419::-;37195:4;37233:2;37222:9;37218:18;37210:26;;37282:9;37276:4;37272:20;37268:1;37257:9;37253:17;37246:47;37310:131;37436:4;37310:131;:::i;:::-;37302:139;;37029:419;;;:::o;37454:166::-;37594:18;37590:1;37582:6;37578:14;37571:42;37454:166;:::o;37626:366::-;37768:3;37789:67;37853:2;37848:3;37789:67;:::i;:::-;37782:74;;37865:93;37954:3;37865:93;:::i;:::-;37983:2;37978:3;37974:12;37967:19;;37626:366;;;:::o;37998:419::-;38164:4;38202:2;38191:9;38187:18;38179:26;;38251:9;38245:4;38241:20;38237:1;38226:9;38222:17;38215:47;38279:131;38405:4;38279:131;:::i;:::-;38271:139;;37998:419;;;:::o;38423:180::-;38471:77;38468:1;38461:88;38568:4;38565:1;38558:15;38592:4;38589:1;38582:15
Swarm Source
ipfs://986d2e3a5adb473d17fbc24cc51da5385a02513f085bf49c7941de97b418496f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.