Token Sanctum Pawn
Overview ERC-721
Total Supply:
0 PAWN
Holders:
392 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x95807EdCA83013e920edF6Ae9047a3Cd64417542
Contract Name:
Pawn
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-21 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Pawn.sol pragma solidity ^0.8.0; contract Pawn is ERC721URIStorage, AccessControl, Ownable, Pausable { function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } using Counters for Counters.Counter; Counters.Counter public _tokenIdCounter; bytes32 public constant MINTER_ROLE = keccak256("MINTER"); bytes32 public constant BURNER_ROLE = keccak256("BURNER"); bytes32 public constant URL_CONTROLLER_ROLE = keccak256("URLCONTROLLER"); constructor() ERC721("Sanctum Pawn", "PAWN") { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } function mint(address to) public whenNotPaused returns (uint256) { require(hasRole(MINTER_ROLE, msg.sender), "Only Minter can do this"); _safeMint(to, _tokenIdCounter.current()); _tokenIdCounter.increment(); return _tokenIdCounter.current(); } function mint_id(address to, uint id) public whenNotPaused returns(uint256) { require(hasRole(MINTER_ROLE, msg.sender), "Only Minter can do this"); _safeMint(to, id); _tokenIdCounter.increment(); return id; } function mint_url(address to, string memory _tokenUrl) public whenNotPaused returns (uint256) { require(hasRole(MINTER_ROLE, msg.sender), "Only Minter can do this"); _safeMint(to, _tokenIdCounter.current()); _setTokenURI(_tokenIdCounter.current(), _tokenUrl); _tokenIdCounter.increment(); return _tokenIdCounter.current(); } function burn(uint256 tokenId) public whenNotPaused { require(hasRole(BURNER_ROLE, msg.sender), "Only Burner can do this"); _burn(tokenId); } function setTokenURI(uint256 tokenId, string memory _tokenURI) public whenNotPaused { require(hasRole(URL_CONTROLLER_ROLE, msg.sender), "Only Url Controller can do this"); _setTokenURI(tokenId, _tokenURI); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URL_CONTROLLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mint_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"_tokenUrl","type":"string"}],"name":"mint_url","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600c81526020017f53616e6374756d205061776e00000000000000000000000000000000000000008152506040518060400160405280600481526020017f5041574e0000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009692919062000349565b508060019080519060200190620000af92919062000349565b505050620000d2620000c66200010860201b60201c565b6200011060201b60201c565b6000600860146101000a81548160ff021916908315150217905550620001026000801b33620001d660201b60201c565b6200045e565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001e88282620001ec60201b60201c565b5050565b620001fe8282620002de60201b60201c565b620002da5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200027f6200010860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620003579062000428565b90600052602060002090601f0160209004810192826200037b5760008555620003c7565b82601f106200039657805160ff1916838001178555620003c7565b82800160010185558215620003c7579182015b82811115620003c6578251825591602001919060010190620003a9565b5b509050620003d69190620003da565b5090565b5b80821115620003f5576000816000905550600101620003db565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044157607f821691505b60208210811415620004585762000457620003f9565b5b50919050565b6147af806200046e6000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806370a082311161011a578063a217fddf116100ad578063c87b56dd1161007c578063c87b56dd146105c5578063d5391393146105f5578063d547741f14610613578063e985e9c51461062f578063f2fde38b1461065f57610206565b8063a217fddf1461053f578063a22cb4651461055d578063b604149414610579578063b88d4fde146105a957610206565b80638da5cb5b116100e95780638da5cb5b146104b55780638fbddc10146104d357806391d14854146104f157806395d89b411461052157610206565b806370a0823114610453578063715018a6146104835780638456cb591461048d57806384c4bd4b1461049757610206565b80632f2ff15d1161019d57806342966c681161016c57806342966c68146103895780635c975abb146103a55780636352211e146103c35780636a627842146103f35780636e0710571461042357610206565b80632f2ff15d1461032b57806336568abe146103475780633f4ba83a1461036357806342842e0e1461036d57610206565b8063162094c4116101d9578063162094c4146102a557806323b872dd146102c1578063248a9ca3146102dd578063282c51f31461030d57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190612e7a565b61067b565b6040516102329190612ec2565b60405180910390f35b61024361068d565b6040516102509190612f76565b60405180910390f35b610273600480360381019061026e9190612fce565b61071f565b604051610280919061303c565b60405180910390f35b6102a3600480360381019061029e9190613083565b6107a4565b005b6102bf60048036038101906102ba91906131f8565b6108bc565b005b6102db60048036038101906102d69190613254565b61097b565b005b6102f760048036038101906102f291906132dd565b6109db565b6040516103049190613319565b60405180910390f35b6103156109fb565b6040516103229190613319565b60405180910390f35b61034560048036038101906103409190613334565b610a1f565b005b610361600480360381019061035c9190613334565b610a48565b005b61036b610acb565b005b61038760048036038101906103829190613254565b610b51565b005b6103a3600480360381019061039e9190612fce565b610b71565b005b6103ad610c2e565b6040516103ba9190612ec2565b60405180910390f35b6103dd60048036038101906103d89190612fce565b610c45565b6040516103ea919061303c565b60405180910390f35b61040d60048036038101906104089190613374565b610cf7565b60405161041a91906133b0565b60405180910390f35b61043d600480360381019061043891906133cb565b610dd8565b60405161044a91906133b0565b60405180910390f35b61046d60048036038101906104689190613374565b610ecd565b60405161047a91906133b0565b60405180910390f35b61048b610f85565b005b61049561100d565b005b61049f611093565b6040516104ac91906133b0565b60405180910390f35b6104bd61109f565b6040516104ca919061303c565b60405180910390f35b6104db6110c9565b6040516104e89190613319565b60405180910390f35b61050b60048036038101906105069190613334565b6110ed565b6040516105189190612ec2565b60405180910390f35b610529611158565b6040516105369190612f76565b60405180910390f35b6105476111ea565b6040516105549190613319565b60405180910390f35b61057760048036038101906105729190613453565b6111f1565b005b610593600480360381019061058e9190613083565b611207565b6040516105a091906133b0565b60405180910390f35b6105c360048036038101906105be9190613534565b6112d7565b005b6105df60048036038101906105da9190612fce565b611339565b6040516105ec9190612f76565b60405180910390f35b6105fd61148b565b60405161060a9190613319565b60405180910390f35b61062d60048036038101906106289190613334565b6114af565b005b610649600480360381019061064491906135b7565b6114d8565b6040516106569190612ec2565b60405180910390f35b61067960048036038101906106749190613374565b61156c565b005b600061068682611664565b9050919050565b60606000805461069c90613626565b80601f01602080910402602001604051908101604052809291908181526020018280546106c890613626565b80156107155780601f106106ea57610100808354040283529160200191610715565b820191906000526020600020905b8154815290600101906020018083116106f857829003601f168201915b5050505050905090565b600061072a826116de565b610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906136ca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107af82610c45565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108179061375c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083f61174a565b73ffffffffffffffffffffffffffffffffffffffff16148061086e575061086d8161086861174a565b6114d8565b5b6108ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a4906137ee565b60405180910390fd5b6108b78383611752565b505050565b6108c4610c2e565b15610904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb9061385a565b60405180910390fd5b61092e7f134e1fb76e73429d75cabe756bf2a05412dc20ce0a9b6472d31f47cd7683aa36336110ed565b61096d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610964906138c6565b60405180910390fd5b610977828261180b565b5050565b61098c61098661174a565b8261187f565b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290613958565b60405180910390fd5b6109d683838361195d565b505050565b600060076000838152602001908152602001600020600101549050919050565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b610a28826109db565b610a3981610a3461174a565b611bc4565b610a438383611c61565b505050565b610a5061174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab4906139ea565b60405180910390fd5b610ac78282611d42565b5050565b610ad361174a565b73ffffffffffffffffffffffffffffffffffffffff16610af161109f565b73ffffffffffffffffffffffffffffffffffffffff1614610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e90613a56565b60405180910390fd5b610b4f611e24565b565b610b6c838383604051806020016040528060008152506112d7565b505050565b610b79610c2e565b15610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb09061385a565b60405180910390fd5b610be37f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336110ed565b610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1990613ac2565b60405180910390fd5b610c2b81611ec6565b50565b6000600860149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590613b54565b60405180910390fd5b80915050919050565b6000610d01610c2e565b15610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d389061385a565b60405180910390fd5b610d6b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336110ed565b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190613bc0565b60405180910390fd5b610dbd82610db86009611f19565b611f27565b610dc76009611f45565b610dd16009611f19565b9050919050565b6000610de2610c2e565b15610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e199061385a565b60405180910390fd5b610e4c7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336110ed565b610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613bc0565b60405180910390fd5b610e9e83610e996009611f19565b611f27565b610eb1610eab6009611f19565b8361180b565b610ebb6009611f45565b610ec56009611f19565b905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590613c52565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f8d61174a565b73ffffffffffffffffffffffffffffffffffffffff16610fab61109f565b73ffffffffffffffffffffffffffffffffffffffff1614611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff890613a56565b60405180910390fd5b61100b6000611f5b565b565b61101561174a565b73ffffffffffffffffffffffffffffffffffffffff1661103361109f565b73ffffffffffffffffffffffffffffffffffffffff1614611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090613a56565b60405180910390fd5b611091612021565b565b60098060000154905081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f134e1fb76e73429d75cabe756bf2a05412dc20ce0a9b6472d31f47cd7683aa3681565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606001805461116790613626565b80601f016020809104026020016040519081016040528092919081815260200182805461119390613626565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b5050505050905090565b6000801b81565b6112036111fc61174a565b83836120c4565b5050565b6000611211610c2e565b15611251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112489061385a565b60405180910390fd5b61127b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336110ed565b6112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190613bc0565b60405180910390fd5b6112c48383611f27565b6112ce6009611f45565b81905092915050565b6112e86112e261174a565b8361187f565b611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90613958565b60405180910390fd5b61133384848484612231565b50505050565b6060611344826116de565b611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613ce4565b60405180910390fd5b60006006600084815260200190815260200160002080546113a390613626565b80601f01602080910402602001604051908101604052809291908181526020018280546113cf90613626565b801561141c5780601f106113f15761010080835404028352916020019161141c565b820191906000526020600020905b8154815290600101906020018083116113ff57829003601f168201915b50505050509050600061142d61228d565b9050600081511415611443578192505050611486565b600082511115611478578082604051602001611460929190613d40565b60405160208183030381529060405292505050611486565b611481846122a4565b925050505b919050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b6114b8826109db565b6114c9816114c461174a565b611bc4565b6114d38383611d42565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61157461174a565b73ffffffffffffffffffffffffffffffffffffffff1661159261109f565b73ffffffffffffffffffffffffffffffffffffffff16146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90613a56565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f90613dd6565b60405180910390fd5b61166181611f5b565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116d757506116d68261234b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117c583610c45565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611814826116de565b611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90613e68565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061187a929190612d2b565b505050565b600061188a826116de565b6118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090613efa565b60405180910390fd5b60006118d483610c45565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061194357508373ffffffffffffffffffffffffffffffffffffffff1661192b8461071f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611954575061195381856114d8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197d82610c45565b73ffffffffffffffffffffffffffffffffffffffff16146119d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ca90613f8c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a9061401e565b60405180910390fd5b611a4e83838361242d565b611a59600082611752565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa9919061406d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b0091906140a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bbf838383612432565b505050565b611bce82826110ed565b611c5d57611bf38173ffffffffffffffffffffffffffffffffffffffff166014612437565b611c018360001c6020612437565b604051602001611c1292919061418f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c549190612f76565b60405180910390fd5b5050565b611c6b82826110ed565b611d3e5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ce361174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611d4c82826110ed565b15611e205760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611dc561174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611e2c610c2e565b611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290614215565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611eaf61174a565b604051611ebc919061303c565b60405180910390a1565b611ecf81612673565b6000600660008381526020019081526020016000208054611eef90613626565b905014611f1657600660008281526020019081526020016000206000611f159190612db1565b5b50565b600081600001549050919050565b611f41828260405180602001604052806000815250612790565b5050565b6001816000016000828254019250508190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612029610c2e565b15612069576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120609061385a565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120ad61174a565b6040516120ba919061303c565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212a90614281565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122249190612ec2565b60405180910390a3505050565b61223c84848461195d565b612248848484846127eb565b612287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227e90614313565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606122af826116de565b6122ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e5906143a5565b60405180910390fd5b60006122f861228d565b905060008151116123185760405180602001604052806000815250612343565b8061232284612973565b604051602001612333929190613d40565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061241657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612426575061242582612ad4565b5b9050919050565b505050565b505050565b60606000600283600261244a91906143c5565b61245491906140a1565b67ffffffffffffffff81111561246d5761246c6130cd565b5b6040519080825280601f01601f19166020018201604052801561249f5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106124d7576124d661441f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061253b5761253a61441f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261257b91906143c5565b61258591906140a1565b90505b6001811115612625577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106125c7576125c661441f565b5b1a60f81b8282815181106125de576125dd61441f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061261e9061444e565b9050612588565b5060008414612669576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612660906144c4565b60405180910390fd5b8091505092915050565b600061267e82610c45565b905061268c8160008461242d565b612697600083611752565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e7919061406d565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461278c81600084612432565b5050565b61279a8383612b3e565b6127a760008484846127eb565b6127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd90614313565b60405180910390fd5b505050565b600061280c8473ffffffffffffffffffffffffffffffffffffffff16612d18565b15612966578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261283561174a565b8786866040518563ffffffff1660e01b81526004016128579493929190614539565b6020604051808303816000875af192505050801561289357506040513d601f19601f82011682018060405250810190612890919061459a565b60015b612916573d80600081146128c3576040519150601f19603f3d011682016040523d82523d6000602084013e6128c8565b606091505b5060008151141561290e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290590614313565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061296b565b600190505b949350505050565b606060008214156129bb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612acf565b600082905060005b600082146129ed5780806129d6906145c7565b915050600a826129e6919061463f565b91506129c3565b60008167ffffffffffffffff811115612a0957612a086130cd565b5b6040519080825280601f01601f191660200182016040528015612a3b5781602001600182028036833780820191505090505b5090505b60008514612ac857600182612a54919061406d565b9150600a85612a639190614670565b6030612a6f91906140a1565b60f81b818381518110612a8557612a8461441f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ac1919061463f565b9450612a3f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba5906146ed565b60405180910390fd5b612bb7816116de565b15612bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bee90614759565b60405180910390fd5b612c036000838361242d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c5391906140a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d1460008383612432565b5050565b600080823b905060008111915050919050565b828054612d3790613626565b90600052602060002090601f016020900481019282612d595760008555612da0565b82601f10612d7257805160ff1916838001178555612da0565b82800160010185558215612da0579182015b82811115612d9f578251825591602001919060010190612d84565b5b509050612dad9190612df1565b5090565b508054612dbd90613626565b6000825580601f10612dcf5750612dee565b601f016020900490600052602060002090810190612ded9190612df1565b5b50565b5b80821115612e0a576000816000905550600101612df2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5781612e22565b8114612e6257600080fd5b50565b600081359050612e7481612e4e565b92915050565b600060208284031215612e9057612e8f612e18565b5b6000612e9e84828501612e65565b91505092915050565b60008115159050919050565b612ebc81612ea7565b82525050565b6000602082019050612ed76000830184612eb3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f17578082015181840152602081019050612efc565b83811115612f26576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4882612edd565b612f528185612ee8565b9350612f62818560208601612ef9565b612f6b81612f2c565b840191505092915050565b60006020820190508181036000830152612f908184612f3d565b905092915050565b6000819050919050565b612fab81612f98565b8114612fb657600080fd5b50565b600081359050612fc881612fa2565b92915050565b600060208284031215612fe457612fe3612e18565b5b6000612ff284828501612fb9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302682612ffb565b9050919050565b6130368161301b565b82525050565b6000602082019050613051600083018461302d565b92915050565b6130608161301b565b811461306b57600080fd5b50565b60008135905061307d81613057565b92915050565b6000806040838503121561309a57613099612e18565b5b60006130a88582860161306e565b92505060206130b985828601612fb9565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61310582612f2c565b810181811067ffffffffffffffff82111715613124576131236130cd565b5b80604052505050565b6000613137612e0e565b905061314382826130fc565b919050565b600067ffffffffffffffff821115613163576131626130cd565b5b61316c82612f2c565b9050602081019050919050565b82818337600083830152505050565b600061319b61319684613148565b61312d565b9050828152602081018484840111156131b7576131b66130c8565b5b6131c2848285613179565b509392505050565b600082601f8301126131df576131de6130c3565b5b81356131ef848260208601613188565b91505092915050565b6000806040838503121561320f5761320e612e18565b5b600061321d85828601612fb9565b925050602083013567ffffffffffffffff81111561323e5761323d612e1d565b5b61324a858286016131ca565b9150509250929050565b60008060006060848603121561326d5761326c612e18565b5b600061327b8682870161306e565b935050602061328c8682870161306e565b925050604061329d86828701612fb9565b9150509250925092565b6000819050919050565b6132ba816132a7565b81146132c557600080fd5b50565b6000813590506132d7816132b1565b92915050565b6000602082840312156132f3576132f2612e18565b5b6000613301848285016132c8565b91505092915050565b613313816132a7565b82525050565b600060208201905061332e600083018461330a565b92915050565b6000806040838503121561334b5761334a612e18565b5b6000613359858286016132c8565b925050602061336a8582860161306e565b9150509250929050565b60006020828403121561338a57613389612e18565b5b60006133988482850161306e565b91505092915050565b6133aa81612f98565b82525050565b60006020820190506133c560008301846133a1565b92915050565b600080604083850312156133e2576133e1612e18565b5b60006133f08582860161306e565b925050602083013567ffffffffffffffff81111561341157613410612e1d565b5b61341d858286016131ca565b9150509250929050565b61343081612ea7565b811461343b57600080fd5b50565b60008135905061344d81613427565b92915050565b6000806040838503121561346a57613469612e18565b5b60006134788582860161306e565b92505060206134898582860161343e565b9150509250929050565b600067ffffffffffffffff8211156134ae576134ad6130cd565b5b6134b782612f2c565b9050602081019050919050565b60006134d76134d284613493565b61312d565b9050828152602081018484840111156134f3576134f26130c8565b5b6134fe848285613179565b509392505050565b600082601f83011261351b5761351a6130c3565b5b813561352b8482602086016134c4565b91505092915050565b6000806000806080858703121561354e5761354d612e18565b5b600061355c8782880161306e565b945050602061356d8782880161306e565b935050604061357e87828801612fb9565b925050606085013567ffffffffffffffff81111561359f5761359e612e1d565b5b6135ab87828801613506565b91505092959194509250565b600080604083850312156135ce576135cd612e18565b5b60006135dc8582860161306e565b92505060206135ed8582860161306e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363e57607f821691505b60208210811415613652576136516135f7565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006136b4602c83612ee8565b91506136bf82613658565b604082019050919050565b600060208201905081810360008301526136e3816136a7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613746602183612ee8565b9150613751826136ea565b604082019050919050565b6000602082019050818103600083015261377581613739565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006137d8603883612ee8565b91506137e38261377c565b604082019050919050565b60006020820190508181036000830152613807816137cb565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613844601083612ee8565b915061384f8261380e565b602082019050919050565b6000602082019050818103600083015261387381613837565b9050919050565b7f4f6e6c792055726c20436f6e74726f6c6c65722063616e20646f207468697300600082015250565b60006138b0601f83612ee8565b91506138bb8261387a565b602082019050919050565b600060208201905081810360008301526138df816138a3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613942603183612ee8565b915061394d826138e6565b604082019050919050565b6000602082019050818103600083015261397181613935565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006139d4602f83612ee8565b91506139df82613978565b604082019050919050565b60006020820190508181036000830152613a03816139c7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a40602083612ee8565b9150613a4b82613a0a565b602082019050919050565b60006020820190508181036000830152613a6f81613a33565b9050919050565b7f4f6e6c79204275726e65722063616e20646f2074686973000000000000000000600082015250565b6000613aac601783612ee8565b9150613ab782613a76565b602082019050919050565b60006020820190508181036000830152613adb81613a9f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613b3e602983612ee8565b9150613b4982613ae2565b604082019050919050565b60006020820190508181036000830152613b6d81613b31565b9050919050565b7f4f6e6c79204d696e7465722063616e20646f2074686973000000000000000000600082015250565b6000613baa601783612ee8565b9150613bb582613b74565b602082019050919050565b60006020820190508181036000830152613bd981613b9d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613c3c602a83612ee8565b9150613c4782613be0565b604082019050919050565b60006020820190508181036000830152613c6b81613c2f565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000613cce603183612ee8565b9150613cd982613c72565b604082019050919050565b60006020820190508181036000830152613cfd81613cc1565b9050919050565b600081905092915050565b6000613d1a82612edd565b613d248185613d04565b9350613d34818560208601612ef9565b80840191505092915050565b6000613d4c8285613d0f565b9150613d588284613d0f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dc0602683612ee8565b9150613dcb82613d64565b604082019050919050565b60006020820190508181036000830152613def81613db3565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613e52602e83612ee8565b9150613e5d82613df6565b604082019050919050565b60006020820190508181036000830152613e8181613e45565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ee4602c83612ee8565b9150613eef82613e88565b604082019050919050565b60006020820190508181036000830152613f1381613ed7565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613f76602583612ee8565b9150613f8182613f1a565b604082019050919050565b60006020820190508181036000830152613fa581613f69565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614008602483612ee8565b915061401382613fac565b604082019050919050565b6000602082019050818103600083015261403781613ffb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061407882612f98565b915061408383612f98565b9250828210156140965761409561403e565b5b828203905092915050565b60006140ac82612f98565b91506140b783612f98565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140ec576140eb61403e565b5b828201905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061412d601783613d04565b9150614138826140f7565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614179601183613d04565b915061418482614143565b601182019050919050565b600061419a82614120565b91506141a68285613d0f565b91506141b18261416c565b91506141bd8284613d0f565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006141ff601483612ee8565b915061420a826141c9565b602082019050919050565b6000602082019050818103600083015261422e816141f2565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061426b601983612ee8565b915061427682614235565b602082019050919050565b6000602082019050818103600083015261429a8161425e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006142fd603283612ee8565b9150614308826142a1565b604082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061438f602f83612ee8565b915061439a82614333565b604082019050919050565b600060208201905081810360008301526143be81614382565b9050919050565b60006143d082612f98565b91506143db83612f98565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144145761441361403e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061445982612f98565b9150600082141561446d5761446c61403e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006144ae602083612ee8565b91506144b982614478565b602082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061450b826144e4565b61451581856144ef565b9350614525818560208601612ef9565b61452e81612f2c565b840191505092915050565b600060808201905061454e600083018761302d565b61455b602083018661302d565b61456860408301856133a1565b818103606083015261457a8184614500565b905095945050505050565b60008151905061459481612e4e565b92915050565b6000602082840312156145b0576145af612e18565b5b60006145be84828501614585565b91505092915050565b60006145d282612f98565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146055761460461403e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061464a82612f98565b915061465583612f98565b92508261466557614664614610565b5b828204905092915050565b600061467b82612f98565b915061468683612f98565b92508261469657614695614610565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006146d7602083612ee8565b91506146e2826146a1565b602082019050919050565b60006020820190508181036000830152614706816146ca565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614743601c83612ee8565b915061474e8261470d565b602082019050919050565b6000602082019050818103600083015261477281614736565b905091905056fea26469706673582212208c10d02ca6078e1dcf7163ad3773eba080539faaaf5d4d617db1624c2ff55c8764736f6c634300080b0033
Deployed ByteCode Sourcemap
54335:2166:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54410:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36607:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38166:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37689:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56124:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38916:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28379:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54748:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28772:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29820:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56433:65;;;:::i;:::-;;39326:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55950:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33069:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36301:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55007:288;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55564:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36031:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53454:103;;;:::i;:::-;;56364:61;;;:::i;:::-;;54636:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52803:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54812:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27248:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36776:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26339:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38459:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55303:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39582:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50247:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54684:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29164:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38685:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53712:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54410:176;54518:4;54542:36;54566:11;54542:23;:36::i;:::-;54535:43;;54410:176;;;:::o;36607:100::-;36661:13;36694:5;36687:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36607:100;:::o;38166:221::-;38242:7;38270:16;38278:7;38270;:16::i;:::-;38262:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38355:15;:24;38371:7;38355:24;;;;;;;;;;;;;;;;;;;;;38348:31;;38166:221;;;:::o;37689:411::-;37770:13;37786:23;37801:7;37786:14;:23::i;:::-;37770:39;;37834:5;37828:11;;:2;:11;;;;37820:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37928:5;37912:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37937:37;37954:5;37961:12;:10;:12::i;:::-;37937:16;:37::i;:::-;37912:62;37890:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;38071:21;38080:2;38084:7;38071:8;:21::i;:::-;37759:341;37689:411;;:::o;56124:232::-;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56227:40:::1;54858:26;56256:10;56227:7;:40::i;:::-;56219:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;56316:32;56329:7;56338:9;56316:12;:32::i;:::-;56124:232:::0;;:::o;38916:339::-;39111:41;39130:12;:10;:12::i;:::-;39144:7;39111:18;:41::i;:::-;39103:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39219:28;39229:4;39235:2;39239:7;39219:9;:28::i;:::-;38916:339;;;:::o;28379:131::-;28453:7;28480:6;:12;28487:4;28480:12;;;;;;;;;;;:22;;;28473:29;;28379:131;;;:::o;54748:57::-;54786:19;54748:57;:::o;28772:147::-;28855:18;28868:4;28855:12;:18::i;:::-;26830:30;26841:4;26847:12;:10;:12::i;:::-;26830:10;:30::i;:::-;28886:25:::1;28897:4;28903:7;28886:10;:25::i;:::-;28772:147:::0;;;:::o;29820:218::-;29927:12;:10;:12::i;:::-;29916:23;;:7;:23;;;29908:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;30004:26;30016:4;30022:7;30004:11;:26::i;:::-;29820:218;;:::o;56433:65::-;53034:12;:10;:12::i;:::-;53023:23;;:7;:5;:7::i;:::-;:23;;;53015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56480:10:::1;:8;:10::i;:::-;56433:65::o:0;39326:185::-;39464:39;39481:4;39487:2;39491:7;39464:39;;;;;;;;;;;;:16;:39::i;:::-;39326:185;;;:::o;55950:166::-;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56021:32:::1;54786:19;56042:10;56021:7;:32::i;:::-;56013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56094:14;56100:7;56094:5;:14::i;:::-;55950:166:::0;:::o;33069:86::-;33116:4;33140:7;;;;;;;;;;;33133:14;;33069:86;:::o;36301:239::-;36373:7;36393:13;36409:7;:16;36417:7;36409:16;;;;;;;;;;;;;;;;;;;;;36393:32;;36461:1;36444:19;;:5;:19;;;;36436:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36527:5;36520:12;;;36301:239;;;:::o;55007:288::-;55063:7;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55091:32:::1;54722:19;55112:10;55091:7;:32::i;:::-;55083:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55162:40;55172:2;55176:25;:15;:23;:25::i;:::-;55162:9;:40::i;:::-;55215:27;:15;:25;:27::i;:::-;55262:25;:15;:23;:25::i;:::-;55255:32;;55007:288:::0;;;:::o;55564:378::-;55649:7;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55677:32:::1;54722:19;55698:10;55677:7;:32::i;:::-;55669:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55748:40;55758:2;55762:25;:15;:23;:25::i;:::-;55748:9;:40::i;:::-;55799:50;55812:25;:15;:23;:25::i;:::-;55839:9;55799:12;:50::i;:::-;55862:27;:15;:25;:27::i;:::-;55909:25;:15;:23;:25::i;:::-;55902:32;;55564:378:::0;;;;:::o;36031:208::-;36103:7;36148:1;36131:19;;:5;:19;;;;36123:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36215:9;:16;36225:5;36215:16;;;;;;;;;;;;;;;;36208:23;;36031:208;;;:::o;53454:103::-;53034:12;:10;:12::i;:::-;53023:23;;:7;:5;:7::i;:::-;:23;;;53015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53519:30:::1;53546:1;53519:18;:30::i;:::-;53454:103::o:0;56364:61::-;53034:12;:10;:12::i;:::-;53023:23;;:7;:5;:7::i;:::-;:23;;;53015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56409:8:::1;:6;:8::i;:::-;56364:61::o:0;54636:39::-;;;;;;;;;:::o;52803:87::-;52849:7;52876:6;;;;;;;;;;;52869:13;;52803:87;:::o;54812:72::-;54858:26;54812:72;:::o;27248:147::-;27334:4;27358:6;:12;27365:4;27358:12;;;;;;;;;;;:20;;:29;27379:7;27358:29;;;;;;;;;;;;;;;;;;;;;;;;;27351:36;;27248:147;;;;:::o;36776:104::-;36832:13;36865:7;36858:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36776:104;:::o;26339:49::-;26384:4;26339:49;;;:::o;38459:155::-;38554:52;38573:12;:10;:12::i;:::-;38587:8;38597;38554:18;:52::i;:::-;38459:155;;:::o;55303:253::-;55370:7;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55398:32:::1;54722:19;55419:10;55398:7;:32::i;:::-;55390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55469:17;55479:2;55483;55469:9;:17::i;:::-;55499:27;:15;:25;:27::i;:::-;55546:2;55539:9;;55303:253:::0;;;;:::o;39582:328::-;39757:41;39776:12;:10;:12::i;:::-;39790:7;39757:18;:41::i;:::-;39749:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39863:39;39877:4;39883:2;39887:7;39896:5;39863:13;:39::i;:::-;39582:328;;;;:::o;50247:679::-;50320:13;50354:16;50362:7;50354;:16::i;:::-;50346:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50437:23;50463:10;:19;50474:7;50463:19;;;;;;;;;;;50437:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50493:18;50514:10;:8;:10::i;:::-;50493:31;;50622:1;50606:4;50600:18;:23;50596:72;;;50647:9;50640:16;;;;;;50596:72;50798:1;50778:9;50772:23;:27;50768:108;;;50847:4;50853:9;50830:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50816:48;;;;;;50768:108;50895:23;50910:7;50895:14;:23::i;:::-;50888:30;;;;50247:679;;;;:::o;54684:57::-;54722:19;54684:57;:::o;29164:149::-;29248:18;29261:4;29248:12;:18::i;:::-;26830:30;26841:4;26847:12;:10;:12::i;:::-;26830:10;:30::i;:::-;29279:26:::1;29291:4;29297:7;29279:11;:26::i;:::-;29164:149:::0;;;:::o;38685:164::-;38782:4;38806:18;:25;38825:5;38806:25;;;;;;;;;;;;;;;:35;38832:8;38806:35;;;;;;;;;;;;;;;;;;;;;;;;;38799:42;;38685:164;;;;:::o;53712:201::-;53034:12;:10;:12::i;:::-;53023:23;;:7;:5;:7::i;:::-;:23;;;53015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53821:1:::1;53801:22;;:8;:22;;;;53793:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53877:28;53896:8;53877:18;:28::i;:::-;53712:201:::0;:::o;26952:204::-;27037:4;27076:32;27061:47;;;:11;:47;;;;:87;;;;27112:36;27136:11;27112:23;:36::i;:::-;27061:87;27054:94;;26952:204;;;:::o;41420:127::-;41485:4;41537:1;41509:30;;:7;:16;41517:7;41509:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41502:37;;41420:127;;;:::o;24147:98::-;24200:7;24227:10;24220:17;;24147:98;:::o;45566:174::-;45668:2;45641:15;:24;45657:7;45641:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45724:7;45720:2;45686:46;;45695:23;45710:7;45695:14;:23::i;:::-;45686:46;;;;;;;;;;;;45566:174;;:::o;51082:217::-;51182:16;51190:7;51182;:16::i;:::-;51174:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;51282:9;51260:10;:19;51271:7;51260:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;51082:217;;:::o;41714:348::-;41807:4;41832:16;41840:7;41832;:16::i;:::-;41824:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41908:13;41924:23;41939:7;41924:14;:23::i;:::-;41908:39;;41977:5;41966:16;;:7;:16;;;:51;;;;42010:7;41986:31;;:20;41998:7;41986:11;:20::i;:::-;:31;;;41966:51;:87;;;;42021:32;42038:5;42045:7;42021:16;:32::i;:::-;41966:87;41958:96;;;41714:348;;;;:::o;44823:625::-;44982:4;44955:31;;:23;44970:7;44955:14;:23::i;:::-;:31;;;44947:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45061:1;45047:16;;:2;:16;;;;45039:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45117:39;45138:4;45144:2;45148:7;45117:20;:39::i;:::-;45221:29;45238:1;45242:7;45221:8;:29::i;:::-;45282:1;45263:9;:15;45273:4;45263:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;45311:1;45294:9;:13;45304:2;45294:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45342:2;45323:7;:16;45331:7;45323:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45381:7;45377:2;45362:27;;45371:4;45362:27;;;;;;;;;;;;45402:38;45422:4;45428:2;45432:7;45402:19;:38::i;:::-;44823:625;;;:::o;27685:505::-;27774:22;27782:4;27788:7;27774;:22::i;:::-;27769:414;;27962:41;27990:7;27962:41;;28000:2;27962:19;:41::i;:::-;28076:38;28104:4;28096:13;;28111:2;28076:19;:38::i;:::-;27867:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27813:358;;;;;;;;;;;:::i;:::-;;;;;;;;27769:414;27685:505;;:::o;31321:238::-;31405:22;31413:4;31419:7;31405;:22::i;:::-;31400:152;;31476:4;31444:6;:12;31451:4;31444:12;;;;;;;;;;;:20;;:29;31465:7;31444:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;31527:12;:10;:12::i;:::-;31500:40;;31518:7;31500:40;;31512:4;31500:40;;;;;;;;;;31400:152;31321:238;;:::o;31691:239::-;31775:22;31783:4;31789:7;31775;:22::i;:::-;31771:152;;;31846:5;31814:6;:12;31821:4;31814:12;;;;;;;;;;;:20;;:29;31835:7;31814:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;31898:12;:10;:12::i;:::-;31871:40;;31889:7;31871:40;;31883:4;31871:40;;;;;;;;;;31771:152;31691:239;;:::o;34128:120::-;33672:8;:6;:8::i;:::-;33664:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;34197:5:::1;34187:7;;:15;;;;;;;;;;;;;;;;;;34218:22;34227:12;:10;:12::i;:::-;34218:22;;;;;;:::i;:::-;;;;;;;;34128:120::o:0;51528:206::-;51597:20;51609:7;51597:11;:20::i;:::-;51671:1;51640:10;:19;51651:7;51640:19;;;;;;;;;;;51634:33;;;;;:::i;:::-;;;:38;51630:97;;51696:10;:19;51707:7;51696:19;;;;;;;;;;;;51689:26;;;;:::i;:::-;51630:97;51528:206;:::o;3948:114::-;4013:7;4040;:14;;;4033:21;;3948:114;;;:::o;42404:110::-;42480:26;42490:2;42494:7;42480:26;;;;;;;;;;;;:9;:26::i;:::-;42404:110;;:::o;4070:127::-;4177:1;4159:7;:14;;;:19;;;;;;;;;;;4070:127;:::o;54073:191::-;54147:16;54166:6;;;;;;;;;;;54147:25;;54192:8;54183:6;;:17;;;;;;;;;;;;;;;;;;54247:8;54216:40;;54237:8;54216:40;;;;;;;;;;;;54136:128;54073:191;:::o;33869:118::-;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33939:4:::1;33929:7;;:14;;;;;;;;;;;;;;;;;;33959:20;33966:12;:10;:12::i;:::-;33959:20;;;;;;:::i;:::-;;;;;;;;33869:118::o:0;45882:315::-;46037:8;46028:17;;:5;:17;;;;46020:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46124:8;46086:18;:25;46105:5;46086:25;;;;;;;;;;;;;;;:35;46112:8;46086:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46170:8;46148:41;;46163:5;46148:41;;;46180:8;46148:41;;;;;;:::i;:::-;;;;;;;;45882:315;;;:::o;40792:::-;40949:28;40959:4;40965:2;40969:7;40949:9;:28::i;:::-;40996:48;41019:4;41025:2;41029:7;41038:5;40996:22;:48::i;:::-;40988:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;40792:315;;;;:::o;37533:94::-;37584:13;37610:9;;;;;;;;;;;;;;37533:94;:::o;36951:334::-;37024:13;37058:16;37066:7;37058;:16::i;:::-;37050:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37139:21;37163:10;:8;:10::i;:::-;37139:34;;37215:1;37197:7;37191:21;:25;:86;;;;;;;;;;;;;;;;;37243:7;37252:18;:7;:16;:18::i;:::-;37226:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37191:86;37184:93;;;36951:334;;;:::o;35662:305::-;35764:4;35816:25;35801:40;;;:11;:40;;;;:105;;;;35873:33;35858:48;;;:11;:48;;;;35801:105;:158;;;;35923:36;35947:11;35923:23;:36::i;:::-;35801:158;35781:178;;35662:305;;;:::o;48133:126::-;;;;:::o;48644:125::-;;;;:::o;6207:451::-;6282:13;6308:19;6353:1;6344:6;6340:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6330:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6308:47;;6366:15;:6;6373:1;6366:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6392;:6;6399:1;6392:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6423:9;6448:1;6439:6;6435:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6423:26;;6418:135;6455:1;6451;:5;6418:135;;;6490:12;6511:3;6503:5;:11;6490:25;;;;;;;:::i;:::-;;;;;6478:6;6485:1;6478:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;6540:1;6530:11;;;;;6458:3;;;;:::i;:::-;;;6418:135;;;;6580:1;6571:5;:10;6563:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6643:6;6629:21;;;6207:451;;;;:::o;44066:420::-;44126:13;44142:23;44157:7;44142:14;:23::i;:::-;44126:39;;44178:48;44199:5;44214:1;44218:7;44178:20;:48::i;:::-;44267:29;44284:1;44288:7;44267:8;:29::i;:::-;44329:1;44309:9;:16;44319:5;44309:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;44348:7;:16;44356:7;44348:16;;;;;;;;;;;;44341:23;;;;;;;;;;;44410:7;44406:1;44382:36;;44391:5;44382:36;;;;;;;;;;;;44431:47;44451:5;44466:1;44470:7;44431:19;:47::i;:::-;44115:371;44066:420;:::o;42741:321::-;42871:18;42877:2;42881:7;42871:5;:18::i;:::-;42922:54;42953:1;42957:2;42961:7;42970:5;42922:22;:54::i;:::-;42900:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;42741:321;;;:::o;46762:799::-;46917:4;46938:15;:2;:13;;;:15::i;:::-;46934:620;;;46990:2;46974:36;;;47011:12;:10;:12::i;:::-;47025:4;47031:7;47040:5;46974:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46970:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47233:1;47216:6;:13;:18;47212:272;;;47259:60;;;;;;;;;;:::i;:::-;;;;;;;;47212:272;47434:6;47428:13;47419:6;47415:2;47411:15;47404:38;46970:529;47107:41;;;47097:51;;;:6;:51;;;;47090:58;;;;;46934:620;47538:4;47531:11;;46762:799;;;;;;;:::o;4906:723::-;4962:13;5192:1;5183:5;:10;5179:53;;;5210:10;;;;;;;;;;;;;;;;;;;;;5179:53;5242:12;5257:5;5242:20;;5273:14;5298:78;5313:1;5305:4;:9;5298:78;;5331:8;;;;;:::i;:::-;;;;5362:2;5354:10;;;;;:::i;:::-;;;5298:78;;;5386:19;5418:6;5408:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5386:39;;5436:154;5452:1;5443:5;:10;5436:154;;5480:1;5470:11;;;;;:::i;:::-;;;5547:2;5539:5;:10;;;;:::i;:::-;5526:2;:24;;;;:::i;:::-;5513:39;;5496:6;5503;5496:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5576:2;5567:11;;;;;:::i;:::-;;;5436:154;;;5614:6;5600:21;;;;;4906:723;;;;:::o;17629:157::-;17714:4;17753:25;17738:40;;;:11;:40;;;;17731:47;;17629:157;;;:::o;43398:439::-;43492:1;43478:16;;:2;:16;;;;43470:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43551:16;43559:7;43551;:16::i;:::-;43550:17;43542:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43613:45;43642:1;43646:2;43650:7;43613:20;:45::i;:::-;43688:1;43671:9;:13;43681:2;43671:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43719:2;43700:7;:16;43708:7;43700:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43764:7;43760:2;43739:33;;43756:1;43739:33;;;;;;;;;;;;43785:44;43813:1;43817:2;43821:7;43785:19;:44::i;:::-;43398:439;;:::o;7485:387::-;7545:4;7753:12;7820:7;7808:20;7800:28;;7863:1;7856:4;:8;7849:15;;;7485:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:654::-;7122:6;7130;7179:2;7167:9;7158:7;7154:23;7150:32;7147:119;;;7185:79;;:::i;:::-;7147:119;7305:1;7330:53;7375:7;7366:6;7355:9;7351:22;7330:53;:::i;:::-;7320:63;;7276:117;7460:2;7449:9;7445:18;7432:32;7491:18;7483:6;7480:30;7477:117;;;7513:79;;:::i;:::-;7477:117;7618:63;7673:7;7664:6;7653:9;7649:22;7618:63;:::i;:::-;7608:73;;7403:288;7044:654;;;;;:::o;7704:619::-;7781:6;7789;7797;7846:2;7834:9;7825:7;7821:23;7817:32;7814:119;;;7852:79;;:::i;:::-;7814:119;7972:1;7997:53;8042:7;8033:6;8022:9;8018:22;7997:53;:::i;:::-;7987:63;;7943:117;8099:2;8125:53;8170:7;8161:6;8150:9;8146:22;8125:53;:::i;:::-;8115:63;;8070:118;8227:2;8253:53;8298:7;8289:6;8278:9;8274:22;8253:53;:::i;:::-;8243:63;;8198:118;7704:619;;;;;:::o;8329:77::-;8366:7;8395:5;8384:16;;8329:77;;;:::o;8412:122::-;8485:24;8503:5;8485:24;:::i;:::-;8478:5;8475:35;8465:63;;8524:1;8521;8514:12;8465:63;8412:122;:::o;8540:139::-;8586:5;8624:6;8611:20;8602:29;;8640:33;8667:5;8640:33;:::i;:::-;8540:139;;;;:::o;8685:329::-;8744:6;8793:2;8781:9;8772:7;8768:23;8764:32;8761:119;;;8799:79;;:::i;:::-;8761:119;8919:1;8944:53;8989:7;8980:6;8969:9;8965:22;8944:53;:::i;:::-;8934:63;;8890:117;8685:329;;;;:::o;9020:118::-;9107:24;9125:5;9107:24;:::i;:::-;9102:3;9095:37;9020:118;;:::o;9144:222::-;9237:4;9275:2;9264:9;9260:18;9252:26;;9288:71;9356:1;9345:9;9341:17;9332:6;9288:71;:::i;:::-;9144:222;;;;:::o;9372:474::-;9440:6;9448;9497:2;9485:9;9476:7;9472:23;9468:32;9465:119;;;9503:79;;:::i;:::-;9465:119;9623:1;9648:53;9693:7;9684:6;9673:9;9669:22;9648:53;:::i;:::-;9638:63;;9594:117;9750:2;9776:53;9821:7;9812:6;9801:9;9797:22;9776:53;:::i;:::-;9766:63;;9721:118;9372:474;;;;;:::o;9852:329::-;9911:6;9960:2;9948:9;9939:7;9935:23;9931:32;9928:119;;;9966:79;;:::i;:::-;9928:119;10086:1;10111:53;10156:7;10147:6;10136:9;10132:22;10111:53;:::i;:::-;10101:63;;10057:117;9852:329;;;;:::o;10187:118::-;10274:24;10292:5;10274:24;:::i;:::-;10269:3;10262:37;10187:118;;:::o;10311:222::-;10404:4;10442:2;10431:9;10427:18;10419:26;;10455:71;10523:1;10512:9;10508:17;10499:6;10455:71;:::i;:::-;10311:222;;;;:::o;10539:654::-;10617:6;10625;10674:2;10662:9;10653:7;10649:23;10645:32;10642:119;;;10680:79;;:::i;:::-;10642:119;10800:1;10825:53;10870:7;10861:6;10850:9;10846:22;10825:53;:::i;:::-;10815:63;;10771:117;10955:2;10944:9;10940:18;10927:32;10986:18;10978:6;10975:30;10972:117;;;11008:79;;:::i;:::-;10972:117;11113:63;11168:7;11159:6;11148:9;11144:22;11113:63;:::i;:::-;11103:73;;10898:288;10539:654;;;;;:::o;11199:116::-;11269:21;11284:5;11269:21;:::i;:::-;11262:5;11259:32;11249:60;;11305:1;11302;11295:12;11249:60;11199:116;:::o;11321:133::-;11364:5;11402:6;11389:20;11380:29;;11418:30;11442:5;11418:30;:::i;:::-;11321:133;;;;:::o;11460:468::-;11525:6;11533;11582:2;11570:9;11561:7;11557:23;11553:32;11550:119;;;11588:79;;:::i;:::-;11550:119;11708:1;11733:53;11778:7;11769:6;11758:9;11754:22;11733:53;:::i;:::-;11723:63;;11679:117;11835:2;11861:50;11903:7;11894:6;11883:9;11879:22;11861:50;:::i;:::-;11851:60;;11806:115;11460:468;;;;;:::o;11934:307::-;11995:4;12085:18;12077:6;12074:30;12071:56;;;12107:18;;:::i;:::-;12071:56;12145:29;12167:6;12145:29;:::i;:::-;12137:37;;12229:4;12223;12219:15;12211:23;;11934:307;;;:::o;12247:410::-;12324:5;12349:65;12365:48;12406:6;12365:48;:::i;:::-;12349:65;:::i;:::-;12340:74;;12437:6;12430:5;12423:21;12475:4;12468:5;12464:16;12513:3;12504:6;12499:3;12495:16;12492:25;12489:112;;;12520:79;;:::i;:::-;12489:112;12610:41;12644:6;12639:3;12634;12610:41;:::i;:::-;12330:327;12247:410;;;;;:::o;12676:338::-;12731:5;12780:3;12773:4;12765:6;12761:17;12757:27;12747:122;;12788:79;;:::i;:::-;12747:122;12905:6;12892:20;12930:78;13004:3;12996:6;12989:4;12981:6;12977:17;12930:78;:::i;:::-;12921:87;;12737:277;12676:338;;;;:::o;13020:943::-;13115:6;13123;13131;13139;13188:3;13176:9;13167:7;13163:23;13159:33;13156:120;;;13195:79;;:::i;:::-;13156:120;13315:1;13340:53;13385:7;13376:6;13365:9;13361:22;13340:53;:::i;:::-;13330:63;;13286:117;13442:2;13468:53;13513:7;13504:6;13493:9;13489:22;13468:53;:::i;:::-;13458:63;;13413:118;13570:2;13596:53;13641:7;13632:6;13621:9;13617:22;13596:53;:::i;:::-;13586:63;;13541:118;13726:2;13715:9;13711:18;13698:32;13757:18;13749:6;13746:30;13743:117;;;13779:79;;:::i;:::-;13743:117;13884:62;13938:7;13929:6;13918:9;13914:22;13884:62;:::i;:::-;13874:72;;13669:287;13020:943;;;;;;;:::o;13969:474::-;14037:6;14045;14094:2;14082:9;14073:7;14069:23;14065:32;14062:119;;;14100:79;;:::i;:::-;14062:119;14220:1;14245:53;14290:7;14281:6;14270:9;14266:22;14245:53;:::i;:::-;14235:63;;14191:117;14347:2;14373:53;14418:7;14409:6;14398:9;14394:22;14373:53;:::i;:::-;14363:63;;14318:118;13969:474;;;;;:::o;14449:180::-;14497:77;14494:1;14487:88;14594:4;14591:1;14584:15;14618:4;14615:1;14608:15;14635:320;14679:6;14716:1;14710:4;14706:12;14696:22;;14763:1;14757:4;14753:12;14784:18;14774:81;;14840:4;14832:6;14828:17;14818:27;;14774:81;14902:2;14894:6;14891:14;14871:18;14868:38;14865:84;;;14921:18;;:::i;:::-;14865:84;14686:269;14635:320;;;:::o;14961:231::-;15101:34;15097:1;15089:6;15085:14;15078:58;15170:14;15165:2;15157:6;15153:15;15146:39;14961:231;:::o;15198:366::-;15340:3;15361:67;15425:2;15420:3;15361:67;:::i;:::-;15354:74;;15437:93;15526:3;15437:93;:::i;:::-;15555:2;15550:3;15546:12;15539:19;;15198:366;;;:::o;15570:419::-;15736:4;15774:2;15763:9;15759:18;15751:26;;15823:9;15817:4;15813:20;15809:1;15798:9;15794:17;15787:47;15851:131;15977:4;15851:131;:::i;:::-;15843:139;;15570:419;;;:::o;15995:220::-;16135:34;16131:1;16123:6;16119:14;16112:58;16204:3;16199:2;16191:6;16187:15;16180:28;15995:220;:::o;16221:366::-;16363:3;16384:67;16448:2;16443:3;16384:67;:::i;:::-;16377:74;;16460:93;16549:3;16460:93;:::i;:::-;16578:2;16573:3;16569:12;16562:19;;16221:366;;;:::o;16593:419::-;16759:4;16797:2;16786:9;16782:18;16774:26;;16846:9;16840:4;16836:20;16832:1;16821:9;16817:17;16810:47;16874:131;17000:4;16874:131;:::i;:::-;16866:139;;16593:419;;;:::o;17018:243::-;17158:34;17154:1;17146:6;17142:14;17135:58;17227:26;17222:2;17214:6;17210:15;17203:51;17018:243;:::o;17267:366::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17267:366;;;:::o;17639:419::-;17805:4;17843:2;17832:9;17828:18;17820:26;;17892:9;17886:4;17882:20;17878:1;17867:9;17863:17;17856:47;17920:131;18046:4;17920:131;:::i;:::-;17912:139;;17639:419;;;:::o;18064:166::-;18204:18;18200:1;18192:6;18188:14;18181:42;18064:166;:::o;18236:366::-;18378:3;18399:67;18463:2;18458:3;18399:67;:::i;:::-;18392:74;;18475:93;18564:3;18475:93;:::i;:::-;18593:2;18588:3;18584:12;18577:19;;18236:366;;;:::o;18608:419::-;18774:4;18812:2;18801:9;18797:18;18789:26;;18861:9;18855:4;18851:20;18847:1;18836:9;18832:17;18825:47;18889:131;19015:4;18889:131;:::i;:::-;18881:139;;18608:419;;;:::o;19033:181::-;19173:33;19169:1;19161:6;19157:14;19150:57;19033:181;:::o;19220:366::-;19362:3;19383:67;19447:2;19442:3;19383:67;:::i;:::-;19376:74;;19459:93;19548:3;19459:93;:::i;:::-;19577:2;19572:3;19568:12;19561:19;;19220:366;;;:::o;19592:419::-;19758:4;19796:2;19785:9;19781:18;19773:26;;19845:9;19839:4;19835:20;19831:1;19820:9;19816:17;19809:47;19873:131;19999:4;19873:131;:::i;:::-;19865:139;;19592:419;;;:::o;20017:236::-;20157:34;20153:1;20145:6;20141:14;20134:58;20226:19;20221:2;20213:6;20209:15;20202:44;20017:236;:::o;20259:366::-;20401:3;20422:67;20486:2;20481:3;20422:67;:::i;:::-;20415:74;;20498:93;20587:3;20498:93;:::i;:::-;20616:2;20611:3;20607:12;20600:19;;20259:366;;;:::o;20631:419::-;20797:4;20835:2;20824:9;20820:18;20812:26;;20884:9;20878:4;20874:20;20870:1;20859:9;20855:17;20848:47;20912:131;21038:4;20912:131;:::i;:::-;20904:139;;20631:419;;;:::o;21056:234::-;21196:34;21192:1;21184:6;21180:14;21173:58;21265:17;21260:2;21252:6;21248:15;21241:42;21056:234;:::o;21296:366::-;21438:3;21459:67;21523:2;21518:3;21459:67;:::i;:::-;21452:74;;21535:93;21624:3;21535:93;:::i;:::-;21653:2;21648:3;21644:12;21637:19;;21296:366;;;:::o;21668:419::-;21834:4;21872:2;21861:9;21857:18;21849:26;;21921:9;21915:4;21911:20;21907:1;21896:9;21892:17;21885:47;21949:131;22075:4;21949:131;:::i;:::-;21941:139;;21668:419;;;:::o;22093:182::-;22233:34;22229:1;22221:6;22217:14;22210:58;22093:182;:::o;22281:366::-;22423:3;22444:67;22508:2;22503:3;22444:67;:::i;:::-;22437:74;;22520:93;22609:3;22520:93;:::i;:::-;22638:2;22633:3;22629:12;22622:19;;22281:366;;;:::o;22653:419::-;22819:4;22857:2;22846:9;22842:18;22834:26;;22906:9;22900:4;22896:20;22892:1;22881:9;22877:17;22870:47;22934:131;23060:4;22934:131;:::i;:::-;22926:139;;22653:419;;;:::o;23078:173::-;23218:25;23214:1;23206:6;23202:14;23195:49;23078:173;:::o;23257:366::-;23399:3;23420:67;23484:2;23479:3;23420:67;:::i;:::-;23413:74;;23496:93;23585:3;23496:93;:::i;:::-;23614:2;23609:3;23605:12;23598:19;;23257:366;;;:::o;23629:419::-;23795:4;23833:2;23822:9;23818:18;23810:26;;23882:9;23876:4;23872:20;23868:1;23857:9;23853:17;23846:47;23910:131;24036:4;23910:131;:::i;:::-;23902:139;;23629:419;;;:::o;24054:228::-;24194:34;24190:1;24182:6;24178:14;24171:58;24263:11;24258:2;24250:6;24246:15;24239:36;24054:228;:::o;24288:366::-;24430:3;24451:67;24515:2;24510:3;24451:67;:::i;:::-;24444:74;;24527:93;24616:3;24527:93;:::i;:::-;24645:2;24640:3;24636:12;24629:19;;24288:366;;;:::o;24660:419::-;24826:4;24864:2;24853:9;24849:18;24841:26;;24913:9;24907:4;24903:20;24899:1;24888:9;24884:17;24877:47;24941:131;25067:4;24941:131;:::i;:::-;24933:139;;24660:419;;;:::o;25085:173::-;25225:25;25221:1;25213:6;25209:14;25202:49;25085:173;:::o;25264:366::-;25406:3;25427:67;25491:2;25486:3;25427:67;:::i;:::-;25420:74;;25503:93;25592:3;25503:93;:::i;:::-;25621:2;25616:3;25612:12;25605:19;;25264:366;;;:::o;25636:419::-;25802:4;25840:2;25829:9;25825:18;25817:26;;25889:9;25883:4;25879:20;25875:1;25864:9;25860:17;25853:47;25917:131;26043:4;25917:131;:::i;:::-;25909:139;;25636:419;;;:::o;26061:229::-;26201:34;26197:1;26189:6;26185:14;26178:58;26270:12;26265:2;26257:6;26253:15;26246:37;26061:229;:::o;26296:366::-;26438:3;26459:67;26523:2;26518:3;26459:67;:::i;:::-;26452:74;;26535:93;26624:3;26535:93;:::i;:::-;26653:2;26648:3;26644:12;26637:19;;26296:366;;;:::o;26668:419::-;26834:4;26872:2;26861:9;26857:18;26849:26;;26921:9;26915:4;26911:20;26907:1;26896:9;26892:17;26885:47;26949:131;27075:4;26949:131;:::i;:::-;26941:139;;26668:419;;;:::o;27093:236::-;27233:34;27229:1;27221:6;27217:14;27210:58;27302:19;27297:2;27289:6;27285:15;27278:44;27093:236;:::o;27335:366::-;27477:3;27498:67;27562:2;27557:3;27498:67;:::i;:::-;27491:74;;27574:93;27663:3;27574:93;:::i;:::-;27692:2;27687:3;27683:12;27676:19;;27335:366;;;:::o;27707:419::-;27873:4;27911:2;27900:9;27896:18;27888:26;;27960:9;27954:4;27950:20;27946:1;27935:9;27931:17;27924:47;27988:131;28114:4;27988:131;:::i;:::-;27980:139;;27707:419;;;:::o;28132:148::-;28234:11;28271:3;28256:18;;28132:148;;;;:::o;28286:377::-;28392:3;28420:39;28453:5;28420:39;:::i;:::-;28475:89;28557:6;28552:3;28475:89;:::i;:::-;28468:96;;28573:52;28618:6;28613:3;28606:4;28599:5;28595:16;28573:52;:::i;:::-;28650:6;28645:3;28641:16;28634:23;;28396:267;28286:377;;;;:::o;28669:435::-;28849:3;28871:95;28962:3;28953:6;28871:95;:::i;:::-;28864:102;;28983:95;29074:3;29065:6;28983:95;:::i;:::-;28976:102;;29095:3;29088:10;;28669:435;;;;;:::o;29110:225::-;29250:34;29246:1;29238:6;29234:14;29227:58;29319:8;29314:2;29306:6;29302:15;29295:33;29110:225;:::o;29341:366::-;29483:3;29504:67;29568:2;29563:3;29504:67;:::i;:::-;29497:74;;29580:93;29669:3;29580:93;:::i;:::-;29698:2;29693:3;29689:12;29682:19;;29341:366;;;:::o;29713:419::-;29879:4;29917:2;29906:9;29902:18;29894:26;;29966:9;29960:4;29956:20;29952:1;29941:9;29937:17;29930:47;29994:131;30120:4;29994:131;:::i;:::-;29986:139;;29713:419;;;:::o;30138:233::-;30278:34;30274:1;30266:6;30262:14;30255:58;30347:16;30342:2;30334:6;30330:15;30323:41;30138:233;:::o;30377:366::-;30519:3;30540:67;30604:2;30599:3;30540:67;:::i;:::-;30533:74;;30616:93;30705:3;30616:93;:::i;:::-;30734:2;30729:3;30725:12;30718:19;;30377:366;;;:::o;30749:419::-;30915:4;30953:2;30942:9;30938:18;30930:26;;31002:9;30996:4;30992:20;30988:1;30977:9;30973:17;30966:47;31030:131;31156:4;31030:131;:::i;:::-;31022:139;;30749:419;;;:::o;31174:231::-;31314:34;31310:1;31302:6;31298:14;31291:58;31383:14;31378:2;31370:6;31366:15;31359:39;31174:231;:::o;31411:366::-;31553:3;31574:67;31638:2;31633:3;31574:67;:::i;:::-;31567:74;;31650:93;31739:3;31650:93;:::i;:::-;31768:2;31763:3;31759:12;31752:19;;31411:366;;;:::o;31783:419::-;31949:4;31987:2;31976:9;31972:18;31964:26;;32036:9;32030:4;32026:20;32022:1;32011:9;32007:17;32000:47;32064:131;32190:4;32064:131;:::i;:::-;32056:139;;31783:419;;;:::o;32208:224::-;32348:34;32344:1;32336:6;32332:14;32325:58;32417:7;32412:2;32404:6;32400:15;32393:32;32208:224;:::o;32438:366::-;32580:3;32601:67;32665:2;32660:3;32601:67;:::i;:::-;32594:74;;32677:93;32766:3;32677:93;:::i;:::-;32795:2;32790:3;32786:12;32779:19;;32438:366;;;:::o;32810:419::-;32976:4;33014:2;33003:9;32999:18;32991:26;;33063:9;33057:4;33053:20;33049:1;33038:9;33034:17;33027:47;33091:131;33217:4;33091:131;:::i;:::-;33083:139;;32810:419;;;:::o;33235:223::-;33375:34;33371:1;33363:6;33359:14;33352:58;33444:6;33439:2;33431:6;33427:15;33420:31;33235:223;:::o;33464:366::-;33606:3;33627:67;33691:2;33686:3;33627:67;:::i;:::-;33620:74;;33703:93;33792:3;33703:93;:::i;:::-;33821:2;33816:3;33812:12;33805:19;;33464:366;;;:::o;33836:419::-;34002:4;34040:2;34029:9;34025:18;34017:26;;34089:9;34083:4;34079:20;34075:1;34064:9;34060:17;34053:47;34117:131;34243:4;34117:131;:::i;:::-;34109:139;;33836:419;;;:::o;34261:180::-;34309:77;34306:1;34299:88;34406:4;34403:1;34396:15;34430:4;34427:1;34420:15;34447:191;34487:4;34507:20;34525:1;34507:20;:::i;:::-;34502:25;;34541:20;34559:1;34541:20;:::i;:::-;34536:25;;34580:1;34577;34574:8;34571:34;;;34585:18;;:::i;:::-;34571:34;34630:1;34627;34623:9;34615:17;;34447:191;;;;:::o;34644:305::-;34684:3;34703:20;34721:1;34703:20;:::i;:::-;34698:25;;34737:20;34755:1;34737:20;:::i;:::-;34732:25;;34891:1;34823:66;34819:74;34816:1;34813:81;34810:107;;;34897:18;;:::i;:::-;34810:107;34941:1;34938;34934:9;34927:16;;34644:305;;;;:::o;34955:173::-;35095:25;35091:1;35083:6;35079:14;35072:49;34955:173;:::o;35134:402::-;35294:3;35315:85;35397:2;35392:3;35315:85;:::i;:::-;35308:92;;35409:93;35498:3;35409:93;:::i;:::-;35527:2;35522:3;35518:12;35511:19;;35134:402;;;:::o;35542:167::-;35682:19;35678:1;35670:6;35666:14;35659:43;35542:167;:::o;35715:402::-;35875:3;35896:85;35978:2;35973:3;35896:85;:::i;:::-;35889:92;;35990:93;36079:3;35990:93;:::i;:::-;36108:2;36103:3;36099:12;36092:19;;35715:402;;;:::o;36123:967::-;36505:3;36527:148;36671:3;36527:148;:::i;:::-;36520:155;;36692:95;36783:3;36774:6;36692:95;:::i;:::-;36685:102;;36804:148;36948:3;36804:148;:::i;:::-;36797:155;;36969:95;37060:3;37051:6;36969:95;:::i;:::-;36962:102;;37081:3;37074:10;;36123:967;;;;;:::o;37096:170::-;37236:22;37232:1;37224:6;37220:14;37213:46;37096:170;:::o;37272:366::-;37414:3;37435:67;37499:2;37494:3;37435:67;:::i;:::-;37428:74;;37511:93;37600:3;37511:93;:::i;:::-;37629:2;37624:3;37620:12;37613:19;;37272:366;;;:::o;37644:419::-;37810:4;37848:2;37837:9;37833:18;37825:26;;37897:9;37891:4;37887:20;37883:1;37872:9;37868:17;37861:47;37925:131;38051:4;37925:131;:::i;:::-;37917:139;;37644:419;;;:::o;38069:175::-;38209:27;38205:1;38197:6;38193:14;38186:51;38069:175;:::o;38250:366::-;38392:3;38413:67;38477:2;38472:3;38413:67;:::i;:::-;38406:74;;38489:93;38578:3;38489:93;:::i;:::-;38607:2;38602:3;38598:12;38591:19;;38250:366;;;:::o;38622:419::-;38788:4;38826:2;38815:9;38811:18;38803:26;;38875:9;38869:4;38865:20;38861:1;38850:9;38846:17;38839:47;38903:131;39029:4;38903:131;:::i;:::-;38895:139;;38622:419;;;:::o;39047:237::-;39187:34;39183:1;39175:6;39171:14;39164:58;39256:20;39251:2;39243:6;39239:15;39232:45;39047:237;:::o;39290:366::-;39432:3;39453:67;39517:2;39512:3;39453:67;:::i;:::-;39446:74;;39529:93;39618:3;39529:93;:::i;:::-;39647:2;39642:3;39638:12;39631:19;;39290:366;;;:::o;39662:419::-;39828:4;39866:2;39855:9;39851:18;39843:26;;39915:9;39909:4;39905:20;39901:1;39890:9;39886:17;39879:47;39943:131;40069:4;39943:131;:::i;:::-;39935:139;;39662:419;;;:::o;40087:234::-;40227:34;40223:1;40215:6;40211:14;40204:58;40296:17;40291:2;40283:6;40279:15;40272:42;40087:234;:::o;40327:366::-;40469:3;40490:67;40554:2;40549:3;40490:67;:::i;:::-;40483:74;;40566:93;40655:3;40566:93;:::i;:::-;40684:2;40679:3;40675:12;40668:19;;40327:366;;;:::o;40699:419::-;40865:4;40903:2;40892:9;40888:18;40880:26;;40952:9;40946:4;40942:20;40938:1;40927:9;40923:17;40916:47;40980:131;41106:4;40980:131;:::i;:::-;40972:139;;40699:419;;;:::o;41124:348::-;41164:7;41187:20;41205:1;41187:20;:::i;:::-;41182:25;;41221:20;41239:1;41221:20;:::i;:::-;41216:25;;41409:1;41341:66;41337:74;41334:1;41331:81;41326:1;41319:9;41312:17;41308:105;41305:131;;;41416:18;;:::i;:::-;41305:131;41464:1;41461;41457:9;41446:20;;41124:348;;;;:::o;41478:180::-;41526:77;41523:1;41516:88;41623:4;41620:1;41613:15;41647:4;41644:1;41637:15;41664:171;41703:3;41726:24;41744:5;41726:24;:::i;:::-;41717:33;;41772:4;41765:5;41762:15;41759:41;;;41780:18;;:::i;:::-;41759:41;41827:1;41820:5;41816:13;41809:20;;41664:171;;;:::o;41841:182::-;41981:34;41977:1;41969:6;41965:14;41958:58;41841:182;:::o;42029:366::-;42171:3;42192:67;42256:2;42251:3;42192:67;:::i;:::-;42185:74;;42268:93;42357:3;42268:93;:::i;:::-;42386:2;42381:3;42377:12;42370:19;;42029:366;;;:::o;42401:419::-;42567:4;42605:2;42594:9;42590:18;42582:26;;42654:9;42648:4;42644:20;42640:1;42629:9;42625:17;42618:47;42682:131;42808:4;42682:131;:::i;:::-;42674:139;;42401:419;;;:::o;42826:98::-;42877:6;42911:5;42905:12;42895:22;;42826:98;;;:::o;42930:168::-;43013:11;43047:6;43042:3;43035:19;43087:4;43082:3;43078:14;43063:29;;42930:168;;;;:::o;43104:360::-;43190:3;43218:38;43250:5;43218:38;:::i;:::-;43272:70;43335:6;43330:3;43272:70;:::i;:::-;43265:77;;43351:52;43396:6;43391:3;43384:4;43377:5;43373:16;43351:52;:::i;:::-;43428:29;43450:6;43428:29;:::i;:::-;43423:3;43419:39;43412:46;;43194:270;43104:360;;;;:::o;43470:640::-;43665:4;43703:3;43692:9;43688:19;43680:27;;43717:71;43785:1;43774:9;43770:17;43761:6;43717:71;:::i;:::-;43798:72;43866:2;43855:9;43851:18;43842:6;43798:72;:::i;:::-;43880;43948:2;43937:9;43933:18;43924:6;43880:72;:::i;:::-;43999:9;43993:4;43989:20;43984:2;43973:9;43969:18;43962:48;44027:76;44098:4;44089:6;44027:76;:::i;:::-;44019:84;;43470:640;;;;;;;:::o;44116:141::-;44172:5;44203:6;44197:13;44188:22;;44219:32;44245:5;44219:32;:::i;:::-;44116:141;;;;:::o;44263:349::-;44332:6;44381:2;44369:9;44360:7;44356:23;44352:32;44349:119;;;44387:79;;:::i;:::-;44349:119;44507:1;44532:63;44587:7;44578:6;44567:9;44563:22;44532:63;:::i;:::-;44522:73;;44478:127;44263:349;;;;:::o;44618:233::-;44657:3;44680:24;44698:5;44680:24;:::i;:::-;44671:33;;44726:66;44719:5;44716:77;44713:103;;;44796:18;;:::i;:::-;44713:103;44843:1;44836:5;44832:13;44825:20;;44618:233;;;:::o;44857:180::-;44905:77;44902:1;44895:88;45002:4;44999:1;44992:15;45026:4;45023:1;45016:15;45043:185;45083:1;45100:20;45118:1;45100:20;:::i;:::-;45095:25;;45134:20;45152:1;45134:20;:::i;:::-;45129:25;;45173:1;45163:35;;45178:18;;:::i;:::-;45163:35;45220:1;45217;45213:9;45208:14;;45043:185;;;;:::o;45234:176::-;45266:1;45283:20;45301:1;45283:20;:::i;:::-;45278:25;;45317:20;45335:1;45317:20;:::i;:::-;45312:25;;45356:1;45346:35;;45361:18;;:::i;:::-;45346:35;45402:1;45399;45395:9;45390:14;;45234:176;;;;:::o;45416:182::-;45556:34;45552:1;45544:6;45540:14;45533:58;45416:182;:::o;45604:366::-;45746:3;45767:67;45831:2;45826:3;45767:67;:::i;:::-;45760:74;;45843:93;45932:3;45843:93;:::i;:::-;45961:2;45956:3;45952:12;45945:19;;45604:366;;;:::o;45976:419::-;46142:4;46180:2;46169:9;46165:18;46157:26;;46229:9;46223:4;46219:20;46215:1;46204:9;46200:17;46193:47;46257:131;46383:4;46257:131;:::i;:::-;46249:139;;45976:419;;;:::o;46401:178::-;46541:30;46537:1;46529:6;46525:14;46518:54;46401:178;:::o;46585:366::-;46727:3;46748:67;46812:2;46807:3;46748:67;:::i;:::-;46741:74;;46824:93;46913:3;46824:93;:::i;:::-;46942:2;46937:3;46933:12;46926:19;;46585:366;;;:::o;46957:419::-;47123:4;47161:2;47150:9;47146:18;47138:26;;47210:9;47204:4;47200:20;47196:1;47185:9;47181:17;47174:47;47238:131;47364:4;47238:131;:::i;:::-;47230:139;;46957:419;;;:::o
Swarm Source
ipfs://8c10d02ca6078e1dcf7163ad3773eba080539faaaf5d4d617db1624c2ff55c87