Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
951444 | 29 days ago | Contract Creation | 0 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 Source Code Verified (Exact Match)
Contract Name:
MarketplaceV3
Compiler Version
v0.8.23+commit.f704f362
ZkSolc Version
v1.5.4
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb // $$\ $$\ $$\ $$\ $$\ // $$ | $$ | \__| $$ | $$ | // $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\ // \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\ // $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ | // $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ | // \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ | // \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/ // ====== External imports ====== import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import { ERC721Holder } from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import { ERC1155Holder, ERC1155Receiver } from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; // ========== Internal imports ========== import { Router, Multicall } from "../../../extension/plugin/Router.sol"; import "../../../extension/upgradeable/Initializable.sol"; import "../../../extension/upgradeable/ContractMetadata.sol"; import "../../../extension/upgradeable/PlatformFee.sol"; import "../../../extension/upgradeable/PermissionsEnumerable.sol"; import "../../../extension/upgradeable/init/ReentrancyGuardInit.sol"; import "../../../extension/upgradeable/ERC2771ContextUpgradeable.sol"; import { RoyaltyPaymentsLogic } from "../../../extension/upgradeable/RoyaltyPayments.sol"; /** * @author thirdweb.com */ contract MarketplaceV3 is Initializable, ContractMetadata, PlatformFee, PermissionsEnumerable, ReentrancyGuardInit, ERC2771ContextUpgradeable, RoyaltyPaymentsLogic, ERC721Holder, ERC1155Holder, Router { /// @dev Only EXTENSION_ROLE holders can perform upgrades. bytes32 private constant EXTENSION_ROLE = keccak256("EXTENSION_ROLE"); bytes32 private constant MODULE_TYPE = bytes32("MarketplaceV3"); uint256 private constant VERSION = 3; /// @dev The address of the native token wrapper contract. address private immutable nativeTokenWrapper; /*/////////////////////////////////////////////////////////////// Constructor + initializer logic //////////////////////////////////////////////////////////////*/ constructor( address _pluginMap, address _royaltyEngineAddress, address _nativeTokenWrapper ) Router(_pluginMap) RoyaltyPaymentsLogic(_royaltyEngineAddress) { nativeTokenWrapper = _nativeTokenWrapper; _disableInitializers(); } receive() external payable override { assert(msg.sender == nativeTokenWrapper); // only accept ETH via fallback from the native token wrapper contract } /// @dev Initializes the contract, like a constructor. function initialize( address _defaultAdmin, string memory _contractURI, address[] memory _trustedForwarders, address _platformFeeRecipient, uint16 _platformFeeBps ) external initializer { // Initialize inherited contracts, most base-like -> most derived. __ReentrancyGuard_init(); __ERC2771Context_init(_trustedForwarders); // Initialize this contract's state. _setupContractURI(_contractURI); _setupPlatformFeeInfo(_platformFeeRecipient, _platformFeeBps); _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin); _setupRole(EXTENSION_ROLE, _defaultAdmin); _setupRole(keccak256("LISTER_ROLE"), address(0)); _setupRole(keccak256("ASSET_ROLE"), address(0)); _setupRole(EXTENSION_ROLE, _defaultAdmin); _setRoleAdmin(EXTENSION_ROLE, EXTENSION_ROLE); } /*/////////////////////////////////////////////////////////////// Generic contract logic //////////////////////////////////////////////////////////////*/ /// @dev Returns the type of the contract. function contractType() external pure returns (bytes32) { return MODULE_TYPE; } /// @dev Returns the version of the contract. function contractVersion() external pure returns (uint8) { return uint8(VERSION); } /*/////////////////////////////////////////////////////////////// ERC 165 / 721 / 1155 logic //////////////////////////////////////////////////////////////*/ function supportsInterface( bytes4 interfaceId ) public view virtual override(Router, IERC165, ERC1155Receiver) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || interfaceId == type(IERC721Receiver).interfaceId || super.supportsInterface(interfaceId); } /*/////////////////////////////////////////////////////////////// Overridable Permissions //////////////////////////////////////////////////////////////*/ /// @dev Checks whether platform fee info can be set in the given execution context. function _canSetPlatformFeeInfo() internal view override returns (bool) { return _hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); } /// @dev Checks whether contract metadata can be set in the given execution context. function _canSetContractURI() internal view override returns (bool) { return _hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); } /// @dev Returns whether royalty engine address can be set in the given execution context. function _canSetRoyaltyEngine() internal view override returns (bool) { return _hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); } /// @dev Checks whether an account has a particular role. function _hasRole(bytes32 _role, address _account) internal view returns (bool) { PermissionsStorage.Data storage data = PermissionsStorage.data(); return data._hasRole[_role][_account]; } /// @dev Returns whether plug-in can be set in the given execution context. function _canSetPlugin() internal view override returns (bool) { return _hasRole(EXTENSION_ROLE, msg.sender); } function _msgSender() internal view override(ERC2771ContextUpgradeable, Permissions, Multicall) returns (address sender) { return ERC2771ContextUpgradeable._msgSender(); } function _msgData() internal view override(ERC2771ContextUpgradeable, Permissions) returns (bytes calldata) { return ERC2771ContextUpgradeable._msgData(); } }
// 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.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; import "./ERC1155Receiver.sol"; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; import "../IERC1155Receiver.sol"; import "../../../utils/introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; import "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// 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 v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./interface/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 * [EIP](https://eips.ethereum.org/EIPS/eip-165). * * 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 * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * 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: Apache 2.0 pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../lib/Address.sol"; import "./interface/IMulticall.sol"; /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ contract Multicall is IMulticall { /** * @notice Receives and executes a batch of function calls on this contract. * @dev Receives and executes a batch of function calls on this contract. * * @param data The bytes data that makes up the batch of function calls to execute. * @return results The bytes data that makes up the result of the batch of function calls executed. */ function multicall(bytes[] calldata data) external returns (bytes[] memory results) { results = new bytes[](data.length); address sender = _msgSender(); bool isForwarder = msg.sender != sender; for (uint256 i = 0; i < data.length; i++) { if (isForwarder) { results[i] = Address.functionDelegateCall(address(this), abi.encodePacked(data[i], sender)); } else { results[i] = Address.functionDelegateCall(address(this), data[i]); } } return results; } /// @notice Returns the sender in the given execution context. function _msgSender() internal view virtual returns (address) { return msg.sender; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI * for you contract. * * Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea. */ interface IContractMetadata { /// @dev Returns the metadata URI of the contract. function contractURI() external view returns (string memory); /** * @dev Sets contract URI for the storefront-level metadata of the contract. * Only module admin can call this function. */ function setContractURI(string calldata _uri) external; /// @dev Emitted when the contract URI is updated. event ContractURIUpdated(string prevURI, string newURI); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; interface IERC2771Context { function isTrustedForwarder(address forwarder) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author thirdweb /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ interface IMulticall { /** * @dev Receives and executes a batch of function calls on this contract. */ function multicall(bytes[] calldata data) external returns (bytes[] memory results); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IPermissions { /** * @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: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "./IPermissions.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IPermissionsEnumerable is IPermissions { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * [forum post](https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296) * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `PlatformFee` is a contract extension to be used with any base contract. It exposes functions for setting and reading * the recipient of platform fee and the platform fee basis points, and lets the inheriting contract perform conditional logic * that uses information about platform fees, if desired. */ interface IPlatformFee { /// @dev Fee type variants: percentage fee and flat fee enum PlatformFeeType { Bps, Flat } /// @dev Returns the platform fee bps and recipient. function getPlatformFeeInfo() external view returns (address, uint16); /// @dev Lets a module admin update the fees on primary sales. function setPlatformFeeInfo(address _platformFeeRecipient, uint256 _platformFeeBps) external; /// @dev Emitted when fee on primary sales is updated. event PlatformFeeInfoUpdated(address indexed platformFeeRecipient, uint256 platformFeeBps); /// @dev Emitted when the flat platform fee is updated. event FlatPlatformFeeUpdated(address platformFeeRecipient, uint256 flatFee); /// @dev Emitted when the platform fee type is updated. event PlatformFeeTypeUpdated(PlatformFeeType feeType); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Lookup engine interface */ interface IRoyaltyEngineV1 is IERC165 { /** * Get the royalty for a given token (address, id) and value amount. Does not cache the bps/amounts. Caches the spec for a given token address * * @param tokenAddress - The address of the token * @param tokenId - The id of the token * @param value - The value you wish to get the royalty of * * returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get */ function getRoyalty( address tokenAddress, uint256 tokenId, uint256 value ) external returns (address payable[] memory recipients, uint256[] memory amounts); /** * View only version of getRoyalty * * @param tokenAddress - The address of the token * @param tokenId - The id of the token * @param value - The value you wish to get the royalty of * * returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get */ function getRoyaltyView( address tokenAddress, uint256 tokenId, uint256 value ) external view returns (address payable[] memory recipients, uint256[] memory amounts); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Read royalty info for a token. * Supports RoyaltyEngineV1 and RoyaltyRegistry by manifold.xyz. */ interface IRoyaltyPayments is IERC165 { /// @dev Emitted when the address of RoyaltyEngine is set or updated. event RoyaltyEngineUpdated(address indexed previousAddress, address indexed newAddress); /** * Get the royalty for a given token (address, id) and value amount. * * @param tokenAddress - The address of the token * @param tokenId - The id of the token * @param value - The value you wish to get the royalty of * * returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get */ function getRoyalty( address tokenAddress, uint256 tokenId, uint256 value ) external returns (address payable[] memory recipients, uint256[] memory amounts); /** * Set or override RoyaltyEngine address * * @param _royaltyEngineAddress - RoyaltyEngineV1 address */ function setRoyaltyEngine(address _royaltyEngineAddress) external; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; /// @author thirdweb interface IPluginMap { /** * @notice An interface to describe a plug-in. * * @param functionSelector 4-byte function selector. * @param functionSignature Function representation as a string. E.g. "transfer(address,address,uint256)" * @param pluginAddress Address of the contract containing the function. */ struct Plugin { bytes4 functionSelector; string functionSignature; address pluginAddress; } /// @dev Emitted when a function selector is mapped to a particular plug-in smart contract, during construction of Map. event PluginSet(bytes4 indexed functionSelector, string indexed functionSignature, address indexed pluginAddress); /// @dev Returns the plug-in contract for a given function. function getPluginForFunction(bytes4 functionSelector) external view returns (address); /// @dev Returns all functions that are mapped to the given plug-in contract. function getAllFunctionsOfPlugin(address pluginAddress) external view returns (bytes4[] memory); /// @dev Returns all plug-ins known by Map. function getAllPlugins() external view returns (Plugin[] memory); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; /// @author thirdweb import "./IPluginMap.sol"; interface IRouter is IPluginMap { /// @dev Emitted when a functionality is added, or plugged-in. event PluginAdded(bytes4 indexed functionSelector, address indexed pluginAddress); /// @dev Emitted when a functionality is updated or overridden. event PluginUpdated( bytes4 indexed functionSelector, address indexed oldPluginAddress, address indexed newPluginAddress ); /// @dev Emitted when a functionality is removed. event PluginRemoved(bytes4 indexed functionSelector, address indexed pluginAddress); /// @dev Add a new plugin to the contract. function addPlugin(Plugin memory plugin) external; /// @dev Update / override an existing plugin. function updatePlugin(Plugin memory plugin) external; /// @dev Remove an existing plugin from the contract. function removePlugin(bytes4 functionSelector) external; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../interface/plugin/IRouter.sol"; import "../Multicall.sol"; import "../../eip/ERC165.sol"; import "../../external-deps/openzeppelin/utils/EnumerableSet.sol"; /** * @author thirdweb.com */ library RouterStorage { /// @custom:storage-location erc7201:router.storage /// @dev keccak256(abi.encode(uint256(keccak256("router.storage")) - 1)) & ~bytes32(uint256(0xff)) bytes32 public constant ROUTER_STORAGE_POSITION = 0x012ef321094c8c682aa635dfdfcd754624a7473f08ad6ac415bb7f35eb12a100; struct Data { EnumerableSet.Bytes32Set allSelectors; mapping(address => EnumerableSet.Bytes32Set) selectorsForPlugin; mapping(bytes4 => IPluginMap.Plugin) pluginForSelector; } function routerStorage() internal pure returns (Data storage routerData) { bytes32 position = ROUTER_STORAGE_POSITION; assembly { routerData.slot := position } } } abstract contract Router is Multicall, ERC165, IRouter { using EnumerableSet for EnumerableSet.Bytes32Set; /*/////////////////////////////////////////////////////////////// State variables //////////////////////////////////////////////////////////////*/ address public immutable pluginMap; /*/////////////////////////////////////////////////////////////// Constructor + initializer logic //////////////////////////////////////////////////////////////*/ constructor(address _pluginMap) { pluginMap = _pluginMap; } /*/////////////////////////////////////////////////////////////// ERC 165 //////////////////////////////////////////////////////////////*/ /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IRouter).interfaceId || super.supportsInterface(interfaceId); } /*/////////////////////////////////////////////////////////////// Generic contract logic //////////////////////////////////////////////////////////////*/ fallback() external payable virtual { address _pluginAddress = _getPluginForFunction(msg.sig); if (_pluginAddress == address(0)) { _pluginAddress = IPluginMap(pluginMap).getPluginForFunction(msg.sig); } _delegate(_pluginAddress); } receive() external payable virtual {} function _delegate(address implementation) internal virtual { assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /*/////////////////////////////////////////////////////////////// External functions //////////////////////////////////////////////////////////////*/ /// @dev Add functionality to the contract. function addPlugin(Plugin memory _plugin) external { require(_canSetPlugin(), "Router: Not authorized"); _addPlugin(_plugin); } /// @dev Update or override existing functionality. function updatePlugin(Plugin memory _plugin) external { require(_canSetPlugin(), "Map: Not authorized"); _updatePlugin(_plugin); } /// @dev Remove existing functionality from the contract. function removePlugin(bytes4 _selector) external { require(_canSetPlugin(), "Map: Not authorized"); _removePlugin(_selector); } /*/////////////////////////////////////////////////////////////// View functions //////////////////////////////////////////////////////////////*/ /// @dev View address of the plugged-in functionality contract for a given function signature. function getPluginForFunction(bytes4 _selector) public view returns (address) { address pluginAddress = _getPluginForFunction(_selector); return pluginAddress != address(0) ? pluginAddress : IPluginMap(pluginMap).getPluginForFunction(_selector); } /// @dev View all funtionality as list of function signatures. function getAllFunctionsOfPlugin(address _pluginAddress) external view returns (bytes4[] memory registered) { RouterStorage.Data storage data = RouterStorage.routerStorage(); EnumerableSet.Bytes32Set storage selectorsForPlugin = data.selectorsForPlugin[_pluginAddress]; bytes4[] memory defaultSelectors = IPluginMap(pluginMap).getAllFunctionsOfPlugin(_pluginAddress); uint256 len = defaultSelectors.length; uint256 count = selectorsForPlugin.length() + defaultSelectors.length; for (uint256 i = 0; i < len; i += 1) { if (selectorsForPlugin.contains(defaultSelectors[i])) { count -= 1; defaultSelectors[i] = bytes4(0); } } registered = new bytes4[](count); uint256 index; for (uint256 i = 0; i < len; i += 1) { if (defaultSelectors[i] != bytes4(0)) { registered[index++] = defaultSelectors[i]; } } len = selectorsForPlugin.length(); for (uint256 i = 0; i < len; i += 1) { registered[index++] = bytes4(data.selectorsForPlugin[_pluginAddress].at(i)); } } /// @dev View all funtionality existing on the contract. function getAllPlugins() external view returns (Plugin[] memory registered) { RouterStorage.Data storage data = RouterStorage.routerStorage(); EnumerableSet.Bytes32Set storage overrideSelectors = data.allSelectors; Plugin[] memory defaultPlugins = IPluginMap(pluginMap).getAllPlugins(); uint256 overrideSelectorsLen = overrideSelectors.length(); uint256 defaultPluginsLen = defaultPlugins.length; uint256 totalCount = overrideSelectorsLen + defaultPluginsLen; for (uint256 i = 0; i < overrideSelectorsLen; i += 1) { for (uint256 j = 0; j < defaultPluginsLen; j += 1) { if (bytes4(overrideSelectors.at(i)) == defaultPlugins[j].functionSelector) { totalCount -= 1; defaultPlugins[j].functionSelector = bytes4(0); } } } registered = new Plugin[](totalCount); uint256 index; for (uint256 i = 0; i < defaultPluginsLen; i += 1) { if (defaultPlugins[i].functionSelector != bytes4(0)) { registered[index] = defaultPlugins[i]; index += 1; } } for (uint256 i = 0; i < overrideSelectorsLen; i += 1) { registered[index] = data.pluginForSelector[bytes4(overrideSelectors.at(i))]; index += 1; } } /*/////////////////////////////////////////////////////////////// Internal functions //////////////////////////////////////////////////////////////*/ /// @dev View address of the plugged-in functionality contract for a given function signature. function _getPluginForFunction(bytes4 _selector) public view returns (address) { RouterStorage.Data storage data = RouterStorage.routerStorage(); address _pluginAddress = data.pluginForSelector[_selector].pluginAddress; return _pluginAddress; } /// @dev Add functionality to the contract. function _addPlugin(Plugin memory _plugin) internal { RouterStorage.Data storage data = RouterStorage.routerStorage(); // Revert: default plugin exists for function; use updatePlugin instead. try IPluginMap(pluginMap).getPluginForFunction(_plugin.functionSelector) returns (address) { revert("Router: default plugin exists for function."); } catch { require(data.allSelectors.add(bytes32(_plugin.functionSelector)), "Router: plugin exists for function."); } require( _plugin.functionSelector == bytes4(keccak256(abi.encodePacked(_plugin.functionSignature))), "Router: fn selector and signature mismatch." ); data.pluginForSelector[_plugin.functionSelector] = _plugin; data.selectorsForPlugin[_plugin.pluginAddress].add(bytes32(_plugin.functionSelector)); emit PluginAdded(_plugin.functionSelector, _plugin.pluginAddress); } /// @dev Update or override existing functionality. function _updatePlugin(Plugin memory _plugin) internal { address currentPlugin = getPluginForFunction(_plugin.functionSelector); require( _plugin.functionSelector == bytes4(keccak256(abi.encodePacked(_plugin.functionSignature))), "Router: fn selector and signature mismatch." ); RouterStorage.Data storage data = RouterStorage.routerStorage(); data.allSelectors.add(bytes32(_plugin.functionSelector)); data.pluginForSelector[_plugin.functionSelector] = _plugin; data.selectorsForPlugin[currentPlugin].remove(bytes32(_plugin.functionSelector)); data.selectorsForPlugin[_plugin.pluginAddress].add(bytes32(_plugin.functionSelector)); emit PluginUpdated(_plugin.functionSelector, currentPlugin, _plugin.pluginAddress); } /// @dev Remove existing functionality from the contract. function _removePlugin(bytes4 _selector) internal { RouterStorage.Data storage data = RouterStorage.routerStorage(); address currentPlugin = _getPluginForFunction(_selector); require(currentPlugin != address(0), "Router: No plugin available for selector"); delete data.pluginForSelector[_selector]; data.allSelectors.remove(_selector); data.selectorsForPlugin[currentPlugin].remove(bytes32(_selector)); emit PluginRemoved(_selector, currentPlugin); } function _canSetPlugin() internal view virtual returns (bool); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../interface/IContractMetadata.sol"; /** * @author thirdweb.com * * @title Contract Metadata * @notice Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI * for you contract. * Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea. */ library ContractMetadataStorage { /// @custom:storage-location erc7201:contract.metadata.storage /// @dev keccak256(abi.encode(uint256(keccak256("contract.metadata.storage")) - 1)) & ~bytes32(uint256(0xff)) bytes32 public constant CONTRACT_METADATA_STORAGE_POSITION = 0x4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da900; struct Data { /// @notice Returns the contract metadata URI. string contractURI; } function data() internal pure returns (Data storage data_) { bytes32 position = CONTRACT_METADATA_STORAGE_POSITION; assembly { data_.slot := position } } } abstract contract ContractMetadata is IContractMetadata { /** * @notice Lets a contract admin set the URI for contract-level metadata. * @dev Caller should be authorized to setup contractURI, e.g. contract admin. * See {_canSetContractURI}. * Emits {ContractURIUpdated Event}. * * @param _uri keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") */ function setContractURI(string memory _uri) external override { if (!_canSetContractURI()) { revert("Not authorized"); } _setupContractURI(_uri); } /// @dev Lets a contract admin set the URI for contract-level metadata. function _setupContractURI(string memory _uri) internal { string memory prevURI = _contractMetadataStorage().contractURI; _contractMetadataStorage().contractURI = _uri; emit ContractURIUpdated(prevURI, _uri); } /// @notice Returns the contract metadata URI. function contractURI() public view virtual override returns (string memory) { return _contractMetadataStorage().contractURI; } /// @dev Returns the AccountPermissions storage. function _contractMetadataStorage() internal pure returns (ContractMetadataStorage.Data storage data) { data = ContractMetadataStorage.data(); } /// @dev Returns whether contract metadata can be set in the given execution context. function _canSetContractURI() internal view virtual returns (bool); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; import "../interface/IERC2771Context.sol"; import "./Initializable.sol"; /** * @dev Context variant with ERC2771 support. */ library ERC2771ContextStorage { /// @custom:storage-location erc7201:erc2771.context.storage /// @dev keccak256(abi.encode(uint256(keccak256("erc2771.context.storage")) - 1)) & ~bytes32(uint256(0xff)) bytes32 public constant ERC2771_CONTEXT_STORAGE_POSITION = 0x82aadcdf5bea62fd30615b6c0754b644e71b6c1e8c55b71bb927ad005b504f00; struct Data { mapping(address => bool) trustedForwarder; } function data() internal pure returns (Data storage data_) { bytes32 position = ERC2771_CONTEXT_STORAGE_POSITION; assembly { data_.slot := position } } } /** * @dev Context variant with ERC2771 support. */ abstract contract ERC2771ContextUpgradeable is Initializable { function __ERC2771Context_init(address[] memory trustedForwarder) internal onlyInitializing { __ERC2771Context_init_unchained(trustedForwarder); } function __ERC2771Context_init_unchained(address[] memory trustedForwarder) internal onlyInitializing { for (uint256 i = 0; i < trustedForwarder.length; i++) { _erc2771ContextStorage().trustedForwarder[trustedForwarder[i]] = true; } } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return _erc2771ContextStorage().trustedForwarder[forwarder]; } function _msgSender() internal view virtual returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return msg.sender; } } function _msgData() internal view virtual returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return msg.data; } } /// @dev Returns the ERC2771ContextStorage storage. function _erc2771ContextStorage() internal pure returns (ERC2771ContextStorage.Data storage data) { data = ERC2771ContextStorage.data(); } uint256[49] private __gap; }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; import "../../lib/Address.sol"; library InitStorage { /// @custom:storage-location erc7201:init.storage /// @dev keccak256(abi.encode(uint256(keccak256("init.storage")) - 1)) & ~bytes32(uint256(0xff)) bytes32 constant INIT_STORAGE_POSITION = 0x322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300; /// @dev Layout of the entrypoint contract's storage. struct Data { uint8 initialized; bool initializing; } /// @dev Returns the entrypoint contract's data at the relevant storage location. function data() internal pure returns (Data storage data_) { bytes32 position = INIT_STORAGE_POSITION; assembly { data_.slot := position } } } abstract contract Initializable { /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { uint8 _initialized = _initStorage().initialized; bool _initializing = _initStorage().initializing; bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initStorage().initialized = 1; if (isTopLevelCall) { _initStorage().initializing = true; } _; if (isTopLevelCall) { _initStorage().initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { uint8 _initialized = _initStorage().initialized; bool _initializing = _initStorage().initializing; require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initStorage().initialized = version; _initStorage().initializing = true; _; _initStorage().initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initStorage().initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { uint8 _initialized = _initStorage().initialized; bool _initializing = _initStorage().initializing; require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initStorage().initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /// @dev Returns the InitStorage storage. function _initStorage() internal pure returns (InitStorage.Data storage data) { data = InitStorage.data(); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../interface/IPermissions.sol"; import "../../lib/Strings.sol"; /** * @title Permissions * @dev This contracts provides extending-contracts with role-based access control mechanisms */ library PermissionsStorage { /// @custom:storage-location erc7201:permissions.storage /// @dev keccak256(abi.encode(uint256(keccak256("permissions.storage")) - 1)) & ~bytes32(uint256(0xff)) bytes32 public constant PERMISSIONS_STORAGE_POSITION = 0x0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e500; struct Data { /// @dev Map from keccak256 hash of a role => a map from address => whether address has role. mapping(bytes32 => mapping(address => bool)) _hasRole; /// @dev Map from keccak256 hash of a role to role admin. See {getRoleAdmin}. mapping(bytes32 => bytes32) _getRoleAdmin; } function data() internal pure returns (Data storage data_) { bytes32 position = PERMISSIONS_STORAGE_POSITION; assembly { data_.slot := position } } } contract Permissions is IPermissions { /// @dev Default admin role for all roles. Only accounts with this role can grant/revoke other roles. bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /// @dev Modifier that checks if an account has the specified role; reverts otherwise. modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @notice Checks whether an account has a particular role. * @dev Returns `true` if `account` has been granted `role`. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account for which the role is being checked. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _permissionsStorage()._hasRole[role][account]; } /** * @notice Checks whether an account has a particular role; * role restrictions can be swtiched on and off. * * @dev Returns `true` if `account` has been granted `role`. * Role restrictions can be swtiched on and off: * - If address(0) has ROLE, then the ROLE restrictions * don't apply. * - If address(0) does not have ROLE, then the ROLE * restrictions will apply. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account for which the role is being checked. */ function hasRoleWithSwitch(bytes32 role, address account) public view returns (bool) { if (!_permissionsStorage()._hasRole[role][address(0)]) { return _permissionsStorage()._hasRole[role][account]; } return true; } /** * @notice Returns the admin role that controls the specified role. * @dev See {grantRole} and {revokeRole}. * To change a role's admin, use {_setRoleAdmin}. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") */ function getRoleAdmin(bytes32 role) external view override returns (bytes32) { return _permissionsStorage()._getRoleAdmin[role]; } /** * @notice Grants a role to an account, if not previously granted. * @dev Caller must have admin role for the `role`. * Emits {RoleGranted Event}. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account to which the role is being granted. */ function grantRole(bytes32 role, address account) public virtual override { _checkRole(_permissionsStorage()._getRoleAdmin[role], _msgSender()); if (_permissionsStorage()._hasRole[role][account]) { revert("Can only grant to non holders"); } _setupRole(role, account); } /** * @notice Revokes role from an account. * @dev Caller must have admin role for the `role`. * Emits {RoleRevoked Event}. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account from which the role is being revoked. */ function revokeRole(bytes32 role, address account) public virtual override { _checkRole(_permissionsStorage()._getRoleAdmin[role], _msgSender()); _revokeRole(role, account); } /** * @notice Revokes role from the account. * @dev Caller must have the `role`, with caller being the same as `account`. * Emits {RoleRevoked Event}. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account from which the role is being revoked. */ function renounceRole(bytes32 role, address account) public virtual override { if (_msgSender() != account) { revert("Can only renounce for self"); } _revokeRole(role, account); } /// @dev Sets `adminRole` as `role`'s admin role. function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = _permissionsStorage()._getRoleAdmin[role]; _permissionsStorage()._getRoleAdmin[role] = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /// @dev Sets up `role` for `account` function _setupRole(bytes32 role, address account) internal virtual { _permissionsStorage()._hasRole[role][account] = true; emit RoleGranted(role, account, _msgSender()); } /// @dev Revokes `role` from `account` function _revokeRole(bytes32 role, address account) internal virtual { _checkRole(role, account); delete _permissionsStorage()._hasRole[role][account]; emit RoleRevoked(role, account, _msgSender()); } /// @dev Checks `role` for `account`. Reverts with a message including the required role. function _checkRole(bytes32 role, address account) internal view virtual { if (!_permissionsStorage()._hasRole[role][account]) { revert( string( abi.encodePacked( "Permissions: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /// @dev Checks `role` for `account`. Reverts with a message including the required role. function _checkRoleWithSwitch(bytes32 role, address account) internal view virtual { if (!hasRoleWithSwitch(role, account)) { revert( string( abi.encodePacked( "Permissions: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } function _msgSender() internal view virtual returns (address sender) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /// @dev Returns the Permissions storage. function _permissionsStorage() internal pure returns (PermissionsStorage.Data storage data) { data = PermissionsStorage.data(); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../interface/IPermissionsEnumerable.sol"; import "./Permissions.sol"; /** * @title PermissionsEnumerable * @dev This contracts provides extending-contracts with role-based access control mechanisms. * Also provides interfaces to view all members with a given role, and total count of members. */ library PermissionsEnumerableStorage { /// @custom:storage-location erc7201:extension.manager.storage bytes32 public constant PERMISSIONS_ENUMERABLE_STORAGE_POSITION = keccak256(abi.encode(uint256(keccak256("permissions.enumerable.storage")) - 1)) & ~bytes32(uint256(0xff)); /** * @notice A data structure to store data of members for a given role. * * @param index Current index in the list of accounts that have a role. * @param members map from index => address of account that has a role * @param indexOf map from address => index which the account has. */ struct RoleMembers { uint256 index; mapping(uint256 => address) members; mapping(address => uint256) indexOf; } struct Data { /// @dev map from keccak256 hash of a role to its members' data. See {RoleMembers}. mapping(bytes32 => RoleMembers) roleMembers; } function data() internal pure returns (Data storage data_) { bytes32 position = PERMISSIONS_ENUMERABLE_STORAGE_POSITION; assembly { data_.slot := position } } } contract PermissionsEnumerable is IPermissionsEnumerable, Permissions { /** * @notice Returns the role-member from a list of members for a role, * at a given index. * @dev Returns `member` who has `role`, at `index` of role-members list. * See struct {RoleMembers}, and mapping {roleMembers} * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param index Index in list of current members for the role. * * @return member Address of account that has `role` */ function getRoleMember(bytes32 role, uint256 index) external view override returns (address member) { uint256 currentIndex = _permissionsEnumerableStorage().roleMembers[role].index; uint256 check; for (uint256 i = 0; i < currentIndex; i += 1) { if (_permissionsEnumerableStorage().roleMembers[role].members[i] != address(0)) { if (check == index) { member = _permissionsEnumerableStorage().roleMembers[role].members[i]; return member; } check += 1; } else if ( hasRole(role, address(0)) && i == _permissionsEnumerableStorage().roleMembers[role].indexOf[address(0)] ) { check += 1; } } } /** * @notice Returns total number of accounts that have a role. * @dev Returns `count` of accounts that have `role`. * See struct {RoleMembers}, and mapping {roleMembers} * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * * @return count Total number of accounts that have `role` */ function getRoleMemberCount(bytes32 role) external view override returns (uint256 count) { uint256 currentIndex = _permissionsEnumerableStorage().roleMembers[role].index; for (uint256 i = 0; i < currentIndex; i += 1) { if (_permissionsEnumerableStorage().roleMembers[role].members[i] != address(0)) { count += 1; } } if (hasRole(role, address(0))) { count += 1; } } /// @dev Revokes `role` from `account`, and removes `account` from {roleMembers} /// See {_removeMember} function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _removeMember(role, account); } /// @dev Grants `role` to `account`, and adds `account` to {roleMembers} /// See {_addMember} function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _addMember(role, account); } /// @dev adds `account` to {roleMembers}, for `role` function _addMember(bytes32 role, address account) internal { uint256 idx = _permissionsEnumerableStorage().roleMembers[role].index; _permissionsEnumerableStorage().roleMembers[role].index += 1; _permissionsEnumerableStorage().roleMembers[role].members[idx] = account; _permissionsEnumerableStorage().roleMembers[role].indexOf[account] = idx; } /// @dev removes `account` from {roleMembers}, for `role` function _removeMember(bytes32 role, address account) internal { uint256 idx = _permissionsEnumerableStorage().roleMembers[role].indexOf[account]; delete _permissionsEnumerableStorage().roleMembers[role].members[idx]; delete _permissionsEnumerableStorage().roleMembers[role].indexOf[account]; } /// @dev Returns the PermissionsEnumerable storage. function _permissionsEnumerableStorage() internal pure returns (PermissionsEnumerableStorage.Data storage data) { data = PermissionsEnumerableStorage.data(); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../interface/IPlatformFee.sol"; /** * @author thirdweb.com */ library PlatformFeeStorage { /// @custom:storage-location erc7201:platform.fee.storage /// @dev keccak256(abi.encode(uint256(keccak256("platform.fee.storage")) - 1)) & ~bytes32(uint256(0xff)) bytes32 public constant PLATFORM_FEE_STORAGE_POSITION = 0xc0c34308b4a2f4c5ee9af8ba82541cfb3c33b076d1fd05c65f9ce7060c64c400; struct Data { /// @dev The address that receives all platform fees from all sales. address platformFeeRecipient; /// @dev The % of primary sales collected as platform fees. uint16 platformFeeBps; /// @dev Fee type variants: percentage fee and flat fee IPlatformFee.PlatformFeeType platformFeeType; /// @dev The flat amount collected by the contract as fees on primary sales. uint256 flatPlatformFee; } function data() internal pure returns (Data storage data_) { bytes32 position = PLATFORM_FEE_STORAGE_POSITION; assembly { data_.slot := position } } } /** * @author thirdweb.com * * @title Platform Fee * @notice Thirdweb's `PlatformFee` is a contract extension to be used with any base contract. It exposes functions for setting and reading * the recipient of platform fee and the platform fee basis points, and lets the inheriting contract perform conditional logic * that uses information about platform fees, if desired. */ abstract contract PlatformFee is IPlatformFee { /// @dev Returns the platform fee recipient and bps. function getPlatformFeeInfo() public view override returns (address, uint16) { return (_platformFeeStorage().platformFeeRecipient, uint16(_platformFeeStorage().platformFeeBps)); } /// @dev Returns the platform fee bps and recipient. function getFlatPlatformFeeInfo() public view returns (address, uint256) { return (_platformFeeStorage().platformFeeRecipient, _platformFeeStorage().flatPlatformFee); } /// @dev Returns the platform fee type. function getPlatformFeeType() public view returns (PlatformFeeType) { return _platformFeeStorage().platformFeeType; } /** * @notice Updates the platform fee recipient and bps. * @dev Caller should be authorized to set platform fee info. * See {_canSetPlatformFeeInfo}. * Emits {PlatformFeeInfoUpdated Event}; See {_setupPlatformFeeInfo}. * * @param _platformFeeRecipient Address to be set as new platformFeeRecipient. * @param _platformFeeBps Updated platformFeeBps. */ function setPlatformFeeInfo(address _platformFeeRecipient, uint256 _platformFeeBps) external override { if (!_canSetPlatformFeeInfo()) { revert("Not authorized"); } _setupPlatformFeeInfo(_platformFeeRecipient, _platformFeeBps); } /// @dev Lets a contract admin update the platform fee recipient and bps function _setupPlatformFeeInfo(address _platformFeeRecipient, uint256 _platformFeeBps) internal { if (_platformFeeBps > 10_000) { revert("Exceeds max bps"); } if (_platformFeeRecipient == address(0)) { revert("Invalid recipient"); } _platformFeeStorage().platformFeeBps = uint16(_platformFeeBps); _platformFeeStorage().platformFeeRecipient = _platformFeeRecipient; emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps); } /// @notice Lets a module admin set a flat fee on primary sales. function setFlatPlatformFeeInfo(address _platformFeeRecipient, uint256 _flatFee) external { if (!_canSetPlatformFeeInfo()) { revert("Not authorized"); } _setupFlatPlatformFeeInfo(_platformFeeRecipient, _flatFee); } /// @dev Sets a flat fee on primary sales. function _setupFlatPlatformFeeInfo(address _platformFeeRecipient, uint256 _flatFee) internal { _platformFeeStorage().flatPlatformFee = _flatFee; _platformFeeStorage().platformFeeRecipient = _platformFeeRecipient; emit FlatPlatformFeeUpdated(_platformFeeRecipient, _flatFee); } /// @notice Lets a module admin set platform fee type. function setPlatformFeeType(PlatformFeeType _feeType) external { if (!_canSetPlatformFeeInfo()) { revert("Not authorized"); } _setupPlatformFeeType(_feeType); } /// @dev Sets platform fee type. function _setupPlatformFeeType(PlatformFeeType _feeType) internal { _platformFeeStorage().platformFeeType = _feeType; emit PlatformFeeTypeUpdated(_feeType); } /// @dev Returns the PlatformFee storage. function _platformFeeStorage() internal pure returns (PlatformFeeStorage.Data storage data) { data = PlatformFeeStorage.data(); } /// @dev Returns whether platform fee info can be set in the given execution context. function _canSetPlatformFeeInfo() internal view virtual returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; library ReentrancyGuardStorage { /// @custom:storage-location erc7201:reentrancy.guard.storage /// @dev keccak256(abi.encode(uint256(keccak256("reentrancy.guard.storage")) - 1)) & ~bytes32(uint256(0xff)) bytes32 public constant REENTRANCY_GUARD_STORAGE_POSITION = 0x1d281c488dae143b6ea4122e80c65059929950b9c32f17fc57be22089d9c3b00; struct Data { uint256 _status; } function data() internal pure returns (Data storage data_) { bytes32 position = REENTRANCY_GUARD_STORAGE_POSITION; assembly { data_.slot := position } } } abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; constructor() { _reentrancyGuardStorage()._status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_reentrancyGuardStorage()._status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _reentrancyGuardStorage()._status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _reentrancyGuardStorage()._status = _NOT_ENTERED; } /// @dev Returns the ReentrancyGuard storage. function _reentrancyGuardStorage() internal pure returns (ReentrancyGuardStorage.Data storage data) { data = ReentrancyGuardStorage.data(); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../interface/IRoyaltyPayments.sol"; import "../interface/IRoyaltyEngineV1.sol"; import { IERC2981 } from "../../eip/interface/IERC2981.sol"; library RoyaltyPaymentsStorage { /// @custom:storage-location erc7201:royalty.payments.storage /// @dev keccak256(abi.encode(uint256(keccak256("royalty.payments.storage")) - 1)) & ~bytes32(uint256(0xff)) bytes32 public constant ROYALTY_PAYMENTS_STORAGE_POSITION = 0xc802b338f3fb784853cf3c808df5ff08335200e394ea2c687d12571a91045000; struct Data { /// @dev The address of RoyaltyEngineV1, replacing the one set during construction. address royaltyEngineAddressOverride; } function royaltyPaymentsStorage() internal pure returns (Data storage royaltyPaymentsData) { bytes32 position = ROYALTY_PAYMENTS_STORAGE_POSITION; assembly { royaltyPaymentsData.slot := position } } } /** * @author thirdweb.com * * @title Royalty Payments * @notice Thirdweb's `RoyaltyPayments` is a contract extension to be used with a marketplace contract. * It exposes functions for fetching royalty settings for a token. * It Supports RoyaltyEngineV1 and RoyaltyRegistry by manifold.xyz. */ abstract contract RoyaltyPaymentsLogic is IRoyaltyPayments { // solhint-disable-next-line var-name-mixedcase address immutable ROYALTY_ENGINE_ADDRESS; constructor(address _royaltyEngineAddress) { // allow address(0) in case RoyaltyEngineV1 not present on a network require( _royaltyEngineAddress == address(0) || IERC165(_royaltyEngineAddress).supportsInterface(type(IRoyaltyEngineV1).interfaceId), "Doesn't support IRoyaltyEngineV1 interface" ); ROYALTY_ENGINE_ADDRESS = _royaltyEngineAddress; } /** * Get the royalty for a given token (address, id) and value amount. Does not cache the bps/amounts. Caches the spec for a given token address * * @param tokenAddress - The address of the token * @param tokenId - The id of the token * @param value - The value you wish to get the royalty of * * returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get */ function getRoyalty( address tokenAddress, uint256 tokenId, uint256 value ) external returns (address payable[] memory recipients, uint256[] memory amounts) { address royaltyEngineAddress = getRoyaltyEngineAddress(); if (royaltyEngineAddress == address(0)) { try IERC2981(tokenAddress).royaltyInfo(tokenId, value) returns (address recipient, uint256 amount) { require(amount <= value, "Invalid royalty amount"); recipients = new address payable[](1); amounts = new uint256[](1); recipients[0] = payable(recipient); amounts[0] = amount; } catch {} } else { (recipients, amounts) = IRoyaltyEngineV1(royaltyEngineAddress).getRoyalty(tokenAddress, tokenId, value); } } /** * Set or override RoyaltyEngine address * * @param _royaltyEngineAddress - RoyaltyEngineV1 address */ function setRoyaltyEngine(address _royaltyEngineAddress) external { if (!_canSetRoyaltyEngine()) { revert("Not authorized"); } require( _royaltyEngineAddress != address(0) && IERC165(_royaltyEngineAddress).supportsInterface(type(IRoyaltyEngineV1).interfaceId), "Doesn't support IRoyaltyEngineV1 interface" ); _setupRoyaltyEngine(_royaltyEngineAddress); } /// @dev Returns original or overridden address for RoyaltyEngineV1 function getRoyaltyEngineAddress() public view returns (address royaltyEngineAddress) { RoyaltyPaymentsStorage.Data storage data = RoyaltyPaymentsStorage.royaltyPaymentsStorage(); address royaltyEngineOverride = data.royaltyEngineAddressOverride; royaltyEngineAddress = royaltyEngineOverride != address(0) ? royaltyEngineOverride : ROYALTY_ENGINE_ADDRESS; } /// @dev Lets a contract admin update the royalty engine address function _setupRoyaltyEngine(address _royaltyEngineAddress) internal { RoyaltyPaymentsStorage.Data storage data = RoyaltyPaymentsStorage.royaltyPaymentsStorage(); address currentAddress = data.royaltyEngineAddressOverride; data.royaltyEngineAddressOverride = _royaltyEngineAddress; emit RoyaltyEngineUpdated(currentAddress, _royaltyEngineAddress); } /// @dev Returns whether royalty engine address can be set in the given execution context. function _canSetRoyaltyEngine() internal view virtual returns (bool); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import { ReentrancyGuardStorage } from "../ReentrancyGuard.sol"; import "../Initializable.sol"; contract ReentrancyGuardInit is Initializable { uint256 private constant _NOT_ENTERED = 1; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { ReentrancyGuardStorage.Data storage data = ReentrancyGuardStorage.data(); data._status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.1; /// @author thirdweb, OpenZeppelin Contracts (v4.9.0) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * 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: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte, /// and the alphabets are capitalized conditionally according to /// https://eips.ethereum.org/EIPS/eip-55 function toHexStringChecksummed(address value) internal pure returns (string memory str) { str = toHexString(value); /// @solidity memory-safe-assembly assembly { let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...` let o := add(str, 0x22) let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... ` let t := shl(240, 136) // `0b10001000 << 240` for { let i := 0 } 1 { } { mstore(add(i, i), mul(t, byte(i, hashed))) i := add(i, 1) if eq(i, 20) { break } } mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask))))) o := add(o, 0x20) mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask))))) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. function toHexString(address value) internal pure returns (string memory str) { str = toHexStringNoPrefix(value); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hexadecimal representation of `value`. /// The output is encoded using 2 hexadecimal digits per byte. function toHexStringNoPrefix(address value) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { str := mload(0x40) // Allocate the memory. // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, // 0x02 bytes for the prefix, and 0x28 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80. mstore(0x40, add(str, 0x80)) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) str := add(str, 2) mstore(str, 40) let o := add(str, 0x20) mstore(add(o, 40), 0) value := shl(96, value) // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. for { let i := 0 } 1 { } { let p := add(o, add(i, i)) let temp := byte(i, value) mstore8(add(p, 1), mload(and(temp, 15))) mstore8(p, mload(shr(4, temp))) i := add(i, 1) if eq(i, 20) { break } } } } /// @dev Returns the hex encoded string from the raw bytes. /// The output is encoded using 2 hexadecimal digits per byte. function toHexString(bytes memory raw) internal pure returns (string memory str) { str = toHexStringNoPrefix(raw); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hex encoded string from the raw bytes. /// The output is encoded using 2 hexadecimal digits per byte. function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { let length := mload(raw) str := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix. mstore(str, add(length, length)) // Store the length of the output. // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let o := add(str, 0x20) let end := add(raw, length) for { } iszero(eq(raw, end)) { } { raw := add(raw, 1) mstore8(add(o, 1), mload(and(mload(raw), 15))) mstore8(o, mload(and(shr(4, mload(raw)), 15))) o := add(o, 2) } mstore(o, 0) // Zeroize the slot after the string. mstore(0x40, add(o, 0x20)) // Allocate the memory. } } }
{ "compilationTarget": { "contracts/prebuilts/marketplace/entrypoint/MarketplaceV3.sol": "MarketplaceV3" }, "evmVersion": "paris", "libraries": {}, "metadata": { "bytecodeHash": "ipfs" }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_pluginMap","type":"address"},{"internalType":"address","name":"_royaltyEngineAddress","type":"address"},{"internalType":"address","name":"_nativeTokenWrapper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"prevURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"platformFeeRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"flatFee","type":"uint256"}],"name":"FlatPlatformFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"platformFeeRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformFeeBps","type":"uint256"}],"name":"PlatformFeeInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum IPlatformFee.PlatformFeeType","name":"feeType","type":"uint8"}],"name":"PlatformFeeTypeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"indexed":true,"internalType":"address","name":"pluginAddress","type":"address"}],"name":"PluginAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"indexed":true,"internalType":"address","name":"pluginAddress","type":"address"}],"name":"PluginRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"indexed":true,"internalType":"string","name":"functionSignature","type":"string"},{"indexed":true,"internalType":"address","name":"pluginAddress","type":"address"}],"name":"PluginSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"indexed":true,"internalType":"address","name":"oldPluginAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newPluginAddress","type":"address"}],"name":"PluginUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"RoyaltyEngineUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"_getPluginForFunction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"internalType":"string","name":"functionSignature","type":"string"},{"internalType":"address","name":"pluginAddress","type":"address"}],"internalType":"struct IPluginMap.Plugin","name":"_plugin","type":"tuple"}],"name":"addPlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractType","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_pluginAddress","type":"address"}],"name":"getAllFunctionsOfPlugin","outputs":[{"internalType":"bytes4[]","name":"registered","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPlugins","outputs":[{"components":[{"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"internalType":"string","name":"functionSignature","type":"string"},{"internalType":"address","name":"pluginAddress","type":"address"}],"internalType":"struct IPluginMap.Plugin[]","name":"registered","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFlatPlatformFeeInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlatformFeeInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlatformFeeType","outputs":[{"internalType":"enum IPlatformFee.PlatformFeeType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"getPluginForFunction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"member","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"getRoyalty","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRoyaltyEngineAddress","outputs":[{"internalType":"address","name":"royaltyEngineAddress","type":"address"}],"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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRoleWithSwitch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_defaultAdmin","type":"address"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"address[]","name":"_trustedForwarders","type":"address[]"},{"internalType":"address","name":"_platformFeeRecipient","type":"address"},{"internalType":"uint16","name":"_platformFeeBps","type":"uint16"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pluginMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"removePlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_platformFeeRecipient","type":"address"},{"internalType":"uint256","name":"_flatFee","type":"uint256"}],"name":"setFlatPlatformFeeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_platformFeeRecipient","type":"address"},{"internalType":"uint256","name":"_platformFeeBps","type":"uint256"}],"name":"setPlatformFeeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IPlatformFee.PlatformFeeType","name":"_feeType","type":"uint8"}],"name":"setPlatformFeeType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyEngineAddress","type":"address"}],"name":"setRoyaltyEngine","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":[{"components":[{"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"internalType":"string","name":"functionSignature","type":"string"},{"internalType":"address","name":"pluginAddress","type":"address"}],"internalType":"struct IPluginMap.Plugin","name":"_plugin","type":"tuple"}],"name":"updatePlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000b559438d6f3e242191531281deae81138c5f0edef419e474ac7b2f94b82000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000009742f5ac11958cfad151ebf0fc31302fa409036e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003439153eb7af838ad19d56e1571fbd09333c2809
Deployed Bytecode
0x0004000000000002001100000000000200000000030200190000000002010019000000600420027000000a98024001970003000000210355000200000001035500000a980040019d00000001003001900000003d0000c13d0000008005000039000000400050043f000000040020008c0000009a0000413d000000000301043b000000e00430027000000aad0040009c000000e60000a13d00000aae0040009c0000018c0000a13d00000aaf0040009c0000020e0000213d00000ab60040009c000003ba0000a13d00000ab70040009c000007ac0000613d00000ab80040009c000006ee0000613d00000ab90040009c000000b30000c13d000000440020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000002402100370000000000202043b000b00000002001d00000a9b0020009c00000daa0000213d0000000401100370000000000101043b000a00000001001d000000000010043f00000af101000041000000200010043f000000400200003900000000010000192a5c2a1f0000040f000000000101041a000900000001001d2a5c29790000040f000000000201001900000009010000292a5c264c0000040f0000000a010000290000000b020000292a5c270a0000040f000000000100001900002a5d0001042e000000e004000039000000400040043f0000000003000416000000000003004b00000daa0000c13d0000001f0320003900000a9903300197000000e003300039000000400030043f0000001f0520018f00000a9a06200198000000e0036000390000004f0000613d000000000701034f000000007807043c0000000004840436000000000034004b0000004b0000c13d000000000005004b0000005c0000613d000000000161034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600020008c00000daa0000413d000000e00400043d00000a9b0040009c00000daa0000213d000001000200043d00000a9b0020009c00000daa0000213d000001200100043d000b00000001001d00000a9b0010009c00000daa0000213d000000000002004b000005b10000c13d000000800020043f000000a00040043f0000000b03000029000000c00030043f00000aa401000041000000000101041a0000ff000010019000000a300000c13d000000ff0510018f000000ff0050008c0000008d0000613d000000ff011001bf00000aa402000041000000000012041b000000ff01000039000000400200043d000000000012043500000a980020009c00000a98020080410000004001200210000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000aa7011001c70000800d02000039000000010300003900000aa8040000412a5c2a4d0000040f000000010020019000000daa0000613d000000c00300043d000000a00400043d000000800200043d0000014000000443000001600020044300000020010000390000018000100443000001a0004004430000004002000039000001c000200443000001e00030044300000100001004430000000301000039000001200010044300000aa90100004100002a5d0001042e000000000002004b000000b20000c13d00000aaa0100004100000000001004430000000001000412000000040010044300000040010000390000002400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000012e00000613d000000000101043b00000a9b011001970000000002000411000000000012004b000002580000c13d000000000100001900002a5d0001042e000000000301043b00000b1e01300197000b00000001001d000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000201100039000000000101041a00000a9b02100198000005520000c13d000000400200043d00000b2e010000410000000000120435000a00000002001d00000004012000390000000b02000029000000000021043500000aaa0100004100000000001004430000000001000412000000040010044300000020010000390000002400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000012e00000613d000000000201043b000000000100041400000a9b02200197000000040020008c000005160000c13d0000000103000031000000200030008c00000020040000390000000004034019000005410000013d00000ac80040009c000001fd0000213d00000ad50040009c000002ae0000a13d00000ad60040009c000004280000a13d00000ad70040009c000007c80000613d00000ad80040009c0000071a0000613d00000ad90040009c000000b30000c13d000000240020008c00000daa0000413d0000000003000416000000000003004b00000daa0000c13d0000000403100370000000000503043b00000a9f0050009c00000daa0000213d000000000352004900000ae40030009c00000daa0000213d000000640030008c00000daa0000413d000000e003000039000000400030043f0000000404500039000000000641034f000000000606043b00000af80060019800000daa0000c13d000000800060043f0000002004400039000000000641034f000000000606043b00000a9f0060009c00000daa0000213d00000000075600190000002305700039000000000025004b00000daa0000813d0000000406700039000000000561034f000000000505043b00000a9f0050009c00000ad80000213d0000001f0850003900000b48088001970000003f0880003900000b480880019700000b2d0080009c00000ad80000213d0000002407700039000000e008800039000000400080043f000000e00050043f0000000007750019000000000027004b00000daa0000213d0000002002600039000000000621034f00000b48075001980000001f0850018f00000100027000390000012f0000613d0000010009000039000000000a06034f00000000ab0a043c0000000009b90436000000000029004b0000012b0000c13d000000000008004b0000013c0000613d000000000676034f0000000307800210000000000802043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f000000000062043500000100025000390000000000020435000000a00030043f0000002002400039000000000121034f000000000101043b00000a9b0010009c00000daa0000213d000000c00010043f000000000100041100000a9b01100197000000000010043f00000b1201000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff00100190000002f40000613d000000800100043d00000b1e01100197000a00000001001d000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000400200043d000b00000002001d000000000101043b0000000201100039000000000101041a00090a9b0010019c0000135f0000c13d00000b2e010000410000000b02000029000000000012043500000004012000390000000a02000029000000000021043500000aaa0100004100000000001004430000000001000412000000040010044300000020010000390000002400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000012e00000613d000000000201043b000000000100041400000a9b02200197000000040020008c000015620000c13d0000000103000031000000200030008c000000200400003900000000040340190000158d0000013d00000abc0040009c0000025e0000a13d00000abd0040009c000003590000a13d00000abe0040009c000007090000613d00000abf0040009c000005d20000613d00000ac00040009c000000b30000c13d000000a40020008c00000daa0000413d0000000003000416000000000003004b00000daa0000c13d0000000403100370000000000303043b00000a9b0030009c00000daa0000213d0000002403100370000000000303043b00000a9b0030009c00000daa0000213d0000004403100370000000000303043b00000a9f0030009c00000daa0000213d0000002304300039000000000024004b00000daa0000813d0000000404300039000000000441034f000000000504043b00000a9f0050009c00000ad80000213d00000005045002100000003f0640003900000ae60660019700000af90060009c00000ad80000213d0000008006600039000000400060043f000000800050043f00000024033000390000000004340019000000000024004b00000daa0000213d000000000005004b000001c50000613d0000008005000039000000000631034f000000000606043b000000200550003900000000006504350000002003300039000000000043004b000001be0000413d0000006403100370000000000303043b00000a9f0030009c00000daa0000213d0000002304300039000000000024004b000000000500001900000ae50500804100000ae504400197000000000004004b000000000600001900000ae50600404100000ae50040009c000000000605c019000000000006004b00000daa0000c13d0000000404300039000000000441034f000000000504043b00000a9f0050009c00000ad80000213d00000005065002100000003f0460003900000ae607400197000000400400043d0000000007740019000000000047004b0000000008000039000000010800403900000a9f0070009c00000ad80000213d000000010080019000000ad80000c13d000000400070043f000000000054043500000024033000390000000006360019000000000026004b00000daa0000213d000000000005004b000001f50000613d000000000531034f000000000505043b000000200440003900000000005404350000002003300039000000000063004b000001ee0000413d0000008401100370000000000101043b00000a9f0010009c00000daa0000213d00000004011000392a5c24720000040f00000afa01000041000009920000013d00000ac90040009c000002c90000a13d00000aca0040009c0000043d0000a13d00000acb0040009c000008900000613d00000acc0040009c000007460000613d00000acd0040009c000000b30000c13d0000000001000416000000000001004b00000daa0000c13d0000000301000039000000800010043f00000aec0100004100002a5d0001042e00000ab00040009c000004110000a13d00000ab10040009c000007b30000613d00000ab20040009c000006fa0000613d00000ab30040009c000000b30000c13d000b00000005001d000000640020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000402100370000000000202043b000a00000002001d00000a9b0020009c00000daa0000213d0000004402100370000000000502043b0000002401100370000000000601043b00000ae101000041000000000101041a00000a9b021001980000023e0000c13d000800000006001d000900000005001d00000aaa010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000012e00000613d000000400200043d000b00000002001d000000000201043b000000090500002900000008060000290000000b0b0000290000002401b000390000000403b0003900000a9b0220019800000b4f0000c13d00000ae70200004100000000022b0436000800000002001d0000000000630435000900000005001d000000000051043500000000010004140000000a02000029000000040020008c00000bf40000c13d00000000060004150000000f0660008a000000050660021000000000050004150000000e0550008a00000005055002100000000103000031000000400030008c0000004004000039000000000403401900000c260000013d00000aac01000041000000000010043f0000000101000039000000040010043f00000a9e0100004100002a5e0001043000000ac30040009c000002d40000213d00000ac60040009c000005c10000613d00000ac70040009c000000b30000c13d000000440020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000002402100370000000000202043b000b00000002001d00000a9b0020009c00000daa0000213d0000000401100370000000000101043b000a00000001001d000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000cd80000c13d0000000a01000029000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000001000039000000010100c039000000010110018f000009920000013d00000adc0040009c000002fb0000213d00000adf0040009c0000061c0000613d00000ae00040009c000000b30000c13d000000840020008c00000daa0000413d0000000003000416000000000003004b00000daa0000c13d0000000403100370000000000303043b00000a9b0030009c00000daa0000213d0000002403100370000000000303043b00000a9b0030009c00000daa0000213d0000006401100370000000000101043b00000a9f0010009c00000daa0000213d00000004011000392a5c24720000040f00000b4501000041000009920000013d00000ad00040009c000003390000213d00000ad30040009c000006340000613d00000ad40040009c000000b30000c13d0000000001000416000000000001004b00000daa0000c13d2a5c250d0000040f000009910000013d00000ac40040009c000005c70000613d00000ac50040009c000000b30000c13d000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b000b00000001001d00000af80010019800000daa0000c13d000000000100041100000a9b01100197000000000010043f00000b1201000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000b5d0000c13d000000400100043d000000440210003900000b310300004100000000003204350000002402100039000000130300003900000b9b0000013d00000add0040009c0000063f0000613d00000ade0040009c000000b30000c13d000000440020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b000b00000001001d00000a9b0010009c00000daa0000213d000000000100041100000a9b01100197000a00000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a01000029000003220000613d000000140100008a00000000011000310000000201100367000000000101043b0000006001100270000000000010043f00000afc01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000a140000613d00000024010000390000000201100367000000000201043b0000000b010000292a5c26160000040f000000000100001900002a5d0001042e00000ad10040009c000006b70000613d00000ad20040009c000000b30000c13d0000000001000416000000000001004b00000daa0000c13d00000b2801000041000000800010043f00000aaa0100004100000000001004430000000001000412000000040010044300000020010000390000002400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000012e00000613d000000000201043b000000000100041400000a9b02200197000000040020008c00000ab00000c13d0000000301000367000000010600003100000abc0000013d00000ac10040009c000008a90000613d00000ac20040009c000000b30000c13d000000240020008c00000daa0000413d0000000003000416000000000003004b00000daa0000c13d0000000403100370000000000303043b000b00000003001d00000a9f0030009c00000daa0000213d0000000b030000290000002303300039000000000023004b00000daa0000813d0000000b030000290000000403300039000000000131034f000000000101043b000a00000001001d00000a9f0010009c00000daa0000213d0000000b0100002900000024041000390000000a0100002900000005011002100000000003410019000000000023004b00000daa0000213d0000003f0210003900000ae60220019700000af90020009c00000ad80000213d000700000004001d0000008002200039000000400020043f0000000a02000029000000800020043f000000000002004b0000038b0000613d00000060020000390000000003000019000000a00430003900000000002404350000002003300039000000000013004b000003860000413d000000000100041100000a9b01100197000900000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000001000411000003a50000613d000000140100008a00000000011000310000000201100367000000000101043b0000006001100270000900000001001d0000000a0000006b00000e1d0000c13d000000400100043d00000020020000390000000003210436000000800200043d0000000000230435000000400310003900000005042002100000000007340019000000000002004b000010d90000c13d000000000217004900000a980020009c00000a9802008041000000600220021000000a980010009c00000a98010080410000004001100210000000000112019f00002a5d0001042e00000aba0040009c000009850000613d00000abb0040009c000000b30000c13d000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b000900000001001d00000af301000041000000a00010043f0000002001000039000000800010043f000000c001000039000000400010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af4011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000800000001001d000000000001004b000a00000000001d00000ba60000c13d0000000901000029000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff00100190000004090000613d0000000a01000029000a00010010003e00000bee0000613d000000400100043d0000000a02000029000000000021043500000a980010009c00000a9801008041000000400110021000000aee011001c700002a5d0001042e00000ab40040009c000009990000613d00000ab50040009c000000b30000c13d0000000001000416000000000001004b00000daa0000c13d2a5c25340000040f0000002002000039000000400300043d000b00000003001d00000000022304362a5c24bb0000040f0000000b02000029000000000121004900000a980010009c00000a9801008041000000600110021000000a980020009c00000a98020080410000004002200210000000000121019f00002a5d0001042e00000ada0040009c000009a50000613d00000adb0040009c000000b30000c13d000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b000000000010043f00000af101000041000000200010043f000000400200003900000000010000192a5c2a1f0000040f000000000101041a000000800010043f00000aec0100004100002a5d0001042e00000ace0040009c000009de0000613d00000acf0040009c000000b30000c13d000000440020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000402100370000000000202043b000a00000002001d0000002401100370000000000101043b000700000001001d00000af301000041000000a00010043f0000002001000039000000800010043f000000c001000039000000400010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af4011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000800000001001d000000000001004b0000000001000019000009920000613d0000801004000039000b00000000001d000900000000001d000004790000013d00008010040000390000000b010000290000000101100039000b00000001001d000000080010006c000010840000813d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700000000020400192a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a00000a9b00100198000004bc0000613d0000000902000029000000070020006c00000000010200190000801004000039000010860000613d000900010010003e000004740000c13d00000bee0000013d0000000a01000029000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff00100190000004730000613d000000400100043d0000002002000039000000000421043600000af303000041000000000034043500000ae90010009c000080100200003900000ad80000213d0000004003100039000000400030043f00000a980040009c00000a98040080410000004003400210000000000101043300000a980010009c00000a98010080410000006001100210000000000131019f000000000300041400000a980030009c00000a9803008041000000c003300210000000000113019f00000af6011001c72a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000000043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a0000000b0010006b00008010040000390000000901000029000004740000c13d000004b90000013d0000000a0300002900000a980030009c00000a9803008041000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000a9e011001c72a5c2a520000040f0000000003010019000000600330027000000a9803300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000005300000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b0000052c0000c13d000000000006004b0000053d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000a240000613d0000001f01400039000000600210018f0000000a01200029000000000021004b0000000002000039000000010200403900000a9f0010009c00000ad80000213d000000010020019000000ad80000c13d000000400010043f000000200030008c00000daa0000413d0000000a01000029000000000201043300000a9b0020009c00000daa0000213d0000000205000367000000000100003100000b48041001980000001f0610018f0000055d0000613d000000000705034f0000000008000019000000007907043c0000000008980436000000000048004b000005590000c13d000000000006004b0000056a0000613d000000000545034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000004000414000000040020008c000005860000c13d0000000304000367000000010100003100000b48021001980000001f0310018f000005780000613d000000000504034f0000000006000019000000005705043c0000000006760436000000000026004b000005740000c13d000000000003004b000005ab0000613d000000000424034f0000000303300210000000000502043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f0000000000320435000005ab0000013d00000a980010009c00000a9801008041000000600110021000000a980040009c00000a9804008041000000c003400210000000000113019f2a5c2a570000040f0003000000010355000000000301001900000060033002700000001f0530018f00010a980030019d00000a9a043001980000059b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000005970000c13d000000000005004b000005a80000613d000000000141034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f000000000014043500000a98013001970000000100200190000005af0000613d00000a980010009c00000a9801008041000000600110021000002a5d0001042e000000600110021000002a5e00010430000a00000004001d000000400b00043d00000a9c0100004100000000001b04350000000401b0003900000a9d0300004100000000003104350000000001000414000000040020008c000900000002001d00000a440000c13d0000000103000031000000200030008c0000002004000039000000000403401900000a710000013d0000000001000416000000000001004b00000daa0000c13d000000800000043f00000aec0100004100002a5d0001042e000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b00000af80010019800000daa0000c13d2a5c256f0000040f000009910000013d000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b000b00000001001d000000010010008c00000daa0000213d000000000100041100000a9b01100197000a00000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a01000029000005f50000613d000000140100008a00000000011000310000000201100367000000000101043b0000006001100270000000000010043f00000afc01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000a140000613d0000000b04000029000000b00140021000000afd0110019700000aeb02000041000000000302041a00000afe03300197000000000113019f000000000012041b000000400100043d000000000041043500000a980010009c00000a98010080410000004001100210000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000aa7011001c70000800d02000039000000010300003900000aff0400004100000da70000013d000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000201043b00000af80020019800000daa0000c13d000000010100003900000b1e0220019700000b450020009c000006300000613d00000b460020009c000006300000613d00000a9c0020009c0000000001000039000000010100603900000b470020009c00000001011061bf000000010110018f000000800010043f00000aec0100004100002a5d0001042e000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b00000a9b0010009c00000daa0000213d2a5c24ec0000040f000008a40000013d000000240020008c00000daa0000413d0000000003000416000000000003004b00000daa0000c13d0000000403100370000000000503043b00000a9f0050009c00000daa0000213d000000000352004900000ae40030009c00000daa0000213d000000640030008c00000daa0000413d000000e003000039000000400030043f0000000404500039000000000641034f000000000606043b00000af80060019800000daa0000c13d000000800060043f0000002004400039000000000641034f000000000606043b00000a9f0060009c00000daa0000213d00000000075600190000002305700039000000000025004b00000daa0000813d0000000406700039000000000561034f000000000505043b00000a9f0050009c00000ad80000213d0000001f0850003900000b48088001970000003f0880003900000b480880019700000b2d0080009c00000ad80000213d0000002407700039000000e008800039000000400080043f000000e00050043f0000000007750019000000000027004b00000daa0000213d0000002002600039000000000621034f00000b48075001980000001f0850018f00000100027000390000067c0000613d0000010009000039000000000a06034f00000000ab0a043c0000000009b90436000000000029004b000006780000c13d000000000008004b000006890000613d000000000676034f0000000307800210000000000802043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f000000000062043500000100025000390000000000020435000000a00030043f0000002002400039000000000121034f000000000101043b00000a9b0010009c00000daa0000213d000000c00010043f000000000100041100000a9b01100197000000000010043f00000b1201000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000400200043d000a00000002001d0000000402200039000000000101043b000000000101041a000000ff00100190000012c00000c13d00000aa2010000410000000a03000029000000000013043500000020010000390000000000120435000000440130003900000b4402000041000000000021043500000024013000390000001602000039000000000021043500000a980030009c00000a9803008041000000400130021000000ae3011001c700002a5e00010430000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b000400000001001d00000a9b0010009c00000daa0000213d0000000401000029000000000010043f00000b2301000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000800000001001d000000400200043d00000b2c010000410000000000120435000b00000002001d00000004012000390000000402000029000000000021043500000aaa0100004100000000001004430000000001000412000000040010044300000020010000390000002400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000012e00000613d000000000201043b000000000100041400000a9b02200197000000040020008c00000cdb0000c13d0000000301000367000000010300003100000cec0000013d0000000001000416000000000001004b00000daa0000c13d00000aeb01000041000000000101041a00000a9b02100197000000800020043f000000a0011002700000ffff0110018f000000a00010043f00000af00100004100002a5d0001042e0000000001000416000000000001004b00000daa0000c13d00000aeb01000041000000000101041a000000b001100270000000ff0110018f000000020010008c000007b00000413d00000aac01000041000000000010043f0000002101000039000000040010043f00000a9e0100004100002a5e000104300000000001000416000000000001004b00000daa0000c13d0000000001000412001100000001001d001000200000003d000080050100003900000044030000390000000004000415000000110440008a000000050440021000000aaa020000412a5c2a340000040f00000a9b01100197000000800010043f00000aec0100004100002a5d0001042e000000440020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000002401100370000000000101043b000b00000001001d00000a9b0010009c00000daa0000213d000000000100041100000a9b01100197000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000000010004110000073c0000613d000000140100008a00000000011000310000000201100367000000000101043b00000060011002700000000b02000029000000000121013f00000a9b0010019800000b950000c13d00000004010000390000000201100367000000000101043b2a5c270a0000040f000000000100001900002a5d0001042e000000240020008c00000daa0000413d0000000003000416000000000003004b00000daa0000c13d0000000403100370000000000403043b00000a9f0040009c00000daa0000213d0000002303400039000000000023004b00000daa0000813d0000000405400039000000000351034f000000000303043b00000a9f0030009c00000ad80000213d0000001f0730003900000b48077001970000003f0770003900000b480770019700000af90070009c00000ad80000213d00000024044000390000008007700039000000400070043f000000800030043f0000000004430019000000000024004b00000daa0000213d0000002002500039000000000221034f00000b48043001980000001f0530018f000000a001400039000007700000613d000000a006000039000000000702034f000000007807043c0000000006860436000000000016004b0000076c0000c13d000000000005004b0000077d0000613d000000000242034f0000000304500210000000000501043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f0000000000210435000000a0013000390000000000010435000000000100041100000a9b01100197000b00000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff00100190000007970000613d000000140100008a00000000011000310000000201100367000000000101043b000b0060001002780000000b01000029000000000010043f00000afc01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000a140000613d00000080010000392a5c28ba0000040f000000000100001900002a5d0001042e0000000001000416000000000001004b00000daa0000c13d00000af201000041000000800010043f00000aec0100004100002a5d0001042e000000a40020008c00000daa0000413d0000000003000416000000000003004b00000daa0000c13d0000000403100370000000000303043b00000a9b0030009c00000daa0000213d0000002403100370000000000303043b00000a9b0030009c00000daa0000213d0000008401100370000000000101043b00000a9f0010009c00000daa0000213d00000004011000392a5c24720000040f00000aed01000041000009920000013d000000440020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d00000a9b0010009c00000daa0000213d0000000b01000029000000000010043f00000af101000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000000100041100000a9b01100197000800000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000801000029000007fe0000613d000000140100008a00000000011000310000000201100367000000000101043b0000006001100270000700000001001d0000000901000029000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000702000029000000000020043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000efd0000c13d000000400100043d00000b000010009c00000ad80000213d0000006004100039000000400040043f0000002a02000039000000000321043600000000020000310000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000008280000c13d000000000403043300000b340440019700000b35044001c700000000004304350000002104100039000000000504043300000b340550019700000b36055001c700000000005404350000002904000039000000070600002900000000050600190000000006010433000000000046004b000016070000a13d0000000006340019000000000706043300000b34077001970000000308500210000000780880018f00000b370880021f00000b3808800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c000008370000213d000000100050008c0000123c0000813d000000400300043d000b00000003001d00000af90030009c00000ad80000213d0000000b050000290000008004500039000000400040043f000000420300003900000000033504360000000005030019000000002602043c0000000005650436000000000045004b000008540000c13d000000000203043300000b340220019700000b35022001c700000000002304350000000b080000290000002102800039000000000402043300000b340440019700000b36044001c700000000004204350000004102000039000000090500002900000000040500190000000005080433000000000025004b000016070000a13d0000000005320019000000000605043300000b34066001970000000307400210000000780770018f00000b370770021f00000b3807700197000000000676019f00000000006504350000000405400270000000010220008a000000010020008c000008640000213d0000000f0040008c0000123c0000213d000000400400043d000a00000004001d000000200240003900000b3a03000041000000000032043500000035024000392a5c26080000040f00000b3b02000041000000000021043500000011021000390000000b010000292a5c26080000040f0000000a030000290000000002310049000000200120008a000000000013043500000000010300192a5c24600000040f00000aa201000041000000400200043d000b00000002001d000000000012043500000004012000390000000a020000290000122e0000013d000000440020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000002402100370000000000202043b000b00000002001d00000a9b0020009c00000daa0000213d0000000401100370000000000101043b000000000010043f00000af701000041000000200010043f000000400200003900000000010000192a5c2a1f0000040f0000000b020000292a5c24fd0000040f000000000101041a000000ff001001900000000001000039000000010100c039000009920000013d000000a40020008c00000daa0000413d0000000003000416000000000003004b00000daa0000c13d0000000403100370000000000303043b000800000003001d00000a9b0030009c00000daa0000213d0000002403100370000000000403043b00000a9f0040009c00000daa0000213d0000002303400039000000000023004b00000daa0000813d0000000405400039000000000351034f000000000303043b00000a9f0030009c00000ad80000213d0000001f0630003900000b48066001970000003f0660003900000b480660019700000af90060009c00000ad80000213d00000024044000390000008006600039000000400060043f000000800030043f0000000004430019000000000024004b00000daa0000213d0000002004500039000000000541034f00000b48063001980000001f0730018f000000a004600039000008d80000613d000000a008000039000000000905034f000000009a09043c0000000008a80436000000000048004b000008d40000c13d000000000007004b000008e50000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000000a00330003900000000000304350000004403100370000000000303043b00000a9f0030009c00000daa0000213d0000002304300039000000000024004b00000daa0000813d0000000404300039000000000441034f000000000404043b00000a9f0040009c00000ad80000213d00000005054002100000003f0650003900000ae606600197000000400700043d0000000006670019000a00000007001d000000000076004b0000000007000039000000010700403900000a9f0060009c00000ad80000213d000000010070019000000ad80000c13d000000400060043f0000000a060000290000000006460436000900000006001d00000024033000390000000005350019000000000025004b00000daa0000213d000000000004004b000009130000613d0000000902000029000000000431034f000000000404043b00000a9b0040009c00000daa0000213d00000000024204360000002003300039000000000053004b0000090b0000413d0000006402100370000000000202043b000700000002001d00000a9b0020009c00000daa0000213d0000008401100370000000000101043b000600000001001d0000ffff0010008c00000daa0000213d00000aa401000041000000000101041a0000ffff00100190000b00000001001d000009380000613d00000b0301000041000000000010044300000000010004100000000400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000b04011001c700008002020000392a5c2a520000040f0000000100200190000012e00000613d0000000b02000029000000ff0220018f000000000101043b000000010020008c000015e50000c13d000000000001004b000015e50000c13d00000aa401000041000000000101041a0000000b020000290000ff000020019000000b490210019700000001022001bf00000aa403000041000000000023041b000014b90000c13d00000b4a0120019700000100011001bf00000aa402000041000000000012041b000000010100003900000b0802000041000000000012041b0000000a010000290000000001010433000000000001004b000009670000613d0000000002000019000b00000002001d00000005012002100000000901100029000000000101043300000a9b01100197000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000b0200002900000001022000390000000a010000290000000001010433000000000012004b0000094b0000413d00000b0901000041000000000201041a000000010420019000000001052002700000007f0550618f0000001f0050008c00000000010000390000000101002039000000000112013f000000010010019000000dfe0000c13d000000400300043d0000000001530436000000000004004b000017090000613d00000b0902000041000000000020043f000000000005004b00000000020000190000170e0000613d00000b0a0400004100000000020000190000000006210019000000000704041a000000000076043500000001044000390000002002200039000000000052004b0000097d0000413d0000170e0000013d000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b00000af80010019800000daa0000c13d2a5c25230000040f0000000201100039000000000101041a00000a9b01100197000000400200043d000000000012043500000a980020009c00000a9802008041000000400120021000000aee011001c700002a5d0001042e0000000001000416000000000001004b00000daa0000c13d00000aef01000041000000000101041a00000aeb02000041000000000202041a00000a9b02200197000000800020043f000000a00010043f00000af00100004100002a5d0001042e000000240020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000401100370000000000101043b000b00000001001d00000a9b0010009c00000daa0000213d000000000100041100000a9b01100197000a00000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a01000029000009c80000613d000000140100008a00000000011000310000000201100367000000000101043b0000006001100270000000000010043f00000afc01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000a140000613d000000400500043d0000000b02000029000000000002004b00000e100000c13d000000000105001900000a890000013d000000440020008c00000daa0000413d0000000002000416000000000002004b00000daa0000c13d0000000402100370000000000202043b000b00000002001d00000a9b0020009c00000daa0000213d0000002401100370000000000101043b000900000001001d000000000100041100000a9b01100197000a00000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a0100002900000a040000613d000000140100008a00000000011000310000000201100367000000000101043b0000006001100270000000000010043f00000afc01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000d8e0000c13d000000400200043d000b00000002001d00000aa201000041000000000012043500000004012000392a5c24e20000040f0000000b02000029000000000121004900000a980010009c00000a9801008041000000600110021000000a980020009c00000a98020080410000004002200210000000000121019f00002a5e000104300000001f0530018f00000a9a06300198000000400200043d000000000462001900000a9d0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000a2b0000c13d00000a9d0000013d000000400100043d000000640210003900000aa5030000410000000000320435000000440210003900000aa603000041000000000032043500000024021000390000002703000039000000000032043500000aa202000041000000000021043500000004021000390000002003000039000000000032043500000a980010009c00000a9801008041000000400110021000000aa3011001c700002a5e0001043000000a9800b0009c00000a980300004100000000030b4019000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000a9e011001c700080000000b001d2a5c2a520000040f000000080b0000290000000003010019000000600330027000000a9803300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900000a600000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00000a5c0000c13d000000000006004b00000a6d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000a920000613d0000001f01400039000000600210018f00000000050b00190000000001b20019000000000021004b0000000002000039000000010200403900000a9f0010009c00000ad80000213d000000010020019000000ad80000c13d000000400010043f000000200030008c0000000a04000029000000090200002900000daa0000413d0000000005050433000000000005004b0000000003000039000000010300c039000000000035004b00000daa0000c13d000000000005004b0000006a0000c13d000000640210003900000aa0030000410000000000320435000000440210003900000aa103000041000000000032043500000024021000390000002a0300003900000a390000013d0000001f0530018f00000a9a06300198000000400200043d000000000462001900000a9d0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000a990000c13d000000000005004b00000aaa0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000600130021000000a980020009c00000a98020080410000004002200210000000000112019f00002a5e0001043000000a980010009c00000a9801008041000000c00110021000000b29011001c72a5c2a520000040f0000000003010019000000600330027000010a980030019d00000a98063001970003000000010355000000010020019000000b7b0000613d00000b48036001980000001f0460018f000000800230003900000ac60000613d0000008005000039000000000701034f000000007807043c0000000005850436000000000025004b00000ac20000c13d000000000004004b00000ad30000613d000000000131034f0000000303400210000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f00000000001204350000001f0160003900000b4801100197000900000001001d00000af90010009c00000ade0000a13d00000aac01000041000000000010043f0000004101000039000000040010043f00000a9e0100004100002a5e0001043000000009010000290000008001100039000500000001001d000000400010043f00000ae40060009c00000daa0000213d000000200060008c00000daa0000413d000000800300043d00000a9f0030009c00000daa0000213d00000080046000390000009f02300039000000000042004b000000000700001900000ae50700804100000ae50540019700000ae502200197000000000852013f000000000052004b000000000200001900000ae50200404100000ae50080009c000000000207c019000000000002004b00000daa0000c13d0000008001300039000b00000001001d000000000201043300000a9f0020009c00000ad80000213d00000005072002100000003f0870003900000ae608800197000000050880002900000a9f0080009c00000ad80000213d000000400080043f00000005010000290000000000210435000000a008300039000a00000087001d0000000a0040006b00000daa0000213d000000000002004b0000000003000019000012680000c13d00000b2102000041000000000102041a000800000001001d000000000031001a00000bee0000413d0000000804300029000000080000006b00000b170000613d000000000003004b000013110000c13d00000a9f0040009c00000ad80000213d00000005054002100000003f0150003900000ae601100197000000400600043d0000000002160019000600000006001d000000000062004b0000000006000039000000010600403900000a9f0020009c00000ad80000213d000000010060019000000ad80000c13d000000400020043f00000006010000290000000008410436000000000004004b00000b3c0000613d00000060020000390000000004000019000000400600043d00000b000060009c00000ad80000213d0000006001600039000000400010043f00000020016000390000000000210435000000400160003900000000000104350000000000060435000000000148001900000000006104350000002004400039000000000054004b00000b2d0000413d000000000003004b000000000900001900000005060000290000000607000029000014c50000c13d000000080000006b000014e10000c13d000000400100043d0000002002000039000000000321043600000000020704330000000000230435000000400310003900000005042002100000000004340019000000000002004b0000160d0000c13d0000000002140049000003b20000013d00000ae20400004100000000044b0436000900000004001d0000000a04000029000000000043043500000000006104350000004401b0003900000000005104350000000001000414000000040020008c00000c450000c13d0000000301000367000000010300003100000c570000013d0000000b0100002900000b1e01100197000b00000001001d000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000201100039000000000101041a000a0a9b0010019c00000de10000c13d000000400100043d000000640210003900000b25030000410000000000320435000000440210003900000b260300004100000000003204350000002402100039000000280300003900000a390000013d0000001f0460018f00000a9a05600198000000400200043d000000000352001900000b860000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000b820000c13d000000000004004b00000b930000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600160021000000aab0000013d000000400100043d000000440210003900000b3203000041000000000032043500000024021000390000001a03000039000000000032043500000aa202000041000000000021043500000004021000390000002003000039000000000032043500000a980010009c00000a9801008041000000400110021000000ae3011001c700002a5e000104300000801004000039000a00000000001d000b00000000001d00000baf0000013d0000000b020000290000000102200039000b00000002001d000000080020006c000003e90000813d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700000000020400192a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d0000801004000039000000000101043b000000000101041a00000a9b0010019800000baa0000613d0000000a01000029000a00010010003e00000baa0000c13d00000aac01000041000000000010043f0000001101000039000000040010043f00000a9e0100004100002a5e0001043000000a9800b0009c00000a980300004100000000030b4019000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000ae8011001c72a5c2a520000040f0000000b0b0000290000000003010019000000600330027000000a9803300197000000400030008c000000400400003900000000040340190000001f0640018f000000600740019000000000057b001900000c0f0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00000c0b0000c13d000000000006004b00000c1c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000000060004150000000d0660008a000000050660021000000000050004150000000c0550008a0000000505500210000000010020019000000dac0000613d0000001f01400039000000e00210018f0000000001b20019000000000021004b0000000002000039000000010200403900000a9f0010009c00000ad80000213d000000010020019000000ad80000c13d000000400010043f000000400030008c00000daa0000413d0000000b02000029000000000402043300000a9b0040009c00000daa0000213d000000080200002900000000030204330000000502600270000000000204001f0000000502500270000000000203001f000000090030006c000010bf0000a13d000000440210003900000aea0300004100000000003204350000002402100039000000160300003900000b9b0000013d00000a9800b0009c00000a980300004100000000030b4019000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000ae3011001c72a5c2a4d0000040f0000000003010019000000600330027000010a980030019d00000a98033001970003000000010355000000010020019000000dd50000613d0000000b0b00002900000b48053001980000001f0630018f00000000045b001900000c610000613d000000000701034f00000000080b0019000000007907043c0000000008980436000000000048004b00000c5d0000c13d000000000006004b00000c6e0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f0130003900000b48021001970000000001b20019000000000021004b0000000002000039000000010200403900000a9f0010009c00000ad80000213d000000010020019000000ad80000c13d000000400010043f00000ae40030009c00000daa0000213d000000400030008c00000daa0000413d0000000b02000029000000000202043300000a9f0020009c00000daa0000213d0000000b033000290000000b042000290000001f02400039000000000032004b000000000500001900000ae50500804100000ae50620019700000ae502300197000000000726013f000000000026004b000000000600001900000ae50600404100000ae50070009c000000000605c019000000000006004b00000daa0000c13d000000004504043400000a9f0050009c00000ad80000213d00000005065002100000003f0760003900000ae607700197000000000717001900000a9f0070009c00000ad80000213d000000400070043f00000000005104350000000005460019000000000035004b00000daa0000213d000000000054004b00000ca90000813d0000000006010019000000004704043400000a9b0070009c00000daa0000213d00000020066000390000000000760435000000000054004b00000ca20000413d0000000904000029000000000404043300000a9f0040009c00000daa0000213d0000000b044000290000001f05400039000000000035004b000000000600001900000ae50600804100000ae505500197000000000725013f000000000025004b000000000200001900000ae50200404100000ae50070009c000000000206c019000000000002004b00000daa0000c13d000000004504043400000a9f0050009c00000ad80000213d00000005065002100000003f0260003900000ae607200197000000400200043d0000000007720019000000000027004b0000000008000039000000010800403900000a9f0070009c00000ad80000213d000000010080019000000ad80000c13d000000400070043f00000000005204350000000005460019000000000035004b00000daa0000213d000000000054004b00000dae0000813d0000000003020019000000200330003900000000460404340000000000630435000000000054004b00000cd20000413d00000dae0000013d0000000101000039000000010110018f000009920000013d0000000b0300002900000a980030009c00000a9803008041000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000a9e011001c72a5c2a520000040f0000000003010019000000600330027000010a980030019d00000a98033001970003000000010355000000010020019000000e040000613d00000b48053001980000001f0630018f0000000b0450002900000cf60000613d000000000701034f0000000b08000029000000007907043c0000000008980436000000000048004b00000cf20000c13d000000000006004b00000d030000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f0130003900000b48011001970000000b02100029000000000012004b00000000010000390000000101004039000900000002001d00000a9f0020009c00000ad80000213d000000010010019000000ad80000c13d0000000901000029000000400010043f00000ae40030009c00000daa0000213d000000200030008c00000daa0000413d0000000b01000029000000000101043300000a9f0010009c00000daa0000213d0000000b023000290000000b011000290000001f03100039000000000023004b000000000400001900000ae50400804100000ae50330019700000ae505200197000000000653013f000000000053004b000000000300001900000ae50300404100000ae50060009c000000000304c019000000000003004b00000daa0000c13d0000000013010434000700000003001d00000a9f0030009c00000ad80000213d000000070300002900000005033002100000003f0430003900000ae604400197000000090440002900000a9f0040009c00000ad80000213d000000400040043f000000090400002900000007050000290000000004540436000600000004001d0000000003130019000000000023004b00000daa0000213d000000000031004b00000d480000813d0000000902000029000000001401043400000af80040019800000daa0000c13d00000020022000390000000000420435000000000031004b00000d3e0000413d00000009010000290000000001010433000700000001001d0000000801000029000000000101041a000300000001001d000000070010002a00000bee0000413d0000000702000029000a00030020002d000000000002004b000013310000c13d0000000a0100002900000a9f0010009c00000ad80000213d0000000a0100002900000005011002100000003f0210003900000ae602200197000000400300043d0000000002230019000800000003001d000000000032004b0000000003000039000000010300403900000a9f0020009c00000ad80000213d000000010030019000000ad80000c13d000000400020043f00000008020000290000000a030000290000000002320436000a00000002001d0000001f0210018f000000000001004b00000d720000613d0000000a04000029000000000114001900000000030000310000000203300367000000003503043c0000000004540436000000000014004b00000d6e0000c13d000000000002004b000000070000006b00000000070000190000000805000029000015ef0000c13d000900000007001d000000030000006b000016d80000c13d000000400100043d000000200200003900000000022104360000000803000029000000000303043300000000003204350000004002100039000000000003004b00000d8c0000613d000000000400001900000008060000290000002006600039000000000506043300000b1e0550019700000000025204360000000104400039000000000034004b00000d850000413d0000000002120049000003b20000013d00000aef010000410000000904000029000000000041041b00000aeb01000041000000000201041a00000b11022001970000000b03000029000000000232019f000000000021041b000000400100043d00000020021000390000000000420435000000000031043500000a980010009c00000a98010080410000004001100210000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af5011001c70000800d02000039000000010300003900000b27040000412a5c2a4d0000040f0000000100200190000000b00000c13d000000000100001900002a5e0001043000000060010000390000000002010019000000400300043d000000400400003900000000044304360000000006010433000000400530003900000000006504350000006005300039000000000006004b00000dbf0000613d00000000070000190000002001100039000000000801043300000a9b0880019700000000058504360000000107700039000000000067004b00000db80000413d0000000001350049000000000014043500000000040204330000000001450436000000000004004b00000dcc0000613d00000000050000190000002002200039000000000602043300000000016104360000000105500039000000000045004b00000dc60000413d000000000131004900000a980010009c00000a9801008041000000600110021000000a980030009c00000a98030080410000004002300210000000000121019f00002a5d0001042e0000001f0530018f00000a9a06300198000000400200043d000000000462001900000a9d0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000ddc0000c13d00000a9d0000013d0000000b01000029000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000001041b000800000001001d0000000101100039000700000001001d000000000101041a000000010010019000000001021002700000007f0220618f000900000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000010f60000613d00000aac01000041000000000010043f0000002201000039000000040010043f00000a9e0100004100002a5e000104300000001f0530018f00000a9a06300198000000400200043d000000000462001900000a9d0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e0b0000c13d00000a9d0000013d00000a9c010000410000000000150435000000040150003900000a9d0300004100000000003104350000000001000414000000040020008c000010300000c13d0000000103000031000000200030008c000000200400003900000000040340190000105e0000013d0000000002000411000000090020006c000011470000c13d000000200b00008a000000000d000019000000070a000029000000050ed002100000000001ae00190000000203000367000000000113034f000000000101043b00000000050000310000000b0250006a000000430220008a00000ae50420019700000ae506100197000000000746013f000000000046004b000000000400001900000ae504004041000000000021004b000000000200001900000ae50200804100000ae50070009c000000000402c019000000000004004b00000daa0000c13d0000000002a10019000000000123034f000000000101043b00000a9f0010009c00000daa0000213d0000000004150049000000200620003900000ae50240019700000ae507600197000000000827013f000000000027004b000000000200001900000ae502004041000000000046004b000000000400001900000ae50400204100000ae50080009c000000000204c019000000000002004b00000daa0000c13d0000001f021000390000000002b2016f0000003f022000390000000004b2016f000000400200043d0000000004420019000000000024004b0000000007000039000000010700403900000a9f0040009c00000ad80000213d000000010070019000000ad80000c13d000000400040043f00000000041204360000000007610019000000000057004b00000daa0000213d000000000563034f0000000006b10170000000000364001900000e680000613d000000000705034f0000000008040019000000007907043c0000000008980436000000000038004b00000e640000c13d0000001f0710019000000e750000613d000000000565034f0000000306700210000000000703043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000053043500000000011400190000000000010435000000400f00043d00000b0000f0009c00000ad80000213d0000006001f00039000000400010043f0000004001f0003900000b010300004100000000003104350000002001f0003900000b02030000410000000000310435000000270100003900000000001f0435000000000202043300000000010004140000000003000410000000040030008c00000e8c0000c13d0000000103000031000000010200003900000ea60000013d00000a980040009c00000a9804008041000000400340021000000a980020009c00000a98020080410000006002200210000000000232019f00000a980010009c00000a9801008041000000c001100210000000000112019f000000000200041000090000000d001d00080000000e001d00060000000f001d2a5c2a570000040f000000060f000029000000080e000029000000090d000029000000200b00008a000000070a000029000000010220018f0003000000010355000000600110027000010a980010019d00000a9803100197000000000003004b0000008001000039000000600400003900000ed40000613d00000a9f0030009c00000ad80000213d0000001f013000390000000001b1016f0000003f011000390000000001b1016f000000400500043d0000000001150019000000000051004b0000000004000039000000010400403900000a9f0010009c00000ad80000213d000000010040019000000ad80000c13d000000400010043f000000000c05001900000000013504360000000005b301700000000004510019000000030600036700000ec60000613d000000000706034f0000000008010019000000007907043c0000000008980436000000000048004b00000ec20000c13d0000001f0330019000000ed30000613d000000000556034f0000000303300210000000000604043300000000063601cf000000000636022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000363019f000000000034043500000000040c00190000000003040433000000000002004b000012260000613d000000000003004b00000ef10000c13d000600000004001d00080000000e001d00090000000d001d00000b0301000041000000000010044300000000010004100000000400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000b04011001c700008002020000392a5c2a520000040f0000000100200190000012e00000613d000000000101043b000000000001004b000000070a000029000000200b00008a000000090d000029000000080e0000290000000604000029000012e90000613d000000800100043d0000000000d1004b000016070000a13d000000a001e000390000000000410435000000800100043d0000000000d1004b000016070000a13d000000010dd000390000000a00d0006c00000e230000413d000003a70000013d0000000b01000029000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff00100190000012470000c13d0000000b01000029000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000801000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000000f500000613d000000140100008a00000000011000310000000201100367000000000101043b0008006000100278000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b10040000410000000b050000290000000a0600002900000008070000292a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b11022001970000000a022001af000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b000000000100001900002a5d0001042e00000a980050009c00000a98030000410000000003054019000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000a9e011001c7000a00000005001d2a5c2a520000040f0000000003010019000000600330027000000a9803300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a0b0000290000000a057000290000104c0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000010480000c13d000000000006004b000010590000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000012300000613d00000000050b00190000001f01400039000000600210018f00000000040500190000000001520019000000000021004b0000000002000039000000010200403900000a9f0010009c00000ad80000213d000000010020019000000ad80000c13d000000400010043f000000200030008c00000daa0000413d0000000002040433000000000002004b0000000003000039000000010300c039000000000032004b00000daa0000c13d000000000002004b00000a890000613d00000ae101000041000000000201041a00000b11032001970000000b06000029000000000363019f000000000031041b000000000100041400000a9b0520019700000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000030300003900000b3c0400004100000da70000013d0000000001000019000009920000013d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000009900000013d00000ae90010009c00000ad80000213d0000004002100039000000400020043f0000000106000039000000000561043600000000020000310000000202200367000000000702043b0000000000750435000000400200043d00000ae90020009c00000ad80000213d0000004008200039000000400080043f000000000662043600000000007604350000000007010433000000000007004b000016070000613d00000000004504350000000004020433000000000004004b000016070000613d000000000036043500000dae0000013d00000080040000390000000006000019000010e40000013d0000001f0980003900000b48099001970000000008780019000000000008043500000000077900190000000106600039000000000026004b000003b10000813d0000000008170049000000400880008a00000000038304360000002004400039000000000804043300000000980804340000000007870436000000000008004b000010dc0000613d000000000a000019000000000b7a0019000000000ca90019000000000c0c04330000000000cb0435000000200aa0003900000000008a004b000010ee0000413d000010dc0000013d000000090000006b000011170000613d00000009010000290000001f0010008c000011150000a13d0000000701000029000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000009020000290000001f02200039000000050220027000000000022100190000000103100039000000000023004b000011120000813d000000000003041b0000000103300039000000000023004b0000110e0000413d0000000702000029000000000002041b000700000001001d0000000701000029000000000001041b00000008010000290000000201100039000000000001041b0000000b01000029000000000010043f00000b2001000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000000001004b0000124b0000c13d0000000a01000029000000000010043f00000b2301000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b020000292a5c29940000040f000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000030300003900000b24040000410000000b050000290000000a0600002900000da70000013d0006006000100218000000200b00008a000000000d000019000000070a000029000000050ed002100000000002ae00190000000201000367000000000221034f000000000302043b00000000020000310000000b0420006a000000430440008a00000ae50540019700000ae506300197000000000756013f000000000056004b000000000500001900000ae505002041000000000043004b000000000400001900000ae50400404100000ae50070009c000000000504c019000000000005004b00000daa0000613d0000000004a30019000000000341034f000000000303043b00000a9f0030009c00000daa0000213d0000000005320049000000200240003900000ae50450019700000ae506200197000000000746013f000000000046004b000000000400001900000ae504004041000000000052004b000000000500001900000ae50500204100000ae50070009c000000000405c019000000000004004b00000daa0000c13d000000000521034f0000000006b30170000000400200043d00000020012000390000000004610019000011800000613d000000000705034f0000000008010019000000007907043c0000000008980436000000000048004b0000117c0000c13d0000001f073001900000118d0000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000004310019000000060500002900000000005404350000001404300039000000000042043500000053033000390000000003b3016f000000000f32001900000000002f004b0000000003000039000000010300403900000a9f00f0009c00000ad80000213d000000010030019000000ad80000c13d0000004000f0043f00000b0000f0009c00000ad80000213d0000006003f00039000000400030043f0000004003f0003900000b010400004100000000004304350000002003f0003900000b02040000410000000000430435000000270300003900000000003f0435000000000302043300000000020004140000000004000410000000040040008c000011b10000c13d00000001030000310000000102000039000011cb0000013d00000a980010009c00000a9801008041000000400110021000000a980030009c00000a98030080410000006003300210000000000113019f00000a980020009c00000a9802008041000000c002200210000000000121019f000000000200041000090000000d001d00080000000e001d00050000000f001d2a5c2a570000040f000000050f000029000000080e000029000000090d000029000000200b00008a000000070a000029000000010220018f0003000000010355000000600110027000010a980010019d00000a9803100197000000000003004b00000080010000390000006004000039000011f90000613d00000a9f0030009c00000ad80000213d0000001f013000390000000001b1016f0000003f011000390000000001b1016f000000400500043d0000000001150019000000000051004b0000000004000039000000010400403900000a9f0010009c00000ad80000213d000000010040019000000ad80000c13d000000400010043f000000000c05001900000000013504360000000005b3017000000000045100190000000306000367000011eb0000613d000000000706034f0000000008010019000000007907043c0000000008980436000000000048004b000011e70000c13d0000001f03300190000012220000613d000000000556034f0000000303300210000000000604043300000000063601cf000000000636022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000363019f000000000034043500000000040c00190000000003040433000000000002004b000012260000613d000000000003004b000012160000c13d000500000004001d00080000000e001d00090000000d001d00000b0301000041000000000010044300000000010004100000000400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000b04011001c700008002020000392a5c2a520000040f0000000100200190000012e00000613d000000000101043b000000000001004b000000070a000029000000200b00008a000000090d000029000000080e0000290000000504000029000012e90000613d000000800100043d0000000000d1004b000016070000a13d000000a001e000390000000000410435000000800100043d0000000000d1004b000016070000a13d000000010dd000390000000a00d0006c0000114b0000413d000003a70000013d00000000040c00190000000003040433000000000002004b000011fc0000c13d00000000020f0019000000000003004b000012e10000c13d000000400300043d000b00000003001d00000aa201000041000000000013043500000004013000392a5c24cd0000040f00000a1a0000013d0000001f0530018f00000a9a06300198000000400200043d000000000462001900000a9d0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000012370000c13d00000a9d0000013d000000400100043d000000440210003900000b3903000041000000000032043500000aa2020000410000000000210435000000240210003900000020030000390000000000320435000000040210003900000ba00000013d000000400100043d000000440210003900000b3303000041000012ec0000013d00000b2101000041000000000201041a000000000002004b00000bee0000613d0000000903000029000000010130008a000000000032004b000012f00000c13d000000090200002900000b220220009a000000000002041b00000b2102000041000000000012041b0000000b01000029000000000010043f00000b2001000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000001041b0000112c0000013d00000060036000390000000506000029000000008208043400000a9f0020009c00000daa0000213d0000000b0a2000290000000002a3004900000ae40020009c00000daa0000213d000000600020008c00000daa0000413d000000400b00043d00000b0000b0009c00000ad80000213d0000006002b00039000000400020043f0000002002a00039000000000202043300000af80020019800000daa0000c13d000000000c2b04360000004002a00039000000000202043300000a9f0020009c00000daa0000213d000000000fa200190000003f02f00039000000000042004b000000000700001900000ae50700804100000ae502200197000000000d52013f000000000052004b000000000200001900000ae50200404100000ae500d0009c000000000207c019000000000002004b00000daa0000c13d0000002002f00039000000000d02043300000a9f00d0009c00000ad80000213d0000001f02d0003900000b48022001970000003f0220003900000b4802200197000000400e00043d00000000022e00190000000000e2004b0000000007000039000000010700403900000a9f0020009c00000ad80000213d000000010070019000000ad80000c13d000000400020043f0000000002de0436000000400ff000390000000007fd0019000000000047004b00000daa0000213d00000000000d004b000012b00000613d000000000700001900000000012700190000000009f700190000000009090433000000000091043500000020077000390000000000d7004b000012a90000413d0000000001d2001900000000000104350000000000ec04350000006001a00039000000000201043300000a9b0020009c00000daa0000213d00000020066000390000004001b0003900000000002104350000000000b604350000000a0080006c0000126a0000413d0000000501000029000000000301043300000b0d0000013d000000800100043d00000b2e030000410000000a04000029000000000034043500000b1e01100197000000000012043500000aaa010000410000000000100443000000000100041200000004001004430000002001000039000b00000001001d0000002400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000012e00000613d000000000201043b000000000100041400000a9b02200197000000040020008c0000139c0000c13d0000000103000031000000200030008c00000020040000390000000004034019000013c70000013d000000000001042f00000a980010009c00000a9801008041000000400110021000000a980030009c00000a98030080410000006002300210000000000112019f00002a5e00010430000000400100043d000000440210003900000b0503000041000000000032043500000024021000390000001d0300003900000b9b0000013d000000000012004b000016070000a13d000000090100002900000b220110009a00000b220220009a000000000202041a000000000021041b000000000020043f00000b2001000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b00000b2101000041000000000101041a000900000001001d000000000001004b000015e20000c13d00000aac01000041000000000010043f0000003101000039000000040010043f00000a9e0100004100002a5e000104300000000901000029000000a00510003900000b2106000041000000000700001900000005010000290000131a0000013d0000000107700039000000080070006c00000b170000813d00000b2a0870009a0000000009000019000013200000013d0000000109900039000000000039004b000013170000813d000000000060043f0000000002010433000000000092004b000016070000a13d000000050290021000000000022500190000000002020433000000000a08041a000000000b020433000000000aab013f00000af800a0009c0000131d0000213d000000000004004b00000bee0000613d0000000000020435000000010440008a0000131d0000013d0000000801000029000500010010003d0000000002000019000013390000013d0000000b020000290000000102200039000000070020006c00000d510000813d00000009010000290000000001010433000000000021004b000016070000a13d000b00000002001d00000005012002100000000601100029000800000001001d000000000101043300000b1e01100197000000000010043f0000000501000029000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000000001004b000013350000613d0000000a0000006b0000000b0200002900000bee0000613d00000009010000290000000001010433000000000021004b000016070000a13d000000080100002900000000000104350000000a01000029000a000100100092000013360000013d0000000b01000029000000800200043d000b00000002001d000000a00300043d00000020021000390000000043030434000000000003004b0000136f0000613d000000000500001900000000062500190000000007540019000000000707043300000000007604350000002005500039000000000035004b000013680000413d000000000323001900000000000304350000000003130049000000200430008a00000000004104350000001f0330003900000b48043001970000000003140019000000000043004b0000000004000039000000010400403900000a9f0030009c00000ad80000213d000000010040019000000ad80000c13d000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b0110014f00000af80010009c000016370000a13d000000400100043d000000640210003900000b40030000410000000000320435000000440210003900000b4103000041000014c10000013d0000000a0300002900000a980030009c00000a9803008041000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000a9e011001c72a5c2a520000040f0000000003010019000000600330027000000a9803300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a05700029000013b60000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000013b20000c13d000000000006004b000013c30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000013de0000613d0000001f01400039000000600210018f0000000a01200029000000000021004b0000000002000039000000010200403900000a9f0010009c00000ad80000213d000000010020019000000ad80000c13d000000400010043f000000200030008c00000daa0000413d0000000a02000029000000000202043300000a9b0020009c00000daa0000213d000000640210003900000b42030000410000000000320435000000440210003900000b4303000041000014c10000013d000000800100043d00000b1e01100197000a00000001001d000000000010043f00000b2001000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000000001004b000016c20000c13d00000b2101000041000000000201041a00000a9f0020009c00000ad80000213d0000000103200039000000000031041b00000b2a0220009a0000000a03000029000000000032041b000000000101041a000900000001001d000000000030043f00000b2001000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b000000800100043d000a00000001001d000000a00300043d000000400100043d00000020021000390000000043030434000000000003004b0000141b0000613d000000000500001900000000062500190000000007540019000000000707043300000000007604350000002005500039000000000035004b000014140000413d000000000323001900000000000304350000000003130049000000200430008a00000000004104350000001f0330003900000b48043001970000000003140019000000000043004b0000000004000039000000010400403900000a9f0030009c00000ad80000213d000000010040019000000ad80000c13d000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a0110014f00000b2b0010009c000013950000813d000000800100043d00000b1e01100197000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000800200043d000000e002200270000000000301043b000000000103041a00000b2f01100197000000000121019f000900000003001d000000000013041b000000a00100043d000a00000001001d0000000021010434000700000002001d000800000001001d00000a9f0010009c00000ad80000213d00000009010000290000000101100039000600000001001d000000000101041a000000010210019000000001011002700000007f0110618f000500000001001d0000001f0010008c00000000010000390000000101002039000000000012004b00000dfe0000c13d0000000501000029000000200010008c0000148a0000413d0000000601000029000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d00000008030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000005010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b0000148a0000813d000000000002041b0000000102200039000000000012004b000014860000413d0000000801000029000000200010008c000023b70000413d0000000601000029000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000200200008a0000000802200180000000000101043b000014a90000613d000000010320008a00000005033002700000000003310019000b00200000003d00000001033000390000000b050000290000000a045000290000000004040433000000000041041b000b00200050003d0000000101100039000000000031004b000014a10000c13d000000080020006c000014b50000813d00000008020000290000000302200210000000f80220018f00000b4b0220027f00000b4b022001670000000a040000290000000b034000290000000003030433000000000223016f000000000021041b0000000801000029000000010110021000000001011001bf000023c30000013d0000ff0000100190000015a00000c13d000000400100043d000000640210003900000b1a030000410000000000320435000000440210003900000b1b03000041000000000032043500000024021000390000002b0300003900000a390000013d0000000901000029000000a00210003900000000040000190000000009000019000014cd0000013d0000000104400039000000000034004b00000b410000813d0000000001060433000000000041004b000016070000a13d000000050140021000000000011200190000000005010433000000000105043300000b2b0010009c000014ca0000413d0000000001070433000000000091004b000016070000a13d0000000501900210000000000118001900000000005104350000000001070433000000000091004b000016070000a13d0000000109900039000014ca0000013d0000000002000019000700000008001d00000b2101000041000000000101041a000000000021004b000016070000a13d000b00000009001d000a00000002001d00000b2a0120009a000000000101041a00000b1e01100197000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000601043b000000400500043d00000b000050009c000000070800002900000ad80000213d0000006001500039000000400010043f000000000106041a000000e00110021000000000071504360000000101600039000000000201041a0000000103200190000000010a2002700000007f0aa0618f0000001f00a0008c00000000040000390000000104002039000000000442013f000000010040019000000dfe0000c13d000000400900043d0000000004a90436000000000003004b000900000007001d000015330000613d000100000004001d00020000000a001d000300000009001d000400000006001d000500000005001d000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d0000000207000029000000000007004b000015390000613d000000000201043b00000000010000190000000708000029000000050500002900000004060000290000000309000029000000010a00002900000000031a0019000000000402041a000000000043043500000001022000390000002001100039000000000071004b0000152b0000413d0000153e0000013d00000b4901200197000000000014043500000000000a004b000000200100003900000000010060390000153e0000013d000000000100001900000007080000290000000505000029000000040600002900000003090000290000003f0110003900000b480210019700000000030900190000000001920019000000000021004b0000000002000039000000010200403900000a9f0010009c00000ad80000213d000000010020019000000ad80000c13d000000400010043f0000000901000029000000000031043500000040015000390000000202600039000000000202041a00000a9b022001970000000000210435000000060700002900000000010704330000000b09000029000000000091004b0000000a02000029000016070000a13d0000000501900210000000000118001900000000005104350000000001070433000000000091004b000016070000a13d00000001099000390000000102200039000000080020006c000014e30000413d00000b430000013d0000000b0300002900000a980030009c00000a9803008041000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000a9e011001c72a5c2a520000040f0000000003010019000000600330027000000a9803300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000157c0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000015780000c13d000000000006004b000015890000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000016cc0000613d0000001f01400039000000600210018f0000000b01200029000000000021004b0000000002000039000000010200403900000a9f0010009c00000ad80000213d000000010020019000000ad80000c13d000000400010043f000000200030008c00000daa0000413d0000000b020000290000000002020433000900000002001d00000a9b0020009c000013600000a13d00000daa0000013d000000010100003900000b0802000041000000000012041b0000000a010000290000000001010433000000000001004b000015c40000613d0000000002000019000b00000002001d00000005012002100000000901100029000000000101043300000a9b01100197000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000b0200002900000001022000390000000a010000290000000001010433000000000012004b000015a80000413d00000b0901000041000000000201041a000000010420019000000001052002700000007f0550618f0000001f0050008c00000000010000390000000101002039000000000112013f000000010010019000000dfe0000c13d000000400300043d0000000001530436000000000004004b000017370000613d00000b0902000041000000000020043f000000000005004b00000000020000190000173c0000613d00000b0a0400004100000000020000190000000006210019000000000704041a000000000076043500000001044000390000002002200039000000000052004b000015da0000413d0000173c0000013d0000000901000029000000010110008a000012530000013d000000400100043d000000640210003900000b06030000410000000000320435000000440210003900000b0703000041000000000032043500000024021000390000002e0300003900000a390000013d00000000020000190000000007000019000015f90000013d00000005047002100000000a04400029000000000034043500000001077000390000000102200039000000070020006c00000d770000813d00000009030000290000000003030433000000000023004b000016070000a13d00000005032002100000000603300029000000000303043300000b1e03300198000015f60000613d00000b4b0070009c00000bee0000613d0000000004050433000000000074004b000015f20000213d00000aac01000041000000000010043f0000003201000039000000040010043f00000a9e0100004100002a5e0001043000000060050000390000000006000019000000060e0000290000161e0000013d000000000a98001900000000000a043500000040044000390000004007700039000000000707043300000a9b0770019700000000007404350000001f0480003900000b480440019700000000049400190000000106600039000000000026004b00000b4d0000813d0000000007140049000000400770008a0000000003730436000000200ee0003900000000070e0433000000009807043400000b1e08800197000000000884043600000000090904330000000000580435000000600b40003900000000a809043400000000008b04350000008009400039000000000008004b000016110000613d000000000b000019000000000c9b0019000000000dba0019000000000d0d04330000000000dc0435000000200bb0003900000000008b004b0000162f0000413d000016110000013d000000800100043d00000b1e01100197000b00000001001d000000000010043f00000b2001000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000000001004b000016640000c13d00000b2101000041000000000201041a00000a9f0020009c00000ad80000213d0000000103200039000000000031041b00000b2a0220009a0000000b03000029000000000032041b000000000101041a000a00000001001d000000000030043f00000b2001000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000021041b000000800100043d00000b1e01100197000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000800200043d000000e002200270000000000301043b000000000103041a00000b2f01100197000000000121019f000b00000003001d000000000013041b000000a00100043d000800000001001d0000000021010434000700000002001d000a00000001001d00000a9f0010009c00000ad80000213d0000000b010000290000000101100039000600000001001d000000000101041a000000010010019000000001021002700000007f0220618f000500000002001d0000001f0020008c00000000020000390000000102002039000000000121013f000000010010019000000dfe0000c13d0000000501000029000000200010008c000016ae0000413d0000000601000029000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d0000000a030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000005010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b000016ae0000813d000000000002041b0000000102200039000000000012004b000016aa0000413d0000000a01000029000000200010008c000022dc0000413d0000000601000029000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000200200008a0000000a02200180000000000101043b000022e90000c13d0000002003000039000022f60000013d000000400100043d000000640210003900000b3d030000410000000000320435000000440210003900000b3e0300004100000000003204350000002402100039000000230300003900000a390000013d0000001f0530018f00000a9a06300198000000400200043d000000000462001900000a9d0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016d30000c13d00000a9d0000013d000b00000000001d0000000401000029000000000010043f00000b2301000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a0000000b0020006c000016070000a13d000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000903000029000000010030003a000000080200002900000bee0000413d0000000002020433000000000032004b000016070000a13d0000000b050000290000000001510019000900010030003d000000000101041a00000b1e0110019700000005033002100000000a0330002900000000001304350000000105500039000b00000005001d000000030050006c000016d90000413d00000d7a0000013d00000b49022001970000000000210435000000000005004b000000200200003900000000020060390000003f0220003900000b48042001970000000002340019000000000042004b0000000004000039000000010400403900000a9f0020009c00000ad80000213d000000010040019000000ad80000c13d000000400020043f000000800400043d00000a9f0040009c00000ad80000213d000000200050008c0000172e0000413d00000b0906000041000000000060043f0000001f06400039000000050660027000000b0b0660009a000000200040008c00000b0a060040410000001f05500039000000050550027000000b0b0550009a000000000056004b0000172e0000813d000000000006041b0000000106600039000000000056004b0000172a0000413d0000001f0040008c000017650000a13d00000b0905000041000000000050043f00000b4807400198000017700000c13d000000200600003900000b0a050000410000177c0000013d00000b49022001970000000000210435000000000005004b000000200200003900000000020060390000003f0220003900000b48042001970000000002340019000000000042004b0000000004000039000000010400403900000a9f0020009c00000ad80000213d000000010040019000000ad80000c13d000000400020043f000000800400043d00000a9f0040009c00000ad80000213d000000200050008c0000175c0000413d00000b0906000041000000000060043f0000001f06400039000000050660027000000b0b0660009a000000200040008c00000b0a060040410000001f05500039000000050550027000000b0b0550009a000000000056004b0000175c0000813d000000000006041b0000000106600039000000000056004b000017580000413d0000001f0040008c00001d240000a13d00000b0905000041000000000050043f00000b480740019800001d2f0000c13d000000200600003900000b0a0500004100001d3b0000013d000000000004004b0000000005000019000017880000613d000000030540021000000b4b0550027f00000b4b05500167000000a00600043d000000000556016f0000000104400210000000000545019f000017880000013d00000b0a050000410000002006000039000000010870008a000000050880027000000b0c0880009a00000080096000390000000009090433000000000095041b00000020066000390000000105500039000000000085004b000017750000c13d000000000047004b000017860000813d0000000307400210000000f80770018f00000b4b0770027f00000b4b0770016700000080066000390000000006060433000000000676016f000000000065041b000000010440021000000001054001bf00000b0904000041000000000054041b000000400400003900000000044204360000004005200039000000000303043300000000003504350000006005200039000000000003004b0000179a0000613d000000000600001900000000075600190000000008610019000000000808043300000000008704350000002006600039000000000036004b000017930000413d000000000153001900000000000104350000001f0130003900000b4801100197000000000151001900000000032100490000000000340435000000800300043d0000000001310436000000000003004b000017ad0000613d00000000040000190000000005140019000000a006400039000000000606043300000000006504350000002004400039000000000034004b000017a60000413d000000000413001900000000000404350000001f0330003900000b48033001970000000001210049000000000131001900000a980010009c00000a9801008041000000600110021000000a980020009c00000a98020080410000004002200210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c70000800d02000039000000010300003900000b0d040000412a5c2a4d0000040f000000010020019000000daa0000613d00000006010000290000ffff0110018f000027110010008c00001d890000813d000000070200002900000a9b0520019800001d930000613d00000aeb02000041000000000302041a00000b0e03300197000000a004100210000000000343019f000000000353019f000000000032041b000000400200043d000000000012043500000a980020009c00000a98020080410000004001200210000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000aa7011001c70000800d02000039000000020300003900000b0f040000412a5c2a4d0000040f000000010020019000000daa0000613d000000080100002900000a9b01100197000b00000001001d000000000010043f00000afc01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b000000000100041100000a9b01100197000a00000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a07000029000018120000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000000050000190000000b060000292a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b4901100197000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b4901100197000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b4901100197000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b11022001970000000b022001af000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b4901100197000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b0000000b01000029000000000010043f00000b1201000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000a01000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a07000029000019140000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000b13050000410000000b060000292a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b11022001970000000b022001af000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b000000000000043f00000b1401000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000a01000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a0700002900001a190000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000b150500004100000000060000192a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1502000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1502000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1502000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b1102200197000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1502000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000000043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b000000000000043f00000b1601000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000a01000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a0700002900001b1c0000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000b170500004100000000060000192a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1702000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1702000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1702000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b1102200197000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1702000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000000043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b0000000b01000029000000000010043f00000b1201000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000a01000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff0010019000001c1f0000613d000000140100008a00000000011000310000000201100367000000000101043b000a006000100278000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000b13050000410000000b060000290000000a070000292a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000a00000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b11022001970000000b022001af000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000021041b00000b1301000041000000000010043f00000af102000041000000200020043f00000b1802000041000000000602041a000000000012041b000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b190400004100000b130500004100000b13070000412a5c2a4d0000040f000000010020019000000daa0000613d00000aa401000041000000000201041a00000b4c02200197000000000021041b000000400100043d0000000103000039000000000031043500000a980010009c00000a98010080410000004001100210000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000aa7011001c70000800d0200003900000aa80400004100000da70000013d000000000004004b000000000500001900001d470000613d000000030540021000000b4b0550027f00000b4b05500167000000a00600043d000000000556016f0000000104400210000000000545019f00001d470000013d00000b0a050000410000002006000039000000010870008a000000050880027000000b0c0880009a00000080096000390000000009090433000000000095041b00000020066000390000000105500039000000000085004b00001d340000c13d000000000047004b00001d450000813d0000000307400210000000f80770018f00000b4b0770027f00000b4b0770016700000080066000390000000006060433000000000676016f000000000065041b000000010440021000000001054001bf00000b0904000041000000000054041b000000400400003900000000044204360000004005200039000000000303043300000000003504350000006005200039000000000003004b00001d590000613d000000000600001900000000075600190000000008610019000000000808043300000000008704350000002006600039000000000036004b00001d520000413d000000000153001900000000000104350000001f0130003900000b4801100197000000000151001900000000032100490000000000340435000000800300043d0000000001310436000000000003004b00001d6c0000613d00000000040000190000000005140019000000a006400039000000000606043300000000006504350000002004400039000000000034004b00001d650000413d000000000413001900000000000404350000001f0330003900000b48033001970000000001210049000000000131001900000a980010009c00000a9801008041000000600110021000000a980020009c00000a98020080410000004002200210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c70000800d02000039000000010300003900000b0d040000412a5c2a4d0000040f000000010020019000000daa0000613d00000006010000290000ffff0110018f000027100010008c00001d900000a13d000000400100043d000000440210003900000b1d03000041000000000032043500000024021000390000000f0300003900000b9b0000013d000000070200002900000a9b0520019800001d9a0000c13d000000400100043d000000440210003900000b1c0300004100000000003204350000002402100039000000110300003900000b9b0000013d00000aeb02000041000000000302041a00000b0e03300197000000a004100210000000000343019f000000000353019f000000000032041b000000400200043d000000000012043500000a980020009c00000a98020080410000004001200210000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000aa7011001c70000800d02000039000000020300003900000b0f040000412a5c2a4d0000040f000000010020019000000daa0000613d000000080100002900000a9b01100197000b00000001001d000000000010043f00000afc01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b000000000100041100000a9b01100197000a00000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a0700002900001ddf0000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000000050000190000000b060000292a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b4901100197000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b4901100197000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b4901100197000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b11022001970000000b022001af000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b4901100197000000000000043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b0000000b01000029000000000010043f00000b1201000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000a01000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a0700002900001ee10000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000b13050000410000000b060000292a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b11022001970000000b022001af000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b000000000000043f00000b1401000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000a01000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a0700002900001fe60000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000b150500004100000000060000192a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1502000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1502000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1502000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b1102200197000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1502000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000000043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b000000000000043f00000b1601000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000a01000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff001001900000000a07000029000020e90000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000b170500004100000000060000192a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1702000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000900000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1702000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1702000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b1102200197000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1702000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000000043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000902000029000000000021041b0000000b01000029000000000010043f00000b1201000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b490220019700000001022001bf000000000021041b0000000a01000029000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000ff00100190000021ec0000613d000000140100008a00000000011000310000000201100367000000000101043b000a006000100278000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b100400004100000b13050000410000000b060000290000000a070000292a5c2a4d0000040f000000010020019000000daa0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000a00000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a000000010220003a00000bee0000613d000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000201041a00000b11022001970000000b022001af000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c00000ad80000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000b1302000041000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000a02000029000000000021041b00000b1301000041000000000010043f00000af102000041000000200020043f00000b1802000041000000000602041a000000000012041b000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b190400004100000b130500004100000b130700004100000da70000013d0000000a0000006b0000000001000019000023040000613d0000000a03000029000000030130021000000b4b0110027f00000b4b0110016700000007020000290000000002020433000000000112016f0000000102300210000000000121019f000023040000013d000000010320008a0000000503300270000000000431001900000020030000390000000104400039000000080600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000022ef0000c13d0000000a0020006c000023010000813d0000000a020000290000000302200210000000f80220018f00000b4b0220027f00000b4b0220016700000008033000290000000003030433000000000223016f000000000021041b0000000a01000029000000010110021000000001011001bf0000000602000029000000000012041b000000c00100043d00000a9b011001970000000b020000290000000202200039000000000302041a00000b1103300197000000000113019f000000000012041b0000000901000029000000000010043f00000b2301000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000201043b000000800100043d00000b1e01100197000800000001001d000000000010043f000b00000002001d0000000101200039000a00000001001d000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000700000001001d000000000001004b0000238d0000c13d000000c00100043d00000a9b01100197000000000010043f00000b2301000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000201043b000000800100043d00000b1e01100197000a00000001001d000000000010043f000b00000002001d0000000101200039000800000001001d000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000000001004b0000237f0000c13d0000000b01000029000000000101041a000700000001001d00000a9f0010009c00000ad80000213d000000070100002900000001011000390000000b02000029000000000012041b000000000020043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000007011000290000000a02000029000000000021041b0000000b01000029000000000101041a000b00000001001d000000000020043f0000000801000029000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000021041b000000c00100043d000000800200043d000000000300041400000a980030009c00000a980300804100000b1e0520019700000a9b07100197000000c00130021000000af6011001c70000800d02000039000000040300003900000b3004000041000000090600002900000da70000013d0000000b01000029000000000101041a000600000001001d000000000001004b00000bee0000613d0000000602000029000000070020006c000024250000c13d0000000b01000029000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d0000000702000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000801000029000000000010043f0000000a01000029000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000001041b000023320000013d000000080000006b0000000001000019000023c30000613d0000000803000029000000030130021000000b4b0110027f00000b4b0110016700000007020000290000000002020433000000000112016f0000000102300210000000000121019f0000000602000029000000000012041b000000c00100043d00000a9b0110019700000009020000290000000202200039000000000302041a00000b1103300197000000000313019f000000000032041b000000000010043f00000b2301000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000201043b000000800100043d00000b1e01100197000a00000001001d000000000010043f000b00000002001d0000000101200039000900000001001d000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b000000000101041a000000000001004b000024180000c13d0000000b01000029000000000101041a000800000001001d00000a9f0010009c00000ad80000213d000000080100002900000001011000390000000b02000029000000000012041b000000000020043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000008011000290000000a02000029000000000021041b0000000b01000029000000000101041a000b00000001001d000000000020043f0000000901000029000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000b02000029000000000021041b000000c00100043d000000800200043d000000000300041400000b1e0520019700000a9b0610019700000a980030009c00000a9803008041000000c00130021000000af6011001c70000800d02000039000000030300003900000b3f0400004100000da70000013d0000000b01000029000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d00000007020000290005000100200092000000000101043b0000000b02000029000000000202041a000000050020006c000016070000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d0000000b01000029000000000010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000a01000029000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000000daa0000613d000000000101043b0000000702000029000000000021041b0000000b01000029000000000101041a000700000001001d000000000001004b0000130b0000613d000023950000013d0000001f0220003900000b48022001970000000001120019000000000021004b0000000002000039000000010200403900000a9f0010009c0000246c0000213d00000001002001900000246c0000c13d000000400010043f000000000001042d00000aac01000041000000000010043f0000004101000039000000040010043f00000a9e0100004100002a5e000104300000001f03100039000000000023004b000000000400001900000ae50400404100000ae50520019700000ae503300197000000000653013f000000000053004b000000000300001900000ae50300204100000ae50060009c000000000304c019000000000003004b000024b90000613d0000000204000367000000000314034f000000000303043b00000b4d0030009c000024b30000813d0000001f0630003900000b48066001970000003f0660003900000b4807600197000000400600043d0000000007760019000000000067004b0000000008000039000000010800403900000a9f0070009c000024b30000213d0000000100800190000024b30000c13d0000002008100039000000400070043f00000000013604360000000006830019000000000026004b000024b90000213d000000000484034f00000b48053001980000001f0630018f0000000002510019000024a30000613d000000000704034f0000000008010019000000007907043c0000000008980436000000000028004b0000249f0000c13d000000000006004b000024b00000613d000000000454034f0000000305600210000000000602043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000042043500000000013100190000000000010435000000000001042d00000aac01000041000000000010043f0000004101000039000000040010043f00000a9e0100004100002a5e00010430000000000100001900002a5e0001043000000000430104340000000001320436000000000003004b000024c70000613d000000000200001900000000051200190000000006240019000000000606043300000000006504350000002002200039000000000032004b000024c00000413d000000000213001900000000000204350000001f0230003900000b48022001970000000001210019000000000001042d00000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b000024dc0000613d000000000400001900000000051400190000000006430019000000000606043300000000006504350000002004400039000000000024004b000024d50000413d000000000312001900000000000304350000001f0220003900000b48022001970000000001120019000000000001042d000000400210003900000b4e03000041000000000032043500000020021000390000000e030000390000000000320435000000200200003900000000002104350000006001100039000000000001042d00000a9b01100197000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f0000000100200190000024fb0000613d000000000101043b000000000001042d000000000100001900002a5e0001043000000a9b02200197000000000020043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000250b0000613d000000000101043b000000000001042d000000000100001900002a5e0001043000000ae101000041000000000101041a00000a9b01100198000025120000613d000000000001042d00000aaa010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000025220000613d000000000101043b000000000001042d000000000001042f00000b1e01100197000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f0000000100200190000025320000613d000000000101043b000000000001042d000000000100001900002a5e0001043000000b0901000041000000000401041a000000010540019000000001024002700000007f0220618f0000001f0020008c00000000010000390000000101002039000000000015004b000025630000c13d000000400100043d0000000003210436000000000005004b000025500000613d00000b0904000041000000000040043f000000000002004b000025560000613d00000b0a0500004100000000040000190000000006430019000000000705041a000000000076043500000001055000390000002004400039000000000024004b000025480000413d000025570000013d00000b49044001970000000000430435000000000002004b00000020040000390000000004006039000025570000013d00000000040000190000003f0240003900000b48032001970000000002130019000000000032004b0000000003000039000000010300403900000a9f0020009c000025690000213d0000000100300190000025690000c13d000000400020043f000000000001042d00000aac01000041000000000010043f0000002201000039000000040010043f00000a9e0100004100002a5e0001043000000aac01000041000000000010043f0000004101000039000000040010043f00000a9e0100004100002a5e00010430000200000000000200000b1e01100197000200000001001d000000000010043f00000b1f01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f0000000100200190000025e10000613d000000000101043b0000000201100039000000000101041a00000a9b01100198000025e00000c13d000000400200043d00000b2e010000410000000000120435000100000002001d00000004012000390000000202000029000000000021043500000aaa0100004100000000001004430000000001000412000000040010044300000020010000390000002400100443000000000100041400000a980010009c00000a9801008041000000c00110021000000aab011001c700008005020000392a5c2a520000040f0000000100200190000025e30000613d000000000201043b000000000100041400000a9b02200197000000040020008c000025a40000c13d0000000103000031000000200030008c00000020040000390000000004034019000000010b000029000025d00000013d000000010300002900000a980030009c00000a9803008041000000400330021000000a980010009c00000a9801008041000000c001100210000000000131019f00000a9e011001c72a5c2a520000040f000000010b0000290000000003010019000000600330027000000a9803300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000025bf0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000025bb0000c13d000000000006004b000025cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000025ea0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000a9f0010009c000025e40000213d0000000100200190000025e40000c13d000000400010043f000000200030008c000025e10000413d00000000010b043300000a9b0010009c000025e10000213d000000000001042d000000000100001900002a5e00010430000000000001042f00000aac01000041000000000010043f0000004101000039000000040010043f00000a9e0100004100002a5e000104300000001f0530018f00000a9a06300198000000400200043d0000000004620019000025f50000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000025f10000c13d000000000005004b000026020000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000600130021000000a980020009c00000a98020080410000004002200210000000000112019f00002a5e000104300000000031010434000000000001004b000026130000613d000000000400001900000000052400190000000006430019000000000606043300000000006504350000002004400039000000000014004b0000260c0000413d00000000012100190000000000010435000000000001042d000000400300043d000027110020008c000026340000813d00000a9b051001980000263a0000613d00000aeb01000041000000000401041a00000b0e04400197000000a00620021000000b4f06600197000000000446019f000000000454019f000000000041041b000000000023043500000a980030009c00000a98030080410000004001300210000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000aa7011001c70000800d02000039000000020300003900000b0f040000412a5c2a4d0000040f00000001002001900000264a0000613d000000000001042d000000440130003900000b1d02000041000000000021043500000024013000390000000f020000390000263f0000013d000000440130003900000b1c02000041000000000021043500000024013000390000001102000039000000000021043500000aa201000041000000000013043500000004013000390000002002000039000000000021043500000a980030009c00000a9803008041000000400130021000000ae3011001c700002a5e00010430000000000100001900002a5e000104300002000000000002000200000002001d000100000001001d000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000266f0000613d000000000101043b000000020200002900000a9b02200197000200000002001d000000000020043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000266f0000613d000000000101043b000000000101041a000000ff00100190000026710000613d000000000001042d000000000100001900002a5e00010430000000400100043d00000b500010009c0000267a0000413d00000aac01000041000000000010043f0000004101000039000000040010043f00000a9e0100004100002a5e000104300000006004100039000000400040043f0000002a02000039000000000321043600000000020000310000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000026820000c13d000000000403043300000b340440019700000b35044001c700000000004304350000002104100039000000000504043300000b340550019700000b36055001c700000000005404350000002904000039000000020600002900000000050600190000000006010433000000000046004b000026f40000a13d0000000006340019000000000706043300000b34077001970000000308500210000000780880018f00000b370880021f00000b3808800197000000000778019f00000000007604350000000406500270000000010440008a000000010040008c000026910000213d000000100050008c000026fa0000813d000000400300043d000200000003001d00000af90030009c000026740000213d00000002050000290000008004500039000000400040043f000000420300003900000000033504360000000005030019000000002602043c0000000005650436000000000045004b000026ae0000c13d000000000203043300000b340220019700000b35022001c7000000000023043500000002080000290000002102800039000000000402043300000b340440019700000b36044001c700000000004204350000004102000039000000010500002900000000040500190000000005080433000000000025004b000026f40000a13d0000000005320019000000000605043300000b34066001970000000307400210000000780770018f00000b370770021f00000b3807700197000000000676019f00000000006504350000000405400270000000010220008a000000010020008c000026be0000213d0000000f0040008c000026fa0000213d000000400400043d000100000004001d000000200240003900000b3a03000041000000000032043500000035024000392a5c26080000040f00000b3b020000410000000000210435000000110210003900000002010000292a5c26080000040f00000001030000290000000002310049000000200120008a000000000013043500000000010300192a5c24600000040f00000aa201000041000000400200043d000200000002001d0000000000120435000000040120003900000001020000292a5c24cd0000040f0000000202000029000000000121004900000a980010009c00000a9801008041000000600110021000000a980020009c00000a98020080410000004002200210000000000121019f00002a5e0001043000000aac01000041000000000010043f0000003201000039000000040010043f00000a9e0100004100002a5e00010430000000400100043d000000440210003900000b3903000041000000000032043500000aa20200004100000000002104350000002402100039000000200300003900000000003204350000000402100039000000000032043500000a980010009c00000a9801008041000000400110021000000ae3011001c700002a5e000104300003000000000002000200000002001d000300000001001d000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b000000020200002900000a9b02200197000200000002001d000000000020043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b000000000101041a000000ff00100190000028210000613d0000000301000029000000000010043f00000af701000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b0000000202000029000000000020043f000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b000000000201041a00000b4902200197000000000021041b000000000100041100000a9b01100197000100000001001d000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b000000000101041a000000ff001001900000000107000029000027630000613d000000140100008a00000000011000310000000201100367000000000101043b0000006007100270000000000100041400000a980010009c00000a9801008041000000c00110021000000af6011001c70000800d02000039000000040300003900000b5104000041000000030500002900000002060000292a5c2a4d0000040f00000001002001900000281f0000613d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c000028240000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b0000000302000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b0000000202000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b000000000101041a000100000001001d000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c000028240000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b0000000302000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b0000000102000029000000000020043f0000000101100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b000000000201041a00000b1102200197000000000021041b000000400100043d0000002002000039000000000221043600000af303000041000000000032043500000ae90010009c000028240000213d0000004003100039000000400030043f00000a980020009c00000a98020080410000004002200210000000000101043300000a980010009c00000a98010080410000006001100210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b0000000302000029000000000020043f00000b4901100197000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b0000000202000029000000000020043f0000000201100039000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f00000001002001900000281f0000613d000000000101043b000000000001041b000000000001042d000000000100001900002a5e00010430000000400100043d00000b500010009c0000282a0000413d00000aac01000041000000000010043f0000004101000039000000040010043f00000a9e0100004100002a5e000104300000006004100039000000400040043f0000002a02000039000000000321043600000000020000310000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000028320000c13d000000000403043300000b340440019700000b35044001c700000000004304350000002104100039000000000504043300000b340550019700000b36055001c700000000005404350000002904000039000000020600002900000000050600190000000006010433000000000046004b000028a40000a13d0000000006340019000000000706043300000b34077001970000000308500210000000780880018f00000b370880021f00000b3808800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c000028410000213d000000100050008c000028aa0000813d000000400300043d000200000003001d00000af90030009c000028240000213d00000002050000290000008004500039000000400040043f000000420300003900000000033504360000000005030019000000002602043c0000000005650436000000000045004b0000285e0000c13d000000000203043300000b340220019700000b35022001c7000000000023043500000002080000290000002102800039000000000402043300000b340440019700000b36044001c700000000004204350000004102000039000000030500002900000000040500190000000005080433000000000025004b000028a40000a13d0000000005320019000000000605043300000b34066001970000000307400210000000780770018f00000b370770021f00000b3807700197000000000676019f00000000006504350000000405400270000000010220008a000000010020008c0000286e0000213d0000000f0040008c000028aa0000213d000000400400043d000300000004001d000000200240003900000b3a03000041000000000032043500000035024000392a5c26080000040f00000b3b020000410000000000210435000000110210003900000002010000292a5c26080000040f00000003030000290000000002310049000000200120008a000000000013043500000000010300192a5c24600000040f00000aa201000041000000400200043d000200000002001d0000000000120435000000040120003900000003020000292a5c24cd0000040f0000000202000029000000000121004900000a980010009c00000a9801008041000000600110021000000a980020009c00000a98020080410000004002200210000000000121019f00002a5e0001043000000aac01000041000000000010043f0000003201000039000000040010043f00000a9e0100004100002a5e00010430000000400100043d000000440210003900000b3903000041000000000032043500000aa20200004100000000002104350000002402100039000000200300003900000000003204350000000402100039000000000032043500000a980010009c00000a9801008041000000400110021000000ae3011001c700002a5e0001043000000b0902000041000000000302041a000000010430019000000001083002700000007f0880618f0000001f0080008c00000000020000390000000102002039000000000024004b000029710000c13d000000400500043d0000000002850436000000000004004b000028d60000613d00000b0903000041000000000030043f000000000008004b000028dc0000613d00000b0a0400004100000000030000190000000006320019000000000704041a000000000076043500000001044000390000002003300039000000000083004b000028ce0000413d000028dd0000013d00000b49033001970000000000320435000000000008004b00000020030000390000000003006039000028dd0000013d00000000030000190000003f0330003900000b48063001970000000003560019000000000063004b0000000006000039000000010600403900000a9f0030009c0000296b0000213d00000001006001900000296b0000c13d000000400030043f000000006701043400000a9f0070009c0000296b0000213d000000200080008c000028fd0000413d00000b0909000041000000000090043f0000001f09700039000000050990027000000b0b0990009a000000200070008c00000b0a090040410000001f08800039000000050880027000000b0b0880009a000000000089004b000028fd0000813d000000000009041b0000000109900039000000000089004b000028f90000413d0000001f0070008c0000291c0000a13d00000b0908000041000000000080043f00000b480a700198000029260000613d00000b0a080000410000002009000039000000010ba0008a000000050bb0027000000b0c0bb0009a000000000c190019000000000c0c04330000000000c8041b000000200990003900000001088000390000000000b8004b000029080000c13d00000000007a004b000029190000813d000000030a700210000000f80aa0018f00000b4b0aa0027f00000b4b0aa00167000000000919001900000000090904330000000009a9016f000000000098041b000000010770021000000001077001bf0000292c0000013d000000000007004b0000292b0000613d000000030870021000000b4b0880027f00000b4b088001670000000009060433000000000889016f0000000107700210000000000778019f0000292c0000013d000000200900003900000b0a0800004100000000007a004b000029110000413d000029190000013d000000000700001900000b0908000041000000000078041b000000400700003900000000077304360000004008300039000000000505043300000000005804350000006008300039000000000005004b0000293e0000613d0000000009000019000000000a890019000000000b920019000000000b0b04330000000000ba04350000002009900039000000000059004b000029370000413d000000000285001900000000000204350000001f0250003900000b480220019700000000058200190000000002350049000000000027043500000000020104330000000001250436000000000002004b000029510000613d000000000500001900000000071500190000000008560019000000000808043300000000008704350000002005500039000000000025004b0000294a0000413d000000000512001900000000000504350000001f0220003900000b48022001970000000001310049000000000121001900000a980010009c00000a9801008041000000600110021000000a980030009c00000a98030080410000004002300210000000000121019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c70000800d02000039000000010300003900000b0d040000412a5c2a4d0000040f0000000100200190000029770000613d000000000001042d00000aac01000041000000000010043f0000004101000039000000040010043f00000a9e0100004100002a5e0001043000000aac01000041000000000010043f0000002201000039000000040010043f00000a9e0100004100002a5e00010430000000000100001900002a5e00010430000000000100041100000a9b01100197000000000010043f00000afb01000041000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f0000000100200190000029920000613d000000000101043b000000000101041a000000ff001001900000000001000411000029910000613d000000140100008a00000000011000310000000201100367000000000101043b0000006001100270000000000001042d000000000100001900002a5e000104300006000000000002000300000002001d000000000020043f000600000001001d0000000101100039000400000001001d000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000002a0a0000613d0000000603000029000000000101043b000000000101041a000000000001004b00002a090000613d000000000203041a000000000002004b00002a0c0000613d000000000012004b000500000001001d000029e90000613d000200000002001d000000000030043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000002a0a0000613d00000005020000290001000100200092000000000101043b0000000604000029000000000204041a000000010020006c000000000304001900002a120000a13d0000000202000029000000010220008a0000000001120019000000000101041a000200000001001d000000000030043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000002a0a0000613d000000000101043b00000001011000290000000202000029000000000021041b000000000020043f0000000401000029000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000002a0a0000613d000000000101043b0000000502000029000000000021041b0000000603000029000000000103041a000500000001001d000000000001004b00002a180000613d000000000030043f000000000100041400000a980010009c00000a9801008041000000c00110021000000aa7011001c700008010020000392a5c2a520000040f000000010020019000002a0a0000613d0000000502000029000000010220008a000000000101043b0000000001210019000000000001041b0000000601000029000000000021041b0000000301000029000000000010043f0000000401000029000000200010043f000000000100041400000a980010009c00000a9801008041000000c00110021000000af5011001c700008010020000392a5c2a520000040f000000010020019000002a0a0000613d000000000101043b000000000001041b000000000001042d000000000100001900002a5e0001043000000aac01000041000000000010043f0000001101000039000000040010043f00000a9e0100004100002a5e0001043000000aac01000041000000000010043f0000003201000039000000040010043f00000a9e0100004100002a5e0001043000000aac01000041000000000010043f0000003101000039000000040010043f00000a9e0100004100002a5e00010430000000000001042f00000a980010009c00000a9801008041000000400110021000000a980020009c00000a98020080410000006002200210000000000112019f000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000af6011001c700008010020000392a5c2a520000040f000000010020019000002a320000613d000000000101043b000000000001042d000000000100001900002a5e0001043000000000050100190000000000200443000000040100003900000005024002700000000002020031000000000121043a0000002004400039000000000031004b00002a370000413d00000a980030009c00000a98030080410000006001300210000000000200041400000a980020009c00000a9802008041000000c002200210000000000112019f00000b52011001c700000000020500192a5c2a520000040f000000010020019000002a4c0000613d000000000101043b000000000001042d000000000001042f00002a50002104210000000102000039000000000001042d0000000002000019000000000001042d00002a55002104230000000102000039000000000001042d0000000002000019000000000001042d00002a5a002104250000000102000039000000000001042d0000000002000019000000000001042d00002a5c0000043200002a5d0001042e00002a5e00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff01ffc9a700000000000000000000000000000000000000000000000000000000cb23f816000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff20696e7465726661636500000000000000000000000000000000000000000000446f65736e277420737570706f72742049526f79616c7479456e67696e65563108c379a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084000000000000000000000000322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300616c697a696e6700000000000000000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e747261637420697320696e69746902000000000000000000000000000000000000200000000000000000000000007f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024980000000200000000000000000000000000000100000001000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e02000002000000000000000000000000000000440000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a217fdde00000000000000000000000000000000000000000000000000000000c511f8fa00000000000000000000000000000000000000000000000000000000e57553d900000000000000000000000000000000000000000000000000000000f23a6e6000000000000000000000000000000000000000000000000000000000f23a6e6100000000000000000000000000000000000000000000000000000000f28083c300000000000000000000000000000000000000000000000000000000f533b80200000000000000000000000000000000000000000000000000000000e57553da00000000000000000000000000000000000000000000000000000000e8a3d48500000000000000000000000000000000000000000000000000000000cb2ef6f600000000000000000000000000000000000000000000000000000000cb2ef6f700000000000000000000000000000000000000000000000000000000d45573f600000000000000000000000000000000000000000000000000000000d547741f00000000000000000000000000000000000000000000000000000000c511f8fb00000000000000000000000000000000000000000000000000000000ca15c87300000000000000000000000000000000000000000000000000000000aaae563200000000000000000000000000000000000000000000000000000000b48912d900000000000000000000000000000000000000000000000000000000b48912da00000000000000000000000000000000000000000000000000000000b6f10c7900000000000000000000000000000000000000000000000000000000bc197c8100000000000000000000000000000000000000000000000000000000aaae563300000000000000000000000000000000000000000000000000000000ac9650d800000000000000000000000000000000000000000000000000000000a520a38900000000000000000000000000000000000000000000000000000000a520a38a00000000000000000000000000000000000000000000000000000000a5342fdf00000000000000000000000000000000000000000000000000000000a217fddf00000000000000000000000000000000000000000000000000000000a32fa5b300000000000000000000000000000000000000000000000000000000572b6c04000000000000000000000000000000000000000000000000000000007e54523b0000000000000000000000000000000000000000000000000000000091d148530000000000000000000000000000000000000000000000000000000091d1485400000000000000000000000000000000000000000000000000000000938e3d7b00000000000000000000000000000000000000000000000000000000a0a8e460000000000000000000000000000000000000000000000000000000007e54523c000000000000000000000000000000000000000000000000000000009010d07c000000000000000000000000000000000000000000000000000000005c573f2d000000000000000000000000000000000000000000000000000000005c573f2e000000000000000000000000000000000000000000000000000000006b86400e00000000000000000000000000000000000000000000000000000000572b6c05000000000000000000000000000000000000000000000000000000005a9ad2310000000000000000000000000000000000000000000000000000000021ede031000000000000000000000000000000000000000000000000000000002f2ff15c000000000000000000000000000000000000000000000000000000002f2ff15d0000000000000000000000000000000000000000000000000000000036568abe000000000000000000000000000000000000000000000000000000004cb5d8fd0000000000000000000000000000000000000000000000000000000021ede03200000000000000000000000000000000000000000000000000000000248a9ca3000000000000000000000000000000000000000000000000000000001ab6b704000000000000000000000000000000000000000000000000000000001ab6b705000000000000000000000000000000000000000000000000000000001e7ac4880000000000000000000000000000000000000000000000000000000001ffc9a700000000000000000000000000000000000000000000000000000000150b7a02c802b338f3fb784853cf3c808df5ff08335200e394ea2c687d12571a91045000f533b8020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02a55205a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf496e76616c696420726f79616c747920616d6f756e7400000000000000000000c0c34308b4a2f4c5ee9af8ba82541cfb3c33b076d1fd05c65f9ce7060c64c4000000000000000000000000000000000000000020000000800000000000000000f23a6e61000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c0c34308b4a2f4c5ee9af8ba82541cfb3c33b076d1fd05c65f9ce7060c64c40100000000000000000000000000000000000000400000008000000000000000000a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e5014d61726b6574706c6163655633000000000000000000000000000000000000000c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0b0200000000000000000000000000000000000020000000a00000000000000000020000000000000000000000000000000000004000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff7fbc197c810000000000000000000000000000000000000000000000000000000082aadcdf5bea62fd30615b6c0754b644e71b6c1e8c55b71bb927ad005b504f00b90bee833937d0b103fcc21342fe66a63fa61acc77e31241a879920fbbe680f8000000000000000000ff00000000000000000000000000000000000000000000ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffd246da9440709ce0dd3f4fd669abc85ada012ab9774b8ecdcc5059ba1486b9c1000000000000000000000000000000000000000000000000ffffffffffffff9f206661696c656400000000000000000000000000000000000000000000000000416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000647920696e697469616c697a6564000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e747261637420697320616c7265611d281c488dae143b6ea4122e80c65059929950b9c32f17fc57be22089d9c3b004bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da900aa22fe19877854b250081f5bff0b980ac78bef9403e721acde6be88fb0e9bf0655dd01e67887ab4daff7e0a400f467f53874106bfc18de53219417704f1640fa55dd01e67887ab4daff7e0a400f467f53874106bfc18de53219417704f1640f9c9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a16ffffffffffffffffffff00000000000000000000000000000000000000000000e2497bd806ec41a6e0dd992c29a72efc0ef8fec9092d1978fd4a1e00b2f183042f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0dffffffffffffffffffffffff0000000000000000000000000000000000000000a04e902a2f30cc90fb357dcfb1d97b3ca94b63614f538cf21ec72e982ed2d5b255add213c41f3851b4506717b8af695a4256979dff496dcaae7789f6121331aa56e2162cc65d2bbb2f8893dab763e238fc3331439b3f34bdf0f28dc89c294a82f94103142c1baabe9ac2b5d1487bf783de9e69cfeea9a72f5c9c94afd7877b8cb13a305efd4a1fab91e486caabeee2b5a635beac69246fef21cd07a02cf9433486d5cf0a6bdc8d859ba3bdc97043337c82a0e609035f378e419298b6a3e00ae670219427ceb0ea781e02ecdbb3116cf6d3742e8a2543d98587f069423fdf2aa2bd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff6e697469616c697a696e67000000000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069496e76616c696420726563697069656e7400000000000000000000000000000045786365656473206d6178206270730000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000012ef321094c8c682aa635dfdfcd754624a7473f08ad6ac415bb7f35eb12a103012ef321094c8c682aa635dfdfcd754624a7473f08ad6ac415bb7f35eb12a101012ef321094c8c682aa635dfdfcd754624a7473f08ad6ac415bb7f35eb12a100a8b7eaf63ace06ac2a3b9688b969ce1dcb13c1bfe40740bd5edb281240851469012ef321094c8c682aa635dfdfcd754624a7473f08ad6ac415bb7f35eb12a10235abc8f71d3b64d5ac2bf726bfcc6c2c4311e2882a30b10d56536b6747f310c473656c6563746f72000000000000000000000000000000000000000000000000526f757465723a204e6f20706c7567696e20617661696c61626c6520666f7220f8086cee80709bd44c82f89dbca54115ebd05e840a88ab81df9cf5be9754eb636b86400e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000a8b7eaf63ace06ac2a3b9688b969ce1dcb13c1bfe40740bd5edb28124085146800000001000000000000000000000000000000000000000000000000000000005c573f2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff1fa520a38a00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000cc8adca15b14349a258731182baaa1a066ed6e039d88e217beefdd9d400bb2054d61703a204e6f7420617574686f72697a65640000000000000000000000000043616e206f6e6c792072656e6f756e636520666f722073656c6600000000000043616e206f6e6c79206772616e7420746f206e6f6e20686f6c6465727300000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3000000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000030313233343536373839616263646566000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000537472696e67733a20686578206c656e67746820696e73756666696369656e745065726d697373696f6e733a206163636f756e74200000000000000000000000206973206d697373696e6720726f6c6520000000000000000000000000000000db773077c54b973d26a2973b12d9e7e458768cbf218f12160d3ea5f015820ef96f6e2e0000000000000000000000000000000000000000000000000000000000526f757465723a20706c7567696e2065786973747320666f722066756e637469e0e70d6cf2eef8321d38ecb6a3a5a107eaaf5e5f8b1976b462146a34e28f7dc265206d69736d617463682e000000000000000000000000000000000000000000526f757465723a20666e2073656c6563746f7220616e64207369676e61747572722066756e6374696f6e2e000000000000000000000000000000000000000000526f757465723a2064656661756c7420706c7567696e2065786973747320666f526f757465723a204e6f7420617574686f72697a656400000000000000000000150b7a02000000000000000000000000000000000000000000000000000000004e2312e000000000000000000000000000000000000000000000000000000000f337402700000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff00000000000000000000000000000000000000000000000100000000000000004e6f7420617574686f72697a656400000000000000000000000000000000000000000000000000000000ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b02000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1646970667358221220b07ee8174209ff610a053817b1b6893d8f8dd3dcea63e9b021bcdf39e69bc85e002a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009742f5ac11958cfad151ebf0fc31302fa409036e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003439153eb7af838ad19d56e1571fbd09333c2809
-----Decoded View---------------
Arg [0] : _pluginMap (address): 0x9742f5ac11958cFAd151eBF0Fc31302fA409036E
Arg [1] : _royaltyEngineAddress (address): 0x0000000000000000000000000000000000000000
Arg [2] : _nativeTokenWrapper (address): 0x3439153EB7AF838Ad19d56E1571FBD09333C2809
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000009742f5ac11958cfad151ebf0fc31302fa409036e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000003439153eb7af838ad19d56e1571fbd09333c2809
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.