Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DefusionAi
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "../interface/IDefusionAi.sol"; contract DefusionAi is IDefusionAi, AccessControl, ERC721Enumerable, Ownable, ReentrancyGuard { using Strings for uint256; bool private initialized; string private baseURI; uint256 private _tokenId; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; mapping(uint256 => TokenInfo) private tokenInfos; mapping(uint256 => bool) private _usedTokenIds; string constant ROLE_MINTER_STR = "MINTER"; // 0xf0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9 bytes32 constant ROLE_MINTER = keccak256(bytes(ROLE_MINTER_STR)); string constant ROLE_MINTER_ADMIN_STR = "MINTER_ADMIN"; // 0x498a9dae57f391d8efcc7bb3e7440ad6a25b1261044ef1b555c5484cb9f67659 bytes32 constant ROLE_MINTER_ADMIN = keccak256(bytes(ROLE_MINTER_ADMIN_STR)); event AINFTMint(address indexed account, uint256 indexed tokenId); event URIPrefix(string indexed baseURI); event SetMinterAdmin(bytes32 role, bytes32 adminRole, address admin); event RevokeMinterAdmin(bytes32 role, bytes32 adminRole, address admin); event SetTokenURI(uint256 indexed tokenId, string uri); constructor() ERC721("DEFUSION.AI", "DEFUSION") {} function initialize( address _owner ) external { require(!initialized, "initialize: Already initialized!"); _transferOwnership(_owner); baseURI = "https://defusion.ai/api/v1/metadata/eth/"; _setRoleAdmin(ROLE_MINTER, ROLE_MINTER_ADMIN); _setupRole(ROLE_MINTER_ADMIN, _owner); initialized = true; } function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } function setMinterAdmin(address minterAdmin) external onlyOwner { _setupRole(ROLE_MINTER_ADMIN, minterAdmin); emit SetMinterAdmin(ROLE_MINTER, ROLE_MINTER_ADMIN, minterAdmin); } function revokeMinterAdmin(address minterAdmin) external onlyOwner { _revokeRole(ROLE_MINTER_ADMIN, minterAdmin); emit RevokeMinterAdmin(ROLE_MINTER, ROLE_MINTER_ADMIN, minterAdmin); } function usedTokenId(uint256 tokenId) public view returns (bool) { return _usedTokenIds[tokenId]; } function mint( address to, uint256 tokenId, TokenInfo calldata tokenInfo ) external override nonReentrant returns (uint256) { require( hasRole(ROLE_MINTER, msg.sender), "DEFUSIONAI: Caller is not a minter" ); _mint(to, tokenId); _usedTokenIds[tokenId] = true; tokenInfos[tokenId] = tokenInfo; emit AINFTMint(to, tokenId); return tokenId; } function burn(uint256 _id) external override { require( _isApprovedOrOwner(_msgSender(), _id), "ERC721: burn caller is not owner nor approved" ); _burn(_id); // Clear metadata (if any) if (bytes(_tokenURIs[_id]).length != 0) { delete _tokenURIs[_id]; } } function updateURIPrefix(string memory baseURI_) external onlyOwner { baseURI = baseURI_; emit URIPrefix(baseURI); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function updateTokenURI( uint256 tokenId, string memory _uri ) public onlyOwner { _setTokenURI(tokenId, _uri); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI( uint256 tokenId, string memory _tokenURI ) internal virtual { require( _exists(tokenId), "ERC721Metadata: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; emit SetTokenURI(tokenId, _tokenURI); } function tokenURI( uint256 tokenId ) public view override returns (string memory) { require(_exists(tokenId), "DEFUSIONAI: URI query for nonexistent token"); string memory baseURI_ = _baseURI(); // return string(abi.encodePacked(baseURI_, tokenId.toString())); string memory _tokenURI = _tokenURIs[tokenId]; // If there is no base URI, return the token URI. if (bytes(baseURI_).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return _tokenURI; } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(baseURI_, tokenId.toString())); } function getTokenInfo( uint256 tokenId ) external view override returns (TokenInfo memory tokenInfo) { tokenInfo = tokenInfos[tokenId]; } function name() public view virtual override returns (string memory) { return "DEFUSION.AI"; } function symbol() public view virtual override returns (string memory) { return "DEFUSIONAI"; } }
pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; interface IDefusionAi { struct TokenInfo { uint256 aigcType; address proj; uint256 num; uint256 boosts; uint256 timestamp; } function mint( address to, uint256 tokenId, TokenInfo calldata tokenInfo ) external returns (uint256); function burn(uint256 tokenId) external; function getTokenInfo( uint256 tokenId ) external view returns (TokenInfo calldata tokenInfo); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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 functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AINFTMint","type":"event"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"adminRole","type":"bytes32"},{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"RevokeMinterAdmin","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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"adminRole","type":"bytes32"},{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"SetMinterAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"SetTokenURI","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":true,"internalType":"string","name":"baseURI","type":"string"}],"name":"URIPrefix","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"_id","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenInfo","outputs":[{"components":[{"internalType":"uint256","name":"aigcType","type":"uint256"},{"internalType":"address","name":"proj","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"boosts","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct IDefusionAi.TokenInfo","name":"tokenInfo","type":"tuple"}],"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"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"aigcType","type":"uint256"},{"internalType":"address","name":"proj","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"boosts","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct IDefusionAi.TokenInfo","name":"tokenInfo","type":"tuple"}],"name":"mint","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":"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":"address","name":"minterAdmin","type":"address"}],"name":"revokeMinterAdmin","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":"address","name":"minterAdmin","type":"address"}],"name":"setMinterAdmin","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"updateURIPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"usedTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f4445465553494f4e2e41490000000000000000000000000000000000000000008152506040518060400160405280600881526020017f4445465553494f4e00000000000000000000000000000000000000000000000081525081600190816200008f91906200041a565b508060029081620000a191906200041a565b505050620000c4620000b8620000d260201b60201c565b620000da60201b60201c565b6001600c8190555062000501565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022257607f821691505b602082108103620002385762000237620001da565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000263565b620002ae868362000263565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002fb620002f5620002ef84620002c6565b620002d0565b620002c6565b9050919050565b6000819050919050565b6200031783620002da565b6200032f620003268262000302565b84845462000270565b825550505050565b600090565b6200034662000337565b620003538184846200030c565b505050565b5b818110156200037b576200036f6000826200033c565b60018101905062000359565b5050565b601f821115620003ca5762000394816200023e565b6200039f8462000253565b81016020851015620003af578190505b620003c7620003be8562000253565b83018262000358565b50505b505050565b600082821c905092915050565b6000620003ef60001984600802620003cf565b1980831691505092915050565b60006200040a8383620003dc565b9150826002028217905092915050565b6200042582620001a0565b67ffffffffffffffff811115620004415762000440620001ab565b5b6200044d825462000209565b6200045a8282856200037f565b600060209050601f8311600181146200049257600084156200047d578287015190505b620004898582620003fc565b865550620004f9565b601f198416620004a2866200023e565b60005b82811015620004cc57848901518255600182019150602085019450602081019050620004a5565b86831015620004ec5784890151620004e8601f891682620003dc565b8355505b6001600288020188555050505b505050505050565b61531080620005116000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806369d9dd4f1161011a578063a217fddf116100ad578063c4d66de81161007c578063c4d66de81461060b578063c87b56dd14610627578063d547741f14610657578063e985e9c514610673578063f2fde38b146106a357610206565b8063a217fddf14610599578063a22cb465146105b7578063b88d4fde146105d3578063bceb2a22146105ef57610206565b80638da5cb5b116100e95780638da5cb5b1461051157806391d148541461052f57806395d89b411461055f57806399235f391461057d57610206565b806369d9dd4f1461047757806370a08231146104a7578063715018a6146104d75780638c7a63ae146104e157610206565b80632f2ff15d1161019d5780633b4d820e1161016c5780633b4d820e146103af57806342842e0e146103df57806342966c68146103fb5780634f6ccce7146104175780636352211e1461044757610206565b80632f2ff15d1461032b5780632f745c591461034757806336568abe14610377578063369088f01461039357610206565b806318160ddd116101d957806318160ddd146102a557806318e97fd1146102c357806323b872dd146102df578063248a9ca3146102fb57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613468565b6106bf565b60405161023291906134b0565b60405180910390f35b6102436106d1565b604051610250919061355b565b60405180910390f35b610273600480360381019061026e91906135b3565b61070e565b6040516102809190613621565b60405180910390f35b6102a3600480360381019061029e9190613668565b610754565b005b6102ad61086b565b6040516102ba91906136b7565b60405180910390f35b6102dd60048036038101906102d89190613807565b610878565b005b6102f960048036038101906102f49190613863565b61088e565b005b610315600480360381019061031091906138ec565b6108ee565b6040516103229190613928565b60405180910390f35b61034560048036038101906103409190613943565b61090d565b005b610361600480360381019061035c9190613668565b61092e565b60405161036e91906136b7565b60405180910390f35b610391600480360381019061038c9190613943565b6109d3565b005b6103ad60048036038101906103a89190613983565b610a56565b005b6103c960048036038101906103c491906139d4565b610b5a565b6040516103d691906136b7565b60405180910390f35b6103f960048036038101906103f49190613863565b610c98565b005b610415600480360381019061041091906135b3565b610cb8565b005b610431600480360381019061042c91906135b3565b610d5b565b60405161043e91906136b7565b60405180910390f35b610461600480360381019061045c91906135b3565b610dcc565b60405161046e9190613621565b60405180910390f35b610491600480360381019061048c91906135b3565b610e52565b60405161049e91906134b0565b60405180910390f35b6104c160048036038101906104bc9190613983565b610e7c565b6040516104ce91906136b7565b60405180910390f35b6104df610f33565b005b6104fb60048036038101906104f691906135b3565b610f47565b6040516105089190613aad565b60405180910390f35b610519610ff2565b6040516105269190613621565b60405180910390f35b61054960048036038101906105449190613943565b61101c565b60405161055691906134b0565b60405180910390f35b610567611086565b604051610574919061355b565b60405180910390f35b61059760048036038101906105929190613983565b6110c3565b005b6105a16111c7565b6040516105ae9190613928565b60405180910390f35b6105d160048036038101906105cc9190613af4565b6111ce565b005b6105ed60048036038101906105e89190613bd5565b6111e4565b005b61060960048036038101906106049190613c58565b611246565b005b61062560048036038101906106209190613983565b6112a4565b005b610641600480360381019061063c91906135b3565b61140b565b60405161064e919061355b565b60405180910390f35b610671600480360381019061066c9190613943565b61155c565b005b61068d60048036038101906106889190613ca1565b61157d565b60405161069a91906134b0565b60405180910390f35b6106bd60048036038101906106b89190613983565b611611565b005b60006106ca82611694565b9050919050565b60606040518060400160405280600b81526020017f4445465553494f4e2e4149000000000000000000000000000000000000000000815250905090565b60006107198261170e565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075f82610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c690613d53565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ee611759565b73ffffffffffffffffffffffffffffffffffffffff16148061081d575061081c81610817611759565b61157d565b5b61085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390613de5565b60405180910390fd5b6108668383611761565b505050565b6000600980549050905090565b61088061181a565b61088a8282611898565b5050565b61089f610899611759565b8261193d565b6108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590613e77565b60405180910390fd5b6108e98383836119d2565b505050565b6000806000838152602001908152602001600020600101549050919050565b610916826108ee565b61091f81611ccb565b6109298383611cdf565b505050565b600061093983610e7c565b821061097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097190613f09565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109db611759565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3f90613f9b565b60405180910390fd5b610a528282611dbf565b5050565b610a5e61181a565b610aa46040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012082611dbf565b7f2e955a9e375473e4fe9dbf72fd85769ec5a27b8b385d1ac90719f0bdf9f214416040518060400160405280600681526020017f4d494e5445520000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012083604051610b4f93929190613fbb565b60405180910390a150565b6000610b64611ea0565b610baa6040518060400160405280600681526020017f4d494e5445520000000000000000000000000000000000000000000000000000815250805190602001203361101c565b610be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be090614064565b60405180910390fd5b610bf38484611eef565b60016012600085815260200190815260200160002060006101000a81548160ff02191690831515021790555081601160008581526020019081526020016000208181610c3f91906142aa565b905050828473ffffffffffffffffffffffffffffffffffffffff167fe80e28d8aa636857526c3c657776bcbbd581134a1e2edbbdb1c618cc4000785d60405160405180910390a3829050610c9161210c565b9392505050565b610cb3838383604051806020016040528060008152506111e4565b505050565b610cc9610cc3611759565b8261193d565b610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff9061432a565b60405180910390fd5b610d1181612116565b6000601060008381526020019081526020016000208054610d3190614379565b905014610d5857601060008281526020019081526020016000206000610d57919061335a565b5b50565b6000610d6561086b565b8210610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d9061441c565b60405180910390fd5b60098281548110610dba57610db961443c565b5b90600052602060002001549050919050565b600080610dd883612264565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906144b7565b60405180910390fd5b80915050919050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee390614549565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f3b61181a565b610f4560006122a1565b565b610f4f61339a565b601160008381526020019081526020016000206040518060a0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820154815250509050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606040518060400160405280600a81526020017f4445465553494f4e414900000000000000000000000000000000000000000000815250905090565b6110cb61181a565b6111116040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012082612367565b7fec9b6dc2d06e32f5e9fdce0cee0f7443bcb99666a145147f25e659e87c5dd3f16040518060400160405280600681526020017f4d494e5445520000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600c81526020017f4d494e5445525f41444d494e000000000000000000000000000000000000000081525080519060200120836040516111bc93929190613fbb565b60405180910390a150565b6000801b81565b6111e06111d9611759565b8383612375565b5050565b6111f56111ef611759565b8361193d565b611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b90613e77565b60405180910390fd5b611240848484846124e1565b50505050565b61124e61181a565b80600e908161125d91906146df565b50600e60405161126d919061483f565b60405180910390207f5b2f71ae2236304212a8f3529aa50b6ae9fe556cc6a4af4f9b51f89328d057f260405160405180910390a250565b600d60009054906101000a900460ff16156112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb906148a2565b60405180910390fd5b6112fd816122a1565b6040518060600160405280602881526020016152b360289139600e908161132491906146df565b506113a76040518060400160405280600681526020017f4d494e5445520000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012061253d565b6113ed6040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012082612367565b6001600d60006101000a81548160ff02191690831515021790555050565b606061141682612598565b611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614934565b60405180910390fd5b600061145f6125d9565b9050600060106000858152602001908152602001600020805461148190614379565b80601f01602080910402602001604051908101604052809291908181526020018280546114ad90614379565b80156114fa5780601f106114cf576101008083540402835291602001916114fa565b820191906000526020600020905b8154815290600101906020018083116114dd57829003601f168201915b505050505090506000825103611514578092505050611557565b600081511115611528578092505050611557565b816115328561266b565b604051602001611543929190614985565b604051602081830303815290604052925050505b919050565b611565826108ee565b61156e81611ccb565b6115788383611dbf565b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161961181a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614a1b565b60405180910390fd5b611691816122a1565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611707575061170682612739565b5b9050919050565b61171781612598565b611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d906144b7565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117d483610dcc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611822611759565b73ffffffffffffffffffffffffffffffffffffffff16611840610ff2565b73ffffffffffffffffffffffffffffffffffffffff1614611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614a87565b60405180910390fd5b565b6118a182612598565b6118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614b19565b60405180910390fd5b8060106000848152602001908152602001600020908161190091906146df565b50817fd2d827dddfc9c9a02afc5fc68d3251684b36e213a7999ebd90a861f25df4077e82604051611931919061355b565b60405180910390a25050565b60008061194983610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061198b575061198a818561157d565b5b806119c957508373ffffffffffffffffffffffffffffffffffffffff166119b18461070e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119f282610dcc565b73ffffffffffffffffffffffffffffffffffffffff1614611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f90614bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae90614c3d565b60405180910390fd5b611ac4838383600161281b565b8273ffffffffffffffffffffffffffffffffffffffff16611ae482610dcc565b73ffffffffffffffffffffffffffffffffffffffff1614611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3190614bab565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cc68383836001612979565b505050565b611cdc81611cd7611759565b61297f565b50565b611ce9828261101c565b611dbb57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d60611759565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611dc9828261101c565b15611e9c57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e41611759565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6002600c5403611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614ca9565b60405180910390fd5b6002600c81905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5590614d15565b60405180910390fd5b611f6781612598565b15611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614d81565b60405180910390fd5b611fb560008383600161281b565b611fbe81612598565b15611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff590614d81565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612108600083836001612979565b5050565b6001600c81905550565b600061212182610dcc565b905061213181600084600161281b565b61213a82610dcc565b90506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612260816000846001612979565b5050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123718282611cdf565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da90614ded565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124d491906134b0565b60405180910390a3505050565b6124ec8484846119d2565b6124f884848484612a04565b612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252e90614e7f565b60405180910390fd5b50505050565b6000612548836108ee565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b60008073ffffffffffffffffffffffffffffffffffffffff166125ba83612264565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600e80546125e890614379565b80601f016020809104026020016040519081016040528092919081815260200182805461261490614379565b80156126615780601f1061263657610100808354040283529160200191612661565b820191906000526020600020905b81548152906001019060200180831161264457829003601f168201915b5050505050905090565b60606000600161267a84612b8b565b01905060008167ffffffffffffffff811115612699576126986136dc565b5b6040519080825280601f01601f1916602001820160405280156126cb5781602001600182028036833780820191505090505b509050600082602001820190505b60011561272e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161272257612721614e9f565b5b049450600085036126d9575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061280457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612814575061281382612cde565b5b9050919050565b61282784848484612d58565b600181111561286b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286290614f40565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128b2576128ad81612d5e565b6128f1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146128f0576128ef8582612da7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129335761292e81612f14565b612972565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612971576129708482612fe5565b5b5b5050505050565b50505050565b612989828261101c565b612a005761299681613064565b6129a48360001c6020613091565b6040516020016129b5929190614ff8565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f7919061355b565b60405180910390fd5b5050565b6000612a258473ffffffffffffffffffffffffffffffffffffffff166132cd565b15612b7e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a4e611759565b8786866040518563ffffffff1660e01b8152600401612a709493929190615087565b6020604051808303816000875af1925050508015612aac57506040513d601f19601f82011682018060405250810190612aa991906150e8565b60015b612b2e573d8060008114612adc576040519150601f19603f3d011682016040523d82523d6000602084013e612ae1565b606091505b506000815103612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614e7f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b83565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612be9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612bdf57612bde614e9f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612c26576d04ee2d6d415b85acef81000000008381612c1c57612c1b614e9f565b5b0492506020810190505b662386f26fc100008310612c5557662386f26fc100008381612c4b57612c4a614e9f565b5b0492506010810190505b6305f5e1008310612c7e576305f5e1008381612c7457612c73614e9f565b5b0492506008810190505b6127108310612ca3576127108381612c9957612c98614e9f565b5b0492506004810190505b60648310612cc65760648381612cbc57612cbb614e9f565b5b0492506002810190505b600a8310612cd5576001810190505b80915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d515750612d50826132f0565b5b9050919050565b50505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612db484610e7c565b612dbe9190615144565b9050600060086000848152602001908152602001600020549050818114612ea3576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612f289190615144565b90506000600a6000848152602001908152602001600020549050600060098381548110612f5857612f5761443c565b5b906000526020600020015490508060098381548110612f7a57612f7961443c565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612fc957612fc8615178565b5b6001900381819060005260206000200160009055905550505050565b6000612ff083610e7c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b606061308a8273ffffffffffffffffffffffffffffffffffffffff16601460ff16613091565b9050919050565b6060600060028360026130a491906151a7565b6130ae91906151e9565b67ffffffffffffffff8111156130c7576130c66136dc565b5b6040519080825280601f01601f1916602001820160405280156130f95781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106131315761313061443c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106131955761319461443c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026131d591906151a7565b6131df91906151e9565b90505b600181111561327f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106132215761322061443c565b5b1a60f81b8282815181106132385761323761443c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806132789061521d565b90506131e2565b50600084146132c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ba90615292565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50805461336690614379565b6000825580601f106133785750613397565b601f01602090049060005260206000209081019061339691906133df565b5b50565b6040518060a0016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b5b808211156133f85760008160009055506001016133e0565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61344581613410565b811461345057600080fd5b50565b6000813590506134628161343c565b92915050565b60006020828403121561347e5761347d613406565b5b600061348c84828501613453565b91505092915050565b60008115159050919050565b6134aa81613495565b82525050565b60006020820190506134c560008301846134a1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135055780820151818401526020810190506134ea565b60008484015250505050565b6000601f19601f8301169050919050565b600061352d826134cb565b61353781856134d6565b93506135478185602086016134e7565b61355081613511565b840191505092915050565b600060208201905081810360008301526135758184613522565b905092915050565b6000819050919050565b6135908161357d565b811461359b57600080fd5b50565b6000813590506135ad81613587565b92915050565b6000602082840312156135c9576135c8613406565b5b60006135d78482850161359e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061360b826135e0565b9050919050565b61361b81613600565b82525050565b60006020820190506136366000830184613612565b92915050565b61364581613600565b811461365057600080fd5b50565b6000813590506136628161363c565b92915050565b6000806040838503121561367f5761367e613406565b5b600061368d85828601613653565b925050602061369e8582860161359e565b9150509250929050565b6136b18161357d565b82525050565b60006020820190506136cc60008301846136a8565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371482613511565b810181811067ffffffffffffffff82111715613733576137326136dc565b5b80604052505050565b60006137466133fc565b9050613752828261370b565b919050565b600067ffffffffffffffff821115613772576137716136dc565b5b61377b82613511565b9050602081019050919050565b82818337600083830152505050565b60006137aa6137a584613757565b61373c565b9050828152602081018484840111156137c6576137c56136d7565b5b6137d1848285613788565b509392505050565b600082601f8301126137ee576137ed6136d2565b5b81356137fe848260208601613797565b91505092915050565b6000806040838503121561381e5761381d613406565b5b600061382c8582860161359e565b925050602083013567ffffffffffffffff81111561384d5761384c61340b565b5b613859858286016137d9565b9150509250929050565b60008060006060848603121561387c5761387b613406565b5b600061388a86828701613653565b935050602061389b86828701613653565b92505060406138ac8682870161359e565b9150509250925092565b6000819050919050565b6138c9816138b6565b81146138d457600080fd5b50565b6000813590506138e6816138c0565b92915050565b60006020828403121561390257613901613406565b5b6000613910848285016138d7565b91505092915050565b613922816138b6565b82525050565b600060208201905061393d6000830184613919565b92915050565b6000806040838503121561395a57613959613406565b5b6000613968858286016138d7565b925050602061397985828601613653565b9150509250929050565b60006020828403121561399957613998613406565b5b60006139a784828501613653565b91505092915050565b600080fd5b600060a082840312156139cb576139ca6139b0565b5b81905092915050565b600080600060e084860312156139ed576139ec613406565b5b60006139fb86828701613653565b9350506020613a0c8682870161359e565b9250506040613a1d868287016139b5565b9150509250925092565b613a308161357d565b82525050565b613a3f81613600565b82525050565b60a082016000820151613a5b6000850182613a27565b506020820151613a6e6020850182613a36565b506040820151613a816040850182613a27565b506060820151613a946060850182613a27565b506080820151613aa76080850182613a27565b50505050565b600060a082019050613ac26000830184613a45565b92915050565b613ad181613495565b8114613adc57600080fd5b50565b600081359050613aee81613ac8565b92915050565b60008060408385031215613b0b57613b0a613406565b5b6000613b1985828601613653565b9250506020613b2a85828601613adf565b9150509250929050565b600067ffffffffffffffff821115613b4f57613b4e6136dc565b5b613b5882613511565b9050602081019050919050565b6000613b78613b7384613b34565b61373c565b905082815260208101848484011115613b9457613b936136d7565b5b613b9f848285613788565b509392505050565b600082601f830112613bbc57613bbb6136d2565b5b8135613bcc848260208601613b65565b91505092915050565b60008060008060808587031215613bef57613bee613406565b5b6000613bfd87828801613653565b9450506020613c0e87828801613653565b9350506040613c1f8782880161359e565b925050606085013567ffffffffffffffff811115613c4057613c3f61340b565b5b613c4c87828801613ba7565b91505092959194509250565b600060208284031215613c6e57613c6d613406565b5b600082013567ffffffffffffffff811115613c8c57613c8b61340b565b5b613c98848285016137d9565b91505092915050565b60008060408385031215613cb857613cb7613406565b5b6000613cc685828601613653565b9250506020613cd785828601613653565b9150509250929050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d3d6021836134d6565b9150613d4882613ce1565b604082019050919050565b60006020820190508181036000830152613d6c81613d30565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613dcf603d836134d6565b9150613dda82613d73565b604082019050919050565b60006020820190508181036000830152613dfe81613dc2565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613e61602d836134d6565b9150613e6c82613e05565b604082019050919050565b60006020820190508181036000830152613e9081613e54565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613ef3602b836134d6565b9150613efe82613e97565b604082019050919050565b60006020820190508181036000830152613f2281613ee6565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613f85602f836134d6565b9150613f9082613f29565b604082019050919050565b60006020820190508181036000830152613fb481613f78565b9050919050565b6000606082019050613fd06000830186613919565b613fdd6020830185613919565b613fea6040830184613612565b949350505050565b7f4445465553494f4e41493a2043616c6c6572206973206e6f742061206d696e7460008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061404e6022836134d6565b915061405982613ff2565b604082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b6000813561409181613587565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6140d38461409a565b9350801983169250808416831791505092915050565b6000819050919050565b600061410e6141096141048461357d565b6140e9565b61357d565b9050919050565b6000819050919050565b614128826140f3565b61413b61413482614115565b83546140a7565b8255505050565b6000813561414f8161363c565b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff6141788461409a565b9350801983169250808416831791505092915050565b60006141a96141a461419f846135e0565b6140e9565b6135e0565b9050919050565b60006141bb8261418e565b9050919050565b60006141cd826141b0565b9050919050565b6000819050919050565b6141e7826141c2565b6141fa6141f3826141d4565b8354614158565b8255505050565b60008101600083018061421381614084565b905061421f818461411f565b50505060018101602083018061423481614142565b905061424081846141de565b50505060028101604083018061425581614084565b9050614261818461411f565b50505060038101606083018061427681614084565b9050614282818461411f565b50505060048101608083018061429781614084565b90506142a3818461411f565b5050505050565b6142b48282614201565b5050565b7f4552433732313a206275726e2063616c6c6572206973206e6f74206f776e657260008201527f206e6f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614314602d836134d6565b915061431f826142b8565b604082019050919050565b6000602082019050818103600083015261434381614307565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061439157607f821691505b6020821081036143a4576143a361434a565b5b50919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614406602c836134d6565b9150614411826143aa565b604082019050919050565b60006020820190508181036000830152614435816143f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006144a16018836134d6565b91506144ac8261446b565b602082019050919050565b600060208201905081810360008301526144d081614494565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006145336029836134d6565b915061453e826144d7565b604082019050919050565b6000602082019050818103600083015261456281614526565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261458e565b6145d5868361458e565b95508019841693508086168417925050509392505050565b6145f6836140f3565b61460a61460282614115565b84845461459b565b825550505050565b600090565b61461f614612565b61462a8184846145ed565b505050565b5b8181101561464e57614643600082614617565b600181019050614630565b5050565b601f8211156146935761466481614569565b61466d8461457e565b8101602085101561467c578190505b6146906146888561457e565b83018261462f565b50505b505050565b600082821c905092915050565b60006146b660001984600802614698565b1980831691505092915050565b60006146cf83836146a5565b9150826002028217905092915050565b6146e8826134cb565b67ffffffffffffffff811115614701576147006136dc565b5b61470b8254614379565b614716828285614652565b600060209050601f8311600181146147495760008415614737578287015190505b61474185826146c3565b8655506147a9565b601f19841661475786614569565b60005b8281101561477f5784890151825560018201915060208501945060208101905061475a565b8683101561479c5784890151614798601f8916826146a5565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600081546147c981614379565b6147d381866147b1565b945060018216600081146147ee576001811461480357614836565b60ff1983168652811515820286019350614836565b61480c85614569565b60005b8381101561482e5781548189015260018201915060208101905061480f565b838801955050505b50505092915050565b600061484b82846147bc565b915081905092915050565b7f696e697469616c697a653a20416c726561647920696e697469616c697a656421600082015250565b600061488c6020836134d6565b915061489782614856565b602082019050919050565b600060208201905081810360008301526148bb8161487f565b9050919050565b7f4445465553494f4e41493a2055524920717565727920666f72206e6f6e65786960008201527f7374656e7420746f6b656e000000000000000000000000000000000000000000602082015250565b600061491e602b836134d6565b9150614929826148c2565b604082019050919050565b6000602082019050818103600083015261494d81614911565b9050919050565b600061495f826134cb565b61496981856147b1565b93506149798185602086016134e7565b80840191505092915050565b60006149918285614954565b915061499d8284614954565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a056026836134d6565b9150614a10826149a9565b604082019050919050565b60006020820190508181036000830152614a34816149f8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a716020836134d6565b9150614a7c82614a3b565b602082019050919050565b60006020820190508181036000830152614aa081614a64565b9050919050565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614b03602c836134d6565b9150614b0e82614aa7565b604082019050919050565b60006020820190508181036000830152614b3281614af6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b956025836134d6565b9150614ba082614b39565b604082019050919050565b60006020820190508181036000830152614bc481614b88565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c276024836134d6565b9150614c3282614bcb565b604082019050919050565b60006020820190508181036000830152614c5681614c1a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614c93601f836134d6565b9150614c9e82614c5d565b602082019050919050565b60006020820190508181036000830152614cc281614c86565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614cff6020836134d6565b9150614d0a82614cc9565b602082019050919050565b60006020820190508181036000830152614d2e81614cf2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614d6b601c836134d6565b9150614d7682614d35565b602082019050919050565b60006020820190508181036000830152614d9a81614d5e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614dd76019836134d6565b9150614de282614da1565b602082019050919050565b60006020820190508181036000830152614e0681614dca565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e696032836134d6565b9150614e7482614e0d565b604082019050919050565b60006020820190508181036000830152614e9881614e5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614f2a6035836134d6565b9150614f3582614ece565b604082019050919050565b60006020820190508181036000830152614f5981614f1d565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614f966017836147b1565b9150614fa182614f60565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614fe26011836147b1565b9150614fed82614fac565b601182019050919050565b600061500382614f89565b915061500f8285614954565b915061501a82614fd5565b91506150268284614954565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061505982615032565b615063818561503d565b93506150738185602086016134e7565b61507c81613511565b840191505092915050565b600060808201905061509c6000830187613612565b6150a96020830186613612565b6150b660408301856136a8565b81810360608301526150c8818461504e565b905095945050505050565b6000815190506150e28161343c565b92915050565b6000602082840312156150fe576150fd613406565b5b600061510c848285016150d3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061514f8261357d565b915061515a8361357d565b925082820390508181111561517257615171615115565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006151b28261357d565b91506151bd8361357d565b92508282026151cb8161357d565b915082820484148315176151e2576151e1615115565b5b5092915050565b60006151f48261357d565b91506151ff8361357d565b925082820190508082111561521757615216615115565b5b92915050565b60006152288261357d565b91506000820361523b5761523a615115565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061527c6020836134d6565b915061528782615246565b602082019050919050565b600060208201905081810360008301526152ab8161526f565b905091905056fe68747470733a2f2f6465667573696f6e2e61692f6170692f76312f6d657461646174612f6574682fa26469706673582212206ad487136a225c48ee923560250f20b1bcab4dacaa7192ca3897fe840b4b6a9164736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806369d9dd4f1161011a578063a217fddf116100ad578063c4d66de81161007c578063c4d66de81461060b578063c87b56dd14610627578063d547741f14610657578063e985e9c514610673578063f2fde38b146106a357610206565b8063a217fddf14610599578063a22cb465146105b7578063b88d4fde146105d3578063bceb2a22146105ef57610206565b80638da5cb5b116100e95780638da5cb5b1461051157806391d148541461052f57806395d89b411461055f57806399235f391461057d57610206565b806369d9dd4f1461047757806370a08231146104a7578063715018a6146104d75780638c7a63ae146104e157610206565b80632f2ff15d1161019d5780633b4d820e1161016c5780633b4d820e146103af57806342842e0e146103df57806342966c68146103fb5780634f6ccce7146104175780636352211e1461044757610206565b80632f2ff15d1461032b5780632f745c591461034757806336568abe14610377578063369088f01461039357610206565b806318160ddd116101d957806318160ddd146102a557806318e97fd1146102c357806323b872dd146102df578063248a9ca3146102fb57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613468565b6106bf565b60405161023291906134b0565b60405180910390f35b6102436106d1565b604051610250919061355b565b60405180910390f35b610273600480360381019061026e91906135b3565b61070e565b6040516102809190613621565b60405180910390f35b6102a3600480360381019061029e9190613668565b610754565b005b6102ad61086b565b6040516102ba91906136b7565b60405180910390f35b6102dd60048036038101906102d89190613807565b610878565b005b6102f960048036038101906102f49190613863565b61088e565b005b610315600480360381019061031091906138ec565b6108ee565b6040516103229190613928565b60405180910390f35b61034560048036038101906103409190613943565b61090d565b005b610361600480360381019061035c9190613668565b61092e565b60405161036e91906136b7565b60405180910390f35b610391600480360381019061038c9190613943565b6109d3565b005b6103ad60048036038101906103a89190613983565b610a56565b005b6103c960048036038101906103c491906139d4565b610b5a565b6040516103d691906136b7565b60405180910390f35b6103f960048036038101906103f49190613863565b610c98565b005b610415600480360381019061041091906135b3565b610cb8565b005b610431600480360381019061042c91906135b3565b610d5b565b60405161043e91906136b7565b60405180910390f35b610461600480360381019061045c91906135b3565b610dcc565b60405161046e9190613621565b60405180910390f35b610491600480360381019061048c91906135b3565b610e52565b60405161049e91906134b0565b60405180910390f35b6104c160048036038101906104bc9190613983565b610e7c565b6040516104ce91906136b7565b60405180910390f35b6104df610f33565b005b6104fb60048036038101906104f691906135b3565b610f47565b6040516105089190613aad565b60405180910390f35b610519610ff2565b6040516105269190613621565b60405180910390f35b61054960048036038101906105449190613943565b61101c565b60405161055691906134b0565b60405180910390f35b610567611086565b604051610574919061355b565b60405180910390f35b61059760048036038101906105929190613983565b6110c3565b005b6105a16111c7565b6040516105ae9190613928565b60405180910390f35b6105d160048036038101906105cc9190613af4565b6111ce565b005b6105ed60048036038101906105e89190613bd5565b6111e4565b005b61060960048036038101906106049190613c58565b611246565b005b61062560048036038101906106209190613983565b6112a4565b005b610641600480360381019061063c91906135b3565b61140b565b60405161064e919061355b565b60405180910390f35b610671600480360381019061066c9190613943565b61155c565b005b61068d60048036038101906106889190613ca1565b61157d565b60405161069a91906134b0565b60405180910390f35b6106bd60048036038101906106b89190613983565b611611565b005b60006106ca82611694565b9050919050565b60606040518060400160405280600b81526020017f4445465553494f4e2e4149000000000000000000000000000000000000000000815250905090565b60006107198261170e565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075f82610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c690613d53565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ee611759565b73ffffffffffffffffffffffffffffffffffffffff16148061081d575061081c81610817611759565b61157d565b5b61085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390613de5565b60405180910390fd5b6108668383611761565b505050565b6000600980549050905090565b61088061181a565b61088a8282611898565b5050565b61089f610899611759565b8261193d565b6108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590613e77565b60405180910390fd5b6108e98383836119d2565b505050565b6000806000838152602001908152602001600020600101549050919050565b610916826108ee565b61091f81611ccb565b6109298383611cdf565b505050565b600061093983610e7c565b821061097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097190613f09565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109db611759565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3f90613f9b565b60405180910390fd5b610a528282611dbf565b5050565b610a5e61181a565b610aa46040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012082611dbf565b7f2e955a9e375473e4fe9dbf72fd85769ec5a27b8b385d1ac90719f0bdf9f214416040518060400160405280600681526020017f4d494e5445520000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012083604051610b4f93929190613fbb565b60405180910390a150565b6000610b64611ea0565b610baa6040518060400160405280600681526020017f4d494e5445520000000000000000000000000000000000000000000000000000815250805190602001203361101c565b610be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be090614064565b60405180910390fd5b610bf38484611eef565b60016012600085815260200190815260200160002060006101000a81548160ff02191690831515021790555081601160008581526020019081526020016000208181610c3f91906142aa565b905050828473ffffffffffffffffffffffffffffffffffffffff167fe80e28d8aa636857526c3c657776bcbbd581134a1e2edbbdb1c618cc4000785d60405160405180910390a3829050610c9161210c565b9392505050565b610cb3838383604051806020016040528060008152506111e4565b505050565b610cc9610cc3611759565b8261193d565b610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff9061432a565b60405180910390fd5b610d1181612116565b6000601060008381526020019081526020016000208054610d3190614379565b905014610d5857601060008281526020019081526020016000206000610d57919061335a565b5b50565b6000610d6561086b565b8210610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d9061441c565b60405180910390fd5b60098281548110610dba57610db961443c565b5b90600052602060002001549050919050565b600080610dd883612264565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906144b7565b60405180910390fd5b80915050919050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee390614549565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f3b61181a565b610f4560006122a1565b565b610f4f61339a565b601160008381526020019081526020016000206040518060a0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820154815250509050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606040518060400160405280600a81526020017f4445465553494f4e414900000000000000000000000000000000000000000000815250905090565b6110cb61181a565b6111116040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012082612367565b7fec9b6dc2d06e32f5e9fdce0cee0f7443bcb99666a145147f25e659e87c5dd3f16040518060400160405280600681526020017f4d494e5445520000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600c81526020017f4d494e5445525f41444d494e000000000000000000000000000000000000000081525080519060200120836040516111bc93929190613fbb565b60405180910390a150565b6000801b81565b6111e06111d9611759565b8383612375565b5050565b6111f56111ef611759565b8361193d565b611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b90613e77565b60405180910390fd5b611240848484846124e1565b50505050565b61124e61181a565b80600e908161125d91906146df565b50600e60405161126d919061483f565b60405180910390207f5b2f71ae2236304212a8f3529aa50b6ae9fe556cc6a4af4f9b51f89328d057f260405160405180910390a250565b600d60009054906101000a900460ff16156112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb906148a2565b60405180910390fd5b6112fd816122a1565b6040518060600160405280602881526020016152b360289139600e908161132491906146df565b506113a76040518060400160405280600681526020017f4d494e5445520000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012061253d565b6113ed6040518060400160405280600c81526020017f4d494e5445525f41444d494e00000000000000000000000000000000000000008152508051906020012082612367565b6001600d60006101000a81548160ff02191690831515021790555050565b606061141682612598565b611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614934565b60405180910390fd5b600061145f6125d9565b9050600060106000858152602001908152602001600020805461148190614379565b80601f01602080910402602001604051908101604052809291908181526020018280546114ad90614379565b80156114fa5780601f106114cf576101008083540402835291602001916114fa565b820191906000526020600020905b8154815290600101906020018083116114dd57829003601f168201915b505050505090506000825103611514578092505050611557565b600081511115611528578092505050611557565b816115328561266b565b604051602001611543929190614985565b604051602081830303815290604052925050505b919050565b611565826108ee565b61156e81611ccb565b6115788383611dbf565b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161961181a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614a1b565b60405180910390fd5b611691816122a1565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611707575061170682612739565b5b9050919050565b61171781612598565b611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d906144b7565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117d483610dcc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611822611759565b73ffffffffffffffffffffffffffffffffffffffff16611840610ff2565b73ffffffffffffffffffffffffffffffffffffffff1614611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614a87565b60405180910390fd5b565b6118a182612598565b6118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614b19565b60405180910390fd5b8060106000848152602001908152602001600020908161190091906146df565b50817fd2d827dddfc9c9a02afc5fc68d3251684b36e213a7999ebd90a861f25df4077e82604051611931919061355b565b60405180910390a25050565b60008061194983610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061198b575061198a818561157d565b5b806119c957508373ffffffffffffffffffffffffffffffffffffffff166119b18461070e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119f282610dcc565b73ffffffffffffffffffffffffffffffffffffffff1614611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f90614bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae90614c3d565b60405180910390fd5b611ac4838383600161281b565b8273ffffffffffffffffffffffffffffffffffffffff16611ae482610dcc565b73ffffffffffffffffffffffffffffffffffffffff1614611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3190614bab565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cc68383836001612979565b505050565b611cdc81611cd7611759565b61297f565b50565b611ce9828261101c565b611dbb57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d60611759565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611dc9828261101c565b15611e9c57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e41611759565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6002600c5403611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614ca9565b60405180910390fd5b6002600c81905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5590614d15565b60405180910390fd5b611f6781612598565b15611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614d81565b60405180910390fd5b611fb560008383600161281b565b611fbe81612598565b15611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff590614d81565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612108600083836001612979565b5050565b6001600c81905550565b600061212182610dcc565b905061213181600084600161281b565b61213a82610dcc565b90506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612260816000846001612979565b5050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123718282611cdf565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da90614ded565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124d491906134b0565b60405180910390a3505050565b6124ec8484846119d2565b6124f884848484612a04565b612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252e90614e7f565b60405180910390fd5b50505050565b6000612548836108ee565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b60008073ffffffffffffffffffffffffffffffffffffffff166125ba83612264565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600e80546125e890614379565b80601f016020809104026020016040519081016040528092919081815260200182805461261490614379565b80156126615780601f1061263657610100808354040283529160200191612661565b820191906000526020600020905b81548152906001019060200180831161264457829003601f168201915b5050505050905090565b60606000600161267a84612b8b565b01905060008167ffffffffffffffff811115612699576126986136dc565b5b6040519080825280601f01601f1916602001820160405280156126cb5781602001600182028036833780820191505090505b509050600082602001820190505b60011561272e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161272257612721614e9f565b5b049450600085036126d9575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061280457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612814575061281382612cde565b5b9050919050565b61282784848484612d58565b600181111561286b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286290614f40565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128b2576128ad81612d5e565b6128f1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146128f0576128ef8582612da7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129335761292e81612f14565b612972565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612971576129708482612fe5565b5b5b5050505050565b50505050565b612989828261101c565b612a005761299681613064565b6129a48360001c6020613091565b6040516020016129b5929190614ff8565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f7919061355b565b60405180910390fd5b5050565b6000612a258473ffffffffffffffffffffffffffffffffffffffff166132cd565b15612b7e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a4e611759565b8786866040518563ffffffff1660e01b8152600401612a709493929190615087565b6020604051808303816000875af1925050508015612aac57506040513d601f19601f82011682018060405250810190612aa991906150e8565b60015b612b2e573d8060008114612adc576040519150601f19603f3d011682016040523d82523d6000602084013e612ae1565b606091505b506000815103612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614e7f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b83565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612be9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612bdf57612bde614e9f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612c26576d04ee2d6d415b85acef81000000008381612c1c57612c1b614e9f565b5b0492506020810190505b662386f26fc100008310612c5557662386f26fc100008381612c4b57612c4a614e9f565b5b0492506010810190505b6305f5e1008310612c7e576305f5e1008381612c7457612c73614e9f565b5b0492506008810190505b6127108310612ca3576127108381612c9957612c98614e9f565b5b0492506004810190505b60648310612cc65760648381612cbc57612cbb614e9f565b5b0492506002810190505b600a8310612cd5576001810190505b80915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d515750612d50826132f0565b5b9050919050565b50505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612db484610e7c565b612dbe9190615144565b9050600060086000848152602001908152602001600020549050818114612ea3576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612f289190615144565b90506000600a6000848152602001908152602001600020549050600060098381548110612f5857612f5761443c565b5b906000526020600020015490508060098381548110612f7a57612f7961443c565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612fc957612fc8615178565b5b6001900381819060005260206000200160009055905550505050565b6000612ff083610e7c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b606061308a8273ffffffffffffffffffffffffffffffffffffffff16601460ff16613091565b9050919050565b6060600060028360026130a491906151a7565b6130ae91906151e9565b67ffffffffffffffff8111156130c7576130c66136dc565b5b6040519080825280601f01601f1916602001820160405280156130f95781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106131315761313061443c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106131955761319461443c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026131d591906151a7565b6131df91906151e9565b90505b600181111561327f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106132215761322061443c565b5b1a60f81b8282815181106132385761323761443c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806132789061521d565b90506131e2565b50600084146132c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ba90615292565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50805461336690614379565b6000825580601f106133785750613397565b601f01602090049060005260206000209081019061339691906133df565b5b50565b6040518060a0016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b5b808211156133f85760008160009055506001016133e0565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61344581613410565b811461345057600080fd5b50565b6000813590506134628161343c565b92915050565b60006020828403121561347e5761347d613406565b5b600061348c84828501613453565b91505092915050565b60008115159050919050565b6134aa81613495565b82525050565b60006020820190506134c560008301846134a1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135055780820151818401526020810190506134ea565b60008484015250505050565b6000601f19601f8301169050919050565b600061352d826134cb565b61353781856134d6565b93506135478185602086016134e7565b61355081613511565b840191505092915050565b600060208201905081810360008301526135758184613522565b905092915050565b6000819050919050565b6135908161357d565b811461359b57600080fd5b50565b6000813590506135ad81613587565b92915050565b6000602082840312156135c9576135c8613406565b5b60006135d78482850161359e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061360b826135e0565b9050919050565b61361b81613600565b82525050565b60006020820190506136366000830184613612565b92915050565b61364581613600565b811461365057600080fd5b50565b6000813590506136628161363c565b92915050565b6000806040838503121561367f5761367e613406565b5b600061368d85828601613653565b925050602061369e8582860161359e565b9150509250929050565b6136b18161357d565b82525050565b60006020820190506136cc60008301846136a8565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371482613511565b810181811067ffffffffffffffff82111715613733576137326136dc565b5b80604052505050565b60006137466133fc565b9050613752828261370b565b919050565b600067ffffffffffffffff821115613772576137716136dc565b5b61377b82613511565b9050602081019050919050565b82818337600083830152505050565b60006137aa6137a584613757565b61373c565b9050828152602081018484840111156137c6576137c56136d7565b5b6137d1848285613788565b509392505050565b600082601f8301126137ee576137ed6136d2565b5b81356137fe848260208601613797565b91505092915050565b6000806040838503121561381e5761381d613406565b5b600061382c8582860161359e565b925050602083013567ffffffffffffffff81111561384d5761384c61340b565b5b613859858286016137d9565b9150509250929050565b60008060006060848603121561387c5761387b613406565b5b600061388a86828701613653565b935050602061389b86828701613653565b92505060406138ac8682870161359e565b9150509250925092565b6000819050919050565b6138c9816138b6565b81146138d457600080fd5b50565b6000813590506138e6816138c0565b92915050565b60006020828403121561390257613901613406565b5b6000613910848285016138d7565b91505092915050565b613922816138b6565b82525050565b600060208201905061393d6000830184613919565b92915050565b6000806040838503121561395a57613959613406565b5b6000613968858286016138d7565b925050602061397985828601613653565b9150509250929050565b60006020828403121561399957613998613406565b5b60006139a784828501613653565b91505092915050565b600080fd5b600060a082840312156139cb576139ca6139b0565b5b81905092915050565b600080600060e084860312156139ed576139ec613406565b5b60006139fb86828701613653565b9350506020613a0c8682870161359e565b9250506040613a1d868287016139b5565b9150509250925092565b613a308161357d565b82525050565b613a3f81613600565b82525050565b60a082016000820151613a5b6000850182613a27565b506020820151613a6e6020850182613a36565b506040820151613a816040850182613a27565b506060820151613a946060850182613a27565b506080820151613aa76080850182613a27565b50505050565b600060a082019050613ac26000830184613a45565b92915050565b613ad181613495565b8114613adc57600080fd5b50565b600081359050613aee81613ac8565b92915050565b60008060408385031215613b0b57613b0a613406565b5b6000613b1985828601613653565b9250506020613b2a85828601613adf565b9150509250929050565b600067ffffffffffffffff821115613b4f57613b4e6136dc565b5b613b5882613511565b9050602081019050919050565b6000613b78613b7384613b34565b61373c565b905082815260208101848484011115613b9457613b936136d7565b5b613b9f848285613788565b509392505050565b600082601f830112613bbc57613bbb6136d2565b5b8135613bcc848260208601613b65565b91505092915050565b60008060008060808587031215613bef57613bee613406565b5b6000613bfd87828801613653565b9450506020613c0e87828801613653565b9350506040613c1f8782880161359e565b925050606085013567ffffffffffffffff811115613c4057613c3f61340b565b5b613c4c87828801613ba7565b91505092959194509250565b600060208284031215613c6e57613c6d613406565b5b600082013567ffffffffffffffff811115613c8c57613c8b61340b565b5b613c98848285016137d9565b91505092915050565b60008060408385031215613cb857613cb7613406565b5b6000613cc685828601613653565b9250506020613cd785828601613653565b9150509250929050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d3d6021836134d6565b9150613d4882613ce1565b604082019050919050565b60006020820190508181036000830152613d6c81613d30565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613dcf603d836134d6565b9150613dda82613d73565b604082019050919050565b60006020820190508181036000830152613dfe81613dc2565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613e61602d836134d6565b9150613e6c82613e05565b604082019050919050565b60006020820190508181036000830152613e9081613e54565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613ef3602b836134d6565b9150613efe82613e97565b604082019050919050565b60006020820190508181036000830152613f2281613ee6565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613f85602f836134d6565b9150613f9082613f29565b604082019050919050565b60006020820190508181036000830152613fb481613f78565b9050919050565b6000606082019050613fd06000830186613919565b613fdd6020830185613919565b613fea6040830184613612565b949350505050565b7f4445465553494f4e41493a2043616c6c6572206973206e6f742061206d696e7460008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061404e6022836134d6565b915061405982613ff2565b604082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b6000813561409181613587565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6140d38461409a565b9350801983169250808416831791505092915050565b6000819050919050565b600061410e6141096141048461357d565b6140e9565b61357d565b9050919050565b6000819050919050565b614128826140f3565b61413b61413482614115565b83546140a7565b8255505050565b6000813561414f8161363c565b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff6141788461409a565b9350801983169250808416831791505092915050565b60006141a96141a461419f846135e0565b6140e9565b6135e0565b9050919050565b60006141bb8261418e565b9050919050565b60006141cd826141b0565b9050919050565b6000819050919050565b6141e7826141c2565b6141fa6141f3826141d4565b8354614158565b8255505050565b60008101600083018061421381614084565b905061421f818461411f565b50505060018101602083018061423481614142565b905061424081846141de565b50505060028101604083018061425581614084565b9050614261818461411f565b50505060038101606083018061427681614084565b9050614282818461411f565b50505060048101608083018061429781614084565b90506142a3818461411f565b5050505050565b6142b48282614201565b5050565b7f4552433732313a206275726e2063616c6c6572206973206e6f74206f776e657260008201527f206e6f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614314602d836134d6565b915061431f826142b8565b604082019050919050565b6000602082019050818103600083015261434381614307565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061439157607f821691505b6020821081036143a4576143a361434a565b5b50919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614406602c836134d6565b9150614411826143aa565b604082019050919050565b60006020820190508181036000830152614435816143f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006144a16018836134d6565b91506144ac8261446b565b602082019050919050565b600060208201905081810360008301526144d081614494565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006145336029836134d6565b915061453e826144d7565b604082019050919050565b6000602082019050818103600083015261456281614526565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261458e565b6145d5868361458e565b95508019841693508086168417925050509392505050565b6145f6836140f3565b61460a61460282614115565b84845461459b565b825550505050565b600090565b61461f614612565b61462a8184846145ed565b505050565b5b8181101561464e57614643600082614617565b600181019050614630565b5050565b601f8211156146935761466481614569565b61466d8461457e565b8101602085101561467c578190505b6146906146888561457e565b83018261462f565b50505b505050565b600082821c905092915050565b60006146b660001984600802614698565b1980831691505092915050565b60006146cf83836146a5565b9150826002028217905092915050565b6146e8826134cb565b67ffffffffffffffff811115614701576147006136dc565b5b61470b8254614379565b614716828285614652565b600060209050601f8311600181146147495760008415614737578287015190505b61474185826146c3565b8655506147a9565b601f19841661475786614569565b60005b8281101561477f5784890151825560018201915060208501945060208101905061475a565b8683101561479c5784890151614798601f8916826146a5565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600081546147c981614379565b6147d381866147b1565b945060018216600081146147ee576001811461480357614836565b60ff1983168652811515820286019350614836565b61480c85614569565b60005b8381101561482e5781548189015260018201915060208101905061480f565b838801955050505b50505092915050565b600061484b82846147bc565b915081905092915050565b7f696e697469616c697a653a20416c726561647920696e697469616c697a656421600082015250565b600061488c6020836134d6565b915061489782614856565b602082019050919050565b600060208201905081810360008301526148bb8161487f565b9050919050565b7f4445465553494f4e41493a2055524920717565727920666f72206e6f6e65786960008201527f7374656e7420746f6b656e000000000000000000000000000000000000000000602082015250565b600061491e602b836134d6565b9150614929826148c2565b604082019050919050565b6000602082019050818103600083015261494d81614911565b9050919050565b600061495f826134cb565b61496981856147b1565b93506149798185602086016134e7565b80840191505092915050565b60006149918285614954565b915061499d8284614954565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a056026836134d6565b9150614a10826149a9565b604082019050919050565b60006020820190508181036000830152614a34816149f8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a716020836134d6565b9150614a7c82614a3b565b602082019050919050565b60006020820190508181036000830152614aa081614a64565b9050919050565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614b03602c836134d6565b9150614b0e82614aa7565b604082019050919050565b60006020820190508181036000830152614b3281614af6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b956025836134d6565b9150614ba082614b39565b604082019050919050565b60006020820190508181036000830152614bc481614b88565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c276024836134d6565b9150614c3282614bcb565b604082019050919050565b60006020820190508181036000830152614c5681614c1a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614c93601f836134d6565b9150614c9e82614c5d565b602082019050919050565b60006020820190508181036000830152614cc281614c86565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614cff6020836134d6565b9150614d0a82614cc9565b602082019050919050565b60006020820190508181036000830152614d2e81614cf2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614d6b601c836134d6565b9150614d7682614d35565b602082019050919050565b60006020820190508181036000830152614d9a81614d5e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614dd76019836134d6565b9150614de282614da1565b602082019050919050565b60006020820190508181036000830152614e0681614dca565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e696032836134d6565b9150614e7482614e0d565b604082019050919050565b60006020820190508181036000830152614e9881614e5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614f2a6035836134d6565b9150614f3582614ece565b604082019050919050565b60006020820190508181036000830152614f5981614f1d565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614f966017836147b1565b9150614fa182614f60565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614fe26011836147b1565b9150614fed82614fac565b601182019050919050565b600061500382614f89565b915061500f8285614954565b915061501a82614fd5565b91506150268284614954565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061505982615032565b615063818561503d565b93506150738185602086016134e7565b61507c81613511565b840191505092915050565b600060808201905061509c6000830187613612565b6150a96020830186613612565b6150b660408301856136a8565b81810360608301526150c8818461504e565b905095945050505050565b6000815190506150e28161343c565b92915050565b6000602082840312156150fe576150fd613406565b5b600061510c848285016150d3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061514f8261357d565b915061515a8361357d565b925082820390508181111561517257615171615115565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006151b28261357d565b91506151bd8361357d565b92508282026151cb8161357d565b915082820484148315176151e2576151e1615115565b5b5092915050565b60006151f48261357d565b91506151ff8361357d565b925082820190508082111561521757615216615115565b5b92915050565b60006152288261357d565b91506000820361523b5761523a615115565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061527c6020836134d6565b915061528782615246565b602082019050919050565b600060208201905081810360008301526152ab8161526f565b905091905056fe68747470733a2f2f6465667573696f6e2e61692f6170692f76312f6d657461646174612f6574682fa26469706673582212206ad487136a225c48ee923560250f20b1bcab4dacaa7192ca3897fe840b4b6a9164736f6c63430008120033
Deployed Bytecode Sourcemap
403:5297:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2021:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5479:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:167:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3468:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1630:111:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3862:144:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4612:326:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4378:129:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4803:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1306:253:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5912:214:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2472:204:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2799:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5004:179:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3259:343:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1813:230:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2190:219:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2682:111:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:204:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:2;;;:::i;:::-;;5312:161:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1201:85:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2895:145:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5591:107:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2269:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2027:49:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4169:153:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5249:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3608:136:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1652:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4473:833;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5228:147:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4388:162:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2021:242:17;2193:4;2220:36;2244:11;2220:23;:36::i;:::-;2213:43;;2021:242;;;:::o;5479:106::-;5533:13;5558:20;;;;;;;;;;;;;;;;;;;5479:106;:::o;3935:167:4:-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;4071:15;:24;4087:7;4071:24;;;;;;;;;;;;;;;;;;;;;4064:31;;3935:167;;;:::o;3468:406::-;3548:13;3564:23;3579:7;3564:14;:23::i;:::-;3548:39;;3611:5;3605:11;;:2;:11;;;3597:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3702:5;3686:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3711:37;3728:5;3735:12;:10;:12::i;:::-;3711:16;:37::i;:::-;3686:62;3665:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3538:336;3468:406;;:::o;1630:111:7:-;1691:7;1717:10;:17;;;;1710:24;;1630:111;:::o;3862:144:17:-;1094:13:2;:11;:13::i;:::-;3972:27:17::1;3985:7;3994:4;3972:12;:27::i;:::-;3862:144:::0;;:::o;4612:326:4:-;4801:41;4820:12;:10;:12::i;:::-;4834:7;4801:18;:41::i;:::-;4793:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;4903:28;4913:4;4919:2;4923:7;4903:9;:28::i;:::-;4612:326;;;:::o;4378:129:0:-;4452:7;4478:6;:12;4485:4;4478:12;;;;;;;;;;;:22;;;4471:29;;4378:129;;;:::o;4803:145::-;4886:18;4899:4;4886:12;:18::i;:::-;2505:16;2516:4;2505:10;:16::i;:::-;4916:25:::1;4927:4;4933:7;4916:10;:25::i;:::-;4803:145:::0;;;:::o;1306:253:7:-;1403:7;1438:23;1455:5;1438:16;:23::i;:::-;1430:5;:31;1422:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1526:12;:19;1539:5;1526:19;;;;;;;;;;;;;;;:26;1546:5;1526:26;;;;;;;;;;;;1519:33;;1306:253;;;;:::o;5912:214:0:-;6018:12;:10;:12::i;:::-;6007:23;;:7;:23;;;5999:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;6093:26;6105:4;6111:7;6093:11;:26::i;:::-;5912:214;;:::o;2472:204:17:-;1094:13:2;:11;:13::i;:::-;2549:43:17::1;1234:21;;;;;;;;;;;;;;;;::::0;1218:39:::1;;;;;;2580:11;2549;:43::i;:::-;2607:62;1014:15;;;;;;;;;;;;;;;;::::0;998:33:::1;;;;;;1234:21;;;;;;;;;;;;;;;;::::0;1218:39:::1;;;;;;2657:11;2607:62;;;;;;;;:::i;:::-;;;;;;;;2472:204:::0;:::o;2799:454::-;2942:7;2261:21:3;:19;:21::i;:::-;2982:32:17::1;1014:15;;;;;;;;;;;;;;;;::::0;998:33:::1;;;;;;3003:10;2982:7;:32::i;:::-;2961:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;3084:18;3090:2;3094:7;3084:5;:18::i;:::-;3138:4;3113:13;:22;3127:7;3113:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;3174:9;3152:10;:19;3163:7;3152:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;;;3213:7;3209:2;3199:22;;;;;;;;;;;;3239:7;3232:14;;2303:20:3::0;:18;:20::i;:::-;2799:454:17;;;;;:::o;5004:179:4:-;5137:39;5154:4;5160:2;5164:7;5137:39;;;;;;;;;;;;:16;:39::i;:::-;5004:179;;;:::o;3259:343:17:-;3335:37;3354:12;:10;:12::i;:::-;3368:3;3335:18;:37::i;:::-;3314:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;3453:10;3459:3;3453:5;:10::i;:::-;3546:1;3519:10;:15;3530:3;3519:15;;;;;;;;;;;3513:29;;;;;:::i;:::-;;;:34;3509:87;;3570:10;:15;3581:3;3570:15;;;;;;;;;;;;3563:22;;;;:::i;:::-;3509:87;3259:343;:::o;1813:230:7:-;1888:7;1923:30;:28;:30::i;:::-;1915:5;:38;1907:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:10;2030:5;2019:17;;;;;;;;:::i;:::-;;;;;;;;;;2012:24;;1813:230;;;:::o;2190:219:4:-;2262:7;2281:13;2297:17;2306:7;2297:8;:17::i;:::-;2281:33;;2349:1;2332:19;;:5;:19;;;2324:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2397:5;2390:12;;;2190:219;;;:::o;2682:111:17:-;2741:4;2764:13;:22;2778:7;2764:22;;;;;;;;;;;;;;;;;;;;;2757:29;;2682:111;;;:::o;1929:204:4:-;2001:7;2045:1;2028:19;;:5;:19;;;2020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2110:9;:16;2120:5;2110:16;;;;;;;;;;;;;;;;2103:23;;1929:204;;;:::o;1831:101:2:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;5312:161:17:-;5397:26;;:::i;:::-;5447:10;:19;5458:7;5447:19;;;;;;;;;;;5435:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5312:161;;;:::o;1201:85:2:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;2895:145:0:-;2981:4;3004:6;:12;3011:4;3004:12;;;;;;;;;;;:20;;:29;3025:7;3004:29;;;;;;;;;;;;;;;;;;;;;;;;;2997:36;;2895:145;;;;:::o;5591:107:17:-;5647:13;5672:19;;;;;;;;;;;;;;;;;;;5591:107;:::o;2269:197::-;1094:13:2;:11;:13::i;:::-;2343:42:17::1;1234:21;;;;;;;;;;;;;;;;::::0;1218:39:::1;;;;;;2373:11;2343:10;:42::i;:::-;2400:59;1014:15;;;;;;;;;;;;;;;;::::0;998:33:::1;;;;;;1234:21;;;;;;;;;;;;;;;;::::0;1218:39:::1;;;;;;2447:11;2400:59;;;;;;;;:::i;:::-;;;;;;;;2269:197:::0;:::o;2027:49:0:-;2072:4;2027:49;;;:::o;4169:153:4:-;4263:52;4282:12;:10;:12::i;:::-;4296:8;4306;4263:18;:52::i;:::-;4169:153;;:::o;5249:314::-;5417:41;5436:12;:10;:12::i;:::-;5450:7;5417:18;:41::i;:::-;5409:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;5518:38;5532:4;5538:2;5542:7;5551:4;5518:13;:38::i;:::-;5249:314;;;;:::o;3608:136:17:-;1094:13:2;:11;:13::i;:::-;3696:8:17::1;3686:7;:18;;;;;;:::i;:::-;;3729:7;3719:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3608:136:::0;:::o;1652:363::-;1730:11;;;;;;;;;;;1729:12;1721:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;1788:26;1807:6;1788:18;:26::i;:::-;1825:52;;;;;;;;;;;;;;;;;:7;:52;;;;;;:::i;:::-;;1887:45;1014:15;;;;;;;;;;;;;;;;;998:33;;;;;;1234:21;;;;;;;;;;;;;;;;;1218:39;;;;;;1887:13;:45::i;:::-;1942:37;1234:21;;;;;;;;;;;;;;;;;1218:39;;;;;;1972:6;1942:10;:37::i;:::-;2004:4;1990:11;;:18;;;;;;;;;;;;;;;;;;1652:363;:::o;4473:833::-;4552:13;4585:16;4593:7;4585;:16::i;:::-;4577:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4659:22;4684:10;:8;:10::i;:::-;4659:35;;4779:23;4805:10;:19;4816:7;4805:19;;;;;;;;;;;4779:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4923:1;4903:8;4897:22;:27;4893:74;;4947:9;4940:16;;;;;;4893:74;5095:1;5075:9;5069:23;:27;5065:74;;;5119:9;5112:16;;;;;;5065:74;5269:8;5279:18;:7;:16;:18::i;:::-;5252:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5238:61;;;;4473:833;;;;:::o;5228:147:0:-;5312:18;5325:4;5312:12;:18::i;:::-;2505:16;2516:4;2505:10;:16::i;:::-;5342:26:::1;5354:4;5360:7;5342:11;:26::i;:::-;5228:147:::0;;;:::o;4388:162:4:-;4485:4;4508:18;:25;4527:5;4508:25;;;;;;;;;;;;;;;:35;4534:8;4508:35;;;;;;;;;;;;;;;;;;;;;;;;;4501:42;;4388:162;;;;:::o;2081:198:2:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1005:222:7:-;1107:4;1145:35;1130:50;;;:11;:50;;;;:90;;;;1184:36;1208:11;1184:23;:36::i;:::-;1130:90;1123:97;;1005:222;;;:::o;13466:133:4:-;13547:16;13555:7;13547;:16::i;:::-;13539:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;13466:133;:::o;640:96:11:-;693:7;719:10;712:17;;640:96;:::o;12768:171:4:-;12869:2;12842:15;:24;12858:7;12842:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12924:7;12920:2;12886:46;;12895:23;12910:7;12895:14;:23::i;:::-;12886:46;;;;;;;;;;;;12768:171;;:::o;1359:130:2:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;4153:314:17:-;4287:16;4295:7;4287;:16::i;:::-;4266:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;4405:9;4383:10;:19;4394:7;4383:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;4441:7;4429:31;4450:9;4429:31;;;;;;:::i;:::-;;;;;;;;4153:314;;:::o;7540:261:4:-;7633:4;7649:13;7665:23;7680:7;7665:14;:23::i;:::-;7649:39;;7717:5;7706:16;;:7;:16;;;:52;;;;7726:32;7743:5;7750:7;7726:16;:32::i;:::-;7706:52;:87;;;;7786:7;7762:31;;:20;7774:7;7762:11;:20::i;:::-;:31;;;7706:87;7698:96;;;7540:261;;;;:::o;11423:1233::-;11577:4;11550:31;;:23;11565:7;11550:14;:23::i;:::-;:31;;;11542:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11655:1;11641:16;;:2;:16;;;11633:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11709:42;11730:4;11736:2;11740:7;11749:1;11709:20;:42::i;:::-;11878:4;11851:31;;:23;11866:7;11851:14;:23::i;:::-;:31;;;11843:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11993:15;:24;12009:7;11993:24;;;;;;;;;;;;11986:31;;;;;;;;;;;12480:1;12461:9;:15;12471:4;12461:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12512:1;12495:9;:13;12505:2;12495:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12552:2;12533:7;:16;12541:7;12533:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12589:7;12585:2;12570:27;;12579:4;12570:27;;;;;;;;;;;;12608:41;12628:4;12634:2;12638:7;12647:1;12608:19;:41::i;:::-;11423:1233;;;:::o;3334:103:0:-;3400:30;3411:4;3417:12;:10;:12::i;:::-;3400:10;:30::i;:::-;3334:103;:::o;7461:233::-;7544:22;7552:4;7558:7;7544;:22::i;:::-;7539:149;;7614:4;7582:6;:12;7589:4;7582:12;;;;;;;;;;;:20;;:29;7603:7;7582:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;7664:12;:10;:12::i;:::-;7637:40;;7655:7;7637:40;;7649:4;7637:40;;;;;;;;;;7539:149;7461:233;;:::o;7865:234::-;7948:22;7956:4;7962:7;7948;:22::i;:::-;7944:149;;;8018:5;7986:6;:12;7993:4;7986:12;;;;;;;;;;;:20;;:29;8007:7;7986:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8069:12;:10;:12::i;:::-;8042:40;;8060:7;8042:40;;8054:4;8042:40;;;;;;;;;;7944:149;7865:234;;:::o;2336:287:3:-;1759:1;2468:7;;:19;2460:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:1;2598:7;:18;;;;2336:287::o;9091:920:4:-;9184:1;9170:16;;:2;:16;;;9162:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9242:16;9250:7;9242;:16::i;:::-;9241:17;9233:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9302:48;9331:1;9335:2;9339:7;9348:1;9302:20;:48::i;:::-;9446:16;9454:7;9446;:16::i;:::-;9445:17;9437:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9854:1;9837:9;:13;9847:2;9837:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;9895:2;9876:7;:16;9884:7;9876:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9938:7;9934:2;9913:33;;9930:1;9913:33;;;;;;;;;;;;9957:47;9985:1;9989:2;9993:7;10002:1;9957:19;:47::i;:::-;9091:920;;:::o;2629:209:3:-;1716:1;2809:7;:22;;;;2629:209::o;10337:762:4:-;10396:13;10412:23;10427:7;10412:14;:23::i;:::-;10396:39;;10446:51;10467:5;10482:1;10486:7;10495:1;10446:20;:51::i;:::-;10607:23;10622:7;10607:14;:23::i;:::-;10599:31;;10675:15;:24;10691:7;10675:24;;;;;;;;;;;;10668:31;;;;;;;;;;;10935:1;10915:9;:16;10925:5;10915:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;10963:7;:16;10971:7;10963:16;;;;;;;;;;;;10956:23;;;;;;;;;;;11023:7;11019:1;10995:36;;11004:5;10995:36;;;;;;;;;;;;11042:50;11062:5;11077:1;11081:7;11090:1;11042:19;:50::i;:::-;10386:713;10337:762;:::o;6838:115::-;6904:7;6930;:16;6938:7;6930:16;;;;;;;;;;;;;;;;;;;;;6923:23;;6838:115;;;:::o;2433:187:2:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;6811:110:0:-;6889:25;6900:4;6906:7;6889:10;:25::i;:::-;6811:110;;:::o;13075:307:4:-;13225:8;13216:17;;:5;:17;;;13208:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;13311:8;13273:18;:25;13292:5;13273:25;;;;;;;;;;;;;;;:35;13299:8;13273:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13356:8;13334:41;;13349:5;13334:41;;;13366:8;13334:41;;;;;;:::i;:::-;;;;;;;;13075:307;;;:::o;6424:305::-;6574:28;6584:4;6590:2;6594:7;6574:9;:28::i;:::-;6620:47;6643:4;6649:2;6653:7;6662:4;6620:22;:47::i;:::-;6612:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6424:305;;;;:::o;7046:247:0:-;7129:25;7157:18;7170:4;7157:12;:18::i;:::-;7129:46;;7210:9;7185:6;:12;7192:4;7185:12;;;;;;;;;;;:22;;:34;;;;7276:9;7257:17;7251:4;7234:52;;;;;;;;;;7119:174;7046:247;;:::o;7256:126:4:-;7321:4;7373:1;7344:31;;:17;7353:7;7344:8;:17::i;:::-;:31;;;;7337:38;;7256:126;;;:::o;3750:106:17:-;3810:13;3842:7;3835:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3750:106;:::o;415:696:12:-;471:13;520:14;557:1;537:17;548:5;537:10;:17::i;:::-;:21;520:38;;572:20;606:6;595:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;572:41;;627:11;753:6;749:2;745:15;737:6;733:28;726:35;;788:280;795:4;788:280;;;819:5;;;;;;;;958:8;953:2;946:5;942:14;937:30;932:3;924:44;1012:2;1003:11;;;;;;:::i;:::-;;;;;1045:1;1036:5;:10;788:280;1032:21;788:280;1088:6;1081:13;;;;;415:696;;;:::o;1570:300:4:-;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;2112:890:7:-;2283:61;2310:4;2316:2;2320:12;2334:9;2283:26;:61::i;:::-;2371:1;2359:9;:13;2355:219;;;2500:63;;;;;;;;;;:::i;:::-;;;;;;;;2355:219;2584:15;2602:12;2584:30;;2645:1;2629:18;;:4;:18;;;2625:183;;2663:40;2695:7;2663:31;:40::i;:::-;2625:183;;;2732:2;2724:10;;:4;:10;;;2720:88;;2750:47;2783:4;2789:7;2750:32;:47::i;:::-;2720:88;2625:183;2835:1;2821:16;;:2;:16;;;2817:179;;2853:45;2890:7;2853:36;:45::i;:::-;2817:179;;;2925:4;2919:10;;:2;:10;;;2915:81;;2945:40;2973:2;2977:7;2945:27;:40::i;:::-;2915:81;2817:179;2273:729;2112:890;;;;:::o;16558:153:4:-;;;;;:::o;3718:479:0:-;3806:22;3814:4;3820:7;3806;:22::i;:::-;3801:390;;3989:28;4009:7;3989:19;:28::i;:::-;4088:38;4116:4;4108:13;;4123:2;4088:19;:38::i;:::-;3896:252;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3844:336;;;;;;;;;;;:::i;:::-;;;;;;;;3801:390;3718:479;;:::o;14151:831:4:-;14300:4;14320:15;:2;:13;;;:15::i;:::-;14316:660;;;14371:2;14355:36;;;14392:12;:10;:12::i;:::-;14406:4;14412:7;14421:4;14355:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14351:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14610:1;14593:6;:13;:18;14589:321;;14635:60;;;;;;;;;;:::i;:::-;;;;;;;;14589:321;14862:6;14856:13;14847:6;14843:2;14839:15;14832:38;14351:573;14486:41;;;14476:51;;;:6;:51;;;;14469:58;;;;;14316:660;14961:4;14954:11;;14151:831;;;;;;;:::o;9889:890:15:-;9942:7;9961:14;9978:1;9961:18;;10026:6;10017:5;:15;10013:99;;10061:6;10052:15;;;;;;:::i;:::-;;;;;10095:2;10085:12;;;;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;;;;:::i;:::-;;;;;10207:2;10197:12;;;;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;;;;:::i;:::-;;;;;10319:2;10309:12;;;;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;;;;:::i;:::-;;;;;10429:1;10419:11;;;;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;;;;:::i;:::-;;;;;10538:1;10528:11;;;;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;;;;:::i;:::-;;;;;10647:1;10637:11;;;;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;;;;10676:64;10766:6;10759:13;;;9889:890;;;:::o;2606:202:0:-;2691:4;2729:32;2714:47;;;:11;:47;;;;:87;;;;2765:36;2789:11;2765:23;:36::i;:::-;2714:87;2707:94;;2606:202;;;:::o;15698:154:4:-;;;;;:::o;3708:161:7:-;3811:10;:17;;;;3784:15;:24;3800:7;3784:24;;;;;;;;;;;:44;;;;3838:10;3854:7;3838:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3708:161;:::o;4486:970::-;4748:22;4798:1;4773:22;4790:4;4773:16;:22::i;:::-;:26;;;;:::i;:::-;4748:51;;4809:18;4830:17;:26;4848:7;4830:26;;;;;;;;;;;;4809:47;;4974:14;4960:10;:28;4956:323;;5004:19;5026:12;:18;5039:4;5026:18;;;;;;;;;;;;;;;:34;5045:14;5026:34;;;;;;;;;;;;5004:56;;5108:11;5075:12;:18;5088:4;5075:18;;;;;;;;;;;;;;;:30;5094:10;5075:30;;;;;;;;;;;:44;;;;5224:10;5191:17;:30;5209:11;5191:30;;;;;;;;;;;:43;;;;4990:289;4956:323;5372:17;:26;5390:7;5372:26;;;;;;;;;;;5365:33;;;5415:12;:18;5428:4;5415:18;;;;;;;;;;;;;;;:34;5434:14;5415:34;;;;;;;;;;;5408:41;;;4567:889;;4486:970;;:::o;5744:1061::-;5993:22;6038:1;6018:10;:17;;;;:21;;;;:::i;:::-;5993:46;;6049:18;6070:15;:24;6086:7;6070:24;;;;;;;;;;;;6049:45;;6416:19;6438:10;6449:14;6438:26;;;;;;;;:::i;:::-;;;;;;;;;;6416:48;;6500:11;6475:10;6486;6475:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6610:10;6579:15;:28;6595:11;6579:28;;;;;;;;;;;:41;;;;6748:15;:24;6764:7;6748:24;;;;;;;;;;;6741:31;;;6782:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5815:990;;;5744:1061;:::o;3296:217::-;3380:14;3397:20;3414:2;3397:16;:20::i;:::-;3380:37;;3454:7;3427:12;:16;3440:2;3427:16;;;;;;;;;;;;;;;:24;3444:6;3427:24;;;;;;;;;;;:34;;;;3500:6;3471:17;:26;3489:7;3471:26;;;;;;;;;;;:35;;;;3370:143;3296:217;;:::o;2102:149:12:-;2160:13;2192:52;2220:4;2204:22;;311:2;2192:52;;:11;:52::i;:::-;2185:59;;2102:149;;;:::o;1513:437::-;1588:13;1613:19;1658:1;1649:6;1645:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1635:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1613:47;;1670:15;:6;1677:1;1670:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1695;:6;1702:1;1695:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1725:9;1750:1;1741:6;1737:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1725:26;;1720:128;1757:1;1753;:5;1720:128;;;1791:8;1808:3;1800:5;:11;1791:21;;;;;;;:::i;:::-;;;;;1779:6;1786:1;1779:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;1836:1;1826:11;;;;;1760:3;;;;:::i;:::-;;;1720:128;;;;1874:1;1865:5;:10;1857:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1936:6;1922:21;;;1513:437;;;;:::o;1175:320:10:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;829:155:13:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:180;5536:77;5533:1;5526:88;5633:4;5630:1;5623:15;5657:4;5654:1;5647:15;5674:281;5757:27;5779:4;5757:27;:::i;:::-;5749:6;5745:40;5887:6;5875:10;5872:22;5851:18;5839:10;5836:34;5833:62;5830:88;;;5898:18;;:::i;:::-;5830:88;5938:10;5934:2;5927:22;5717:238;5674:281;;:::o;5961:129::-;5995:6;6022:20;;:::i;:::-;6012:30;;6051:33;6079:4;6071:6;6051:33;:::i;:::-;5961:129;;;:::o;6096:308::-;6158:4;6248:18;6240:6;6237:30;6234:56;;;6270:18;;:::i;:::-;6234:56;6308:29;6330:6;6308:29;:::i;:::-;6300:37;;6392:4;6386;6382:15;6374:23;;6096:308;;;:::o;6410:146::-;6507:6;6502:3;6497;6484:30;6548:1;6539:6;6534:3;6530:16;6523:27;6410:146;;;:::o;6562:425::-;6640:5;6665:66;6681:49;6723:6;6681:49;:::i;:::-;6665:66;:::i;:::-;6656:75;;6754:6;6747:5;6740:21;6792:4;6785:5;6781:16;6830:3;6821:6;6816:3;6812:16;6809:25;6806:112;;;6837:79;;:::i;:::-;6806:112;6927:54;6974:6;6969:3;6964;6927:54;:::i;:::-;6646:341;6562:425;;;;;:::o;7007:340::-;7063:5;7112:3;7105:4;7097:6;7093:17;7089:27;7079:122;;7120:79;;:::i;:::-;7079:122;7237:6;7224:20;7262:79;7337:3;7329:6;7322:4;7314:6;7310:17;7262:79;:::i;:::-;7253:88;;7069:278;7007:340;;;;:::o;7353:654::-;7431:6;7439;7488:2;7476:9;7467:7;7463:23;7459:32;7456:119;;;7494:79;;:::i;:::-;7456:119;7614:1;7639:53;7684:7;7675:6;7664:9;7660:22;7639:53;:::i;:::-;7629:63;;7585:117;7769:2;7758:9;7754:18;7741:32;7800:18;7792:6;7789:30;7786:117;;;7822:79;;:::i;:::-;7786:117;7927:63;7982:7;7973:6;7962:9;7958:22;7927:63;:::i;:::-;7917:73;;7712:288;7353:654;;;;;:::o;8013:619::-;8090:6;8098;8106;8155:2;8143:9;8134:7;8130:23;8126:32;8123:119;;;8161:79;;:::i;:::-;8123:119;8281:1;8306:53;8351:7;8342:6;8331:9;8327:22;8306:53;:::i;:::-;8296:63;;8252:117;8408:2;8434:53;8479:7;8470:6;8459:9;8455:22;8434:53;:::i;:::-;8424:63;;8379:118;8536:2;8562:53;8607:7;8598:6;8587:9;8583:22;8562:53;:::i;:::-;8552:63;;8507:118;8013:619;;;;;:::o;8638:77::-;8675:7;8704:5;8693:16;;8638:77;;;:::o;8721:122::-;8794:24;8812:5;8794:24;:::i;:::-;8787:5;8784:35;8774:63;;8833:1;8830;8823:12;8774:63;8721:122;:::o;8849:139::-;8895:5;8933:6;8920:20;8911:29;;8949:33;8976:5;8949:33;:::i;:::-;8849:139;;;;:::o;8994:329::-;9053:6;9102:2;9090:9;9081:7;9077:23;9073:32;9070:119;;;9108:79;;:::i;:::-;9070:119;9228:1;9253:53;9298:7;9289:6;9278:9;9274:22;9253:53;:::i;:::-;9243:63;;9199:117;8994:329;;;;:::o;9329:118::-;9416:24;9434:5;9416:24;:::i;:::-;9411:3;9404:37;9329:118;;:::o;9453:222::-;9546:4;9584:2;9573:9;9569:18;9561:26;;9597:71;9665:1;9654:9;9650:17;9641:6;9597:71;:::i;:::-;9453:222;;;;:::o;9681:474::-;9749:6;9757;9806:2;9794:9;9785:7;9781:23;9777:32;9774:119;;;9812:79;;:::i;:::-;9774:119;9932:1;9957:53;10002:7;9993:6;9982:9;9978:22;9957:53;:::i;:::-;9947:63;;9903:117;10059:2;10085:53;10130:7;10121:6;10110:9;10106:22;10085:53;:::i;:::-;10075:63;;10030:118;9681:474;;;;;:::o;10161:329::-;10220:6;10269:2;10257:9;10248:7;10244:23;10240:32;10237:119;;;10275:79;;:::i;:::-;10237:119;10395:1;10420:53;10465:7;10456:6;10445:9;10441:22;10420:53;:::i;:::-;10410:63;;10366:117;10161:329;;;;:::o;10496:117::-;10605:1;10602;10595:12;10655:234;10730:5;10771:3;10762:6;10757:3;10753:16;10749:26;10746:113;;;10778:79;;:::i;:::-;10746:113;10877:6;10868:15;;10655:234;;;;:::o;10895:678::-;11001:6;11009;11017;11066:3;11054:9;11045:7;11041:23;11037:33;11034:120;;;11073:79;;:::i;:::-;11034:120;11193:1;11218:53;11263:7;11254:6;11243:9;11239:22;11218:53;:::i;:::-;11208:63;;11164:117;11320:2;11346:53;11391:7;11382:6;11371:9;11367:22;11346:53;:::i;:::-;11336:63;;11291:118;11448:2;11474:82;11548:7;11539:6;11528:9;11524:22;11474:82;:::i;:::-;11464:92;;11419:147;10895:678;;;;;:::o;11579:108::-;11656:24;11674:5;11656:24;:::i;:::-;11651:3;11644:37;11579:108;;:::o;11693:::-;11770:24;11788:5;11770:24;:::i;:::-;11765:3;11758:37;11693:108;;:::o;11875:1043::-;12026:4;12021:3;12017:14;12117:4;12110:5;12106:16;12100:23;12136:63;12193:4;12188:3;12184:14;12170:12;12136:63;:::i;:::-;12041:168;12291:4;12284:5;12280:16;12274:23;12310:63;12367:4;12362:3;12358:14;12344:12;12310:63;:::i;:::-;12219:164;12464:4;12457:5;12453:16;12447:23;12483:63;12540:4;12535:3;12531:14;12517:12;12483:63;:::i;:::-;12393:163;12640:4;12633:5;12629:16;12623:23;12659:63;12716:4;12711:3;12707:14;12693:12;12659:63;:::i;:::-;12566:166;12819:4;12812:5;12808:16;12802:23;12838:63;12895:4;12890:3;12886:14;12872:12;12838:63;:::i;:::-;12742:169;11995:923;11875:1043;;:::o;12924:331::-;13071:4;13109:3;13098:9;13094:19;13086:27;;13123:125;13245:1;13234:9;13230:17;13221:6;13123:125;:::i;:::-;12924:331;;;;:::o;13261:116::-;13331:21;13346:5;13331:21;:::i;:::-;13324:5;13321:32;13311:60;;13367:1;13364;13357:12;13311:60;13261:116;:::o;13383:133::-;13426:5;13464:6;13451:20;13442:29;;13480:30;13504:5;13480:30;:::i;:::-;13383:133;;;;:::o;13522:468::-;13587:6;13595;13644:2;13632:9;13623:7;13619:23;13615:32;13612:119;;;13650:79;;:::i;:::-;13612:119;13770:1;13795:53;13840:7;13831:6;13820:9;13816:22;13795:53;:::i;:::-;13785:63;;13741:117;13897:2;13923:50;13965:7;13956:6;13945:9;13941:22;13923:50;:::i;:::-;13913:60;;13868:115;13522:468;;;;;:::o;13996:307::-;14057:4;14147:18;14139:6;14136:30;14133:56;;;14169:18;;:::i;:::-;14133:56;14207:29;14229:6;14207:29;:::i;:::-;14199:37;;14291:4;14285;14281:15;14273:23;;13996:307;;;:::o;14309:423::-;14386:5;14411:65;14427:48;14468:6;14427:48;:::i;:::-;14411:65;:::i;:::-;14402:74;;14499:6;14492:5;14485:21;14537:4;14530:5;14526:16;14575:3;14566:6;14561:3;14557:16;14554:25;14551:112;;;14582:79;;:::i;:::-;14551:112;14672:54;14719:6;14714:3;14709;14672:54;:::i;:::-;14392:340;14309:423;;;;;:::o;14751:338::-;14806:5;14855:3;14848:4;14840:6;14836:17;14832:27;14822:122;;14863:79;;:::i;:::-;14822:122;14980:6;14967:20;15005:78;15079:3;15071:6;15064:4;15056:6;15052:17;15005:78;:::i;:::-;14996:87;;14812:277;14751:338;;;;:::o;15095:943::-;15190:6;15198;15206;15214;15263:3;15251:9;15242:7;15238:23;15234:33;15231:120;;;15270:79;;:::i;:::-;15231:120;15390:1;15415:53;15460:7;15451:6;15440:9;15436:22;15415:53;:::i;:::-;15405:63;;15361:117;15517:2;15543:53;15588:7;15579:6;15568:9;15564:22;15543:53;:::i;:::-;15533:63;;15488:118;15645:2;15671:53;15716:7;15707:6;15696:9;15692:22;15671:53;:::i;:::-;15661:63;;15616:118;15801:2;15790:9;15786:18;15773:32;15832:18;15824:6;15821:30;15818:117;;;15854:79;;:::i;:::-;15818:117;15959:62;16013:7;16004:6;15993:9;15989:22;15959:62;:::i;:::-;15949:72;;15744:287;15095:943;;;;;;;:::o;16044:509::-;16113:6;16162:2;16150:9;16141:7;16137:23;16133:32;16130:119;;;16168:79;;:::i;:::-;16130:119;16316:1;16305:9;16301:17;16288:31;16346:18;16338:6;16335:30;16332:117;;;16368:79;;:::i;:::-;16332:117;16473:63;16528:7;16519:6;16508:9;16504:22;16473:63;:::i;:::-;16463:73;;16259:287;16044:509;;;;:::o;16559:474::-;16627:6;16635;16684:2;16672:9;16663:7;16659:23;16655:32;16652:119;;;16690:79;;:::i;:::-;16652:119;16810:1;16835:53;16880:7;16871:6;16860:9;16856:22;16835:53;:::i;:::-;16825:63;;16781:117;16937:2;16963:53;17008:7;16999:6;16988:9;16984:22;16963:53;:::i;:::-;16953:63;;16908:118;16559:474;;;;;:::o;17039:220::-;17179:34;17175:1;17167:6;17163:14;17156:58;17248:3;17243:2;17235:6;17231:15;17224:28;17039:220;:::o;17265:366::-;17407:3;17428:67;17492:2;17487:3;17428:67;:::i;:::-;17421:74;;17504:93;17593:3;17504:93;:::i;:::-;17622:2;17617:3;17613:12;17606:19;;17265:366;;;:::o;17637:419::-;17803:4;17841:2;17830:9;17826:18;17818:26;;17890:9;17884:4;17880:20;17876:1;17865:9;17861:17;17854:47;17918:131;18044:4;17918:131;:::i;:::-;17910:139;;17637:419;;;:::o;18062:248::-;18202:34;18198:1;18190:6;18186:14;18179:58;18271:31;18266:2;18258:6;18254:15;18247:56;18062:248;:::o;18316:366::-;18458:3;18479:67;18543:2;18538:3;18479:67;:::i;:::-;18472:74;;18555:93;18644:3;18555:93;:::i;:::-;18673:2;18668:3;18664:12;18657:19;;18316:366;;;:::o;18688:419::-;18854:4;18892:2;18881:9;18877:18;18869:26;;18941:9;18935:4;18931:20;18927:1;18916:9;18912:17;18905:47;18969:131;19095:4;18969:131;:::i;:::-;18961:139;;18688:419;;;:::o;19113:232::-;19253:34;19249:1;19241:6;19237:14;19230:58;19322:15;19317:2;19309:6;19305:15;19298:40;19113:232;:::o;19351:366::-;19493:3;19514:67;19578:2;19573:3;19514:67;:::i;:::-;19507:74;;19590:93;19679:3;19590:93;:::i;:::-;19708:2;19703:3;19699:12;19692:19;;19351:366;;;:::o;19723:419::-;19889:4;19927:2;19916:9;19912:18;19904:26;;19976:9;19970:4;19966:20;19962:1;19951:9;19947:17;19940:47;20004:131;20130:4;20004:131;:::i;:::-;19996:139;;19723:419;;;:::o;20148:230::-;20288:34;20284:1;20276:6;20272:14;20265:58;20357:13;20352:2;20344:6;20340:15;20333:38;20148:230;:::o;20384:366::-;20526:3;20547:67;20611:2;20606:3;20547:67;:::i;:::-;20540:74;;20623:93;20712:3;20623:93;:::i;:::-;20741:2;20736:3;20732:12;20725:19;;20384:366;;;:::o;20756:419::-;20922:4;20960:2;20949:9;20945:18;20937:26;;21009:9;21003:4;20999:20;20995:1;20984:9;20980:17;20973:47;21037:131;21163:4;21037:131;:::i;:::-;21029:139;;20756:419;;;:::o;21181:234::-;21321:34;21317:1;21309:6;21305:14;21298:58;21390:17;21385:2;21377:6;21373:15;21366:42;21181:234;:::o;21421:366::-;21563:3;21584:67;21648:2;21643:3;21584:67;:::i;:::-;21577:74;;21660:93;21749:3;21660:93;:::i;:::-;21778:2;21773:3;21769:12;21762:19;;21421:366;;;:::o;21793:419::-;21959:4;21997:2;21986:9;21982:18;21974:26;;22046:9;22040:4;22036:20;22032:1;22021:9;22017:17;22010:47;22074:131;22200:4;22074:131;:::i;:::-;22066:139;;21793:419;;;:::o;22218:442::-;22367:4;22405:2;22394:9;22390:18;22382:26;;22418:71;22486:1;22475:9;22471:17;22462:6;22418:71;:::i;:::-;22499:72;22567:2;22556:9;22552:18;22543:6;22499:72;:::i;:::-;22581;22649:2;22638:9;22634:18;22625:6;22581:72;:::i;:::-;22218:442;;;;;;:::o;22666:221::-;22806:34;22802:1;22794:6;22790:14;22783:58;22875:4;22870:2;22862:6;22858:15;22851:29;22666:221;:::o;22893:366::-;23035:3;23056:67;23120:2;23115:3;23056:67;:::i;:::-;23049:74;;23132:93;23221:3;23132:93;:::i;:::-;23250:2;23245:3;23241:12;23234:19;;22893:366;;;:::o;23265:419::-;23431:4;23469:2;23458:9;23454:18;23446:26;;23518:9;23512:4;23508:20;23504:1;23493:9;23489:17;23482:47;23546:131;23672:4;23546:131;:::i;:::-;23538:139;;23265:419;;;:::o;23876:186::-;23921:11;23970:3;23957:17;23983:33;24010:5;23983:33;:::i;:::-;24050:5;24026:29;;23933:129;23876:186;;;:::o;24068:92::-;24100:8;24147:5;24144:1;24140:13;24119:34;;24068:92;;;:::o;24166:290::-;24224:6;24253:66;24340:22;24353:8;24340:22;:::i;:::-;24328:34;;24395:4;24391:9;24384:5;24380:21;24371:30;;24444:4;24434:8;24430:19;24423:5;24420:30;24410:40;;24231:225;24166:290;;;;:::o;24462:60::-;24490:3;24511:5;24504:12;;24462:60;;;:::o;24528:142::-;24578:9;24611:53;24629:34;24638:24;24656:5;24638:24;:::i;:::-;24629:34;:::i;:::-;24611:53;:::i;:::-;24598:66;;24528:142;;;:::o;24676:75::-;24719:3;24740:5;24733:12;;24676:75;;;:::o;24757:262::-;24867:39;24898:7;24867:39;:::i;:::-;24928:84;24970:41;24994:16;24970:41;:::i;:::-;24963:4;24957:11;24928:84;:::i;:::-;24922:4;24915:98;24833:186;24757:262;;:::o;25025:186::-;25070:11;25119:3;25106:17;25132:33;25159:5;25132:33;:::i;:::-;25199:5;25175:29;;25082:129;25025:186;;;:::o;25217:266::-;25275:6;25304:42;25367:22;25380:8;25367:22;:::i;:::-;25355:34;;25422:4;25418:9;25411:5;25407:21;25398:30;;25471:4;25461:8;25457:19;25450:5;25447:30;25437:40;;25282:201;25217:266;;;;:::o;25489:142::-;25539:9;25572:53;25590:34;25599:24;25617:5;25599:24;:::i;:::-;25590:34;:::i;:::-;25572:53;:::i;:::-;25559:66;;25489:142;;;:::o;25637:126::-;25687:9;25720:37;25751:5;25720:37;:::i;:::-;25707:50;;25637:126;;;:::o;25769:::-;25819:9;25852:37;25883:5;25852:37;:::i;:::-;25839:50;;25769:126;;;:::o;25901:75::-;25944:3;25965:5;25958:12;;25901:75;;;:::o;25982:262::-;26092:39;26123:7;26092:39;:::i;:::-;26153:84;26195:41;26219:16;26195:41;:::i;:::-;26188:4;26182:11;26153:84;:::i;:::-;26147:4;26140:98;26058:186;25982:262;;:::o;26250:1824::-;26430:1;26424:4;26420:12;26476:1;26469:5;26465:13;26526:12;26569:42;26597:13;26569:42;:::i;:::-;26552:59;;26625:78;26689:13;26677:10;26625:78;:::i;:::-;26387:327;;;26767:1;26761:4;26757:12;26813:2;26806:5;26802:14;26864:12;26907:42;26935:13;26907:42;:::i;:::-;26890:59;;26963:78;27027:13;27015:10;26963:78;:::i;:::-;26724:328;;;27105:1;27099:4;27095:12;27151:2;27144:5;27140:14;27202:12;27245:42;27273:13;27245:42;:::i;:::-;27228:59;;27301:78;27365:13;27353:10;27301:78;:::i;:::-;27062:328;;;27443:1;27437:4;27433:12;27489:2;27482:5;27478:14;27540:12;27583:42;27611:13;27583:42;:::i;:::-;27566:59;;27639:78;27703:13;27691:10;27639:78;:::i;:::-;27400:328;;;27781:1;27775:4;27771:12;27827:3;27820:5;27816:15;27879:12;27922:42;27950:13;27922:42;:::i;:::-;27905:59;;27978:78;28042:13;28030:10;27978:78;:::i;:::-;27738:329;;;26250:1824;;:::o;28080:264::-;28220:118;28330:7;28324:4;28220:118;:::i;:::-;28080:264;;:::o;28350:232::-;28490:34;28486:1;28478:6;28474:14;28467:58;28559:15;28554:2;28546:6;28542:15;28535:40;28350:232;:::o;28588:366::-;28730:3;28751:67;28815:2;28810:3;28751:67;:::i;:::-;28744:74;;28827:93;28916:3;28827:93;:::i;:::-;28945:2;28940:3;28936:12;28929:19;;28588:366;;;:::o;28960:419::-;29126:4;29164:2;29153:9;29149:18;29141:26;;29213:9;29207:4;29203:20;29199:1;29188:9;29184:17;29177:47;29241:131;29367:4;29241:131;:::i;:::-;29233:139;;28960:419;;;:::o;29385:180::-;29433:77;29430:1;29423:88;29530:4;29527:1;29520:15;29554:4;29551:1;29544:15;29571:320;29615:6;29652:1;29646:4;29642:12;29632:22;;29699:1;29693:4;29689:12;29720:18;29710:81;;29776:4;29768:6;29764:17;29754:27;;29710:81;29838:2;29830:6;29827:14;29807:18;29804:38;29801:84;;29857:18;;:::i;:::-;29801:84;29622:269;29571:320;;;:::o;29897:231::-;30037:34;30033:1;30025:6;30021:14;30014:58;30106:14;30101:2;30093:6;30089:15;30082:39;29897:231;:::o;30134:366::-;30276:3;30297:67;30361:2;30356:3;30297:67;:::i;:::-;30290:74;;30373:93;30462:3;30373:93;:::i;:::-;30491:2;30486:3;30482:12;30475:19;;30134:366;;;:::o;30506:419::-;30672:4;30710:2;30699:9;30695:18;30687:26;;30759:9;30753:4;30749:20;30745:1;30734:9;30730:17;30723:47;30787:131;30913:4;30787:131;:::i;:::-;30779:139;;30506:419;;;:::o;30931:180::-;30979:77;30976:1;30969:88;31076:4;31073:1;31066:15;31100:4;31097:1;31090:15;31117:174;31257:26;31253:1;31245:6;31241:14;31234:50;31117:174;:::o;31297:366::-;31439:3;31460:67;31524:2;31519:3;31460:67;:::i;:::-;31453:74;;31536:93;31625:3;31536:93;:::i;:::-;31654:2;31649:3;31645:12;31638:19;;31297:366;;;:::o;31669:419::-;31835:4;31873:2;31862:9;31858:18;31850:26;;31922:9;31916:4;31912:20;31908:1;31897:9;31893:17;31886:47;31950:131;32076:4;31950:131;:::i;:::-;31942:139;;31669:419;;;:::o;32094:228::-;32234:34;32230:1;32222:6;32218:14;32211:58;32303:11;32298:2;32290:6;32286:15;32279:36;32094:228;:::o;32328:366::-;32470:3;32491:67;32555:2;32550:3;32491:67;:::i;:::-;32484:74;;32567:93;32656:3;32567:93;:::i;:::-;32685:2;32680:3;32676:12;32669:19;;32328:366;;;:::o;32700:419::-;32866:4;32904:2;32893:9;32889:18;32881:26;;32953:9;32947:4;32943:20;32939:1;32928:9;32924:17;32917:47;32981:131;33107:4;32981:131;:::i;:::-;32973:139;;32700:419;;;:::o;33125:141::-;33174:4;33197:3;33189:11;;33220:3;33217:1;33210:14;33254:4;33251:1;33241:18;33233:26;;33125:141;;;:::o;33272:93::-;33309:6;33356:2;33351;33344:5;33340:14;33336:23;33326:33;;33272:93;;;:::o;33371:107::-;33415:8;33465:5;33459:4;33455:16;33434:37;;33371:107;;;;:::o;33484:393::-;33553:6;33603:1;33591:10;33587:18;33626:97;33656:66;33645:9;33626:97;:::i;:::-;33744:39;33774:8;33763:9;33744:39;:::i;:::-;33732:51;;33816:4;33812:9;33805:5;33801:21;33792:30;;33865:4;33855:8;33851:19;33844:5;33841:30;33831:40;;33560:317;;33484:393;;;;;:::o;33883:269::-;33993:39;34024:7;33993:39;:::i;:::-;34054:91;34103:41;34127:16;34103:41;:::i;:::-;34095:6;34088:4;34082:11;34054:91;:::i;:::-;34048:4;34041:105;33959:193;33883:269;;;:::o;34158:73::-;34203:3;34158:73;:::o;34237:189::-;34314:32;;:::i;:::-;34355:65;34413:6;34405;34399:4;34355:65;:::i;:::-;34290:136;34237:189;;:::o;34432:186::-;34492:120;34509:3;34502:5;34499:14;34492:120;;;34563:39;34600:1;34593:5;34563:39;:::i;:::-;34536:1;34529:5;34525:13;34516:22;;34492:120;;;34432:186;;:::o;34624:543::-;34725:2;34720:3;34717:11;34714:446;;;34759:38;34791:5;34759:38;:::i;:::-;34843:29;34861:10;34843:29;:::i;:::-;34833:8;34829:44;35026:2;35014:10;35011:18;35008:49;;;35047:8;35032:23;;35008:49;35070:80;35126:22;35144:3;35126:22;:::i;:::-;35116:8;35112:37;35099:11;35070:80;:::i;:::-;34729:431;;34714:446;34624:543;;;:::o;35173:117::-;35227:8;35277:5;35271:4;35267:16;35246:37;;35173:117;;;;:::o;35296:169::-;35340:6;35373:51;35421:1;35417:6;35409:5;35406:1;35402:13;35373:51;:::i;:::-;35369:56;35454:4;35448;35444:15;35434:25;;35347:118;35296:169;;;;:::o;35470:295::-;35546:4;35692:29;35717:3;35711:4;35692:29;:::i;:::-;35684:37;;35754:3;35751:1;35747:11;35741:4;35738:21;35730:29;;35470:295;;;;:::o;35770:1395::-;35887:37;35920:3;35887:37;:::i;:::-;35989:18;35981:6;35978:30;35975:56;;;36011:18;;:::i;:::-;35975:56;36055:38;36087:4;36081:11;36055:38;:::i;:::-;36140:67;36200:6;36192;36186:4;36140:67;:::i;:::-;36234:1;36258:4;36245:17;;36290:2;36282:6;36279:14;36307:1;36302:618;;;;36964:1;36981:6;36978:77;;;37030:9;37025:3;37021:19;37015:26;37006:35;;36978:77;37081:67;37141:6;37134:5;37081:67;:::i;:::-;37075:4;37068:81;36937:222;36272:887;;36302:618;36354:4;36350:9;36342:6;36338:22;36388:37;36420:4;36388:37;:::i;:::-;36447:1;36461:208;36475:7;36472:1;36469:14;36461:208;;;36554:9;36549:3;36545:19;36539:26;36531:6;36524:42;36605:1;36597:6;36593:14;36583:24;;36652:2;36641:9;36637:18;36624:31;;36498:4;36495:1;36491:12;36486:17;;36461:208;;;36697:6;36688:7;36685:19;36682:179;;;36755:9;36750:3;36746:19;36740:26;36798:48;36840:4;36832:6;36828:17;36817:9;36798:48;:::i;:::-;36790:6;36783:64;36705:156;36682:179;36907:1;36903;36895:6;36891:14;36887:22;36881:4;36874:36;36309:611;;;36272:887;;35862:1303;;;35770:1395;;:::o;37171:148::-;37273:11;37310:3;37295:18;;37171:148;;;;:::o;37349:874::-;37452:3;37489:5;37483:12;37518:36;37544:9;37518:36;:::i;:::-;37570:89;37652:6;37647:3;37570:89;:::i;:::-;37563:96;;37690:1;37679:9;37675:17;37706:1;37701:166;;;;37881:1;37876:341;;;;37668:549;;37701:166;37785:4;37781:9;37770;37766:25;37761:3;37754:38;37847:6;37840:14;37833:22;37825:6;37821:35;37816:3;37812:45;37805:52;;37701:166;;37876:341;37943:38;37975:5;37943:38;:::i;:::-;38003:1;38017:154;38031:6;38028:1;38025:13;38017:154;;;38105:7;38099:14;38095:1;38090:3;38086:11;38079:35;38155:1;38146:7;38142:15;38131:26;;38053:4;38050:1;38046:12;38041:17;;38017:154;;;38200:6;38195:3;38191:16;38184:23;;37883:334;;37668:549;;37456:767;;37349:874;;;;:::o;38229:269::-;38358:3;38380:92;38468:3;38459:6;38380:92;:::i;:::-;38373:99;;38489:3;38482:10;;38229:269;;;;:::o;38504:182::-;38644:34;38640:1;38632:6;38628:14;38621:58;38504:182;:::o;38692:366::-;38834:3;38855:67;38919:2;38914:3;38855:67;:::i;:::-;38848:74;;38931:93;39020:3;38931:93;:::i;:::-;39049:2;39044:3;39040:12;39033:19;;38692:366;;;:::o;39064:419::-;39230:4;39268:2;39257:9;39253:18;39245:26;;39317:9;39311:4;39307:20;39303:1;39292:9;39288:17;39281:47;39345:131;39471:4;39345:131;:::i;:::-;39337:139;;39064:419;;;:::o;39489:230::-;39629:34;39625:1;39617:6;39613:14;39606:58;39698:13;39693:2;39685:6;39681:15;39674:38;39489:230;:::o;39725:366::-;39867:3;39888:67;39952:2;39947:3;39888:67;:::i;:::-;39881:74;;39964:93;40053:3;39964:93;:::i;:::-;40082:2;40077:3;40073:12;40066:19;;39725:366;;;:::o;40097:419::-;40263:4;40301:2;40290:9;40286:18;40278:26;;40350:9;40344:4;40340:20;40336:1;40325:9;40321:17;40314:47;40378:131;40504:4;40378:131;:::i;:::-;40370:139;;40097:419;;;:::o;40522:390::-;40628:3;40656:39;40689:5;40656:39;:::i;:::-;40711:89;40793:6;40788:3;40711:89;:::i;:::-;40704:96;;40809:65;40867:6;40862:3;40855:4;40848:5;40844:16;40809:65;:::i;:::-;40899:6;40894:3;40890:16;40883:23;;40632:280;40522:390;;;;:::o;40918:435::-;41098:3;41120:95;41211:3;41202:6;41120:95;:::i;:::-;41113:102;;41232:95;41323:3;41314:6;41232:95;:::i;:::-;41225:102;;41344:3;41337:10;;40918:435;;;;;:::o;41359:225::-;41499:34;41495:1;41487:6;41483:14;41476:58;41568:8;41563:2;41555:6;41551:15;41544:33;41359:225;:::o;41590:366::-;41732:3;41753:67;41817:2;41812:3;41753:67;:::i;:::-;41746:74;;41829:93;41918:3;41829:93;:::i;:::-;41947:2;41942:3;41938:12;41931:19;;41590:366;;;:::o;41962:419::-;42128:4;42166:2;42155:9;42151:18;42143:26;;42215:9;42209:4;42205:20;42201:1;42190:9;42186:17;42179:47;42243:131;42369:4;42243:131;:::i;:::-;42235:139;;41962:419;;;:::o;42387:182::-;42527:34;42523:1;42515:6;42511:14;42504:58;42387:182;:::o;42575:366::-;42717:3;42738:67;42802:2;42797:3;42738:67;:::i;:::-;42731:74;;42814:93;42903:3;42814:93;:::i;:::-;42932:2;42927:3;42923:12;42916:19;;42575:366;;;:::o;42947:419::-;43113:4;43151:2;43140:9;43136:18;43128:26;;43200:9;43194:4;43190:20;43186:1;43175:9;43171:17;43164:47;43228:131;43354:4;43228:131;:::i;:::-;43220:139;;42947:419;;;:::o;43372:231::-;43512:34;43508:1;43500:6;43496:14;43489:58;43581:14;43576:2;43568:6;43564:15;43557:39;43372:231;:::o;43609:366::-;43751:3;43772:67;43836:2;43831:3;43772:67;:::i;:::-;43765:74;;43848:93;43937:3;43848:93;:::i;:::-;43966:2;43961:3;43957:12;43950:19;;43609:366;;;:::o;43981:419::-;44147:4;44185:2;44174:9;44170:18;44162:26;;44234:9;44228:4;44224:20;44220:1;44209:9;44205:17;44198:47;44262:131;44388:4;44262:131;:::i;:::-;44254:139;;43981:419;;;:::o;44406:224::-;44546:34;44542:1;44534:6;44530:14;44523:58;44615:7;44610:2;44602:6;44598:15;44591:32;44406:224;:::o;44636:366::-;44778:3;44799:67;44863:2;44858:3;44799:67;:::i;:::-;44792:74;;44875:93;44964:3;44875:93;:::i;:::-;44993:2;44988:3;44984:12;44977:19;;44636:366;;;:::o;45008:419::-;45174:4;45212:2;45201:9;45197:18;45189:26;;45261:9;45255:4;45251:20;45247:1;45236:9;45232:17;45225:47;45289:131;45415:4;45289:131;:::i;:::-;45281:139;;45008:419;;;:::o;45433:223::-;45573:34;45569:1;45561:6;45557:14;45550:58;45642:6;45637:2;45629:6;45625:15;45618:31;45433:223;:::o;45662:366::-;45804:3;45825:67;45889:2;45884:3;45825:67;:::i;:::-;45818:74;;45901:93;45990:3;45901:93;:::i;:::-;46019:2;46014:3;46010:12;46003:19;;45662:366;;;:::o;46034:419::-;46200:4;46238:2;46227:9;46223:18;46215:26;;46287:9;46281:4;46277:20;46273:1;46262:9;46258:17;46251:47;46315:131;46441:4;46315:131;:::i;:::-;46307:139;;46034:419;;;:::o;46459:181::-;46599:33;46595:1;46587:6;46583:14;46576:57;46459:181;:::o;46646:366::-;46788:3;46809:67;46873:2;46868:3;46809:67;:::i;:::-;46802:74;;46885:93;46974:3;46885:93;:::i;:::-;47003:2;46998:3;46994:12;46987:19;;46646:366;;;:::o;47018:419::-;47184:4;47222:2;47211:9;47207:18;47199:26;;47271:9;47265:4;47261:20;47257:1;47246:9;47242:17;47235:47;47299:131;47425:4;47299:131;:::i;:::-;47291:139;;47018:419;;;:::o;47443:182::-;47583:34;47579:1;47571:6;47567:14;47560:58;47443:182;:::o;47631:366::-;47773:3;47794:67;47858:2;47853:3;47794:67;:::i;:::-;47787:74;;47870:93;47959:3;47870:93;:::i;:::-;47988:2;47983:3;47979:12;47972:19;;47631:366;;;:::o;48003:419::-;48169:4;48207:2;48196:9;48192:18;48184:26;;48256:9;48250:4;48246:20;48242:1;48231:9;48227:17;48220:47;48284:131;48410:4;48284:131;:::i;:::-;48276:139;;48003:419;;;:::o;48428:178::-;48568:30;48564:1;48556:6;48552:14;48545:54;48428:178;:::o;48612:366::-;48754:3;48775:67;48839:2;48834:3;48775:67;:::i;:::-;48768:74;;48851:93;48940:3;48851:93;:::i;:::-;48969:2;48964:3;48960:12;48953:19;;48612:366;;;:::o;48984:419::-;49150:4;49188:2;49177:9;49173:18;49165:26;;49237:9;49231:4;49227:20;49223:1;49212:9;49208:17;49201:47;49265:131;49391:4;49265:131;:::i;:::-;49257:139;;48984:419;;;:::o;49409:175::-;49549:27;49545:1;49537:6;49533:14;49526:51;49409:175;:::o;49590:366::-;49732:3;49753:67;49817:2;49812:3;49753:67;:::i;:::-;49746:74;;49829:93;49918:3;49829:93;:::i;:::-;49947:2;49942:3;49938:12;49931:19;;49590:366;;;:::o;49962:419::-;50128:4;50166:2;50155:9;50151:18;50143:26;;50215:9;50209:4;50205:20;50201:1;50190:9;50186:17;50179:47;50243:131;50369:4;50243:131;:::i;:::-;50235:139;;49962:419;;;:::o;50387:237::-;50527:34;50523:1;50515:6;50511:14;50504:58;50596:20;50591:2;50583:6;50579:15;50572:45;50387:237;:::o;50630:366::-;50772:3;50793:67;50857:2;50852:3;50793:67;:::i;:::-;50786:74;;50869:93;50958:3;50869:93;:::i;:::-;50987:2;50982:3;50978:12;50971:19;;50630:366;;;:::o;51002:419::-;51168:4;51206:2;51195:9;51191:18;51183:26;;51255:9;51249:4;51245:20;51241:1;51230:9;51226:17;51219:47;51283:131;51409:4;51283:131;:::i;:::-;51275:139;;51002:419;;;:::o;51427:180::-;51475:77;51472:1;51465:88;51572:4;51569:1;51562:15;51596:4;51593:1;51586:15;51613:240;51753:34;51749:1;51741:6;51737:14;51730:58;51822:23;51817:2;51809:6;51805:15;51798:48;51613:240;:::o;51859:366::-;52001:3;52022:67;52086:2;52081:3;52022:67;:::i;:::-;52015:74;;52098:93;52187:3;52098:93;:::i;:::-;52216:2;52211:3;52207:12;52200:19;;51859:366;;;:::o;52231:419::-;52397:4;52435:2;52424:9;52420:18;52412:26;;52484:9;52478:4;52474:20;52470:1;52459:9;52455:17;52448:47;52512:131;52638:4;52512:131;:::i;:::-;52504:139;;52231:419;;;:::o;52656:173::-;52796:25;52792:1;52784:6;52780:14;52773:49;52656:173;:::o;52835:402::-;52995:3;53016:85;53098:2;53093:3;53016:85;:::i;:::-;53009:92;;53110:93;53199:3;53110:93;:::i;:::-;53228:2;53223:3;53219:12;53212:19;;52835:402;;;:::o;53243:167::-;53383:19;53379:1;53371:6;53367:14;53360:43;53243:167;:::o;53416:402::-;53576:3;53597:85;53679:2;53674:3;53597:85;:::i;:::-;53590:92;;53691:93;53780:3;53691:93;:::i;:::-;53809:2;53804:3;53800:12;53793:19;;53416:402;;;:::o;53824:967::-;54206:3;54228:148;54372:3;54228:148;:::i;:::-;54221:155;;54393:95;54484:3;54475:6;54393:95;:::i;:::-;54386:102;;54505:148;54649:3;54505:148;:::i;:::-;54498:155;;54670:95;54761:3;54752:6;54670:95;:::i;:::-;54663:102;;54782:3;54775:10;;53824:967;;;;;:::o;54797:98::-;54848:6;54882:5;54876:12;54866:22;;54797:98;;;:::o;54901:168::-;54984:11;55018:6;55013:3;55006:19;55058:4;55053:3;55049:14;55034:29;;54901:168;;;;:::o;55075:373::-;55161:3;55189:38;55221:5;55189:38;:::i;:::-;55243:70;55306:6;55301:3;55243:70;:::i;:::-;55236:77;;55322:65;55380:6;55375:3;55368:4;55361:5;55357:16;55322:65;:::i;:::-;55412:29;55434:6;55412:29;:::i;:::-;55407:3;55403:39;55396:46;;55165:283;55075:373;;;;:::o;55454:640::-;55649:4;55687:3;55676:9;55672:19;55664:27;;55701:71;55769:1;55758:9;55754:17;55745:6;55701:71;:::i;:::-;55782:72;55850:2;55839:9;55835:18;55826:6;55782:72;:::i;:::-;55864;55932:2;55921:9;55917:18;55908:6;55864:72;:::i;:::-;55983:9;55977:4;55973:20;55968:2;55957:9;55953:18;55946:48;56011:76;56082:4;56073:6;56011:76;:::i;:::-;56003:84;;55454:640;;;;;;;:::o;56100:141::-;56156:5;56187:6;56181:13;56172:22;;56203:32;56229:5;56203:32;:::i;:::-;56100:141;;;;:::o;56247:349::-;56316:6;56365:2;56353:9;56344:7;56340:23;56336:32;56333:119;;;56371:79;;:::i;:::-;56333:119;56491:1;56516:63;56571:7;56562:6;56551:9;56547:22;56516:63;:::i;:::-;56506:73;;56462:127;56247:349;;;;:::o;56602:180::-;56650:77;56647:1;56640:88;56747:4;56744:1;56737:15;56771:4;56768:1;56761:15;56788:194;56828:4;56848:20;56866:1;56848:20;:::i;:::-;56843:25;;56882:20;56900:1;56882:20;:::i;:::-;56877:25;;56926:1;56923;56919:9;56911:17;;56950:1;56944:4;56941:11;56938:37;;;56955:18;;:::i;:::-;56938:37;56788:194;;;;:::o;56988:180::-;57036:77;57033:1;57026:88;57133:4;57130:1;57123:15;57157:4;57154:1;57147:15;57174:410;57214:7;57237:20;57255:1;57237:20;:::i;:::-;57232:25;;57271:20;57289:1;57271:20;:::i;:::-;57266:25;;57326:1;57323;57319:9;57348:30;57366:11;57348:30;:::i;:::-;57337:41;;57527:1;57518:7;57514:15;57511:1;57508:22;57488:1;57481:9;57461:83;57438:139;;57557:18;;:::i;:::-;57438:139;57222:362;57174:410;;;;:::o;57590:191::-;57630:3;57649:20;57667:1;57649:20;:::i;:::-;57644:25;;57683:20;57701:1;57683:20;:::i;:::-;57678:25;;57726:1;57723;57719:9;57712:16;;57747:3;57744:1;57741:10;57738:36;;;57754:18;;:::i;:::-;57738:36;57590:191;;;;:::o;57787:171::-;57826:3;57849:24;57867:5;57849:24;:::i;:::-;57840:33;;57895:4;57888:5;57885:15;57882:41;;57903:18;;:::i;:::-;57882:41;57950:1;57943:5;57939:13;57932:20;;57787:171;;;:::o;57964:182::-;58104:34;58100:1;58092:6;58088:14;58081:58;57964:182;:::o;58152:366::-;58294:3;58315:67;58379:2;58374:3;58315:67;:::i;:::-;58308:74;;58391:93;58480:3;58391:93;:::i;:::-;58509:2;58504:3;58500:12;58493:19;;58152:366;;;:::o;58524:419::-;58690:4;58728:2;58717:9;58713:18;58705:26;;58777:9;58771:4;58767:20;58763:1;58752:9;58748:17;58741:47;58805:131;58931:4;58805:131;:::i;:::-;58797:139;;58524:419;;;:::o
Swarm Source
ipfs://6ad487136a225c48ee923560250f20b1bcab4dacaa7192ca3897fe840b4b6a91
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.