More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 123,454 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 59463627 | 29 hrs ago | IN | 0 ETH | 0.00000469 | ||||
Safe Mint | 59397386 | 3 days ago | IN | 0.0003 ETH | 0.00000804 | ||||
Safe Mint | 59391805 | 3 days ago | IN | 0.0003 ETH | 0.00000836 | ||||
Safe Mint | 59358993 | 4 days ago | IN | 0.0003 ETH | 0.00000848 | ||||
Safe Mint | 59340668 | 4 days ago | IN | 0.0003 ETH | 0.0000085 | ||||
Safe Mint | 59326510 | 5 days ago | IN | 0.0003 ETH | 0.0000085 | ||||
Safe Mint | 59265345 | 6 days ago | IN | 0.0003 ETH | 0.00000795 | ||||
Safe Mint | 59264651 | 6 days ago | IN | 0.0003 ETH | 0.00000678 | ||||
Safe Mint | 59264557 | 6 days ago | IN | 0.0003 ETH | 0.00000676 | ||||
Safe Mint | 59264543 | 6 days ago | IN | 0.0003 ETH | 0.00001072 | ||||
Safe Mint | 59184118 | 8 days ago | IN | 0.0003 ETH | 0.00000637 | ||||
Safe Mint | 59184105 | 8 days ago | IN | 0.0003 ETH | 0.00000966 | ||||
Safe Mint | 59124184 | 9 days ago | IN | 0.0003 ETH | 0.00000811 | ||||
Safe Mint | 59043994 | 11 days ago | IN | 0.0003 ETH | 0.00000838 | ||||
Safe Mint | 59028456 | 11 days ago | IN | 0.0003 ETH | 0.00000644 | ||||
Safe Mint | 59027138 | 11 days ago | IN | 0.0003 ETH | 0.0000059 | ||||
Safe Mint | 59027127 | 11 days ago | IN | 0.0003 ETH | 0.00000844 | ||||
Safe Mint | 59011610 | 11 days ago | IN | 0.0003 ETH | 0.00000845 | ||||
Safe Mint | 59008534 | 11 days ago | IN | 0.0003 ETH | 0.00000911 | ||||
Safe Mint | 58931805 | 13 days ago | IN | 0.0003 ETH | 0.00000749 | ||||
Safe Mint | 58893248 | 14 days ago | IN | 0.0003 ETH | 0.00000841 | ||||
Safe Mint | 58885157 | 14 days ago | IN | 0.0003 ETH | 0.00000809 | ||||
Safe Mint | 58859704 | 14 days ago | IN | 0.0003 ETH | 0.00000785 | ||||
Safe Mint | 58814508 | 15 days ago | IN | 0.0003 ETH | 0.00000749 | ||||
Safe Mint | 58809896 | 15 days ago | IN | 0.0003 ETH | 0.00000861 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
59397386 | 3 days ago | 0.0003 ETH | ||||
59391805 | 3 days ago | 0.0003 ETH | ||||
59358993 | 4 days ago | 0.0003 ETH | ||||
59340668 | 4 days ago | 0.0003 ETH | ||||
59326510 | 5 days ago | 0.0003 ETH | ||||
59265345 | 6 days ago | 0.0003 ETH | ||||
59264651 | 6 days ago | 0.0003 ETH | ||||
59264557 | 6 days ago | 0.0003 ETH | ||||
59264543 | 6 days ago | 0.0003 ETH | ||||
59184118 | 8 days ago | 0.0003 ETH | ||||
59184105 | 8 days ago | 0.0003 ETH | ||||
59124184 | 9 days ago | 0.0003 ETH | ||||
59043994 | 11 days ago | 0.0003 ETH | ||||
59028456 | 11 days ago | 0.0003 ETH | ||||
59027138 | 11 days ago | 0.0003 ETH | ||||
59027127 | 11 days ago | 0.0003 ETH | ||||
59011610 | 11 days ago | 0.0003 ETH | ||||
59008534 | 11 days ago | 0.0003 ETH | ||||
58931805 | 13 days ago | 0.0003 ETH | ||||
58893248 | 14 days ago | 0.0003 ETH | ||||
58885157 | 14 days ago | 0.0003 ETH | ||||
58859704 | 14 days ago | 0.0003 ETH | ||||
58814508 | 15 days ago | 0.0003 ETH | ||||
58809896 | 15 days ago | 0.0003 ETH | ||||
58808906 | 15 days ago | 0.0003 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Rubyscore_Achievement
Compiler Version
v0.8.19+commit.7dd6d404
ZkSolc Version
v1.3.13
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {IRubyscore_Achievement} from "./interfaces/IRubyscore_Achievement.sol"; import {EIP712, ECDSA} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {ERC1155URIStorage} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol"; import {AccessControl, Strings} from "@openzeppelin/contracts/access/AccessControl.sol"; import {ERC1155, ERC1155Supply} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol"; /** * @title Rubyscore_Achievement * @dev An ERC1155 token contract for minting and managing achievements with URI support. * @dev Rubyscore_Achievement can be minted by users with the MINTER_ROLE after proper authorization. * @dev Rubyscore_Achievement can have their URIs set by operators with the MINTER_ROLE. * @dev Rubyscore_Achievement can be safely transferred with restrictions on certain tokens. */ contract Rubyscore_Achievement is ERC1155, EIP712, AccessControl, ERC1155Supply, ERC1155URIStorage, ReentrancyGuard, IRubyscore_Achievement { bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); string public constant NAME = "Rubyscore_Achievement"; string public constant VERSION = "0.0.1"; uint256 private price; string public name; string public symbol; mapping(uint256 => bool) private transferUnlock; mapping(address => uint256) private userNonce; /** * @dev See {IRubyscore_Achievement} */ function supportsInterface( bytes4 interfaceId ) public view override(ERC1155, AccessControl, IRubyscore_Achievement) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {IRubyscore_Achievement} */ function uri( uint256 tokenId ) public view override(ERC1155, ERC1155URIStorage, IRubyscore_Achievement) returns (string memory) { return super.uri(tokenId); } /** * @dev See {IRubyscore_Achievement} */ function getTransferStatus(uint256 tokenId) external view returns (bool) { return transferUnlock[tokenId]; } /** * @dev See {IRubyscore_Achievement} */ function getPrice() external view returns (uint256) { return price; } /** * @dev See {IRubyscore_Achievement} */ function getUserNonce(address userAddress) external view returns (uint256) { return userNonce[userAddress]; } /** * @dev See {IRubyscore_Achievement} */ function tokenURI(uint256 tokenId) public view returns (string memory) { return uri(tokenId); } /** * @notice Constructor for the Rubyscore_Achievement contract. * @dev Initializes the contract with roles and settings. * @param admin The address of the admin role, which has overall control. * @param operator The address of the operator role, responsible for unlock tokens and set base URI. * @param minter The address of the minter role, authorized to mint achievements and responsible for setting token URIs. * @param baseURI The base URI for token metadata. * @dev It sets the base URI for token metadata to the provided `baseURI`. * @dev It grants the DEFAULT_ADMIN_ROLE, OPERATOR_ROLE, and MINTER_ROLE to the specified addresses. * @dev It also initializes the contract with EIP712 support and ERC1155 functionality. */ constructor( address admin, address operator, address minter, string memory baseURI, string memory _name, string memory _symbol ) ERC1155("ipfs://") EIP712(NAME, VERSION) { require(admin != address(0), "Zero address check"); require(operator != address(0), "Zero address check"); require(minter != address(0), "Zero address check"); name = _name; symbol = _symbol; _grantRole(DEFAULT_ADMIN_ROLE, admin); _grantRole(OPERATOR_ROLE, msg.sender); _grantRole(OPERATOR_ROLE, operator); _grantRole(MINTER_ROLE, minter); _setBaseURI(baseURI); } /** * @dev See {IRubyscore_Achievement} */ function setTokenURI(uint256 tokenId, string memory newTokenURI) public onlyRole(MINTER_ROLE) { super._setURI(tokenId, newTokenURI); emit TokenURISet(tokenId, newTokenURI); } /** * @dev See {IRubyscore_Achievement} */ function setBatchTokenURI( uint256[] calldata tokenIds, string[] calldata newTokenURIs ) external onlyRole(MINTER_ROLE) { require(tokenIds.length == newTokenURIs.length, "Invalid params"); for (uint256 i = 0; i < tokenIds.length; i++) { setTokenURI(tokenIds[i], newTokenURIs[i]); } } /** * @dev See {IRubyscore_Achievement} */ function setBaseURI(string memory newBaseURI) external onlyRole(OPERATOR_ROLE) { super._setBaseURI(newBaseURI); emit BaseURISet(newBaseURI); } /** * @dev See {IRubyscore_Achievement} */ function setPrice(uint256 newPrice) external onlyRole(OPERATOR_ROLE) { price = newPrice; emit PriceUpdated(newPrice); } /** * @dev See {IRubyscore_Achievement} */ function safeMint(MintParams memory mintParams, bytes calldata operatorSignature) external payable nonReentrant { require(mintParams.nftIds.length >= 1, "Invalid NFT ids"); require(msg.value == price, "Wrong payment amount"); bytes32 digest = _hashTypedDataV4( keccak256( abi.encode( keccak256("MintParams(address userAddress,uint256 userNonce,uint256[] nftIds)"), msg.sender, userNonce[msg.sender], keccak256(abi.encodePacked(mintParams.nftIds)) ) ) ); _checkRole(MINTER_ROLE, ECDSA.recover(digest, operatorSignature)); userNonce[mintParams.userAddress] += 1; if (mintParams.nftIds.length > 1) _mintBatch(mintParams.userAddress, mintParams.nftIds, ""); else _mint(mintParams.userAddress, mintParams.nftIds[0], ""); emit Minted(mintParams.userAddress, mintParams.userNonce, mintParams.nftIds); } /** * @dev See {IRubyscore_Achievement} */ function setTransferUnlock(uint256 tokenId, bool lock) external onlyRole(OPERATOR_ROLE) { transferUnlock[tokenId] = lock; emit TokenUnlockSet(tokenId, lock); } /** * @dev See {IRubyscore_Achievement} */ function withdraw() external onlyRole(DEFAULT_ADMIN_ROLE) { uint256 amount = address(this).balance; require(amount > 0, "Zero amount to withdraw"); (bool sent, ) = payable(msg.sender).call{value: amount}(""); require(sent, "Failed to send Ether"); emit Withdrawed(amount); } /** * @dev See {IRubyscore_Achievement} */ function _mint(address to, uint256 id, bytes memory data) internal { require(balanceOf(to, id) == 0, "You already have this achievement"); super._mint(to, id, 1, data); } /** * @notice Internal function to safely mint multiple NFTs in a batch for a specified recipient. * @param to The address of the recipient to mint the NFTs for. * @param ids An array of NFT IDs to mint. * @param data Additional data to include in the minting transaction. * @dev This function checks if the recipient already owns any of the specified NFTs to prevent duplicates. * @dev It is intended for batch minting operations where multiple NFTs can be minted at once. */ function _mintBatch(address to, uint256[] memory ids, bytes memory data) internal { uint256[] memory amounts = new uint256[](ids.length); for (uint8 i = 0; i < ids.length; i++) { require(balanceOf(to, ids[i]) == 0, "You already have this achievement"); amounts[i] = 1; } super._mintBatch(to, ids, amounts, data); } /** * @notice Internal function that is called before the transfer of tokens. * @param operator The address that initiates or approves the transfer. * @param from The address from which the tokens are being transferred. * @param to The address to which the tokens are being transferred. * @param ids An array of token IDs to be transferred. * @param amounts An array of token amounts corresponding to the IDs to be transferred. * @param data Additional data to include in the transfer. * @dev This function enforces transfer restrictions based on the 'transferUnlock' status of individual tokens. * @dev If a token has its transfer locked and the 'from' address is not zero (indicating a user-to-contract transfer), * it will revert to prevent unauthorized transfers. * @dev It then delegates the transfer logic to the parent contracts 'ERC1155' and 'ERC1155Supply'. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) { for (uint256 i = 0; i < ids.length; i++) { if (!transferUnlock[ids[i]] && from != address(0)) revert("This token only for you"); } super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ 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(account), " 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()); } } }
// SPDX-License-Identifier: MIT // 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol) pragma solidity ^0.8.0; interface IERC5267 { /** * @dev MAY be emitted to signal that the domain could have changed. */ event EIP712DomainChanged(); /** * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 * signature. */ function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] memory accounts, uint256[] memory ids ) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn(address from, uint256 id, uint256 amount) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; import "../ERC1155.sol"; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155URIStorage.sol) pragma solidity ^0.8.0; import "../../../utils/Strings.sol"; import "../ERC1155.sol"; /** * @dev ERC1155 token with storage based token URI management. * Inspired by the ERC721URIStorage extension * * _Available since v4.6._ */ abstract contract ERC1155URIStorage is ERC1155 { using Strings for uint256; // Optional base URI string private _baseURI = ""; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the concatenation of the `_baseURI` * and the token-specific uri if the latter is set * * This enables the following behaviors: * * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation * of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI` * is empty per default); * * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()` * which in most cases will contain `ERC1155._uri`; * * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a * uri value set, then the result is empty. */ function uri(uint256 tokenId) public view virtual override returns (string memory) { string memory tokenURI = _tokenURIs[tokenId]; // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked). return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId); } /** * @dev Sets `tokenURI` as the tokenURI of `tokenId`. */ function _setURI(uint256 tokenId, string memory tokenURI) internal virtual { _tokenURIs[tokenId] = tokenURI; emit URI(uri(tokenId), tokenId); } /** * @dev Sets `baseURI` as the `_baseURI` for all tokens */ function _setBaseURI(string memory baseURI) internal virtual { _baseURI = baseURI; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol) pragma solidity ^0.8.8; import "./StorageSlot.sol"; // | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | // | length | 0x BB | type ShortString is bytes32; /** * @dev This library provides functions to convert short memory strings * into a `ShortString` type that can be used as an immutable variable. * * Strings of arbitrary length can be optimized using this library if * they are short enough (up to 31 bytes) by packing them with their * length (1 byte) in a single EVM word (32 bytes). Additionally, a * fallback mechanism can be used for every other case. * * Usage example: * * ```solidity * contract Named { * using ShortStrings for *; * * ShortString private immutable _name; * string private _nameFallback; * * constructor(string memory contractName) { * _name = contractName.toShortStringWithFallback(_nameFallback); * } * * function name() external view returns (string memory) { * return _name.toStringWithFallback(_nameFallback); * } * } * ``` */ library ShortStrings { // Used as an identifier for strings longer than 31 bytes. bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF; error StringTooLong(string str); error InvalidShortString(); /** * @dev Encode a string of at most 31 chars into a `ShortString`. * * This will trigger a `StringTooLong` error is the input string is too long. */ function toShortString(string memory str) internal pure returns (ShortString) { bytes memory bstr = bytes(str); if (bstr.length > 31) { revert StringTooLong(str); } return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length)); } /** * @dev Decode a `ShortString` back to a "normal" string. */ function toString(ShortString sstr) internal pure returns (string memory) { uint256 len = byteLength(sstr); // using `new string(len)` would work locally but is not memory safe. string memory str = new string(32); /// @solidity memory-safe-assembly assembly { mstore(str, len) mstore(add(str, 0x20), sstr) } return str; } /** * @dev Return the length of a `ShortString`. */ function byteLength(ShortString sstr) internal pure returns (uint256) { uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF; if (result > 31) { revert InvalidShortString(); } return result; } /** * @dev Encode a string into a `ShortString`, or write it to storage if it is too long. */ function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) { if (bytes(value).length < 32) { return toShortString(value); } else { StorageSlot.getStringSlot(store).value = value; return ShortString.wrap(_FALLBACK_SENTINEL); } } /** * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}. */ function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) { if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) { return toString(value); } else { return store; } } /** * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}. * * WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of * actual characters as the UTF-8 encoding of a single character can span over multiple bytes. */ function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) { if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) { return byteLength(value); } else { return bytes(store).length; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _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) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.8; import "./ECDSA.sol"; import "../ShortStrings.sol"; import "../../interfaces/IERC5267.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. * * _Available since v3.4._ * * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment */ abstract contract EIP712 is IERC5267 { using ShortStrings for *; bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _cachedDomainSeparator; uint256 private immutable _cachedChainId; address private immutable _cachedThis; bytes32 private immutable _hashedName; bytes32 private immutable _hashedVersion; ShortString private immutable _name; ShortString private immutable _version; string private _nameFallback; string private _versionFallback; /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { _name = name.toShortStringWithFallback(_nameFallback); _version = version.toShortStringWithFallback(_versionFallback); _hashedName = keccak256(bytes(name)); _hashedVersion = keccak256(bytes(version)); _cachedChainId = block.chainid; _cachedDomainSeparator = _buildDomainSeparator(); _cachedThis = address(this); } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _cachedThis && block.chainid == _cachedChainId) { return _cachedDomainSeparator; } else { return _buildDomainSeparator(); } } function _buildDomainSeparator() private view returns (bytes32) { return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev See {EIP-5267}. * * _Available since v4.9._ */ function eip712Domain() public view virtual override returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ) { return ( hex"0f", // 01111 _name.toStringWithFallback(_nameFallback), _version.toStringWithFallback(_versionFallback), block.chainid, address(this), bytes32(0), new uint256[](0) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity 0.8.19; import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; /** * @title IRubyscore_Achievement * @dev IRubyscore_Achievement is an interface for Rubyscore_Achievement contract */ interface IRubyscore_Achievement is IERC1155 { struct MintParams { address userAddress; // Address of the buyer. uint256 userNonce; // Nonce associated with the user's address for preventing replay attacks. uint256[] nftIds; // ids of NFTs to mint } /** * @notice Emitted when the base URI for token metadata is updated. * @param newBaseURI The new base URI that will be used to construct token metadata URIs. * @dev This event is triggered when the contract operator updates the base URI * for retrieving metadata associated with tokens. The 'newBaseURI' parameter represents * the updated base URI. */ event BaseURISet(string indexed newBaseURI); /** * @notice Emitted when NFTs are minted for a user. * @param userAddress The address of the user receiving the NFTs. * @param userNonce The user's nonce used to prevent replay attacks. * @param nftIds An array of NFT IDs that were minted. * @dev This event is emitted when new NFTs are created and assigned to a user. * @dev It includes the user's address, nonce, and the IDs of the minted NFTs for transparency. */ event Minted(address indexed userAddress, uint256 indexed userNonce, uint256[] nftIds); /** * @notice Emitted when the URI for a specific token is updated. * @param tokenId The ID of the token for which the URI is updated. * @param newTokenURI The new URI assigned to the token. * @dev This event is emitted when the URI for a token is modified, providing transparency * when metadata URIs are changed for specific tokens. */ event TokenURISet(uint256 indexed tokenId, string indexed newTokenURI); /** * @notice Emitted when the transfer lock status for a token is updated. * @param tokenId The ID of the token for which the transfer lock status changes. * @param lock The new transfer lock status (true for locked, false for unlocked). * @dev This event is emitted when the transfer lock status of a specific token is modified. * @dev It provides transparency regarding whether a token can be transferred or not. */ event TokenUnlockSet(uint256 indexed tokenId, bool indexed lock); /** * @notice Emitted when the price for a token mint is updated. * @param newPrice The new price for mint. * @dev This event is emitted when the price for mint a token is modified. */ event PriceUpdated(uint256 newPrice); /** * @notice Get token name. * @return Token name. */ function name() external view returns (string memory); /** * @notice Get token symbol. * @return Token symbol. */ function symbol() external view returns (string memory); /** * @notice Get the URI of a token. * @param tokenId The ID of the token. * @return The URI of the token. */ function uri(uint256 tokenId) external view returns (string memory); /** * @notice Get the transfer status of a token. * @param tokenId The ID of the token. * @return Whether the token's transfer is unlocked (true) or restricted (false). */ function getTransferStatus(uint256 tokenId) external view returns (bool); /** * @notice Get the user's nonce associated with their address. * @param userAddress The address of the user. * @return The user's nonce. */ function getUserNonce(address userAddress) external view returns (uint256); /** * @notice Get the token URI for a given tokenId. * @param tokenId The ID of the token. * @return The URI of the token. * @dev Diblicate for uri() method */ function tokenURI(uint256 tokenId) external view returns (string memory); /** * @notice Set the URI for a token. * @param tokenId The ID of the token. * @param newTokenURI The new URI to set for the token. * @dev Requires the MINTER_ROLE. */ function setTokenURI(uint256 tokenId, string memory newTokenURI) external; /** * @notice Set the URIs for multiple tokens in a batch. * @param tokenIds An array of token IDs to set URIs for. * @param newTokenURIs An array of new URIs to set for the tokens. * @dev Requires the MINTER_ROLE. * @dev Requires that the tokenIds and newTokenURIs arrays have the same length. */ function setBatchTokenURI(uint256[] calldata tokenIds, string[] calldata newTokenURIs) external; /** * @notice Set the base URI for all tokens. * @param newBaseURI The new base URI to set. * @dev Requires the OPERATOR_ROLE. */ function setBaseURI(string memory newBaseURI) external; /** * @notice Safely mints NFTs for a user based on provided parameters and a valid minter signature. * @param mintParams The struct containing user address, user nonce, and NFT IDs to mint. * @param operatorSignature The ECDSA signature of the data, validating the operator's role. * @dev This function safely mints NFTs for a user while ensuring the validity of the operator's signature. * @dev It requires that the provided NFT IDs are valid and that the operator has the MINTER_ROLE. * @dev User nonces are used to prevent replay attacks. * @dev Multiple NFTs can be minted in a batch or a single NFT can be minted based on the number of NFT IDs provided. * @dev Emits the 'Minted' event to indicate the successful minting of NFTs. */ function safeMint(MintParams memory mintParams, bytes calldata operatorSignature) external payable; event Withdrawed(uint256 amount); /** * @notice Sets the transfer lock status for a specific token ID. * @param tokenId The ID of the token to set the transfer lock status for. * @param lock The boolean value to determine whether transfers of this token are locked or unlocked. * @dev This function can only be called by an operator with the OPERATOR_ROLE. * @dev It allows operators to control the transferability of specific tokens. * @dev Emits the 'tokenUnlockSet' event to indicate the change in transfer lock status. */ function setTransferUnlock(uint256 tokenId, bool lock) external; /** * @notice Check if a given interface is supported by this contract. * @param interfaceId The interface identifier to check for support. * @return Whether the contract supports the specified interface. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "areLibrariesMissing": false, "compilerPath": "/home/roman/.cache/hardhat-nodejs/compilers-v2/zksolc/zksolc-v1.3.13", "experimental": {}, "libraries": {}, "missingLibrariesPath": "./.zksolc-libraries-cache/missingLibraryDependencies.json", "optimizer": { "enabled": true, "mode": "3" } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"newBaseURI","type":"string"}],"name":"BaseURISet","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"userNonce","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceUpdated","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"newTokenURI","type":"string"}],"name":"TokenURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"lock","type":"bool"}],"name":"TokenUnlockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawed","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTransferStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getUserNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"userNonce","type":"uint256"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"internalType":"struct IRubyscore_Achievement.MintParams","name":"mintParams","type":"tuple"},{"internalType":"bytes","name":"operatorSignature","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"newTokenURIs","type":"string[]"}],"name":"setBatchTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newTokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"lock","type":"bool"}],"name":"setTransferUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000aabfb06de3cfbc97b8b24df197991ad24880015178fb6fc0619528d27b0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000d0d5ff3cfef8b7b2b1cac6b6c27fd0846c09361000000000000000000000000381c031baa5995d0cc52386508050ac947780815000000000000000000000000381c031baa5995d0cc52386508050ac94778081500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000007697066733a2f2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105275627973636f72655f7a6b53796e630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105275627973636f72655f7a6b53796e6300000000000000000000000000000000
Deployed Bytecode
0x0004000000000002001300000000000200000000030100190000006003300270000009ff0430019700030000004103550002000000010355000009ff0030019d000100000000001f00000001012001900000000c0000c13d27f505f70000040f0000016001000039000000400010043f0000000001000416000000000101004b0000004f0000c13d00000000010000310000017f02100039000000200800008a000000000282016f00000a000320004100000a010330009c0000001e0000213d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f700010430000000400020043f0000001f0210018f000000020300036700000005041002720000002c0000613d00000000050000190000000506500210000000000763034f000000000707043b000001600660003900000000007604350000000105500039000000000645004b000000240000413d000000000502004b0000003b0000613d0000000504400210000000000343034f00000003022002100000016004400039000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000a0202000041000000c00310008c0000000003000019000000000302401900000a0204100197000000000504004b000000000200a01900000a020440009c000000000203c019000000000202004b0000004f0000c13d000001600b00043d00000a0302b0009c0000004f0000213d000001800d00043d00000a0302d0009c0000004f0000213d000001a00c00043d00000a0302c0009c000000510000a13d0000000001000019000027f700010430000001c00300043d00000a040230009c0000004f0000213d00000160011000390000017f0230003900000a0204000041000000000512004b0000000005000019000000000504801900000a020610019700000a0202200197000000000762004b0000000004008019000000000262013f00000a020220009c00000000020500190000000002046019000000000202004b0000004f0000c13d0000016002300039000000000202043300000a040420009c000000180000213d0000003f04200039000000000484016f000000400900043d0000000004490019000000000594004b0000000005000019000000010500403900000a040640009c000000180000213d0000000105500190000000180000c13d000000400040043f000000000a29043600000180033000390000000004320019000000000414004b0000004f0000213d000000000402004b000000830000613d00000000040000190000000005a400190000000006340019000000000606043300000000006504350000002004400039000000000524004b0000007c0000413d00000000022a00190000000000020435000001e00300043d00000a040230009c0000004f0000213d0000017f0230003900000a0204000041000000000512004b0000000005000019000000000504801900000a020610019700000a0202200197000000000762004b0000000004008019000000000262013f00000a020220009c00000000020500190000000002046019000000000202004b0000004f0000c13d0000016002300039000000000202043300000a040420009c000000180000213d0000003f04200039000000000484016f000000400700043d0000000004470019000000000574004b0000000005000019000000010500403900000a040640009c000000180000213d0000000105500190000000180000c13d000000400040043f001200000007001d0000000004270436001300000004001d00000180033000390000000004320019000000000414004b0000004f0000213d000f0000000d001d000e0000000c001d00100000000b001d000c0000000a001d000d00000009001d001100000008001d000000000402004b0000001307000029000000bf0000613d000000000400001900000000057400190000000006340019000000000606043300000000006504350000002004400039000000000524004b000000b80000413d00000000022700190000000000020435000002000300043d00000a040230009c00000011080000290000004f0000213d0000017f0230003900000a0204000041000000000512004b0000000005000019000000000504801900000a020610019700000a0202200197000000000762004b0000000004008019000000000262013f00000a020220009c00000000020500190000000002046019000000000202004b0000004f0000c13d0000016002300039000000000202043300000a040420009c000000180000213d0000003f04200039000000000484016f000000400500043d0000000004450019000b00000005001d000000000554004b0000000005000019000000010500403900000a040640009c000000180000213d0000000105500190000000180000c13d000000400040043f0000000b040000290000000004240436000a00000004001d00000180033000390000000004320019000000000114004b0000004f0000213d000000000102004b0000000a06000029000000f70000613d000000000100001900000000046100190000000005310019000000000505043300000000005404350000002001100039000000000421004b000000f00000413d00000000012600190000000000010435000000400100043d000900000001001d00000a050110009c000000180000213d00000009020000290000004001200039000000400010043f0000001501000039000000000212043600000a0601000041000700000002001d0000000000120435000000400100043d000800000001001d00000a050110009c000000180000213d00000008020000290000004001200039000000400010043f0000000501000039000500000001001d000000000212043600000a0701000041000600000002001d0000000000120435000000400100043d00000a050210009c000000180000213d0000004002100039000000400020043f0000000702000039000100000002001d000000000221043600000a0801000041000200000002001d00000000001204350000000201000039000400000001001d000000000101041a000000010210019000000001011002700000007f0310018f0000000001036019000300000001001d0000001f0110008c00000000010000190000000101002039000000010110018f000000000112004b000001310000613d00000a180100004100000000001004350000002201000039000000040010043f00000a1901000041000027f7000104300000000301000029000000200110008c0000014b0000413d00000004010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b00000003020000290000001f0220003900000005022002700000000002210019000000000321004b0000014b0000813d000000000001041b0000000101100039000000000321004b000001470000413d0000000201000029000000000101043300000a0a011001970000000e011001bf0000000402000029000000000012041b00000009010000290000000001010433000400000001001d000000200110008c000001b70000413d000000040100002900000a040110009c000000180000213d0000000301000039000300000001001d000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000200000002001d0000001f0220008c00000000020000190000000102002039000000000121013f00000001011001900000012b0000c13d0000000201000029000000200110008c000001850000413d00000003010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000201043b00000004010000290000001f011000390000000501100270000000000112001900000002030000290000001f0330003900000005033002700000000002320019000000000321004b000001850000813d000000000001041b0000000101100039000000000321004b000001810000413d00000003010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f000000010220019000000011020000290000004f0000613d000000040300002900000000032301700000002002000039000000000101043b0000000906000029000001a20000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b0000019a0000413d0000000404000029000000000343004b000001b00000813d00000004030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f000000090400002900000000024200190000000002020433000000000232016f000000000021041b0000000401000029000000010110021000000001011001bf0000000302000029000000000012041b000000ff01000039000001c50000013d000000040400002900000003014002100000010002100089000000010300008a00000000022301cf0000000001100049000001000300008a000000000131004b0000000001020019000000000100401900000007020000290000000002020433000000000112016f000000000141019f000001200010043f00000008010000290000000001010433000400000001001d000000200110008c0000022c0000413d000000040100002900000a040110009c000000180000213d0000000401000039000300000001001d000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000200000002001d0000001f0220008c00000000020000190000000102002039000000000121013f00000001011001900000012b0000c13d0000000201000029000000200110008c000001fa0000413d00000003010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000201043b00000004010000290000001f011000390000000501100270000000000112001900000002030000290000001f0330003900000005033002700000000002320019000000000321004b000001fa0000813d000000000001041b0000000101100039000000000321004b000001f60000413d00000003010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f000000010220019000000011020000290000004f0000613d000000040300002900000000032301700000002002000039000000000101043b0000000806000029000002170000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b0000020f0000413d0000000404000029000000000343004b000002250000813d00000004030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f000000080400002900000000024200190000000002020433000000000232016f000000000021041b0000000401000029000000010110021000000001011001bf0000000302000029000000000012041b000000ff010000390000023a0000013d000000040400002900000003014002100000010002100089000000010300008a00000000022301cf0000000001100049000001000300008a000000000131004b0000000001020019000000000100401900000006020000290000000002020433000000000112016f000000000141019f000001400010043f000009ff010000410000000703000029000009ff0230009c00000000020100190000000002034019000000400220021000000009030000290000000003030433000009ff0430009c00000000030180190000006003300210000000000223019f0000000003000414000009ff0430009c0000000001034019000000c001100210000000000121019f00000a0b011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000900000001001d000000e00010043f000009ff010000410000000603000029000009ff0230009c00000000020100190000000002034019000000400220021000000008030000290000000003030433000009ff0430009c00000000030180190000006003300210000000000223019f0000000003000414000009ff0430009c0000000001034019000000c001100210000000000121019f00000a0b011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000800000001001d000001000010043f00000a0c010000410000000000100439000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0d011001c70000800b0200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000a00010043f000000400300043d000000600130003900000008020000290000000000210435000000400130003900000009020000290000000000210435000900000003001d000000200230003900000a0e01000041000800000002001d000000000012043500000a0c010000410000000000100439000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0d011001c70000800b0200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000090300002900000080023000390000000000120435000000a0013000390000000002000410000700000002001d0000000000210435000000a001000039000600000001001d000000000013043500000a0f0130009c000000180000213d0000000903000029000000c001300039000000400010043f000009ff010000410000000804000029000009ff0240009c0000000002010019000000000204401900000040022002100000000003030433000009ff0430009c00000000030180190000006003300210000000000223019f0000000003000414000009ff0430009c0000000001034019000000c001100210000000000121019f00000a0b011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000800010043f0000000701000029000000c00010043f0000000101000029000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000900000002001d0000001f0220008c00000000020000190000000102002039000000000121013f00000001011001900000012b0000c13d0000000901000029000000200110008c000002e30000413d00000001010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b00000009020000290000001f0220003900000005022002700000000002210019000000000321004b000002e30000813d000000000001041b0000000101100039000000000321004b000002df0000413d0000000101000029000000000001041b00000001020000390000000901000039000900000002001d000000000021041b0000000f0100002900000a0301100197000f00000001001d000000100100002900000a0301100198001000000001001d000002f70000613d0000000f01000029000000000101004b000002f70000613d0000000e0100002900000a0301100198000e00000001001d000003090000c13d000000400100043d000000440210003900000a1503000041000000000032043500000024021000390000001203000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f70001043000000012010000290000000001010433000800000001001d00000a040110009c000000180000213d0000000b01000039000700000001001d000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000400000002001d0000001f0220008c00000000020000190000000102002039000000000121013f00000001011001900000012b0000c13d0000000401000029000000200110008c0000033c0000413d00000007010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d00000008030000290000001f023000390000000502200270000000200330008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b0000033c0000813d000000000002041b0000000102200039000000000312004b000003380000413d00000008010000290000001f0110008c0000036e0000a13d00000007010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f000000010220019000000011020000290000004f0000613d000000080300002900000000032301700000002002000039000000000101043b0000035c0000613d00000020020000390000000004000019000000120500002900000000055200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000003530000413d0000000804000029000000000343004b0000036a0000813d00000008030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f000000120400002900000000024200190000000002020433000000000232016f000000000021041b0000000801000029000000010110021000000001011001bf0000037c0000013d0000000801000029000000000101004b0000000001000019000003740000613d0000001301000029000000000101043300000008040000290000000302400210000000010300008a000000000223022f000000000232013f000000000121016f0000000102400210000000000121019f0000000702000029000000000012041b0000000b010000290000000001010433001300000001001d00000a040110009c000000180000213d0000000c01000039001200000001001d000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000800000002001d0000001f0220008c00000000020000190000000102002039000000000121013f00000001011001900000012b0000c13d0000000801000029000000200110008c000003b10000413d00000012010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d00000013030000290000001f023000390000000502200270000000200330008c0000000002004019000000000301043b00000008010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b000003b10000813d000000000002041b0000000102200039000000000312004b000003ad0000413d00000013010000290000001f0110008c000003e30000a13d00000012010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f000000010220019000000011020000290000004f0000613d000000130300002900000000032301700000002002000039000000000101043b000003d10000613d000000200200003900000000040000190000000b0500002900000000055200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000003c80000413d0000001304000029000000000343004b000003df0000813d00000013030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f0000000b0400002900000000024200190000000002020433000000000232016f000000000021041b0000001301000029000000010110021000000001011001bf000003f10000013d0000001301000029000000000101004b0000000001000019000003e90000613d0000000a01000029000000000101043300000013040000290000000302400210000000010300008a000000000223022f000000000232013f000000000121016f0000000102400210000000000121019f0000001202000029000000000012041b00000000000004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b00000010020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000000101041a000000ff01100190000004440000c13d00000000000004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b00000010020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000000201041a000001000300008a000000000232016f00000001022001bf000000000021041b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000040300003900000a1104000041000000000700041100000000050000190000001006000029001300000007001d27f527eb0000040f00000001012001900000004f0000613d000004460000013d0000000001000411001300000001001d00000a120100004100000000001004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000130200002900000a0302200197001200000002001d0000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000000101041a000000ff01100190000004990000c13d00000a120100004100000000001004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b00000012020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000000201041a000001000300008a000000000232016f00000001022001bf000000000021041b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000040300003900000a110400004100000a12050000410000000007000411000000120600002927f527eb0000040f00000001012001900000004f0000613d00000a120100004100000000001004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b0000000f020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000000101041a000000ff01100190000004ea0000c13d00000a120100004100000000001004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b0000000f020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000000201041a000001000300008a000000000232016f00000001022001bf000000000021041b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000040300003900000a110400004100000a120500004100000000070004110000000f0600002927f527eb0000040f00000001012001900000004f0000613d00000a130100004100000000001004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b0000000e020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000d0300002900000001022001900000004f0000613d000000000101043b000000000101041a000000ff011001900000053d0000c13d00000a130100004100000000001004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b0000000e020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d000000000101043b000000000201041a000001000300008a000000000232016f00000001022001bf000000000021041b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000040300003900000a110400004100000a13050000410000000e06000029000000130700002927f527eb0000040f0000000d0300002900000001012001900000004f0000613d0000000001030433001300000001001d00000a040110009c000000180000213d0000000101000029000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019001200000002001d0000001f0220008c00000000020000190000000102002039000000000121013f00000001011001900000012b0000c13d0000001201000029000000200110008c0000056e0000413d00000001010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f00000001022001900000004f0000613d00000013030000290000001f023000390000000502200270000000200330008c0000000002004019000000000301043b00000012010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b0000056e0000813d000000000002041b0000000102200039000000000312004b0000056a0000413d00000013010000290000001f0110008c0000059f0000a13d00000001010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f000000010220019000000011020000290000004f0000613d000000130300002900000000032301700000002002000039000000000101043b0000058e0000613d000000200200003900000000040000190000000d0500002900000000055200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000005850000413d0000001304000029000000000343004b0000059c0000813d00000013030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f0000000d0400002900000000024200190000000002020433000000000232016f000000000021041b00000013010000290000000101100210000005ad0000013d0000001301000029000000000101004b0000000001000019000005a50000613d0000000c01000029000000000101043300000013040000290000000302400210000000010300008a000000000223022f000000000232013f000000000121016f0000000102400210000900000002001d0000000902000029000000000121019f0000000104000029000000000014041b000000800100043d00000140000004430000016000100443000000a00100043d00000020020000390000018000200443000001a0001004430000004001000039000000c00300043d000001c000100443000001e0003004430000006001000039000000e00300043d000002000010044300000220003004430000008001000039000001000300043d00000240001004430000026000300443000001200100043d00000006030000290000028000300443000002a000100443000000c001000039000001400300043d000002c000100443000002e0003004430000010000200443000001200040044300000a1401000041000027f60001042e000009ff03000041000009ff0410009c00000000010380190000004001100210000009ff0420009c00000000020380190000006002200210000000000112019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000112019f00000a0b011001c7000080100200003927f527f00000040f0000000102200190000005e40000613d000000000101043b000000000001042d0000000001000019000027f7000104300000000003010019000009ff010000410000000004000414000009ff0540009c0000000001044019000000c0011002100000006002200210000000000112001900000a1a01100041000000000203001927f527f00000040f0000000102200190000005f50000613d000000000101043b000000000001042d0000000001000019000027f700010430001a0000000000020000008009000039000000400090043f0000000003000031000000040130008c000015920000413d0000000202000367000000000102043b000000e00110027000000a1b0410009c0000063c0000213d00000a340410009c000006730000a13d00000a350410009c000006d60000a13d00000a360410009c000008080000a13d00000a370410009c000010b60000613d00000a380210009c00000dae0000613d00000a390110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b001000000001001d000000000100041127f522800000040f0000000a010000390000001002000029000000000021041b000000400100043d0000000000210435000009ff020000410000000003000414000009ff0430009c0000000003028019000009ff0410009c00000000010280190000004001100210000000c002300210000000000112019f00000a09011001c70000800d02000039000000010300003900000a680400004127f527eb0000040f0000000101200190000015920000613d0000000001000019000027f60001042e00000a1c0210009c000006a50000a13d00000a1d0210009c0000072f0000a13d00000a1e0210009c000008310000a13d00000a1f0210009c000011500000613d00000a200210009c00000e0f0000613d00000a210110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d000000400100043d000f00000001001d27f5214b0000040f0000000f03000029000000200130003900000a070200004100000000002104350000000501000039000000000013043500000000010300190000002002000039000000400300043d001000000003001d000000000223043627f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000112019f000027f60001042e00000a410210009c000007580000213d00000a470210009c000008690000213d00000a4a0210009c00000e290000613d00000a4b0110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b00000a5502100197000000000221004b000015920000c13d000000010200003900000a970310009c0000069c0000613d00000a980310009c0000069c0000613d00000a990310009c0000069c0000613d00000a9a0110009c00000000020000190000000102006039000000010120018f000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e00000a290210009c000007820000213d00000a2f0210009c000008920000213d00000a320210009c00000e4a0000613d00000a330110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d0000000c04000039000000000304041a000000010530019000000001013002700000007f0210018f000000000701001900000000070260190000001f0270008c00000000020000190000000102002039000000000223013f000000010220019000000ee60000c13d000000400100043d0000000002710436000000000505004b000012150000c13d000001000400008a000000000343016f0000000000320435000000000307004b00000020030000390000000003006019000012260000013d00000a3c0210009c000007c00000213d00000a3f0210009c000009870000613d00000a400110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000000000004350000000501000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b0000000002000411001000000002001d0000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000ff01100190000012e60000c13d000000400200043d00000a5b0120009c00000ea90000213d0000006001200039000000400010043f0000002a01000039000000000112043600000000030000310000000203300367000000000400001900000005054002100000000006510019000000000553034f000000000505043b00000000005604350000000104400039000000020540008c000007170000413d0000000003020433000000000303004b000007290000613d000000000301043300000a5c0330019700000a5d033001c700000000003104350000000003020433000000020330008c000013490000813d00000a180100004100000000001004350000003201000039000000040010043f00000a1901000041000027f70001043000000a240210009c000007ea0000213d00000a270210009c000009a50000613d00000a280110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b00000000001004350000000601000039000000200010043f0000004002000039000000000100001927f505d00000040f000000000101041a000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e00000a420210009c000008d80000213d00000a450210009c00000e7c0000613d00000a460110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b00000000001004350000000501000039000000200010043f0000004002000039000000000100001927f505d00000040f0000000101100039000000000101041a000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e00000a2a0210009c0000095d0000213d00000a2d0210009c00000eaf0000613d00000a2e0110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000400310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000002010003670000000402100370000000000202043b001000000002001d00000a030220009c000015920000213d0000002401100370000000000201043b000000000102004b0000000001000019000000010100c039000f00000002001d000000000112004b000015920000c13d00000000020004110000001001000029000000000112004b000013090000c13d000000400100043d000000640210003900000a64030000410000000000320435000000440210003900000a6503000041000000000032043500000024021000390000002903000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f70001043000000a3d0210009c00000c370000613d00000a3e0110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b00000000001004350000000601000039000000200010043f0000004002000039000000000100001927f505d00000040f000000000101041a000000000101004b0000000001000019000000010100c039000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e00000a250210009c00000cba0000613d00000a260110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d000000400100043d00000a13020000410000000000210435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4c011001c7000027f60001042e00000a3a0210009c00000cdf0000613d00000a3b0110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b00000a030210009c000015920000213d00000000001004350000000e01000039000000200010043f0000004002000039000000000100001927f505d00000040f000000000101041a000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e00000a220210009c00000d850000613d00000a230110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000400310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000002020003670000000401200370000000000101043b00000a030310009c000015920000213d0000002402200370000000000202043b001000000002001d00000a030220009c000015920000213d00000000001004350000000101000039000000200010043f0000004002000039000f00000002001d000000000100001927f505d00000040f00000010020000290000000000200435000000200010043f00000000010000190000000f0200002927f505d00000040f000000000101041a000000ff011001900000000001000019000000010100c039000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e00000a480210009c00000ec80000613d00000a490110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b27f525a60000040f0000002002000039000000400300043d001000000003001d000000000223043627f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f60001042e00000a300210009c00000eec0000613d00000a310110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000400310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000002010003670000000402100370000000000202043b001000000002001d0000002401100370000000000201043b000000000102004b0000000001000019000000010100c039000f00000002001d000000000112004b000015920000c13d000000000100041127f522800000040f000000100100002900000000001004350000000d01000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a000001000300008a000000000232016f0000000f06000029000000000262019f000000000021041b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000030300003900000a6604000041000000100500002927f527eb0000040f00000001012001900000063a0000c13d000015920000013d00000a430210009c00000f070000613d00000a440110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000400310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000002010003670000000402100370000000000202043b001000000002001d0000002401100370000000000101043b000f00000001001d00000a030110009c000015920000213d000000100100002900000000001004350000000501000039000e00000001001d000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b0000000101100039000000000101041a0000000002000411000d00000002001d27f5236a0000040f000000100100002900000000001004350000000e01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b0000000f020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000ff011001900000063a0000c13d000000100100002900000000001004350000000e01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b0000000f020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a000001000300008a000000000232016f00000001022001bf000000000021041b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000040300003900000a110400004100000010050000290000000f060000290000000d0700002927f527eb0000040f00000001012001900000063a0000c13d000015920000013d00000a2b0210009c0000108b0000613d00000a2c0110009c000015920000c13d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b00000000001004350000000d01000039000000200010043f0000004002000039000000000100001927f505d00000040f000000000101041a000000ff011001900000000001000019000000010100c039000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000400310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000002010003670000002402100370000000000302043b00000a030230009c000015920000213d0000000002000411000000000323004b000011e60000c13d0000000401100370000000000101043b27f524540000040f0000000001000019000027f60001042e0000000001000416000000000101004b000015920000c13d0000000001000031000000040210008a00000a0203000041000000400420008c0000000004000019000000000403401900000a0202200197000000000502004b000000000300a01900000a020220009c00000000020400190000000002036019000000000202004b000015920000c13d00000002020003670000000403200370000000000303043b00000a040430009c000015920000213d000000230430003900000a0205000041000000000614004b0000000006000019000000000605801900000a020710019700000a0204400197000000000874004b0000000005008019000000000474013f00000a020440009c00000000040600190000000004056019000000000404004b000015920000c13d0000000404300039000000000442034f000000000404043b000b00000004001d00000a040440009c000015920000213d00000024043000390000000b030000290000000503300210000600000004001d0000000003430019000000000313004b000015920000213d0000002403200370000000000303043b001000000003001d00000a040330009c000015920000213d0000001003000029000000230330003900000a0204000041000000000513004b0000000005000019000000000504801900000a020610019700000a0203300197000000000763004b0000000004008019000000000363013f00000a020330009c00000000030500190000000003046019000000000303004b000015920000c13d00000010030000290000000403300039000000000232034f000000000202043b000f00000002001d00000a040220009c000015920000213d000000100200002900000024032000390000000f020000290000000502200210000a00000003001d0000000002320019000000000112004b000015920000213d0000000001000411000e00000001001d27f521960000040f0000000b010000290000000f02000029000000000121004b0000142d0000c13d0000000b01000029000000000101004b0000063a0000613d000000430100008a00000010020000290000000001210049000500000001001d0000000e0100002900000a0301100197000400000001001d000d00000000001d0000000b010000290000000d02000029000000000112004b000007290000813d00000005022002100000000a01000029000e00000002001d00000000032100190000000002000031000000050100002900000000042100190000000201000367000000000331034f000000000303043b00000a0205000041000000000643004b0000000006000019000000000605801900000a020440019700000a0207300197000000000847004b0000000005008019000000000447013f00000a020440009c00000000040600190000000004056019000000000404004b000015920000c13d0000000a040000290000000003430019000000000131034f000000000101043b00000a040410009c000015920000213d0000000004120049000000200330003900000a0205000041000000000643004b0000000006000019000000000605201900000a020440019700000a0207300197000000000847004b0000000005008019000000000447013f00000a020440009c00000000040600190000000004056019000000000404004b000015920000c13d0000003f04100039000000200500008a000f00000005001d000000000454016f000000400500043d0000000004450019001000000005001d000000000554004b0000000005000019000000010500403900000a040640009c00000ea90000213d000000010550019000000ea90000c13d000000400040043f00000010040000290000000004140436000c00000004001d0000000004130019000000000224004b000015920000213d000000020230036700000005031002720000000c0700002900000a610000613d000000000400001900000005054002100000000006570019000000000552034f000000000505043b00000000005604350000000104400039000000000534004b00000a590000413d0000001f0410019000000a700000613d0000000503300210000000000232034f00000000033700190000000304400210000000000503043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f00000000002304350000000001170019000000000001043500000a130100004100000000001004350000000501000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000004020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000ff01100190000016f40000613d00000006010000290000000e020000290000000001210019000e00000001001d0000000201100367000000000101043b00000000001004350000000801000039000900000001001d000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000401043b0000001001000029000000000501043300000a040150009c00000ea90000213d000000000104041a000000010210019000000001021002700000007f0320018f000000000302c0190000001f0230008c00000000020000190000000102002039000000000121013f000000010110019000000ee60000c13d000000200130008c000800000004001d000700000005001d00000ad80000413d000300000003001d0000000000400435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f0000000102200190000015920000613d00000007050000290000001f025000390000000502200270000000200350008c0000000002004019000000000301043b00000003010000290000001f01100039000000050110027000000000013100190000000002230019000000000312004b000000080400002900000ad80000813d000000000002041b0000000102200039000000000312004b00000ad40000413d0000001f0150008c0000000c0200002900000b060000a13d0000000000400435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f0000000102200190000015920000613d0000000f02000029000000070700002900000000032701700000002002000039000000000101043b000000100600002900000af70000613d0000002002000039000000000400001900000000052600190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b00000aef0000413d000000000373004b00000b020000813d0000000303700210000000f80330018f000000010400008a000000000334022f000000000343013f00000000022600190000000002020433000000000232016f000000000021041b000000010170021000000001011001bf000000080400002900000b110000013d000000000105004b000000000100001900000b0a0000613d00000000010204330000000302500210000000010300008a000000000223022f000000000232013f000000000121016f0000000102500210000000000121019f000000000014041b0000000e010000290000000201100367000000000101043b00000000001004350000000901000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a000000010320019000000001042002700000007f0540018f000000000504c0190000001f0450008c00000000040000190000000104002039000000000442013f000000010440019000000ee60000c13d000000400900043d0000000008590436000000000303004b00000b500000613d000800000005001d000900000009001d000c00000008001d0000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f0000000102200190000015920000613d0000000805000029000000000205004b00000000020000190000000c08000029000000090900002900000b560000613d000000000101043b00000000020000190000000003820019000000000401041a000000000043043500000001011000390000002002200039000000000352004b00000b480000413d00000b560000013d000001000100008a000000000112016f0000000000180435000000000105004b000000200200003900000000020060190000003f012000390000000f02000029000000000221016f0000000001920019000000000221004b0000000002000019000000010200403900000a040310009c00000ea90000213d000000010220019000000ea90000c13d000000400010043f0000000002090433000000000202004b00000b810000613d0000000703000039000000000403041a000000010540019000000001024002700000007f0620018f00000000020660190000001f0620008c00000000060000190000000106002039000000000664013f000000010660019000000ee60000c13d000000000505004b00000b9e0000613d00000000003004350000002003100039000000000402004b00000ba20000613d00000a570400004100000000050000190000000006350019000000000704041a000000000076043500000001044000390000002005500039000000000625004b00000b790000413d00000ba20000013d0000000205000039000000000405041a000000010640019000000001024002700000007f0320018f00000000020360190000001f0320008c00000000030000190000000103002039000000000334013f000000010330019000000ee60000c13d0000000003210436000000000606004b00000bbf0000613d0000000000500435000000000402004b000000000400001900000bc50000613d00000a580500004100000000040000190000000006430019000000000705041a000000000076043500000001055000390000002004400039000000000624004b00000b960000413d00000bc50000013d0000002003100039000001000500008a000000000454016f000000000043043500000000022300190000000003090433000000000403004b00000bae0000613d000000000400001900000000052400190000000006840019000000000606043300000000006504350000002004400039000000000534004b00000ba70000413d000000000223001900000000000204350000000002120049000000200320008a00000000003104350000001f022000390000000f03000029000000000332016f0000000002130019000000000332004b0000000003000019000000010300403900000a040420009c00000ea90000213d000000010330019000000bd00000613d00000ea90000013d000001000500008a000000000454016f0000000000430435000000000202004b000000200400003900000000040060190000003f024000390000000f03000029000000000332016f0000000002130019000000000332004b0000000003000019000000010300403900000a040420009c00000ea90000213d000000010330019000000ea90000c13d000000400020043f000000200300003900000000043204360000000e030000290000000203300367000000000503043b000000000301043300000000003404350000004004200039000000000603004b00000be30000613d000000000600001900000000074600190000002006600039000000000816001900000000080804330000000000870435000000000736004b00000bdc0000413d000000000143001900000000000104350000005f013000390000000f03000029000000000131016f000009ff03000041000009ff0420009c00000000020380190000004002200210000009ff0410009c00000000010380190000006001100210000000000121019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000112019f00000a0b011001c70000800d02000039000000020300003900000a590400004127f527eb0000040f0000000101200190000015920000613d000000400200043d00000010060000290000000001060433000000000301004b00000c090000613d000000000300001900000000042300190000002003300039000000000563001900000000050504330000000000540435000000000413004b00000c020000413d00000000032100190000000000030435000009ff03000041000009ff0420009c00000000020380190000004002200210000009ff0410009c00000000010380190000006001100210000000000121019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000112019f00000a0b011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000601043b0000000e010000290000000201100367000000000501043b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000030300003900000a5a0400004127f527eb0000040f0000000101200190000015920000613d000000010100008a0000000d02000029000000000112004b000018f60000613d00000001022000390000000b01000029000d00000002001d000000000112004b00000a0d0000413d0000063a0000013d0000000001000416000000000101004b000015920000c13d0000000001000031000000040210008a00000a0203000041000000400420008c0000000004000019000000000403401900000a0202200197000000000502004b000000000300a01900000a020220009c00000000020400190000000002036019000000000202004b000015920000c13d00000002030003670000000402300370000000000202043b00000a040420009c000015920000213d000000230420003900000a0205000041000000000614004b0000000006000019000000000605801900000a020110019700000a0204400197000000000714004b0000000005008019000000000114013f00000a020110009c00000000010600190000000001056019000000000101004b000015920000c13d0000000401200039000000000113034f000000000301043b00000a040130009c00000ea90000213d00000005043002100000003f05400039000000200100008a000000000515016f000000400600043d0000000005560019000c00000006001d000000000665004b0000000006000019000000010600403900000a040750009c00000ea90000213d000000010660019000000ea90000c13d000000400050043f0000000c050000290000000005350436000b00000005001d000000240220003900000000044200190000000005000031000000000554004b000015920000213d000000000303004b00000c830000613d0000000b030000290000000205200367000000000505043b00000a030650009c000015920000213d00000000035304360000002002200039000000000542004b00000c7b0000413d00000002040003670000002402400370000000000202043b00000a040320009c000015920000213d0000002305200039000000000300003100000a0206000041000000000735004b0000000007000019000000000706801900000a020550019700000a0208300197000000000985004b0000000006008019000000000585013f00000a020550009c00000000050700190000000005066019000000000505004b000015920000c13d0000000405200039000000000454034f000000000404043b00000a040540009c00000ea90000213d00000005054002100000003f06500039000000000616016f000000400700043d0000000006670019000a00000007001d000000000776004b0000000007000019000000010700403900000a040860009c00000ea90000213d000000010770019000000ea90000c13d000000400060043f0000000a060000290000000006460436000900000006001d00000024022000390000000005250019000000000335004b000015920000213d000000000304004b000015940000c13d0000000c020000290000000002020433000000000202004b0000000002000019000015a40000613d000015e80000013d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000200310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000004010000390000000201100367000000000101043b27f525a60000040f0000002002000039000000400300043d001000000003001d000000000223043627f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000112019f000027f60001042e0000000001000416000000000101004b000015920000c13d0000000002000031000000040120008a00000a0203000041000000200410008c0000000004000019000000000403401900000a0201100197000000000501004b000000000300a01900000a020110009c00000000010400190000000001036019000000000101004b000015920000c13d00000002010003670000000403100370000000000303043b00000a040430009c000015920000213d000000230430003900000a0205000041000000000624004b0000000006000019000000000605801900000a020720019700000a0204400197000000000874004b0000000005008019000000000474013f00000a020440009c00000000040600190000000004056019000000000404004b000015920000c13d0000000404300039000000000141034f000000000101043b00000a040410009c00000ea90000213d0000003f04100039000000200500008a000f00000005001d000000000454016f000000400500043d0000000004450019001000000005001d000000000554004b0000000005000019000000010500403900000a040640009c00000ea90000213d000000010550019000000ea90000c13d0000002403300039000000400040043f00000010040000290000000004140436000e00000004001d0000000004310019000000000224004b000015920000213d0000001f0210018f000000020330036700000005041002720000000e0800002900000d2d0000613d000000000500001900000005065002100000000007680019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000d250000413d000000000502004b00000d3c0000613d0000000504400210000000000343034f00000000044800190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000000011800190000000000010435000000000100041127f522800000040f0000001001000029000000000201043300000a040120009c00000ea90000213d0000000701000039000000000401041a000000010340019000000001034002700000007f0530018f00000000030560190000001f0530008c00000000050000190000000105002039000000000454013f000000010440019000000ee60000c13d000000200430008c00000d620000413d0000001f04200039000000050440027000000a570440004100000a5705000041000000200620008c000000000405401900000000001004350000001f03300039000000050330027000000a5703300041000000000534004b00000d620000813d000000000004041b0000000104400039000000000534004b00000d5e0000413d0000001f0320008c0000143f0000a13d00000000001004350000000f030000290000000005320170000000200400003900000a5703000041000000100800002900000d760000613d00000a57030000410000002004000039000000000600001900000000078400190000000007070433000000000073041b000000200440003900000001033000390000002006600039000000000756004b00000d6e0000413d000000000525004b00000d820000813d0000000305200210000000f80550018f000000010600008a000000000556022f000000000565013f000000100600002900000000046400190000000004040433000000000454016f000000000043041b000000010220021000000001022001bf0000144b0000013d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000400310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000002010003670000002402100370000000000202043b001000000002001d00000a030220009c000015920000213d0000000401100370000000000101043b000f00000001001d00000000001004350000000501000039000000200010043f0000004002000039000000000100001927f505d00000040f0000000101100039000000000101041a000000000200041127f5236a0000040f0000000f01000029000000100200002927f524540000040f0000000001000019000027f60001042e0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000a6901000041001000000001001d00000000001004390000000001000412000f00000001001d0000000400100443000000a00100003900000024001004430000800501000039000d00000001001d0000004402000039000c00000002001d27f505e60000040f27f524fe0000040f000000100200002900000000002004390000000f020000290000000400200443000000c0020000390000002400200443000e00000001001d0000000d010000290000000c0200002927f505e60000040f27f525520000040f000d00000001001d000000400100043d000f00000001001d27f521400000040f0000000f010000290000000000010435000000e001000039000000400300043d001000000003001d0000002002300039000000000012043500000a6a010000410000000000130435000000e0023000390000000e0100002927f521760000040f000000000201001900000010030000290000000001320049000000400330003900000000001304350000000d0100002927f521760000040f00000a0c020000410000000000200439000e00000001001d0000800b01000039000000040200003927f505e60000040f0000001004000029000000c0054000390000000e020000290000000003420049000000000035043500000000050004100000008003400039000000000053043500000060034000390000000000130435000000a00140003900000000000104350000000f0100002927f521890000040f00000010040000290000000001410049000009ff02000041000009ff0340009c00000000030200190000000003044019000009ff0410009c000000000102801900000040023002100000006001100210000000000121019f000027f60001042e0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d000000400100043d00000a12020000410000000000210435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4c011001c7000027f60001042e0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000400310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000002020003670000000401200370000000000101043b00000a030310009c000015920000213d0000002402200370000000000202043b27f524ac0000040f000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000400310008c0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d00000002010003670000002402100370000000000202043b001000000002001d00000a030220009c000015920000213d0000000401100370000000000101043b00000000001004350000000501000039000000200010043f0000004002000039000f00000002001d000000000100001927f505d00000040f00000010020000290000000000200435000000200010043f00000000010000190000000f0200002927f505d00000040f000000000101041a000000ff011001900000000001000019000000010100c039000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e0000000001000416000000000101004b000015920000c13d0000000002000031000000040120008a00000a0203000041000000400410008c0000000004000019000000000403401900000a0201100197000000000501004b000000000300a01900000a020110009c00000000010400190000000001036019000000000101004b000015920000c13d00000002010003670000000403100370000000000303043b001000000003001d0000002403100370000000000303043b00000a040430009c000015920000213d000000230430003900000a0205000041000000000624004b0000000006000019000000000605801900000a020720019700000a0204400197000000000874004b0000000005008019000000000474013f00000a020440009c00000000040600190000000004056019000000000404004b000015920000c13d0000000404300039000000000141034f000000000101043b00000a950410009c0000123b0000413d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f7000104300000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d000000400100043d0000000000010435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4c011001c7000027f60001042e0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d0000000b04000039000000000304041a000000010530019000000001013002700000007f0210018f000000000701001900000000070260190000001f0270008c00000000020000190000000102002039000000010220018f000000000225004b000011d40000613d00000a180100004100000000001004350000002201000039000000040010043f00000a1901000041000027f7000104300000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d0000000a01000039000000000101041a000000400200043d0000000000120435000009ff01000041000009ff0320009c0000000001024019000000400110021000000a4c011001c7000027f60001042e0000000001000416000000000101004b000015920000c13d0000000002000031000000040120008a00000a0203000041000000a00410008c0000000004000019000000000403401900000a0201100197000000000501004b000000000300a01900000a020110009c00000000010400190000000001036019000000000101004b000015920000c13d00000002040003670000000401400370000000000101043b00000a030310009c000015920000213d0000002403400370000000000303043b000d00000003001d00000a030330009c000015920000213d0000004403400370000000000303043b00000a040530009c000015920000213d000000230530003900000a0206000041000000000725004b0000000007000019000000000706801900000a020820019700000a0205500197000000000985004b0000000006008019000000000585013f00000a020550009c00000000050700190000000005066019000000000505004b000015920000c13d0000000405300039000000000454034f000000000404043b00000a040540009c00000ea90000213d00000005054002100000003f06500039000000200700008a000a00000007001d000000000676016f000000400700043d0000000006670019001000000007001d000000000776004b0000000007000019000000010700403900000a040860009c00000ea90000213d000000010770019000000ea90000c13d000000400060043f00000010060000290000000006460436000e00000006001d00000024033000390000000005350019000000000225004b000015920000213d000000000204004b00000f5b0000613d00000010020000290000000204300367000000000404043b000000200220003900000000004204350000002003300039000000000453004b00000f540000413d00000002040003670000006402400370000000000202043b00000a040320009c000015920000213d0000002305200039000000000300003100000a0206000041000000000735004b0000000007000019000000000706801900000a020550019700000a0208300197000000000985004b0000000006008019000000000585013f00000a020550009c00000000050700190000000005066019000000000505004b000015920000c13d0000000405200039000000000454034f000000000404043b00000a040540009c00000ea90000213d00000005054002100000003f065000390000000a07000029000000000676016f000000400700043d0000000006670019000900000007001d000000000776004b0000000007000019000000010700403900000a040860009c00000ea90000213d000000010770019000000ea90000c13d000000400060043f00000009060000290000000006460436000800000006001d00000024022000390000000005250019000000000335004b000015920000213d000000000304004b00000f950000613d00000009030000290000000204200367000000000404043b000000200330003900000000004304350000002002200039000000000452004b00000f8e0000413d00000002020003670000008403200370000000000303043b00000a040430009c000015920000213d0000002305300039000000000400003100000a0206000041000000000745004b0000000007000019000000000706801900000a020550019700000a0208400197000000000985004b0000000006008019000000000585013f00000a020550009c00000000050700190000000005066019000000000505004b000015920000c13d0000000405300039000000000252034f000000000202043b00000a040520009c00000ea90000213d0000003f052000390000000a06000029000000000565016f000000400600043d0000000005560019000400000006001d000000000665004b0000000006000019000000010600403900000a040750009c00000ea90000213d000000010660019000000ea90000c13d0000002406300039000000400050043f000000040300002900000000032304360000000005620019000000000445004b000015920000213d0000001f0420018f0000000205600367000000050620027200000fd00000613d000000000700001900000005087002100000000009830019000000000885034f000000000808043b00000000008904350000000107700039000000000867004b00000fc80000413d000000000704004b00000fdf0000613d0000000506600210000000000565034f00000000066300190000000304400210000000000706043300000000074701cf000000000747022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000474019f00000000004604350000000002230019000000000002043500000a03021001970000000001000411000300000001001d000600000002001d000000000112004b000018fc0000c13d0000001001000029000000000101043300000009020000290000000002020433000000000221004b00001ef50000c13d0000000d0200002900000a0302200198000500000002001d000011bf0000613d000000000101004b000019320000c13d000000400100043d0000004002000039000000000221043600000010030000290000000004030433000000400310003900000000004304350000006003100039000000000504004b000010050000613d000000000500001900000010060000290000002006600039000000000706043300000000037304360000000105500039000000000745004b00000fff0000413d00000000041300490000000000420435000000090200002900000000040204330000000002430436000000000304004b000010140000613d000000000300001900000009050000290000002005500039000000000605043300000000026204360000000103300039000000000643004b0000100e0000413d0000000002120049000009ff03000041000009ff0410009c00000000010380190000004001100210000009ff0420009c00000000020380190000006002200210000000000112019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000121019f00000a0b011001c70000800d02000039000000040300003900000a7404000041000f00000003001d00000003050000290000000606000029000000050700002927f527eb0000040f0000000101200190000015920000613d00000a510100004100000000001004390000000d010000290000000400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a52011001c7000080020200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101004b0000063a0000613d000000400300043d0000004401300039000000a002000039000000000021043500000024013000390000000602000029000000000021043500000a7501000041000000000013043500000004013000390000000302000029000000000021043500000010050000290000000002050433000000a4013000390000000000210435000e00000003001d000000c401300039000000000302004b000010590000613d00000000030000190000002005500039000000000405043300000000014104360000000103300039000000000423004b000010530000413d0000000e030000290000000002310049000000040220008a00000064033000390000000000230435000000090500002900000000020504330000000001210436000000000302004b0000106a0000613d00000000030000190000002005500039000000000405043300000000014104360000000103300039000000000423004b000010640000413d0000000e030000290000000002310049000000040220008a00000084033000390000000000230435000000040600002900000000020604330000000001210436000000000302004b0000107c0000613d000000000300001900000000041300190000002003300039000000000563001900000000050504330000000000540435000000000423004b000010750000413d0000000003120019000000000003043500000000030004140000000504000029000000040440008c00001a9c0000c13d00000000050004150000001a0550008a00000020055000c90000000103000031000000200130008c00000020040000390000000004034019001a00000000001d00001adc0000013d0000000001000416000000000101004b000015920000c13d000000040100008a000000000110003100000a0202000041000000000301004b0000000003000019000000000302401900000a0201100197000000000401004b000000000200a01900000a020110009c00000000010300190000000001026019000000000101004b000015920000c13d000000400100043d000f00000001001d27f5214b0000040f0000000f03000029000000200130003900000a060200004100000000002104350000001501000039000000000013043500000000010300190000002002000039000000400300043d001000000003001d000000000223043627f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000112019f000027f60001042e000000040330008a00000a0201000041000000400430008c0000000004000019000000000401401900000a0205300197000000000605004b000000000100a01900000a020550009c000000000104c019000000000101004b000015920000c13d0000000401200370000000000101043b00000a040210009c000015920000213d000000000213004900000a0203000041000000600420008c0000000004000019000000000403401900000a0202200197000000000502004b000000000300a01900000a020220009c00000000020400190000000002036019000000000202004b000015920000c13d000000e002000039000000400020043f00000004021000390000000202200367000000000202043b00000a030320009c000015920000213d000000800020043f00000024021000390000000202200367000000000202043b000000a00020043f00000044021000390000000203000367000000000223034f000000000202043b00000a040420009c000015920000213d00000000021200190000002304200039000000000100003100000a0205000041000000000614004b0000000006000019000000000605801900000a020440019700000a0207100197000000000874004b0000000005008019000000000474013f00000a020440009c00000000040600190000000004056019000000000404004b000015920000c13d001000000009001d0000000404200039000000000343034f000000000403043b00000a040340009c00000ea90000213d00000005054002100000003f03500039000000200600008a000f00000006001d000000000663016f000000400300043d0000000006630019000000000736004b0000000007000019000000010700403900000a040860009c00000ea90000213d000000010770019000000ea90000c13d000000400060043f000000000043043500000024022000390000000005250019000000000115004b000015920000213d000000000104004b0000111a0000613d00000000010300190000000204200367000000000404043b000000200110003900000000004104350000002002200039000000000452004b000011130000413d000000c00030043f00000002020003670000002401200370000000000101043b00000a040310009c000015920000213d0000002304100039000000000300003100000a0205000041000000000634004b0000000006000019000000000605801900000a020440019700000a0207300197000000000874004b0000000005008019000000000474013f00000a020440009c00000000040600190000000004056019000000000404004b000015920000c13d0000000404100039000000000242034f000000000202043b00000a040420009c000015920000213d00000000012100190000002401100039000000000131004b000015920000213d0000000901000039000e00000001001d000000000101041a000000020110008c000015fd0000c13d000000400100043d000000440210003900000a7f03000041000000000032043500000024021000390000001f03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300000000001000416000000000101004b000015920000c13d0000000001000031000000040210008a00000a0203000041000000a00420008c0000000004000019000000000403401900000a0202200197000000000502004b000000000300a01900000a020220009c00000000020400190000000002036019000000000202004b000015920000c13d00000002020003670000000403200370000000000303043b000c00000003001d00000a030330009c000015920000213d0000002403200370000000000303043b000600000003001d00000a030330009c000015920000213d0000008403200370000000000303043b00000a040430009c000015920000213d000000230430003900000a0205000041000000000614004b0000000006000019000000000605801900000a020710019700000a0204400197000000000874004b0000000005008019000000000474013f00000a020440009c00000000040600190000000004056019000000000404004b000015920000c13d0000000404300039000000000242034f000000000202043b00000a040420009c00000ea90000213d0000003f04200039000000200500008a000400000005001d000000000454016f000000400500043d0000000004450019000500000005001d000000000554004b0000000005000019000000010500403900000a040640009c00000ea90000213d000000010550019000000ea90000c13d0000002405300039000000400040043f000000050300002900000000032304360000000004520019000000000114004b000015920000213d0000001f0120018f00000002045003670000000505200272000011a60000613d000000000600001900000005076002100000000008730019000000000774034f000000000707043b00000000007804350000000106600039000000000756004b0000119e0000413d000000000601004b000011b50000613d0000000505500210000000000454034f00000000055300190000000301100210000000000605043300000000061601cf000000000616022f000000000404043b0000010001100089000000000414022f00000000011401cf000000000161019f00000000001504350000000001230019000000000001043500000000020004110000000c01000029000300000002001d000000000121004b0000147b0000c13d0000000601000029000000000101004b000014b00000c13d000000400100043d000000640210003900000a93030000410000000000320435000000440210003900000a9403000041000000000032043500000024021000390000002503000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f700010430000000400100043d0000000002710436000000000505004b000011fb0000613d0000000000400435000000000307004b0000000003000019000012010000613d00000a960400004100000000030000190000000005320019000000000604041a000000000065043500000001044000390000002003300039000000000573004b000011de0000413d000012010000013d000000400100043d000000640210003900000a8a030000410000000000320435000000440210003900000a8b03000041000000000032043500000024021000390000002f03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f700010430000001000400008a000000000343016f0000000000320435000000000207004b000000200300003900000000030060190000002002300039001000000001001d27f521560000040f0000002001000039000000400200043d000f00000002001d0000000002120436000000100100002927f521760000040f0000000f040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f60001042e00000000004004350000002002000039000000000307004b0000000003010019000012260000613d00000a67020000410000000003000019000000000403001900000020034000390000000005130019000000000602041a00000000006504350000000102200039000000000573004b0000121c0000413d0000004002400039000000000301001900000000023200190000000002120049001000000001001d27f521560000040f0000002001000039000000400200043d000f00000002001d0000000002120436000000100100002927f521760000040f0000000f040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000112019f000027f60001042e0000003f04100039000000200500008a000e00000005001d000000000454016f000000400500043d0000000004450019000f00000005001d000000000554004b0000000005000019000000010500403900000a040640009c00000ea90000213d000000010550019000000ea90000c13d0000002403300039000000400040043f0000000f040000290000000004140436000d00000004001d0000000004310019000000000224004b000015920000213d0000001f0210018f000000020330036700000005041002720000000d080000290000125f0000613d000000000500001900000005065002100000000007680019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000012570000413d000000000502004b0000126e0000613d0000000504400210000000000343034f00000000044800190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000000011800190000000000010435000000000100041127f521960000040f000000100100002900000000001004350000000801000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000c00000001001d0000000f010000290000000001010433000b00000001001d00000a040110009c00000ea90000213d0000000c01000029000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000a00000002001d0000001f0220008c00000000020000190000000102002039000000000121013f000000010110019000000ee60000c13d0000000a01000029000000200110008c000012b40000413d0000000c010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f0000000102200190000015920000613d0000000b030000290000001f023000390000000502200270000000200330008c0000000002004019000000000301043b0000000a010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b000012b40000813d000000000002041b0000000102200039000000000312004b000012b00000413d0000000b010000290000001f0110008c000015270000a13d0000000c010000290000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f0000000102200190000015920000613d0000000e020000290000000b0300002900000000032301700000002002000039000000000101043b0000000f06000029000012d40000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000012cc0000413d0000000b04000029000000000343004b000012e20000813d0000000b030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f0000000f0400002900000000024200190000000002020433000000000232016f000000000021041b0000000b01000029000000010110021000000001011001bf000015350000013d00000a8501000041000000000010043900000000010004100000000400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a52011001c70000800a0200003927f527f00000040f0000000102200190000015920000613d000000000301043b000000000103004b000013410000c13d000000400100043d000000440210003900000a8803000041000000000032043500000024021000390000001703000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f700010430000e00000002001d00000000002004350000000101000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000010020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a000001000300008a000000000232016f0000000f03000029000000000232019f000000000021041b000000400100043d0000000000310435000009ff020000410000000003000414000009ff0430009c0000000003028019000009ff0410009c00000000010280190000004001100210000000c002300210000000000112019f00000a09011001c70000800d02000039000000030300003900000a63040000410000000e05000029000000100600002927f527eb0000040f00000001012001900000063a0000c13d000015920000013d00000000010004140000001004000029000000040240008c000f00000003001d000013c90000c13d00000001020000390000000101000031000013d60000013d0000002103200039000000000403043300000a5c0440019700000a5e044001c700000000004304350000002903000039000000100600002900000000040600190000000005020433000000000535004b000007290000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006130019000000000706043300000a5c07700197000000f805500210000000000557019f00000000005604350000000406400270000000010330008a000000010530008c000013500000213d000000100340008c0000179a0000813d000000400300043d000000000703001900000a600330009c00000ea90000213d00000000040700190000008003400039000000400030043f0000004203000039000000000834043600000000030000310000000203300367000000000400001900000005054002100000000006580019000000000553034f000000000505043b00000000005604350000000104400039000000030540008c000013710000413d00000000060700190000000003060433000000000303004b000007290000613d000000000308043300000a5c0330019700000a5d033001c700000000003804350000000003060433000000020330008c000007290000413d0000002103600039000000000403043300000a5c0440019700000a5e044001c7000000000043043500000041030000390000000004060433000000000434004b000007290000a13d0000000004830019000000000504043300000a5c0550019700000a5d055001c70000000000540435000000010330008a000000010430008c0000138a0000213d000000400500043d001000000005001d000000200350003900000a610400004100000000004304350000000003020433000f00000003001d0000003702500039000d00000006001d000e00000008001d27f521690000040f00000010010000290000000f020000290000000001120019000000370210003900000a6203000041000000000032043500000048021000390000000d010000290000000003010433000d00000003001d0000000e0100002927f521690000040f0000000f010000290000000d020000290000000003210019000000280230003900000010010000290000000000210435000000480230003927f521560000040f00000a1601000041000000400300043d000f00000003001d00000000001304350000002001000039000000040230003900000000001204350000002402300039000000100100002927f521760000040f0000000f040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000009ff02000041000009ff0510009c0000000001028019000000c00110021000000a0b011001c70000800902000039000000000500001927f527eb0000040f000000010220018f00030000000103550000006001100270000109ff0010019d000009ff01100197000000000301004b000013ec0000c13d000000400100043d000000000202004b0000141a0000c13d000000440210003900000a8703000041000000000032043500000024021000390000001403000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f70001043000000a040310009c00000ea90000213d0000003f03100039000000200400008a000000000443016f000000400300043d0000000004430019000000000534004b0000000005000019000000010500403900000a040640009c00000ea90000213d000000010550019000000ea90000c13d000000400040043f0000000001130436000000030300036700000001050000310000001f0450018f00000005055002720000140a0000613d000000000600001900000005076002100000000008710019000000000773034f000000000707043b00000000007804350000000106600039000000000756004b000014020000413d000000000604004b000013d80000613d0000000505500210000000000353034f00000000015100190000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000013d80000013d0000000f020000290000000000210435000009ff020000410000000003000414000009ff0430009c0000000003028019000009ff0410009c00000000010280190000004001100210000000c002300210000000000112019f00000a09011001c70000800d02000039000000010300003900000a860400004127f527eb0000040f00000001012001900000063a0000c13d000015920000013d000000400100043d000000440210003900000a5603000041000000000032043500000024021000390000000e03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f700010430000000000302004b0000000003000019000014440000613d0000000e0300002900000000030304330000000304200210000000010500008a000000000445022f000000000454013f000000000343016f0000000102200210000000000223019f000000000021041b000000400200043d00000010060000290000000001060433000000000301004b000014590000613d000000000300001900000000042300190000002003300039000000000563001900000000050504330000000000540435000000000413004b000014520000413d00000000032100190000000000030435000009ff03000041000009ff0420009c00000000020380190000004002200210000009ff0410009c00000000010380190000006001100210000000000121019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000112019f00000a0b011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000501043b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000020300003900000a800400004127f527eb0000040f00000001012001900000063a0000c13d000015920000013d0000000c0100002900000000001004350000000101000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000003020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000ff01100190000011bc0000c13d000000400100043d000000640210003900000a8c030000410000000000320435000000440210003900000a8d03000041000000000032043500000024021000390000002e03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f7000104300000004401000039000200000001001d0000000201100367000000000201043b000000400100043d000f00000001001d00000a050110009c00000ea90000213d0000000f030000290000004001300039000000400010043f0000000101000039000000000713043600000000030000310000000203300367000000000400001900000005054002100000000006570019000000000553034f000000000505043b0000000000560435000000010440003a000014c00000413d0000000f030000290000000003030433000000000303004b000007290000613d000a00000007001d00000000002704350000006402000039000100000002001d0000000202200367000000000202043b000000400300043d000b00000003001d00000a050330009c00000ea90000213d0000000b040000290000004003400039000000400030043f000000000614043600000000010000310000000201100367000000000300001900000005043002100000000005460019000000000441034f000000000404043b0000000000450435000000010330003a000014dc0000413d0000000b010000290000000001010433000000000101004b0000000f03000029000007290000613d000700000006001d00000000002604350000000001030433000000000101004b000017ab0000c13d00000002010000290000000201100367000000000101043b0000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b0000000c020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000301041a00000002010003670000006402100370000000000202043b001000000003001d000000000223004b000018ac0000813d000000400100043d000000640210003900000a91030000410000000000320435000000440210003900000a9203000041000000000032043500000024021000390000002a03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f7000104300000000b01000029000000000101004b00000000010000190000152d0000613d0000000d0100002900000000010104330000000b040000290000000302400210000000010300008a000000000223022f000000000232013f000000000121016f0000000102400210000000000121019f0000000c02000029000000000012041b000000100100002927f525a60000040f0000002003000039000000400200043d0000000004320436000000000301043300000000003404350000004004200039000000000503004b000015490000613d000000000500001900000000064500190000002005500039000000000715001900000000070704330000000000760435000000000635004b000015420000413d000000000143001900000000000104350000005f013000390000000e03000029000000000131016f000009ff03000041000009ff0420009c00000000020380190000004002200210000009ff0410009c00000000010380190000006001100210000000000121019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000112019f00000a0b011001c70000800d02000039000000020300003900000a5904000041000000100500002927f527eb0000040f0000000101200190000015920000613d000000400200043d0000000f060000290000000001060433000000000301004b000015700000613d000000000300001900000000042300190000002003300039000000000563001900000000050504330000000000540435000000000413004b000015690000413d00000000032100190000000000030435000009ff03000041000009ff0420009c00000000020380190000004002200210000009ff0410009c00000000010380190000006001100210000000000121019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000112019f00000a0b011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000601043b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000030300003900000a5a04000041000000100500002927f527eb0000040f00000001012001900000063a0000c13d0000000001000019000027f7000104300000000a030000290000000204200367000000000404043b000000200330003900000000004304350000002002200039000000000452004b000015950000413d0000000a0200002900000000020204330000000c030000290000000003030433000000000323004b000015e80000c13d00000a040320009c00000ea90000213d00000005032002100000003f04300039000000000114016f000000400400043d0000000001140019000800000004001d000000000441004b0000000004000019000000010400403900000a040510009c00000ea90000213d000000010440019000000ea90000c13d000000400010043f000000080100002900000000072104360000001f0130018f000000000200003100000002022003670000000503300272000015c20000613d000000000400001900000005054002100000000006570019000000000552034f000000000505043b00000000005604350000000104400039000000000534004b000015ba0000413d000700000007001d000000000401004b000015d30000613d0000000503300210000000000232034f000000070400002900000000033400190000000301100210000000000403043300000000041401cf000000000414022f000000000202043b0000010001100089000000000212022f00000000011201cf000000000141019f00000000001304350000000c010000290000000001010433000000000101004b000017e20000c13d000000400200043d001000000002001d00000020010000390000000002120436000000080100002927f521890000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f60001042e000000400100043d000000640210003900000a81030000410000000000320435000000440210003900000a8203000041000000000032043500000024021000390000002903000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f70001043000000002010000390000000e02000029000000000012041b000000c00100043d0000000001010433000000000101004b000016160000c13d000000400100043d000000440210003900000a7e03000041000000000032043500000024021000390000000f03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300000000a01000039000000000101041a0000000002000416000000000112004b000018210000c13d0000000001000411000d00000001001d00000000001004350000000e01000039000c00000001001d000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000400200043d0000002003200039000000000101043b000000000101041a000b00000001001d000000c00100043d0000000004010433000000000504004b00000000050300190000163d0000613d000000000600001900000000050300190000002001100039000000000701043300000000057504360000000106600039000000000746004b000016370000413d0000000001250049000000200410008a00000000004204350000001f011000390000000f04000029000000000441016f0000000001240019000000000441004b0000000004000019000000010400403900000a040510009c00000ea90000213d000000010440019000000ea90000c13d000000400010043f000009ff01000041000009ff0430009c000000000301801900000040033002100000000002020433000009ff0420009c00000000020180190000006002200210000000000232019f0000000003000414000009ff0430009c0000000001034019000000c001100210000000000121019f00000a0b011001c7000080100200003927f527f00000040f00000001022001900000001004000029000015920000613d000000000201043b000000400100043d0000008003100039000000000023043500000060021000390000000b03000029000000000032043500000040021000390000000d030000290000000000320435000000200210003900000a6c030000410000000000320435000000000041043500000a6d0310009c00000ea90000213d000000a003100039000000400030043f000009ff03000041000009ff0420009c000000000203801900000040022002100000000001010433000009ff0410009c00000000010380190000006001100210000000000121019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000112019f00000a0b011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b001000000001001d27f526700000040f00000a6e02000041000000400300043d000000000023043500000002023000390000000000120435000000220130003900000010020000290000000000210435000009ff010000410000000002000414000009ff0420009c0000000002018019000009ff0430009c00000000010340190000004001100210000000c002200210000000000121019f00000a6f011001c7000080100200003927f527f00000040f0000000102200190000015920000613d00000002020003670000002403200370000000000403043b0000000403400039000000000232034f0000000005000031000000000101043b000000000302043b00000a040230009c00000ea90000213d0000003f023000390000000f06000029000000000662016f000000400200043d0000000006620019000000000726004b0000000007000019000000010700403900000a040860009c00000ea90000213d000000010770019000000ea90000c13d0000002407400039000000400060043f00000000043204360000000006730019000000000556004b000015920000213d0000001f0530018f00000002067003670000000507300272000016c70000613d00000000080000190000000509800210000000000a940019000000000996034f000000000909043b00000000009a04350000000108800039000000000978004b000016bf0000413d000000000805004b000016d60000613d0000000507700210000000000676034f00000000077400190000000305500210000000000807043300000000085801cf000000000858022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000585019f0000000000570435000000000334001900000000000304350000000003020433000000410330008c00001a8a0000c13d0000004003200039000000000303043300000a710530009c00001b040000a13d000000400100043d000000640210003900000a7c030000410000000000320435000000440210003900000a7d03000041000000000032043500000024021000390000002203000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f700010430000000400200043d00000a5b0120009c00000ea90000213d0000006001200039000000400010043f0000002a01000039000000000112043600000000030000310000000203300367000000000400001900000005054002100000000006510019000000000553034f000000000505043b00000000005604350000000104400039000000020540008c000016fe0000413d0000000003020433000000000303004b000007290000613d000000000301043300000a5c0330019700000a5d033001c700000000003104350000000003020433000000020330008c000007290000413d0000002103200039000000000403043300000a5c0440019700000a5e044001c700000000004304350000002903000039000000040600002900000000040600190000000005020433000000000535004b000007290000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006130019000000000706043300000a5c07700197000000f805500210000000000557019f00000000005604350000000406400270000000010330008a000000010530008c000017170000213d000000100340008c0000179a0000813d000000400300043d001000000003001d00000a600330009c00000ea90000213d00000010040000290000008003400039000000400030043f0000004203000039000000000934043600000000030000310000000203300367000000000400001900000005054002100000000006590019000000000553034f000000000505043b00000000005604350000000104400039000000030540008c000017380000413d00000010080000290000000003080433000000000303004b000007290000613d000000000309043300000a5c0330019700000a5d033001c700000000003904350000000003080433000000020330008c000007290000413d0000002103800039000000000403043300000a5c0440019700000a5e044001c7000000000043043500000a1305000041000000410300003900000000040500190000000005080433000000000535004b000007290000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006930019000000000706043300000a5c07700197000000f805500210000000000557019f00000000005604350000000405400270000000010330008a000000010630008c000017520000213d000e00000009001d000000100340008c0000179a0000813d000000400500043d000f00000005001d000000200350003900000a610400004100000000004304350000000003020433000d00000003001d000000370250003927f521690000040f0000000f010000290000000d020000290000000001120019000000370210003900000a62030000410000000000320435000000480210003900000010010000290000000003010433001000000003001d0000000e0100002927f521690000040f0000000d010000290000001002000029000000000312001900000028023000390000000f010000290000000000210435000000480230003927f521560000040f00000a1601000041000000400300043d001000000003001d000000000013043500000020010000390000000402300039000000000012043500000024023000390000000f0100002927f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000000400100043d000000440210003900000a8903000041000000000032043500000a1602000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300000000d01000039000e00000001001d0000801001000039000d00000001001d0000000004000019000017b70000013d0000000f03000029000000000103043300000010040000290000000104400039000000000214004b000018330000813d001000000004001d000000050140021000000000013100190000002001100039000000000101043300000000001004350000000e01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000d0200002927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000ff01100190000017b10000c13d0000000c01000029000000000101004b000017b10000613d000000400100043d000000440210003900000a9003000041000000000032043500000024021000390000001703000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300000801001000039001000000001001d000000000300001900000005043002100000000b010000290000000001140019000000000101043300000a03021001970000000a010000290000000001010433000000000131004b000007290000a13d000e00000003001d000f00000002001d000000000102004b000000100200002900001cc50000613d0000000901000029000d00000004001d000000000141001900000000010104330000000000100435000000200000043f000009ff010000410000000004000414000009ff0340009c0000000001044019000000c00110021000000a10011001c727f527f00000040f0000000102200190000015920000613d000000000101043b0000000f020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000000100200002927f527f00000040f0000000102200190000015920000613d000000080200002900000000020204330000000e03000029000000000232004b00000007020000290000000d04000029000007290000a13d0000000002240019000000000101043b000000000101041a000000000012043500000001033000390000000c010000290000000001010433000000000113004b000017e50000413d000015d70000013d000000400100043d000000440210003900000a6b03000041000000000032043500000024021000390000001403000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300000000c02000029000000000202004b000018670000c13d000000000201004b000014ed0000613d0000000602000039000d00000002001d0000801002000039000900000002001d00000000050000190000000a040000290000000b020000290000000002020433000000000252004b000007290000a13d000000000151004b000007290000a13d000e00000005001d00000005015002100000000b02000029000000000221001900000020022000390000000002020433001000000002001d0000000001140019000000000101043300000000001004350000000d01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000000090200002927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a0000001003000029000000000232001a000018f60000413d000000000021041b0000000e0500002900000001055000390000000f030000290000000001030433000000000215004b0000000a040000290000183e0000413d0000000602000029000000000202004b000014ed0000c13d000000000101004b000014ed0000613d0000000601000039000e00000001001d0000801001000039000d00000001001d00000000020000190000000b010000290000000001010433000000000121004b0000000704000029000007290000a13d000900000002001d000000050120021000000000023100190000002002200039000000000202043300000000011400190000000001010433001000000001001d000a00000002001d00000000002004350000000e01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000d0200002927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a0000001001000029000800000002001d000000000112004b0000191d0000413d0000000a0100002900000000001004350000000e01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000d0200002927f527f00000040f0000000102200190000015920000613d000000100200002900000008030000290000000002230049000000000101043b000000000021041b000000090200002900000001022000390000000f030000290000000001030433000000000112004b000018710000413d000014ed0000013d0000004401100370000000000101043b0000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b0000000c020000290000000000200435000000200010043f00000001010000290000000201100367000000000101043b000f00000001001d000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d00000010020000290000000f030000290000000002320049000000000101043b000000000021041b00000002010000290000000201100367000000000101043b0000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000006020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d00000001020000290000000202200367000000000202043b000000000101043b000000000301041a000000000223001a000018f60000413d000019530000013d00000a180100004100000000001004350000001101000039000000040010043f00000a1901000041000027f700010430000000060100002900000000001004350000000101000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000003020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000ff0110019000000fe70000c13d0000149b0000013d000000400100043d000000640210003900000a4d030000410000000000320435000000440210003900000a4e03000041000000000032043500000024021000390000002803000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f7000104300000000601000029000000000101004b000019b70000c13d0000000d01000039000c00000001001d0000801001000039000b00000001001d0000000003000019000f00000003001d00000005013002100000000e020000290000000001120019000000000101043300000000001004350000000c01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000b0200002927f527f00000040f0000000101200190000015920000613d000000100100002900000000010104330000000f030000290000000103300039000000000213004b0000193a0000413d000019d80000013d000000000021041b00000002010000290000000201100367000000000101043b000000400200043d000000000112043600000001030000290000000203300367000000000303043b0000000000310435000009ff010000410000000003000414000009ff0430009c0000000003018019000009ff0420009c00000000010240190000004001100210000000c002300210000000000112019f00000a10011001c70000800d02000039000000040300003900000a5004000041001000000003001d00000003050000290000000c06000029000000060700002927f527eb0000040f0000000101200190000015920000613d00000a5101000041000000000010043900000006010000290000000400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a52011001c7000080020200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101004b0000063a0000613d000000400400043d00000024014000390000000c02000029000000000021043500000a5301000041000000000014043500000004014000390000000302000029000000000021043500000002010000290000000201100367000000000101043b0000004402400039000000000012043500000001010000290000000201100367000000000101043b0000008402400039000000a00300003900000000003204350000006402400039000000000012043500000005060000290000000001060433000000a4024000390000000000120435000f00000004001d000000c402400039000000000301004b000019a80000613d000000000300001900000000042300190000002003300039000000000563001900000000050504330000000000540435000000000413004b000019a10000413d0000000002210019000000000002043500000000020004140000000603000029000000040330008c00001bb70000c13d0000000001000415000000120110008a00000020011000c90000000102000031000000200320008c00000020030000390000000003024019001200000000001d00001bf60000013d0000000d01000039000c00000001001d0000801001000039000b00000001001d0000000003000019000f00000003001d00000005013002100000000e020000290000000001120019000000000101043300000000001004350000000c01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000b0200002927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000ff01100190000017d00000613d000000100100002900000000010104330000000f030000290000000103300039000000000213004b000019bc0000413d0000000602000029000000000202004b00001a0c0000c13d000000000101004b00000ff30000613d0000000601000039000b00000001001d0000801001000039000700000001001d000000000300001900000009010000290000000001010433000000000131004b000007290000a13d000c00000003001d00000005013002100000000e020000290000000002120019000000080300002900000000011300190000000001010433000f00000001001d000000000102043300000000001004350000000b01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000000070200002927f527f00000040f0000000102200190000015920000613d000000000101043b000000000301041a0000000f020000290000000002230019000000000332004b000000000300001900000001030040390000000103300190000018f60000c13d000000000021041b0000000c03000029000000010330003900000010010000290000000001010433000000000213004b000019e20000413d000000000101004b00000ff30000613d0000801001000039000b00000001001d000f00000000001d000000090100002900000000010104330000000f02000029000000000121004b000007290000a13d0000000f0100002900000005011002100000001002000029000000000221001900000020022000390000000003020433000000080200002900000000011200190000000001010433000e00000001001d000c00000003001d0000000000300435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000b0200002927f527f00000040f0000000102200190000015920000613d000000000101043b00000006020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000b0200002927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a0000000e01000029000700000002001d000000000112004b000015120000413d0000000c010000290000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000006020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d0000000e0200002900000007030000290000000002230049000000000101043b000000000021041b0000000c010000290000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000005020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a0000000e03000029000000000232001a000018f60000413d000000000021041b0000000f02000029000000010220003900000010010000290000000001010433000f00000002001d000000000112004b00001a110000413d00000ff30000013d000000400100043d000000440210003900000a7003000041000000000032043500000024021000390000001f03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300000001f022000390000000a04000029000000000242016f0000000e0500002900000000015100490000000001210019000009ff02000041000009ff0410009c00000000010280190000006001100210000009ff0450009c000000000402001900000000040540190000004004400210000000000141019f000009ff0430009c0000000002034019000000c002200210000000000112019f000000050200002927f527eb0000040f0000000e0a00002900000000030100190000006003300270000009ff03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050640027200001ac40000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00001abc0000413d000000000705004b00001ad40000613d0000000506600210000000000761034f0000000e0800002900000000066800190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000005000415000000190550008a00000020055000c9001900000000001d000000010220019000001b560000613d0000001f01400039000000600110018f0000000e020000290000000002210019000000000112004b00000000010000190000000101004039000000000402001900000a040220009c00000ea90000213d000000010110019000000ea90000c13d000000400040043f000000200130008c000015920000413d0000000e01000029000000000101043300000a5502100197000000000221004b000015920000c13d000000200250011a000000000201001f00000a750110009c0000063a0000613d00000a1601000041001000000004001d0000000000140435000000040140003927f524e40000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000000600220003900000000020204330000000004040433000000400500043d0000006006500039000000000036043500000040035000390000000000430435000000f8022002700000002003500039000000000023043500000000001504350000000000000435000009ff010000410000000002000414000009ff0320009c0000000002018019000009ff0350009c00000000010540190000004001100210000000c002200210000000000112019f00000a72011001c70000000102000039000600000002001d27f527f00000040f00000000030100190000006003300270000009ff03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200001b2f0000613d00000000060000190000000507600210000000000871034f000000000808043b00000000008704350000000106600039000000000746004b00001b280000413d000000000605004b00001b3d0000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f0003000000010355000000010220019000001c1e0000613d000000000100043300000a030210019800001c940000c13d000000400100043d000000440210003900000a7b03000041000000000032043500000024021000390000001803000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f700010430000000040230008c00001c830000413d000000000200043300000a5402200197000000000101043b00000a5501100197000000000121019f000000000010043500000a550110019700000a160110009c00001c830000c13d0000000103000031000000440130008c00001c830000413d000000400200043d0000000f010000290000000301100367000000040430008a0000001f0340018f000000050440027200001b740000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000645004b00001b6c0000413d000000000503004b00001b830000613d0000000504400210000000000141034f00000000044200190000000303300210000000000504043300000000053501cf000000000535022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000151019f00000000001404350000000104000031000000000302043300000a040130009c00001c830000213d0000002401300039000000000141004b00001c830000213d0000000001230019000000000501043300000a040650009c00001c830000213d00000000065100190000000004420019000000040440008a0000002006600039000000000446004b00001c830000213d00000000035300190000003f033000390000000a04000029000000000343016f0000000005230019000000000235004b00000000020000190000000102004039000000000405001900000a040350009c00000ea90000213d000000010220019000000ea90000c13d000000400040043f000000000201004b00001c830000613d00000a1602000041001000000004001d0000000000240435000000040240003900000020030000390000000000320435000000240240003927f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f7000104300000001f011000390000000403000029000000000131016f000009ff030000410000000f05000029000009ff0450009c000000000403001900000000040540190000004004400210000000c401100039000009ff0510009c00000000010380190000006001100210000000000141019f000009ff0420009c0000000002038019000000c002200210000000000112019f000000060200002927f527eb0000040f0000000f0a00002900000000030100190000006003300270000009ff04300197000000200340008c000000200300003900000000030440190000001f0530018f000000050630027200001bde0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00001bd60000413d000000000705004b00001bee0000613d0000000506600210000000000761034f0000000f0800002900000000066800190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000004001f00030000000103550000000001000415000000110110008a00000020011000c9001100000000001d000000010220019000001c440000613d0000001f02300039000000600220018f0000000f040000290000000004420019000000000224004b00000000020000190000000102004039000000000504001900000a040440009c00000ea90000213d000000010220019000000ea90000c13d000000400050043f000000200230008c000015920000413d0000000f02000029000000000202043300000a5503200197000000000332004b000015920000c13d000000200110011a000000000102001f00000a530120009c0000063a0000613d00000a1601000041001000000005001d0000000000150435000000040150003927f524e40000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000000400200043d0000001f0430018f000000050330027200001c2b0000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b00001c230000413d000000000504004b00001c3a0000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000009ff010000410000000103000031000009ff0430009c0000000003018019000009ff0420009c000000000102401900000040011002100000006002300210000000000112019f000027f700010430000000040140008c00001c830000413d000000000100043300000a54011001970000000302000367000000000202043b00000a5502200197000000000112019f000000000010043500000a550110019700000a160110009c00001c830000c13d0000000103000031000000440130008c00001c830000413d000000400200043d00000010010000290000000301100367000000040430008a0000001f0340018f000000050440027200001c630000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000645004b00001c5b0000413d000000000503004b00001c720000613d0000000504400210000000000141034f00000000044200190000000303300210000000000504043300000000053501cf000000000535022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000151019f00000000001404350000000104000031000000000302043300000a040130009c00001c830000213d0000002401300039000000000141004b00001c830000213d0000000001230019000000000501043300000a040650009c00001c830000213d00000000065100190000000004420019000000040440008a0000002006600039000000000446004b00001d350000a13d000000400200043d001000000002001d00000a16010000410000000000120435000000040120003927f524f10000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f70001043027f521960000040f000000800100043d00000a030110019700000000001004350000000c01000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a000000010300008a000c00000003001d000000000332004b000018f60000613d0000000102200039000000000021041b000000800100043d00000a0301100197000700000001001d000000c00100043d000b00000001001d0000000021010434000500000002001d000000020210008c00001cda0000813d000000000101004b000007290000613d00000005010000290000000001010433000b00000001001d000000400100043d001000000001001d00000a730110009c00000ea90000213d00000010020000290000002001200039000000400010043f00000000000204350000000701000029000000000101004b00001d580000c13d000000400100043d000000640210003900000a83030000410000000000320435000000440210003900000a8403000041000000000032043500000024021000390000002a03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f700010430000000400100043d000400000001001d00000a730110009c00000ea90000213d00000004020000290000002001200039000000400010043f00000000000204350000000b01000029000000000101043300000a040210009c00000ea90000213d00000005031002100000003f023000390000000f04000029000000000242016f000000400400043d0000000002240019000800000004001d000000000442004b0000000004000019000000010400403900000a040520009c00000ea90000213d000000010440019000000ea90000c13d000000400020043f00000008020000290000000001120436001000000001001d0000001f0130018f00000000020000310000000202200367000000050330027200001d070000613d0000000004000019000000050540021000000010060000290000000006560019000000000552034f000000000505043b00000000005604350000000104400039000000000534004b00001cfe0000413d000000000401004b00001d170000613d0000000503300210000000000232034f000000100400002900000000033400190000000301100210000000000403043300000000041401cf000000000414022f000000000202043b0000010001100089000000000212022f00000000011201cf000000000141019f00000000001304350000000b010000290000000002010433001600000000001d000000000102004b000000000100001900001e230000c13d0000000702000029000000000202004b00001e710000c13d000000400100043d000000640210003900000a76030000410000000000320435000000440210003900000a7703000041000000000032043500000024021000390000002103000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f70001043000000000035300190000003f033000390000000404000029000000000343016f0000000005230019000000000235004b00000000020000190000000102004039000000000405001900000a040350009c00000ea90000213d000000010220019000000ea90000c13d000000400040043f000000000201004b00001c830000613d00000a1602000041001000000004001d0000000000240435000000040240003900000020030000390000000000320435000000240240003927f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f7000104300000000b010000290000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000007020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000000101004b00001f0a0000c13d000000400200043d00000a050120009c00000ea90000213d0000004001200039000000400010043f0000000601000029000000000112043600000000030000310000000203300367000000000400001900000005054002100000000006510019000000000553034f000000000505043b0000000000560435000000010440003a00001d810000413d0000000003020433000000000303004b000007290000613d0000000b030000290000000000310435000000400300043d00000a050130009c00000ea90000213d0000004001300039000000400010043f0000000601000029000000000113043600000000040000310000000204400367000000000500001900000005065002100000000007610019000000000664034f000000000606043b0000000000670435000000010550003a00001d970000413d0000000004030433000000000404004b000007290000613d00000006040000290000000000410435000000070100002927f527210000040f0000000b010000290000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b00000007020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a0000000c03000029000000000332004b000018f60000613d0000000102200039000000000021041b000000400100043d0000002002100039000000060300002900000000003204350000000b020000290000000000210435000009ff020000410000000003000414000009ff0430009c0000000003028019000009ff0410009c00000000010280190000004001100210000000c002300210000000000112019f00000a10011001c70000800d02000039000000040300003900000a5004000041000c00000003001d0000000d050000290000000006000019000000070700002927f527eb0000040f0000000101200190000015920000613d00000a5101000041000000000010043900000007010000290000000400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a52011001c7000080020200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101004b00001ec80000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000602000029000000000021043500000044013000390000000b02000029000000000021043500000a5301000041000000000013043500000004013000390000000d0200002900000000002104350000002401300039000000000001043500000010010000290000000001010433000000a4023000390000000000120435000d00000003001d000000c402300039000000000301004b00001e140000613d0000000003000019000000000423001900000020033000390000001005000029000000000553001900000000050504330000000000540435000000000413004b00001e0c0000413d0000000002210019000000000002043500000000020004140000000703000029000000040330008c000020770000c13d0000000001000415000000180110008a00000020011000c90000000103000031000000200230008c00000020040000390000000004034019001800000000001d000020b60000013d0000000701000029000000000101004b00001cc50000613d0000000001000415000000160110008a00000020011000c9000900000001001d0000801001000039000a00000001001d0000000001020019000c00000000001d0000000c02000029000000000121004b000007290000a13d0000000c0100002900000005011002100000000b020000290000000001210019000000200110003900000000010104330000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000a0200002927f527f00000040f0000000102200190000015920000613d000000000101043b00000007020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000a0200002927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101041a000000000101004b00001f0a0000c13d0000000901000029000000200110011a000000000101003100000008020000290000000002020433000000000212004b000007290000a13d000000050110021000000010020000290000000001120019000000060200002900000000002104350000000c01000029000000ff0210018f000000ff0120008c000018f60000613d0000000001000415000000150110008a00000020011000c9000900000001001d0000000b010000290000000001010433001500010020003d0000000102200039000c00000002001d000000000212004b00001e2e0000413d00001d1d0000013d00000008020000290000000002020433000000000121004b00001ef50000c13d00000007010000290000000b02000029000000080300002927f527210000040f0000000b010000290000000001010433000000000201004b00001f1f0000c13d000000400100043d000000400200003900000000022104360000000b030000290000000004030433000000400310003900000000004304350000006003100039000000000504004b00001e8f0000613d00000000050000190000000b060000290000002006600039000000000706043300000000037304360000000105500039000000000745004b00001e890000413d00000000041300490000000000420435000000080200002900000000040204330000000002430436000000000304004b00001e9e0000613d000000000300001900000008050000290000002005500039000000000605043300000000026204360000000103300039000000000643004b00001e980000413d0000000002120049000009ff03000041000009ff0410009c00000000010380190000004001100210000009ff0420009c00000000020380190000006002200210000000000112019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000121019f00000a0b011001c70000800d02000039000000040300003900000a7404000041000c00000003001d0000000d050000290000000006000019000000070700002927f527eb0000040f0000000101200190000015920000613d00000a5101000041000000000010043900000007010000290000000400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a52011001c7000080020200003927f527f00000040f0000000102200190000015920000613d000000000101043b000000000101004b00001f5c0000c13d000000a00600043d000000800500043d000000c00200043d000000400100043d0000002003000039000000000331043600000000040204330000000000430435000000400310003900000a0305500197000000000704004b00001edb0000613d00000000070000190000002002200039000000000802043300000000038304360000000107700039000000000847004b00001ed50000413d0000000002130049000009ff03000041000009ff0410009c00000000010380190000004001100210000009ff0420009c00000000020380190000006002200210000000000121019f0000000002000414000009ff0420009c0000000002038019000000c002200210000000000121019f00000a0b011001c70000800d02000039000000030300003900000a7a0400004127f527eb0000040f0000000101200190000015920000613d0000000e010000290000000602000029000000000021041b0000000001000019000027f60001042e000000400100043d000000640210003900000a8e030000410000000000320435000000440210003900000a8f03000041000000000032043500000024021000390000002803000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f700010430000000400100043d000000640210003900000a78030000410000000000320435000000440210003900000a7903000041000000000032043500000024021000390000002103000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f7000104300000801002000039000c00000002001d001000000000001d000000080200002900000000020204330000001003000029000000000232004b000007290000a13d0000001002000029000000000121004b000007290000a13d000000100100002900000005011002100000000802000029000000000221001900000020022000390000000002020433000a00000002001d0000000502000029000000000112001900000000010104330000000000100435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000c0200002927f527f00000040f0000000102200190000015920000613d000000000101043b00000007020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c70000000c0200002927f527f00000040f0000000102200190000015920000613d000000000101043b000000000201041a0000000a03000029000000000232001a000018f60000413d000000000021041b000000100200002900000001022000390000000b010000290000000001010433001000000002001d000000000212004b00001f220000413d00001e7d0000013d000000400300043d0000004401300039000000a002000039000000000021043500000a7501000041000000000013043500000004013000390000000d020000290000000000210435000000240130003900000000000104350000000b010000290000000002010433000000a4013000390000000000210435001000000003001d000000c401300039000000000302004b00001f780000613d00000000030000190000000b040000290000002004400039000b00000004001d000000000404043300000000014104360000000103300039000000000423004b00001f700000413d00000010030000290000000002310049000000040220008a00000064033000390000000000230435000000080200002900000000020204330000000001210436000000000302004b00001f8b0000613d000000000300001900000008040000290000002004400039000800000004001d000000000404043300000000014104360000000103300039000000000423004b00001f830000413d00000010030000290000000002310049000000040220008a00000084033000390000000000230435000000040200002900000000020204330000000001210436000000000302004b00001f9e0000613d0000000003000019000000000413001900000020033000390000000405000029000000000553001900000000050504330000000000540435000000000423004b00001f960000413d0000000003120019000000000003043500000000030004140000000704000029000000040440008c00001fad0000c13d0000000001000415000000140110008a00000020011000c90000000103000031000000200230008c00000020040000390000000004034019001400000000001d00001fed0000013d0000001f022000390000000f04000029000000000242016f000000100500002900000000015100490000000001210019000009ff02000041000009ff0410009c00000000010280190000006001100210000009ff0450009c000000000402001900000000040540190000004004400210000000000141019f000009ff0430009c0000000002034019000000c002200210000000000112019f000000070200002927f527eb0000040f00000000030100190000006003300270000009ff03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050640027200001fd50000613d0000000007000019000000050870021000000010090000290000000009890019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00001fcc0000413d000000000705004b00001fe50000613d0000000506600210000000000761034f000000100800002900000000066800190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000001000415000000130110008a00000020011000c9001300000000001d0000000102200190000020150000613d0000001f02400039000000600220018f00000010040000290000000004420019000000000224004b00000000020000190000000102004039000000000504001900000a040440009c00000ea90000213d000000010220019000000ea90000c13d000000400050043f000000200230008c000015920000413d0000001002000029000000000202043300000a5503200197000000000332004b000015920000c13d000000200110011a000000000102001f00000a750120009c00001ec80000613d00000a1601000041000f00000005001d0000000000150435000000040150003927f524e40000040f0000000f040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000000040130008c00001c830000413d000000000100043300000a54011001970000000302000367000000000202043b00000a5502200197000000000112019f000000000010043500000a550110019700000a160110009c00001c830000c13d0000000103000031000000440130008c00001c830000413d000000400200043d0000000c010000290000000301100367000000040430008a0000001f0340018f0000000504400272000020340000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000645004b0000202c0000413d000000000503004b000020430000613d0000000504400210000000000141034f00000000044200190000000303300210000000000504043300000000053501cf000000000535022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000151019f00000000001404350000000104000031000000000302043300000a040130009c00001c830000213d0000002401300039000000000141004b00001c830000213d0000000001230019000000000501043300000a040650009c00001c830000213d00000000065100190000000004420019000000040440008a0000002006600039000000000446004b00001c830000213d00000000035300190000003f033000390000000f04000029000000000343016f0000000005230019000000000235004b00000000020000190000000102004039000000000405001900000a040350009c00000ea90000213d000000010220019000000ea90000c13d000000400040043f000000000201004b00001c830000613d00000a1602000041001000000004001d0000000000240435000000040240003900000020030000390000000000320435000000240240003927f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f7000104300000001f011000390000000f03000029000000000131016f000009ff030000410000000d05000029000009ff0450009c000000000403001900000000040540190000004004400210000000c401100039000009ff0510009c00000000010380190000006001100210000000000141019f000009ff0420009c0000000002038019000000c002200210000000000112019f000000070200002927f527eb0000040f00000000030100190000006003300270000009ff03300197000000200430008c000000200400003900000000040340190000001f0540018f00000005064002720000209e0000613d000000000700001900000005087002100000000d090000290000000009890019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000020950000413d000000000705004b000020ae0000613d0000000506600210000000000761034f0000000d0800002900000000066800190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000001000415000000170110008a00000020011000c9001700000000001d0000000102200190000020de0000613d0000001f02400039000000600220018f0000000d040000290000000004420019000000000224004b00000000020000190000000102004039000000000504001900000a040440009c00000ea90000213d000000010220019000000ea90000c13d000000400050043f000000200230008c000015920000413d0000000d02000029000000000202043300000a5503200197000000000332004b000015920000c13d000000200110011a000000000102001f00000a530120009c00001ec80000613d00000a1601000041001000000005001d0000000000150435000000040150003927f524e40000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000000040130008c00001c830000413d000000000100043300000a54011001970000000302000367000000000202043b00000a5502200197000000000112019f000000000010043500000a550110019700000a160110009c00001c830000c13d0000000103000031000000440130008c00001c830000413d000000400200043d0000000c010000290000000301100367000000040430008a0000001f0340018f0000000504400272000020fd0000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000645004b000020f50000413d000000000503004b0000210c0000613d0000000504400210000000000141034f00000000044200190000000303300210000000000504043300000000053501cf000000000535022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000151019f00000000001404350000000104000031000000000302043300000a040130009c00001c830000213d0000002401300039000000000141004b00001c830000213d0000000001230019000000000501043300000a040650009c00001c830000213d00000000065100190000000004420019000000040440008a0000002006600039000000000446004b00001c830000213d00000000035300190000003f033000390000000f04000029000000000343016f0000000005230019000000000235004b00000000020000190000000102004039000000000405001900000a040350009c00000ea90000213d000000010220019000000ea90000c13d000000400040043f000000000201004b00001c830000613d00000a1602000041001000000004001d0000000000240435000000040240003900000020030000390000000000320435000000240240003927f521760000040f00000010040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f70001043000000a9b0210009c000021450000813d0000002001100039000000400010043f000000000001042d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f70001043000000a9c0210009c000021500000813d0000004001100039000000400010043f000000000001042d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f7000104300000001f02200039000000200300008a000000000232016f0000000001120019000000000221004b0000000002000019000000010200403900000a040310009c000021630000213d0000000102200190000021630000c13d000000400010043f000000000001042d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f700010430000000000403004b000021730000613d000000000400001900000000052400190000000006140019000000000606043300000000006504350000002004400039000000000534004b0000216c0000413d00000000012300190000000000010435000000000001042d00000000030104330000000002320436000000000403004b000021820000613d000000000400001900000000052400190000002004400039000000000614001900000000060604330000000000650435000000000534004b0000217b0000413d000000000123001900000000000104350000001f01300039000000200300008a000000000131016f0000000001120019000000000001042d000000000301001900000000040304330000000001420436000000000204004b000021950000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000542004b0000218f0000413d000000000001042d0004000000000002000400000001001d00000a130100004100000000001004350000000501000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000021bb0000613d000000000101043b000000040200002900000a0302200197000400000002001d0000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000021bb0000613d000000000101043b000000000101041a000000ff01100190000021bd0000613d000000000001042d0000000001000019000027f700010430000000400200043d00000a9d0120009c000021c60000413d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f7000104300000006001200039000000400010043f0000002a01000039000000000112043600000000030000310000000203300367000000000400001900000005054002100000000006510019000000000553034f000000000505043b00000000005604350000000104400039000000020540008c000021cd0000413d0000000003020433000000000303004b000021df0000613d000000000301043300000a5c0330019700000a5d033001c700000000003104350000000003020433000000020330008c000021e50000813d00000a180100004100000000001004350000003201000039000000040010043f00000a1901000041000027f7000104300000002103200039000000000403043300000a5c0440019700000a5e044001c700000000004304350000002903000039000000040600002900000000040600190000000005020433000000000535004b000021df0000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006130019000000000706043300000a5c07700197000000f805500210000000000557019f00000000005604350000000406400270000000010330008a000000010530008c000021ec0000213d000000100340008c0000226f0000813d000000400300043d000400000003001d00000a600330009c000021c00000213d00000004040000290000008003400039000000400030043f0000004203000039000000000934043600000000030000310000000203300367000000000400001900000005054002100000000006590019000000000553034f000000000505043b00000000005604350000000104400039000000030540008c0000220d0000413d00000004080000290000000003080433000000000303004b000021df0000613d000000000309043300000a5c0330019700000a5d033001c700000000003904350000000003080433000000020330008c000021df0000413d0000002103800039000000000403043300000a5c0440019700000a5e044001c7000000000043043500000a1305000041000000410300003900000000040500190000000005080433000000000535004b000021df0000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006930019000000000706043300000a5c07700197000000f805500210000000000575019f00000000005604350000000405400270000000010330008a000000010630008c000022270000213d000100000009001d000000100340008c0000226f0000813d000000400500043d000300000005001d000000200350003900000a610400004100000000004304350000000003020433000200000003001d000000370250003927f521690000040f000000030100002900000002020000290000000001120019000000370210003900000a62030000410000000000320435000000480210003900000004010000290000000003010433000400000003001d000000010100002927f521690000040f000000020100002900000004020000290000000003210019000000280230003900000003010000290000000000210435000000480230003927f521560000040f00000a1601000041000000400300043d000400000003001d00000000001304350000002001000039000000040230003900000000001204350000002402300039000000030100002927f521760000040f00000004040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000000400100043d000000440210003900000a8903000041000000000032043500000a1602000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300004000000000002000400000001001d00000a120100004100000000001004350000000501000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000022a50000613d000000000101043b000000040200002900000a0302200197000400000002001d0000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000022a50000613d000000000101043b000000000101041a000000ff01100190000022a70000613d000000000001042d0000000001000019000027f700010430000000400200043d00000a9d0120009c000022b00000413d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f7000104300000006001200039000000400010043f0000002a01000039000000000112043600000000030000310000000203300367000000000400001900000005054002100000000006510019000000000553034f000000000505043b00000000005604350000000104400039000000020540008c000022b70000413d0000000003020433000000000303004b000022c90000613d000000000301043300000a5c0330019700000a5d033001c700000000003104350000000003020433000000020330008c000022cf0000813d00000a180100004100000000001004350000003201000039000000040010043f00000a1901000041000027f7000104300000002103200039000000000403043300000a5c0440019700000a5e044001c700000000004304350000002903000039000000040600002900000000040600190000000005020433000000000535004b000022c90000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006130019000000000706043300000a5c07700197000000f805500210000000000557019f00000000005604350000000406400270000000010330008a000000010530008c000022d60000213d000000100340008c000023590000813d000000400300043d000400000003001d00000a600330009c000022aa0000213d00000004040000290000008003400039000000400030043f0000004203000039000000000934043600000000030000310000000203300367000000000400001900000005054002100000000006590019000000000553034f000000000505043b00000000005604350000000104400039000000030540008c000022f70000413d00000004080000290000000003080433000000000303004b000022c90000613d000000000309043300000a5c0330019700000a5d033001c700000000003904350000000003080433000000020330008c000022c90000413d0000002103800039000000000403043300000a5c0440019700000a5e044001c7000000000043043500000a1205000041000000410300003900000000040500190000000005080433000000000535004b000022c90000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006930019000000000706043300000a5c07700197000000f805500210000000000575019f00000000005604350000000405400270000000010330008a000000010630008c000023110000213d000100000009001d000000100340008c000023590000813d000000400500043d000300000005001d000000200350003900000a610400004100000000004304350000000003020433000200000003001d000000370250003927f521690000040f000000030100002900000002020000290000000001120019000000370210003900000a62030000410000000000320435000000480210003900000004010000290000000003010433000400000003001d000000010100002927f521690000040f000000020100002900000004020000290000000003210019000000280230003900000003010000290000000000210435000000480230003927f521560000040f00000a1601000041000000400300043d000400000003001d00000000001304350000002001000039000000040230003900000000001204350000002402300039000000030100002927f521760000040f00000004040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000000400100043d000000440210003900000a8903000041000000000032043500000a1602000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300004000000000002000400000002001d000300000001001d00000000001004350000000501000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000238f0000613d000000000101043b000000040200002900000a0302200197000400000002001d0000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000238f0000613d000000000101043b000000000101041a000000ff01100190000023910000613d000000000001042d0000000001000019000027f700010430000000400200043d00000a9d0120009c0000239a0000413d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f7000104300000006001200039000000400010043f0000002a01000039000000000112043600000000030000310000000203300367000000000400001900000005054002100000000006510019000000000553034f000000000505043b00000000005604350000000104400039000000020540008c000023a10000413d0000000003020433000000000303004b000023b30000613d000000000301043300000a5c0330019700000a5d033001c700000000003104350000000003020433000000020330008c000023b90000813d00000a180100004100000000001004350000003201000039000000040010043f00000a1901000041000027f7000104300000002103200039000000000403043300000a5c0440019700000a5e044001c700000000004304350000002903000039000000040600002900000000040600190000000005020433000000000535004b000023b30000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006130019000000000706043300000a5c07700197000000f805500210000000000557019f00000000005604350000000406400270000000010330008a000000010530008c000023c00000213d000000100340008c000024430000813d000000400300043d000400000003001d00000a600330009c000023940000213d00000004040000290000008003400039000000400030043f0000004203000039000000000934043600000000030000310000000203300367000000000400001900000005054002100000000006590019000000000553034f000000000505043b00000000005604350000000104400039000000030540008c000023e10000413d00000004080000290000000003080433000000000303004b000023b30000613d000000000309043300000a5c0330019700000a5d033001c700000000003904350000000003080433000000020330008c000023b30000413d0000002103800039000000000403043300000a5c0440019700000a5e044001c700000000004304350000004103000039000000030600002900000000040600190000000005080433000000000535004b000023b30000a13d0000000f0540018f0000000305500210000000f80550015f00000a5f06000041000000000556022f0000000006930019000000000706043300000a5c07700197000000f805500210000000000575019f00000000005604350000000406400270000000010330008a000000010530008c000023fb0000213d000100000009001d000000100340008c000024430000813d000000400500043d000300000005001d000000200350003900000a610400004100000000004304350000000003020433000200000003001d000000370250003927f521690000040f000000030100002900000002020000290000000001120019000000370210003900000a62030000410000000000320435000000480210003900000004010000290000000003010433000400000003001d000000010100002927f521690000040f000000020100002900000004020000290000000003210019000000280230003900000003010000290000000000210435000000480230003927f521560000040f00000a1601000041000000400300043d000400000003001d00000000001304350000002001000039000000040230003900000000001204350000002402300039000000030100002927f521760000040f00000004040000290000000001410049000009ff02000041000009ff0310009c0000000001028019000009ff0340009c000000000204401900000040022002100000006001100210000000000121019f000027f700010430000000400100043d000000440210003900000a8903000041000000000032043500000a1602000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a17011001c7000027f7000104300003000000000002000200000002001d000300000001001d00000000001004350000000501000039000100000001001d000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000024aa0000613d000000000101043b000000020200002900000a0302200197000200000002001d0000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000024aa0000613d000000000101043b000000000101041a000000ff01100190000024a90000613d000000030100002900000000001004350000000101000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000024aa0000613d000000000101043b00000002020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000024aa0000613d000000000101043b000000000201041a000001000300008a000000000232016f000000000021041b000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0b011001c70000800d02000039000000040300003900000a9e0400004100000000070004110000000305000029000000020600002927f527eb0000040f0000000101200190000024aa0000613d000000000001042d0000000001000019000027f700010430000100000000000200000a0301100198000100000001001d000024cf0000613d0000000000200435000000200000043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000024cd0000613d000000000101043b00000001020000290000000000200435000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f0000000102200190000024cd0000613d000000000101043b000000000101041a000000000001042d0000000001000019000027f700010430000000400100043d000000640210003900000a83030000410000000000320435000000440210003900000a8403000041000000000032043500000024021000390000002a03000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f700010430000000600210003900000a9f030000410000000000320435000000400210003900000aa0030000410000000000320435000000200210003900000028030000390000000000320435000000200200003900000000002104350000008001100039000000000001042d000000600210003900000aa1030000410000000000320435000000400210003900000aa2030000410000000000320435000000200210003900000034030000390000000000320435000000200200003900000000002104350000008001100039000000000001042d0000000002010019000000ff0120008c0000251f0000c13d0000000305000039000000000405041a000000010640019000000001014002700000007f0210018f000000000201c0190000001f0120008c00000000010000190000000101002039000000010110018f000000000116004b000025440000c13d000000400100043d0000000003210436000000000606004b0000252b0000613d0000000000500435000000000402004b0000000004000019000025310000613d00000aa50500004100000000040000190000000006430019000000000705041a000000000076043500000001055000390000002004400039000000000624004b000025170000413d000025310000013d000000400100043d000000ff0320018f000000200430008c0000254a0000813d00000a050410009c0000253e0000213d0000004004100039000000400040043f0000002004100039000000000024043500000000003104350000253d0000013d000001000500008a000000000454016f0000000000430435000000000202004b000000200400003900000000040060190000003f02400039000000200300008a000000000332016f0000000002130019000000000332004b0000000003000019000000010300403900000a040420009c0000253e0000213d00000001033001900000253e0000c13d000000400020043f000000000001042d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f70001043000000a180100004100000000001004350000002201000039000000040010043f00000a1901000041000027f70001043000000aa3020000410000000000210435000009ff02000041000009ff0310009c0000000001028019000000400110021000000aa4011001c7000027f7000104300000000002010019000000ff0120008c000025730000c13d0000000405000039000000000405041a000000010640019000000001014002700000007f0210018f000000000201c0190000001f0120008c00000000010000190000000101002039000000010110018f000000000116004b000025980000c13d000000400100043d0000000003210436000000000606004b0000257f0000613d0000000000500435000000000402004b0000000004000019000025850000613d00000aa60500004100000000040000190000000006430019000000000705041a000000000076043500000001055000390000002004400039000000000624004b0000256b0000413d000025850000013d000000400100043d000000ff0320018f000000200430008c0000259e0000813d00000a050410009c000025920000213d0000004004100039000000400040043f000000200410003900000000002404350000000000310435000025910000013d000001000500008a000000000454016f0000000000430435000000000202004b000000200400003900000000040060190000003f02400039000000200300008a000000000332016f0000000002130019000000000332004b0000000003000019000000010300403900000a040420009c000025920000213d0000000103300190000025920000c13d000000400020043f000000000001042d00000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f70001043000000a180100004100000000001004350000002201000039000000040010043f00000a1901000041000027f70001043000000aa3020000410000000000210435000009ff02000041000009ff0310009c0000000001028019000000400110021000000aa4011001c7000027f700010430000300000000000200000000001004350000000801000039000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000080100200003927f527f00000040f00000001022001900000266e0000613d000000000101043b000000000201041a000000010320019000000001042002700000007f0540018f000000000504c0190000001f0450008c00000000040000190000000104002039000000010440018f000000000443004b000026620000c13d000000400a00043d00000000095a0436000000000303004b000025e20000613d000100000005001d00020000000a001d000300000009001d0000000000100435000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a09011001c7000080100200003927f527f00000040f00000001022001900000266e0000613d0000000105000029000000000205004b00000000020000190000000309000029000000020a000029000025e80000613d000000000101043b00000000020000190000000003290019000000000401041a000000000043043500000001011000390000002002200039000000000352004b000025da0000413d000025e80000013d000001000100008a000000000112016f0000000000190435000000000105004b000000200200003900000000020060190000003f01200039000000200200008a000000000321016f0000000001a30019000000000331004b0000000003000019000000010300403900000a040410009c000026680000213d0000000103300190000026680000c13d000000400010043f00000000030a0433000000000303004b000026130000613d0000000705000039000000000405041a000000010640019000000001034002700000007f0730018f00000000030760190000001f0730008c00000000070000190000000107002039000000000774013f0000000107700190000026620000c13d000000000606004b000026300000613d00000000005004350000002004100039000000000503004b000026340000613d00000a570500004100000000060000190000000007640019000000000805041a000000000087043500000001055000390000002006600039000000000736004b0000260b0000413d000026340000013d0000000206000039000000000506041a000000010750019000000001035002700000007f0430018f00000000030460190000001f0430008c00000000040000190000000104002039000000000445013f0000000104400190000026620000c13d0000000004310436000000000707004b000026500000613d0000000000600435000000000503004b0000000005000019000026560000613d00000a580600004100000000050000190000000007540019000000000806041a000000000087043500000001066000390000002005500039000000000735004b000026280000413d000026560000013d000001000500008a000000000554016f00000020041000390000000000540435000000000334001900000000040a0433000000000504004b000026400000613d000000000500001900000000063500190000000007950019000000000707043300000000007604350000002005500039000000000645004b000026390000413d000000000334001900000000000304350000000003130049000000200430008a00000000004104350000001f03300039000000000323016f0000000002130019000000000332004b0000000003000019000000010300403900000a040420009c000026680000213d0000000103300190000026600000613d000026680000013d000001000600008a000000000565016f0000000000540435000000000303004b000000200500003900000000050060190000003f03500039000000000323016f0000000002130019000000000332004b0000000003000019000000010300403900000a040420009c000026680000213d0000000103300190000026680000c13d000000400020043f000000000001042d00000a180100004100000000001004350000002201000039000000040010043f00000a1901000041000027f70001043000000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f7000104300000000001000019000027f700010430000400000000000200000a690100004100000000001004390000000001000412000300000001001d000000040010044300000040010000390000002400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000aa7011001c7000080050200003927f527f00000040f0000000102200190000027190000613d000000000101043b00000a03011001970000000002000410000200000002001d000000000112004b000026ba0000c13d00000a690100004100000000001004390000000301000029000000040010044300000020010000390000002400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000aa7011001c7000080050200003927f527f00000040f0000000102200190000027190000613d000000000101043b000400000001001d00000a0c010000410000000000100439000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0d011001c70000800b0200003927f527f00000040f0000000102200190000027190000613d000000000101043b0000000402000029000000000121004b000026ba0000c13d00000a69010000410000000000100439000000030100002900000004001004430000002400000443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000aa7011001c7000080050200003927f527f00000040f0000000102200190000027170000c13d000027190000013d000000400100043d000400000001001d000000200210003900000a0e01000041000100000002001d000000000012043500000a690100004100000000001004390000000301000029000000040010044300000060010000390000002400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000aa7011001c7000080050200003927f527f00000040f0000000102200190000027190000613d000000000101043b00000004020000290000004002200039000000000012043500000a690100004100000000001004390000000301000029000000040010044300000080010000390000002400100443000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000aa7011001c7000080050200003927f527f00000040f0000000102200190000027190000613d000000000101043b00000004020000290000006002200039000000000012043500000a0c010000410000000000100439000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a0d011001c70000800b0200003927f527f00000040f0000000102200190000027190000613d000000000101043b0000000404000029000000a0024000390000000203000029000000000032043500000080024000390000000000120435000000a001000039000000000014043500000aa80140009c0000271b0000813d0000000403000029000000c001300039000000400010043f000009ff010000410000000104000029000009ff0240009c0000000002010019000000000204401900000040022002100000000003030433000009ff0430009c00000000030180190000006003300210000000000223019f0000000003000414000009ff0430009c0000000001034019000000c001100210000000000121019f00000a0b011001c7000080100200003927f527f00000040f0000000102200190000027190000613d000000000101043b000000000001042d0000000001000019000027f70001043000000a180100004100000000001004350000004101000039000000040010043f00000a1901000041000027f700010430000a000000000002000200000003001d000300000001001d0000000103000039000900000002001d0000000021020434000a00000002001d000000000101004b000027800000613d000500000003001d0000000d01000039000700000001001d0000801001000039000600000001001d0000000003000019000800000003001d00000005013002100000000a020000290000000001120019000000000101043300000000001004350000000701000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000000060200002927f527f00000040f0000000101200190000027c80000613d0000000901000029000000000101043300000008030000290000000103300039000000000213004b000027300000413d000000000101004b0000000503000029000027800000613d00000002010000290000002001100039000600000001001d0000000601000039000500000001001d0000801001000039000400000001001d000000000300001900000002010000290000000001010433000000000131004b000027ca0000a13d000700000003001d00000005013002100000000a020000290000000002120019000000060300002900000000011300190000000001010433000800000001001d000000000102043300000000001004350000000501000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000000040200002927f527f00000040f0000000102200190000027c80000613d000000000101043b000000000301041a00000008020000290000000002230019000000000332004b000000000300001900000001030040390000000103300190000027e50000c13d000000000021041b0000000703000029000000010330003900000009010000290000000001010433000000000213004b000027530000413d000000000101004b00000000030000190000000103006039000000030100002900000a0301100198000027c70000c13d0000000101300190000027c70000c13d00000002010000290000002001100039000100000001001d0000000601000039000700000001001d0000801001000039000600000001001d000000000200001900000002010000290000000001010433000000000121004b000027ca0000a13d000400000002001d00000005012002100000000a0200002900000000021200190000000003020433000000010200002900000000011200190000000001010433000800000001001d000500000003001d00000000003004350000000701000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000000060200002927f527f00000040f0000000102200190000027c80000613d000000000101043b000000000101041a0000000802000029000300000001001d000000000121004b000027d00000413d000000050100002900000000001004350000000701000029000000200010043f000009ff010000410000000002000414000009ff0320009c0000000001024019000000c00110021000000a10011001c7000000060200002927f527f00000040f00000001022001900000000802000029000027c80000613d00000003030000290000000002230049000000000101043b000000000021041b0000000402000029000000010220003900000009010000290000000001010433000000000112004b0000278d0000413d000000000001042d0000000001000019000027f70001043000000a180100004100000000001004350000003201000039000000040010043f00000a1901000041000027f700010430000000400100043d000000640210003900000a4d030000410000000000320435000000440210003900000a4e03000041000000000032043500000024021000390000002803000039000000000032043500000a16020000410000000000210435000000040210003900000020030000390000000000320435000009ff02000041000009ff0310009c0000000001028019000000400110021000000a4f011001c7000027f70001043000000a180100004100000000001004350000001101000039000000040010043f00000a1901000041000027f700010430000027ee002104210000000102000039000000000001042d0000000002000019000000000001042d000027f3002104230000000102000039000000000001042d0000000002000019000000000001042d000027f500000432000027f60001042e000027f700010430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000015f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffbf5275627973636f72655f416368696576656d656e740000000000000000000000302e302e31000000000000000000000000000000000000000000000000000000697066733a2f2f000000000000000000000000000000000000000000000000000200000000000000000000000000000000000020000000000000000000000000ffffffffffffff0000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000009a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000002000000000000000000000000000000040000000000000000000000008b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000000000000000000000000000ffffffffffffff3f02000000000000000000000000000000000000400000000000000000000000002f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9299f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a600000002000000000000000000000000000002000000010000000000000000005a65726f206164647265737320636865636b000000000000000000000000000008c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091d1485300000000000000000000000000000000000000000000000000000000ba772d8a00000000000000000000000000000000000000000000000000000000d547741e00000000000000000000000000000000000000000000000000000000f242432900000000000000000000000000000000000000000000000000000000f242432a00000000000000000000000000000000000000000000000000000000f5b541a600000000000000000000000000000000000000000000000000000000ffa1ad7400000000000000000000000000000000000000000000000000000000d547741f00000000000000000000000000000000000000000000000000000000e985e9c500000000000000000000000000000000000000000000000000000000c87b56dc00000000000000000000000000000000000000000000000000000000c87b56dd00000000000000000000000000000000000000000000000000000000d539139300000000000000000000000000000000000000000000000000000000ba772d8b00000000000000000000000000000000000000000000000000000000bd85b03900000000000000000000000000000000000000000000000000000000a217fdde00000000000000000000000000000000000000000000000000000000a3f4df7d00000000000000000000000000000000000000000000000000000000a3f4df7e00000000000000000000000000000000000000000000000000000000b93c377000000000000000000000000000000000000000000000000000000000a217fddf00000000000000000000000000000000000000000000000000000000a22cb4650000000000000000000000000000000000000000000000000000000098d5fdc90000000000000000000000000000000000000000000000000000000098d5fdca000000000000000000000000000000000000000000000000000000009b3e55730000000000000000000000000000000000000000000000000000000091d148540000000000000000000000000000000000000000000000000000000095d89b410000000000000000000000000000000000000000000000000000000036568abd0000000000000000000000000000000000000000000000000000000055f804b2000000000000000000000000000000000000000000000000000000007c2ccc44000000000000000000000000000000000000000000000000000000007c2ccc450000000000000000000000000000000000000000000000000000000084b0196e0000000000000000000000000000000000000000000000000000000091b7f5ed0000000000000000000000000000000000000000000000000000000055f804b3000000000000000000000000000000000000000000000000000000006834e3a8000000000000000000000000000000000000000000000000000000004e1273f3000000000000000000000000000000000000000000000000000000004e1273f4000000000000000000000000000000000000000000000000000000004f558e790000000000000000000000000000000000000000000000000000000036568abe000000000000000000000000000000000000000000000000000000003ccfd60b00000000000000000000000000000000000000000000000000000000162094c3000000000000000000000000000000000000000000000000000000002eb2c2d5000000000000000000000000000000000000000000000000000000002eb2c2d6000000000000000000000000000000000000000000000000000000002f2ff15d00000000000000000000000000000000000000000000000000000000162094c400000000000000000000000000000000000000000000000000000000248a9ca30000000000000000000000000000000000000000000000000000000006fdde020000000000000000000000000000000000000000000000000000000006fdde03000000000000000000000000000000000000000000000000000000000e89341c0000000000000000000000000000000000000000000000000000000000fdd58e0000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000020000000000000000000000000616c537570706c79000000000000000000000000000000000000000000000000455243313135353a206275726e20616d6f756e74206578636565647320746f740000000000000000000000000000000000000084000000000000000000000000c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f621806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000f23a6e610000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000496e76616c696420706172616d73000000000000000000000000000000000000a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529bda84ca2183491f179a603e877b2cb058e42195041c2b9c53d746427e519a34df000000000000000000000000000000000000000000000000ffffffffffffff9f00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff300000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000003031323334353637383961626364656600000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000206973206d697373696e6720726f6c652000000000000000000000000000000017307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3120666f722073656c660000000000000000000000000000000000000000000000455243313135353a2073657474696e6720617070726f76616c20737461747573784afb92b74f2c9ccd3cb1b9697580a90fadab59d6640bbb915d1637bfbbf008df6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c766cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe0310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0f0000000000000000000000000000000000000000000000000000000000000057726f6e67207061796d656e7420616d6f756e7400000000000000000000000066fe4d8b6c8e0542c70e2a244bf04681bb936b001f1be0f079a80e77158a8474000000000000000000000000000000000000000000000000ffffffffffffff5f1901000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000004200000000000000000000000045434453413a20696e76616c6964207369676e6174757265206c656e677468007fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a00000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbbc197c81000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000455243313135353a206d696e7420746f20746865207a65726f206164647265737400000000000000000000000000000000000000000000000000000000000000596f7520616c72656164792068617665207468697320616368696576656d656eff0a1dc048ef1a5e9e2845c6bb6cafd8b8531f3cb15368f4a708dec7d7bc789f45434453413a20696e76616c6964207369676e61747572650000000000000000756500000000000000000000000000000000000000000000000000000000000045434453413a20696e76616c6964207369676e6174757265202773272076616c496e76616c6964204e46542069647300000000000000000000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c00f9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f6206d69736d617463680000000000000000000000000000000000000000000000455243313135353a206163636f756e747320616e6420696473206c656e677468616c6964206f776e657200000000000000000000000000000000000000000000455243313135353a2061646472657373207a65726f206973206e6f74206120769cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f3911e9d9f7a772129e26cb0560945658c96b41c42ac6712d233e20c894bfcd00fd4661696c656420746f2073656e642045746865720000000000000000000000005a65726f20616d6f756e7420746f207769746864726177000000000000000000537472696e67733a20686578206c656e67746820696e73756666696369656e7420726f6c657320666f722073656c660000000000000000000000000000000000416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63656572206f7220617070726f766564000000000000000000000000000000000000455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e6d69736d61746368000000000000000000000000000000000000000000000000455243313135353a2069647320616e6420616d6f756e7473206c656e677468205468697320746f6b656e206f6e6c7920666f7220796f7500000000000000000072207472616e7366657200000000000000000000000000000000000000000000455243313135353a20696e73756666696369656e742062616c616e636520666f6472657373000000000000000000000000000000000000000000000000000000455243313135353a207472616e7366657220746f20746865207a65726f20616400000000000000000000000000000000000000000000000100000000000000000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db97965db0b00000000000000000000000000000000000000000000000000000000d9b67a26000000000000000000000000000000000000000000000000000000000e89341c0000000000000000000000000000000000000000000000000000000001ffc9a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffffc0000000000000000000000000000000000000000000000000ffffffffffffffa0f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b6420746f6b656e73000000000000000000000000000000000000000000000000455243313135353a204552433131353552656365697665722072656a65637465526563656976657220696d706c656d656e746572000000000000000000000000455243313135353a207472616e7366657220746f206e6f6e2d45524331313535b3512b0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0200000200000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff4000000000000000000000000000000000000000000000000000000000000000000a226756732b05e3ffcccfe8c89467fde1a79be96c5ac3a75eb19fc157cb9946
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0x0000000000000000000000000d0d5ff3cfef8b7b2b1cac6b6c27fd0846c09361000000000000000000000000381c031baa5995d0cc52386508050ac947780815000000000000000000000000381c031baa5995d0cc52386508050ac94778081500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000007697066733a2f2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105275627973636f72655f7a6b53796e630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105275627973636f72655f7a6b53796e6300000000000000000000000000000000
-----Decoded View---------------
Arg [0] : admin (address): 0x0d0D5Ff3cFeF8B7B2b1cAC6B6C27Fd0846c09361
Arg [1] : operator (address): 0x381c031bAA5995D0Cc52386508050Ac947780815
Arg [2] : minter (address): 0x381c031bAA5995D0Cc52386508050Ac947780815
Arg [3] : baseURI (string): ipfs://
Arg [4] : _name (string): Rubyscore_zkSync
Arg [5] : _symbol (string): Rubyscore_zkSync
-----Encoded View---------------
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ZKSYNC | 52.99% | $1,785.71 | 0.0114 | $20.36 | |
SCROLL | 16.71% | $1,783.68 | 0.0036 | $6.42 | |
LINEA | 11.16% | $1,785.71 | 0.0024 | $4.29 | |
BASE | 6.98% | $1,788.31 | 0.0015 | $2.68 | |
ETH | 4.18% | $1,785.71 | 0.0009 | $1.61 | |
OPBNB | 2.83% | $603.77 | 0.0018 | $1.09 | |
BLAST | 1.41% | $1,785.47 | 0.00030386 | $0.542542 | |
OP | 1.40% | $1,788.27 | 0.0003 | $0.53648 | |
TAIKO | 1.39% | $1,785.71 | 0.0003 | $0.535714 | |
BSC | 0.94% | $604.14 | 0.0006 | $0.362483 | |
POL | <0.01% | $0.223478 | 0.0009 | $0.000201 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.