Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
288
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OkaydogNft
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-22 */ // File: contracts/nfgDog/ContentMixin.sol pragma solidity ^0.8.0; abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } } // File: contracts/nfgDog/Initializable.sol pragma solidity ^0.8.0; contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } // File: contracts/nfgDog/EIP712Base.sol pragma solidity ^0.8.0; contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string constant public ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contracts that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712( string memory name ) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/nfgDog/NativeMetaTransaction.sol pragma solidity ^0.8.0; contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.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 functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (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); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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 be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be 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 owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || 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); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/nfgDog/ERC721Tradable.sol pragma solidity ^0.8.0; contract OwnableDelegateProxy {} /** * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users */ contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } /** * @title ERC721Tradable * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality. */ abstract contract ERC721Tradable is ERC721, ContextMixin, NativeMetaTransaction, Ownable { using SafeMath for uint256; using Counters for Counters.Counter; /** * We rely on the OZ Counter util to keep track of the next available ID. * We track the nextTokenId instead of the currentTokenId to save users on gas costs. * Read more about it here: https://shiny.mirror.xyz/OUampBbIz9ebEicfGnQf5At_ReMHlZy0tB4glb9xQ0E */ address proxyRegistryAddress; constructor( string memory _name, string memory _symbol, address _proxyRegistryAddress ) ERC721(_name, _symbol) { proxyRegistryAddress = _proxyRegistryAddress; // nextTokenId is initialized to 1, since starting at 0 leads to higher gas cost for the first minter _initializeEIP712(_name); } /** * @dev Mints a token to an address with a tokenURI. * @param _to address of the future owner of the token function mintTo(address _to) public onlyOwner { uint256 currentTokenId = _nextTokenId.current(); _nextTokenId.increment(); _safeMint(_to, currentTokenId); } */ /** @dev Returns the total tokens minted so far. 1 is always subtracted from the Counter since it tracks the next available tokenId. */ function baseTokenURI() virtual public pure returns (string memory); function tokenURI(uint256 _tokenId) override public pure returns (string memory) { return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId))); } /** * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) override public view returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner, operator); } /** * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea. */ function _msgSender() internal override view returns (address sender) { return ContextMixin.msgSender(); } } // File: contracts/nfgDog/OkaydogNft.sol pragma solidity ^0.8.12; contract OkaydogNft is ERC721Tradable { using Counters for Counters.Counter; Counters.Counter private _nextTokenId; uint256 public price = 0.003 ether; uint256 public constant MAX_SUPPLY = 10000; uint256 public constant MAX_MINT_PER_WALLET = 5; uint256 public spec_count; address public spec_addr; // string public constant baseUri = "ipfs://bafybeiaagw2wr6azndmdkh67tb3gierkkmok4ott477u75ry3ytc6qujgi/"; string public constant baseUri = "ipfs://bafybeidfrx2pih3trmwbwnpdilmweaeszvfrkovmw3rplw3mbphcvvr56e/"; constructor(address _proxyRegistryAddress) ERC721Tradable("Okay Dog", "Okay Dog", _proxyRegistryAddress) { } function setSpecCount(uint256 _count, address _spec_addr) external onlyOwner { require(_count <= MAX_SUPPLY, "count addr error"); require(_spec_addr != address(0), "addr arg error"); require(spec_addr == address(0), "spec addr error"); spec_count = _count; spec_addr = _spec_addr; } function setPrice(uint256 _price) external onlyOwner { price = _price; } function mint(uint256 _quantity) payable public { address sender = msgSender(); mint_check(_quantity); for (uint256 i = 0; i < _quantity; i++) { _nextTokenId.increment(); uint256 currentTokenId = _nextTokenId.current(); _safeMint(sender, currentTokenId); } } function mint_check(uint256 _quantity) internal returns (bool) { address sender = msgSender(); require(sender != address(0), "empty adress error"); uint256 already_count = balanceOf(sender); require(_nextTokenId.current() + _quantity <= MAX_SUPPLY, "Exceed supply3."); if (sender == spec_addr) { require(already_count + _quantity <= spec_count, "sepc addr count error"); } else { require(already_count + _quantity <= MAX_MINT_PER_WALLET, "Exceed supply2."); } if (sender != spec_addr) { if (already_count != 0) { if (msg.value < price * _quantity) { string memory s = string.concat("price=", Strings.toString(price), "&&count=", Strings.toString(_quantity), "&&value=", Strings.toString(msg.value), "++"); revert(s); } } else { if (msg.value < price * (_quantity - 1)) { string memory s = string.concat("price=", Strings.toString(price), "&&count=", Strings.toString(_quantity), "&&value=", Strings.toString(msg.value), "++"); revert(s); } } } return true; } function baseTokenURI() virtual public override pure returns (string memory){ return baseUri; } function totalSupply() virtual public view returns (uint256) { return _nextTokenId.current(); } function withdraw() external onlyOwner { (bool success,) = msg.sender.call{value : address(this).balance}(""); require(success, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":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"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_spec_addr","type":"address"}],"name":"setSpecCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spec_addr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spec_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600660006101000a81548160ff021916908315150217905550660aa87bee538000600c553480156200003757600080fd5b50604051620052233803806200522383398181016040528101906200005d9190620004aa565b6040518060400160405280600881526020017f4f6b617920446f670000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f4f6b617920446f670000000000000000000000000000000000000000000000008152508282828160009081620000dd919062000756565b508060019081620000ef919062000756565b50505062000112620001066200016e60201b60201c565b6200018a60201b60201c565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000164836200025060201b60201c565b5050505062000949565b600062000185620002d260201b620018401760201c565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600660009054906101000a900460ff1615620002a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029a906200089e565b60405180910390fd5b620002b4816200038460201b60201c565b6001600660006101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036200037d57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505062000381565b3390505b90565b6040518060800160405280604f8152602001620051d4604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620003fb6200043360201b60201c565b60001b60405160200162000414959493929190620008ec565b6040516020818303038152906040528051906020012060078190555050565b6000804690508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004728262000445565b9050919050565b620004848162000465565b81146200049057600080fd5b50565b600081519050620004a48162000479565b92915050565b600060208284031215620004c357620004c262000440565b5b6000620004d38482850162000493565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055e57607f821691505b60208210810362000574576200057362000516565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005de7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200059f565b620005ea86836200059f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000637620006316200062b8462000602565b6200060c565b62000602565b9050919050565b6000819050919050565b620006538362000616565b6200066b62000662826200063e565b848454620005ac565b825550505050565b600090565b6200068262000673565b6200068f81848462000648565b505050565b5b81811015620006b757620006ab60008262000678565b60018101905062000695565b5050565b601f8211156200070657620006d0816200057a565b620006db846200058f565b81016020851015620006eb578190505b62000703620006fa856200058f565b83018262000694565b50505b505050565b600082821c905092915050565b60006200072b600019846008026200070b565b1980831691505092915050565b600062000746838362000718565b9150826002028217905092915050565b6200076182620004dc565b67ffffffffffffffff8111156200077d576200077c620004e7565b5b62000789825462000545565b62000796828285620006bb565b600060209050601f831160018114620007ce5760008415620007b9578287015190505b620007c5858262000738565b86555062000835565b601f198416620007de866200057a565b60005b828110156200080857848901518255600182019150602085019450602081019050620007e1565b8683101562000828578489015162000824601f89168262000718565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b600062000886600e836200083d565b915062000893826200084e565b602082019050919050565b60006020820190508181036000830152620008b98162000877565b9050919050565b6000819050919050565b620008d581620008c0565b82525050565b620008e68162000465565b82525050565b600060a082019050620009036000830188620008ca565b620009126020830187620008ca565b620009216040830186620008ca565b620009306060830185620008db565b6200093f6080830184620008ca565b9695505050505050565b61487b80620009596000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063a22cb465116100a0578063b88d4fde1161006f578063b88d4fde146106c3578063c87b56dd146106ec578063d547cfb714610729578063e985e9c514610754578063f2fde38b14610791576101ee565b8063a22cb4651461061b578063a549d8ab14610644578063b19960e61461066f578063b67dfd201461069a576101ee565b806395d89b41116100dc57806395d89b411461057e5780639abc8320146105a9578063a035b1fe146105d4578063a0712d68146105ff576101ee565b8063715018a6146104e85780638da5cb5b146104ff5780639105553a1461052a57806391b7f5ed14610555576101ee565b806323b872dd116101855780633ccfd60b116101545780633ccfd60b1461042e57806342842e0e146104455780636352211e1461046e57806370a08231146104ab576101ee565b806323b872dd146103725780632d0335ab1461039b57806332cb6b0c146103d85780633408e47014610403576101ee565b80630c53c51c116101c15780630c53c51c146102c15780630f7e5970146102f157806318160ddd1461031c57806320379ee514610347576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612c28565b6107ba565b6040516102279190612c70565b60405180910390f35b34801561023c57600080fd5b5061024561089c565b6040516102529190612d24565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612d7c565b61092e565b60405161028f9190612dea565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612e31565b6109b3565b005b6102db60048036038101906102d69190613015565b610aca565b6040516102e89190613101565b60405180910390f35b3480156102fd57600080fd5b50610306610d3c565b6040516103139190612d24565b60405180910390f35b34801561032857600080fd5b50610331610d75565b60405161033e9190613132565b60405180910390f35b34801561035357600080fd5b5061035c610d86565b604051610369919061315c565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613177565b610d90565b005b3480156103a757600080fd5b506103c260048036038101906103bd91906131ca565b610df0565b6040516103cf9190613132565b60405180910390f35b3480156103e457600080fd5b506103ed610e39565b6040516103fa9190613132565b60405180910390f35b34801561040f57600080fd5b50610418610e3f565b6040516104259190613132565b60405180910390f35b34801561043a57600080fd5b50610443610e4c565b005b34801561045157600080fd5b5061046c60048036038101906104679190613177565b610f77565b005b34801561047a57600080fd5b5061049560048036038101906104909190612d7c565b610f97565b6040516104a29190612dea565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd91906131ca565b611048565b6040516104df9190613132565b60405180910390f35b3480156104f457600080fd5b506104fd6110ff565b005b34801561050b57600080fd5b50610514611187565b6040516105219190612dea565b60405180910390f35b34801561053657600080fd5b5061053f6111b1565b60405161054c9190613132565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190612d7c565b6111b7565b005b34801561058a57600080fd5b5061059361123d565b6040516105a09190612d24565b60405180910390f35b3480156105b557600080fd5b506105be6112cf565b6040516105cb9190612d24565b60405180910390f35b3480156105e057600080fd5b506105e96112eb565b6040516105f69190613132565b60405180910390f35b61061960048036038101906106149190612d7c565b6112f1565b005b34801561062757600080fd5b50610642600480360381019061063d9190613223565b61134d565b005b34801561065057600080fd5b50610659611363565b6040516106669190612dea565b60405180910390f35b34801561067b57600080fd5b50610684611389565b6040516106919190613132565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613263565b61138e565b005b3480156106cf57600080fd5b506106ea60048036038101906106e591906132a3565b61159b565b005b3480156106f857600080fd5b50610713600480360381019061070e9190612d7c565b6115fd565b6040516107209190612d24565b60405180910390f35b34801561073557600080fd5b5061073e611637565b60405161074b9190612d24565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190613326565b611657565b6040516107889190612c70565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b391906131ca565b611749565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108955750610894826118f0565b5b9050919050565b6060600080546108ab90613395565b80601f01602080910402602001604051908101604052809291908181526020018280546108d790613395565b80156109245780601f106108f957610100808354040283529160200191610924565b820191906000526020600020905b81548152906001019060200180831161090757829003601f168201915b5050505050905090565b60006109398261195a565b610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90613438565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109be82610f97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a25906134ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4d6119c6565b73ffffffffffffffffffffffffffffffffffffffff161480610a7c5750610a7b81610a766119c6565b611657565b5b610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab29061355c565b60405180910390fd5b610ac583836119d5565b505050565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610b4d8782878787611a8e565b610b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b83906135ee565b60405180910390fd5b610bdf6001600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b9690919063ffffffff16565b600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610c559392919061362f565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610c8a9291906136f1565b604051602081830303815290604052604051610ca69190613719565b6000604051808303816000865af19150503d8060008114610ce3576040519150601f19603f3d011682016040523d82523d6000602084013e610ce8565b606091505b509150915081610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d249061377c565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000610d81600b611bac565b905090565b6000600754905090565b610da1610d9b6119c6565b82611bba565b610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd79061380e565b60405180910390fd5b610deb838383611c98565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61271081565b6000804690508091505090565b610e546119c6565b73ffffffffffffffffffffffffffffffffffffffff16610e72611187565b73ffffffffffffffffffffffffffffffffffffffff1614610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf9061387a565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610eee906138c0565b60006040518083038185875af1925050503d8060008114610f2b576040519150601f19603f3d011682016040523d82523d6000602084013e610f30565b606091505b5050905080610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90613921565b60405180910390fd5b50565b610f928383836040518060200160405280600081525061159b565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361103f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611036906139b3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90613a45565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111076119c6565b73ffffffffffffffffffffffffffffffffffffffff16611125611187565b73ffffffffffffffffffffffffffffffffffffffff161461117b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111729061387a565b60405180910390fd5b6111856000611efe565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6111bf6119c6565b73ffffffffffffffffffffffffffffffffffffffff166111dd611187565b73ffffffffffffffffffffffffffffffffffffffff1614611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a9061387a565b60405180910390fd5b80600c8190555050565b60606001805461124c90613395565b80601f016020809104026020016040519081016040528092919081815260200182805461127890613395565b80156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050905090565b6040518060800160405280604381526020016148036043913981565b600c5481565b60006112fb611840565b905061130682611fc4565b5060005b828110156113485761131c600b612343565b6000611328600b611bac565b90506113348382612359565b50808061134090613a94565b91505061130a565b505050565b61135f6113586119c6565b8383612377565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b6113966119c6565b73ffffffffffffffffffffffffffffffffffffffff166113b4611187565b73ffffffffffffffffffffffffffffffffffffffff161461140a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114019061387a565b60405180910390fd5b61271082111561144f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144690613b28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b590613b94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690613c00565b60405180910390fd5b81600d8190555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6115ac6115a66119c6565b83611bba565b6115eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e29061380e565b60405180910390fd5b6115f7848484846124e3565b50505050565b6060611607611637565b6116108361253f565b604051602001611621929190613c5c565b6040516020818303038152906040529050919050565b606060405180608001604052806043815260200161480360439139905090565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016116cf9190612dea565b602060405180830381865afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190613cbe565b73ffffffffffffffffffffffffffffffffffffffff1603611735576001915050611743565b61173f848461269f565b9150505b92915050565b6117516119c6565b73ffffffffffffffffffffffffffffffffffffffff1661176f611187565b73ffffffffffffffffffffffffffffffffffffffff16146117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc9061387a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613d5d565b60405180910390fd5b61183d81611efe565b50565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036118e957600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506118ed565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006119d0611840565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4883610f97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613def565b60405180910390fd5b6001611b11611b0c87612733565b61279b565b83868660405160008152602001604052604051611b319493929190613e1e565b6020604051602081039080840390855afa158015611b53573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611ba49190613e63565b905092915050565b600081600001549050919050565b6000611bc58261195a565b611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90613f2b565b60405180910390fd5b6000611c0f83610f97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c515750611c508185611657565b5b80611c8f57508373ffffffffffffffffffffffffffffffffffffffff16611c778461092e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cb882610f97565b73ffffffffffffffffffffffffffffffffffffffff1614611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0590613fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d749061404f565b60405180910390fd5b611d888383836127d4565b611d936000826119d5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de3919061406f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e3a9190613e63565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ef98383836127d9565b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611fcf611840565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612037906140ef565b60405180910390fd5b600061204b82611048565b90506127108461205b600b611bac565b6120659190613e63565b11156120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d9061415b565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361215057600d54848261210a9190613e63565b111561214b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612142906141c7565b60405180910390fd5b6121a0565b6005848261215e9190613e63565b111561219f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219690614233565b60405180910390fd5b5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461233857600081146122965783600c5461220b9190614253565b34101561229157600061221f600c5461253f565b6122288661253f565b6122313461253f565b60405160200161224393929190614345565b6040516020818303038152906040529050806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122889190612d24565b60405180910390fd5b612337565b6001846122a3919061406f565b600c546122b09190614253565b3410156123365760006122c4600c5461253f565b6122cd8661253f565b6122d63461253f565b6040516020016122e893929190614345565b6040516020818303038152906040529050806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232d9190612d24565b60405180910390fd5b5b5b600192505050919050565b6001816000016000828254019250508190555050565b6123738282604051806020016040528060008152506127de565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dc906143fe565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124d69190612c70565b60405180910390a3505050565b6124ee848484611c98565b6124fa84848484612839565b612539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253090614490565b60405180910390fd5b50505050565b606060008203612586576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061269a565b600082905060005b600082146125b85780806125a190613a94565b915050600a826125b191906144df565b915061258e565b60008167ffffffffffffffff8111156125d4576125d3612e7b565b5b6040519080825280601f01601f1916602001820160405280156126065781602001600182028036833780820191505090505b5090505b600085146126935760018261261f919061406f565b9150600a8561262e9190614510565b603061263a9190613e63565b60f81b8183815181106126505761264f614541565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561268c91906144df565b945061260a565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006040518060800160405280604381526020016147c060439139805190602001208260000151836020015184604001518051906020012060405160200161277e9493929190614570565b604051602081830303815290604052805190602001209050919050565b60006127a5610d86565b826040516020016127b7929190614622565b604051602081830303815290604052805190602001209050919050565b505050565b505050565b6127e883836129c0565b6127f56000848484612839565b612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b90614490565b60405180910390fd5b505050565b600061285a8473ffffffffffffffffffffffffffffffffffffffff16612b99565b156129b3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128836119c6565b8786866040518563ffffffff1660e01b81526004016128a59493929190614659565b6020604051808303816000875af19250505080156128e157506040513d601f19601f820116820180604052508101906128de91906146ba565b60015b612963573d8060008114612911576040519150601f19603f3d011682016040523d82523d6000602084013e612916565b606091505b50600081510361295b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295290614490565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b8565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2690614733565b60405180910390fd5b612a388161195a565b15612a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6f9061479f565b60405180910390fd5b612a84600083836127d4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ad49190613e63565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b95600083836127d9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0581612bd0565b8114612c1057600080fd5b50565b600081359050612c2281612bfc565b92915050565b600060208284031215612c3e57612c3d612bc6565b5b6000612c4c84828501612c13565b91505092915050565b60008115159050919050565b612c6a81612c55565b82525050565b6000602082019050612c856000830184612c61565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cc5578082015181840152602081019050612caa565b83811115612cd4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612cf682612c8b565b612d008185612c96565b9350612d10818560208601612ca7565b612d1981612cda565b840191505092915050565b60006020820190508181036000830152612d3e8184612ceb565b905092915050565b6000819050919050565b612d5981612d46565b8114612d6457600080fd5b50565b600081359050612d7681612d50565b92915050565b600060208284031215612d9257612d91612bc6565b5b6000612da084828501612d67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dd482612da9565b9050919050565b612de481612dc9565b82525050565b6000602082019050612dff6000830184612ddb565b92915050565b612e0e81612dc9565b8114612e1957600080fd5b50565b600081359050612e2b81612e05565b92915050565b60008060408385031215612e4857612e47612bc6565b5b6000612e5685828601612e1c565b9250506020612e6785828601612d67565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612eb382612cda565b810181811067ffffffffffffffff82111715612ed257612ed1612e7b565b5b80604052505050565b6000612ee5612bbc565b9050612ef18282612eaa565b919050565b600067ffffffffffffffff821115612f1157612f10612e7b565b5b612f1a82612cda565b9050602081019050919050565b82818337600083830152505050565b6000612f49612f4484612ef6565b612edb565b905082815260208101848484011115612f6557612f64612e76565b5b612f70848285612f27565b509392505050565b600082601f830112612f8d57612f8c612e71565b5b8135612f9d848260208601612f36565b91505092915050565b6000819050919050565b612fb981612fa6565b8114612fc457600080fd5b50565b600081359050612fd681612fb0565b92915050565b600060ff82169050919050565b612ff281612fdc565b8114612ffd57600080fd5b50565b60008135905061300f81612fe9565b92915050565b600080600080600060a0868803121561303157613030612bc6565b5b600061303f88828901612e1c565b955050602086013567ffffffffffffffff8111156130605761305f612bcb565b5b61306c88828901612f78565b945050604061307d88828901612fc7565b935050606061308e88828901612fc7565b925050608061309f88828901613000565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60006130d3826130ac565b6130dd81856130b7565b93506130ed818560208601612ca7565b6130f681612cda565b840191505092915050565b6000602082019050818103600083015261311b81846130c8565b905092915050565b61312c81612d46565b82525050565b60006020820190506131476000830184613123565b92915050565b61315681612fa6565b82525050565b6000602082019050613171600083018461314d565b92915050565b6000806000606084860312156131905761318f612bc6565b5b600061319e86828701612e1c565b93505060206131af86828701612e1c565b92505060406131c086828701612d67565b9150509250925092565b6000602082840312156131e0576131df612bc6565b5b60006131ee84828501612e1c565b91505092915050565b61320081612c55565b811461320b57600080fd5b50565b60008135905061321d816131f7565b92915050565b6000806040838503121561323a57613239612bc6565b5b600061324885828601612e1c565b92505060206132598582860161320e565b9150509250929050565b6000806040838503121561327a57613279612bc6565b5b600061328885828601612d67565b925050602061329985828601612e1c565b9150509250929050565b600080600080608085870312156132bd576132bc612bc6565b5b60006132cb87828801612e1c565b94505060206132dc87828801612e1c565b93505060406132ed87828801612d67565b925050606085013567ffffffffffffffff81111561330e5761330d612bcb565b5b61331a87828801612f78565b91505092959194509250565b6000806040838503121561333d5761333c612bc6565b5b600061334b85828601612e1c565b925050602061335c85828601612e1c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133ad57607f821691505b6020821081036133c0576133bf613366565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613422602c83612c96565b915061342d826133c6565b604082019050919050565b6000602082019050818103600083015261345181613415565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134b4602183612c96565b91506134bf82613458565b604082019050919050565b600060208201905081810360008301526134e3816134a7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613546603883612c96565b9150613551826134ea565b604082019050919050565b6000602082019050818103600083015261357581613539565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006135d8602183612c96565b91506135e38261357c565b604082019050919050565b60006020820190508181036000830152613607816135cb565b9050919050565b600061361982612da9565b9050919050565b6136298161360e565b82525050565b60006060820190506136446000830186612ddb565b6136516020830185613620565b818103604083015261366381846130c8565b9050949350505050565b600081905092915050565b6000613683826130ac565b61368d818561366d565b935061369d818560208601612ca7565b80840191505092915050565b60008160601b9050919050565b60006136c1826136a9565b9050919050565b60006136d3826136b6565b9050919050565b6136eb6136e682612dc9565b6136c8565b82525050565b60006136fd8285613678565b915061370982846136da565b6014820191508190509392505050565b60006137258284613678565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000613766601c83612c96565b915061377182613730565b602082019050919050565b6000602082019050818103600083015261379581613759565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006137f8603183612c96565b91506138038261379c565b604082019050919050565b60006020820190508181036000830152613827816137eb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613864602083612c96565b915061386f8261382e565b602082019050919050565b6000602082019050818103600083015261389381613857565b9050919050565b50565b60006138aa60008361366d565b91506138b58261389a565b600082019050919050565b60006138cb8261389d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061390b601083612c96565b9150613916826138d5565b602082019050919050565b6000602082019050818103600083015261393a816138fe565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061399d602983612c96565b91506139a882613941565b604082019050919050565b600060208201905081810360008301526139cc81613990565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613a2f602a83612c96565b9150613a3a826139d3565b604082019050919050565b60006020820190508181036000830152613a5e81613a22565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a9f82612d46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ad157613ad0613a65565b5b600182019050919050565b7f636f756e742061646472206572726f7200000000000000000000000000000000600082015250565b6000613b12601083612c96565b9150613b1d82613adc565b602082019050919050565b60006020820190508181036000830152613b4181613b05565b9050919050565b7f6164647220617267206572726f72000000000000000000000000000000000000600082015250565b6000613b7e600e83612c96565b9150613b8982613b48565b602082019050919050565b60006020820190508181036000830152613bad81613b71565b9050919050565b7f737065632061646472206572726f720000000000000000000000000000000000600082015250565b6000613bea600f83612c96565b9150613bf582613bb4565b602082019050919050565b60006020820190508181036000830152613c1981613bdd565b9050919050565b600081905092915050565b6000613c3682612c8b565b613c408185613c20565b9350613c50818560208601612ca7565b80840191505092915050565b6000613c688285613c2b565b9150613c748284613c2b565b91508190509392505050565b6000613c8b82612dc9565b9050919050565b613c9b81613c80565b8114613ca657600080fd5b50565b600081519050613cb881613c92565b92915050565b600060208284031215613cd457613cd3612bc6565b5b6000613ce284828501613ca9565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d47602683612c96565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b6000613dd9602583612c96565b9150613de482613d7d565b604082019050919050565b60006020820190508181036000830152613e0881613dcc565b9050919050565b613e1881612fdc565b82525050565b6000608082019050613e33600083018761314d565b613e406020830186613e0f565b613e4d604083018561314d565b613e5a606083018461314d565b95945050505050565b6000613e6e82612d46565b9150613e7983612d46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eae57613ead613a65565b5b828201905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613f15602c83612c96565b9150613f2082613eb9565b604082019050919050565b60006020820190508181036000830152613f4481613f08565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613fa7602583612c96565b9150613fb282613f4b565b604082019050919050565b60006020820190508181036000830152613fd681613f9a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614039602483612c96565b915061404482613fdd565b604082019050919050565b600060208201905081810360008301526140688161402c565b9050919050565b600061407a82612d46565b915061408583612d46565b92508282101561409857614097613a65565b5b828203905092915050565b7f656d70747920616472657373206572726f720000000000000000000000000000600082015250565b60006140d9601283612c96565b91506140e4826140a3565b602082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b7f45786365656420737570706c79332e0000000000000000000000000000000000600082015250565b6000614145600f83612c96565b91506141508261410f565b602082019050919050565b6000602082019050818103600083015261417481614138565b9050919050565b7f73657063206164647220636f756e74206572726f720000000000000000000000600082015250565b60006141b1601583612c96565b91506141bc8261417b565b602082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f45786365656420737570706c79322e0000000000000000000000000000000000600082015250565b600061421d600f83612c96565b9150614228826141e7565b602082019050919050565b6000602082019050818103600083015261424c81614210565b9050919050565b600061425e82612d46565b915061426983612d46565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142a2576142a1613a65565b5b828202905092915050565b7f70726963653d0000000000000000000000000000000000000000000000000000815250565b7f2626636f756e743d000000000000000000000000000000000000000000000000815250565b7f262676616c75653d000000000000000000000000000000000000000000000000815250565b7f2b2b000000000000000000000000000000000000000000000000000000000000815250565b6000614350826142ad565b6006820191506143608286613c2b565b915061436b826142d3565b60088201915061437b8285613c2b565b9150614386826142f9565b6008820191506143968284613c2b565b91506143a18261431f565b600282019150819050949350505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143e8601983612c96565b91506143f3826143b2565b602082019050919050565b60006020820190508181036000830152614417816143db565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061447a603283612c96565b91506144858261441e565b604082019050919050565b600060208201905081810360008301526144a98161446d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144ea82612d46565b91506144f583612d46565b925082614505576145046144b0565b5b828204905092915050565b600061451b82612d46565b915061452683612d46565b925082614536576145356144b0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082019050614585600083018761314d565b6145926020830186613123565b61459f6040830185612ddb565b6145ac606083018461314d565b95945050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006145eb600283613c20565b91506145f6826145b5565b600282019050919050565b6000819050919050565b61461c61461782612fa6565b614601565b82525050565b600061462d826145de565b9150614639828561460b565b602082019150614649828461460b565b6020820191508190509392505050565b600060808201905061466e6000830187612ddb565b61467b6020830186612ddb565b6146886040830185613123565b818103606083015261469a81846130c8565b905095945050505050565b6000815190506146b481612bfc565b92915050565b6000602082840312156146d0576146cf612bc6565b5b60006146de848285016146a5565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061471d602083612c96565b9150614728826146e7565b602082019050919050565b6000602082019050818103600083015261474c81614710565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614789601c83612c96565b915061479482614753565b602082019050919050565b600060208201905081810360008301526147b88161477c565b905091905056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529697066733a2f2f6261667962656964667278327069683374726d7762776e7064696c6d77656165737a7666726b6f766d773372706c77336d627068637676723536652fa2646970667358221220f8f27eb412c24876f608811175a7ed43e9e643d75cbf3b4fa50724e44fdf343164736f6c634300080f0033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c74290000000000000000000000006bb5bd743b59f211de3138a7166cc8687d22219d
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063a22cb465116100a0578063b88d4fde1161006f578063b88d4fde146106c3578063c87b56dd146106ec578063d547cfb714610729578063e985e9c514610754578063f2fde38b14610791576101ee565b8063a22cb4651461061b578063a549d8ab14610644578063b19960e61461066f578063b67dfd201461069a576101ee565b806395d89b41116100dc57806395d89b411461057e5780639abc8320146105a9578063a035b1fe146105d4578063a0712d68146105ff576101ee565b8063715018a6146104e85780638da5cb5b146104ff5780639105553a1461052a57806391b7f5ed14610555576101ee565b806323b872dd116101855780633ccfd60b116101545780633ccfd60b1461042e57806342842e0e146104455780636352211e1461046e57806370a08231146104ab576101ee565b806323b872dd146103725780632d0335ab1461039b57806332cb6b0c146103d85780633408e47014610403576101ee565b80630c53c51c116101c15780630c53c51c146102c15780630f7e5970146102f157806318160ddd1461031c57806320379ee514610347576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612c28565b6107ba565b6040516102279190612c70565b60405180910390f35b34801561023c57600080fd5b5061024561089c565b6040516102529190612d24565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612d7c565b61092e565b60405161028f9190612dea565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612e31565b6109b3565b005b6102db60048036038101906102d69190613015565b610aca565b6040516102e89190613101565b60405180910390f35b3480156102fd57600080fd5b50610306610d3c565b6040516103139190612d24565b60405180910390f35b34801561032857600080fd5b50610331610d75565b60405161033e9190613132565b60405180910390f35b34801561035357600080fd5b5061035c610d86565b604051610369919061315c565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613177565b610d90565b005b3480156103a757600080fd5b506103c260048036038101906103bd91906131ca565b610df0565b6040516103cf9190613132565b60405180910390f35b3480156103e457600080fd5b506103ed610e39565b6040516103fa9190613132565b60405180910390f35b34801561040f57600080fd5b50610418610e3f565b6040516104259190613132565b60405180910390f35b34801561043a57600080fd5b50610443610e4c565b005b34801561045157600080fd5b5061046c60048036038101906104679190613177565b610f77565b005b34801561047a57600080fd5b5061049560048036038101906104909190612d7c565b610f97565b6040516104a29190612dea565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd91906131ca565b611048565b6040516104df9190613132565b60405180910390f35b3480156104f457600080fd5b506104fd6110ff565b005b34801561050b57600080fd5b50610514611187565b6040516105219190612dea565b60405180910390f35b34801561053657600080fd5b5061053f6111b1565b60405161054c9190613132565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190612d7c565b6111b7565b005b34801561058a57600080fd5b5061059361123d565b6040516105a09190612d24565b60405180910390f35b3480156105b557600080fd5b506105be6112cf565b6040516105cb9190612d24565b60405180910390f35b3480156105e057600080fd5b506105e96112eb565b6040516105f69190613132565b60405180910390f35b61061960048036038101906106149190612d7c565b6112f1565b005b34801561062757600080fd5b50610642600480360381019061063d9190613223565b61134d565b005b34801561065057600080fd5b50610659611363565b6040516106669190612dea565b60405180910390f35b34801561067b57600080fd5b50610684611389565b6040516106919190613132565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613263565b61138e565b005b3480156106cf57600080fd5b506106ea60048036038101906106e591906132a3565b61159b565b005b3480156106f857600080fd5b50610713600480360381019061070e9190612d7c565b6115fd565b6040516107209190612d24565b60405180910390f35b34801561073557600080fd5b5061073e611637565b60405161074b9190612d24565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190613326565b611657565b6040516107889190612c70565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b391906131ca565b611749565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108955750610894826118f0565b5b9050919050565b6060600080546108ab90613395565b80601f01602080910402602001604051908101604052809291908181526020018280546108d790613395565b80156109245780601f106108f957610100808354040283529160200191610924565b820191906000526020600020905b81548152906001019060200180831161090757829003601f168201915b5050505050905090565b60006109398261195a565b610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90613438565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109be82610f97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a25906134ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4d6119c6565b73ffffffffffffffffffffffffffffffffffffffff161480610a7c5750610a7b81610a766119c6565b611657565b5b610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab29061355c565b60405180910390fd5b610ac583836119d5565b505050565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610b4d8782878787611a8e565b610b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b83906135ee565b60405180910390fd5b610bdf6001600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b9690919063ffffffff16565b600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610c559392919061362f565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610c8a9291906136f1565b604051602081830303815290604052604051610ca69190613719565b6000604051808303816000865af19150503d8060008114610ce3576040519150601f19603f3d011682016040523d82523d6000602084013e610ce8565b606091505b509150915081610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d249061377c565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000610d81600b611bac565b905090565b6000600754905090565b610da1610d9b6119c6565b82611bba565b610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd79061380e565b60405180910390fd5b610deb838383611c98565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61271081565b6000804690508091505090565b610e546119c6565b73ffffffffffffffffffffffffffffffffffffffff16610e72611187565b73ffffffffffffffffffffffffffffffffffffffff1614610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf9061387a565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610eee906138c0565b60006040518083038185875af1925050503d8060008114610f2b576040519150601f19603f3d011682016040523d82523d6000602084013e610f30565b606091505b5050905080610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90613921565b60405180910390fd5b50565b610f928383836040518060200160405280600081525061159b565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361103f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611036906139b3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90613a45565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111076119c6565b73ffffffffffffffffffffffffffffffffffffffff16611125611187565b73ffffffffffffffffffffffffffffffffffffffff161461117b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111729061387a565b60405180910390fd5b6111856000611efe565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6111bf6119c6565b73ffffffffffffffffffffffffffffffffffffffff166111dd611187565b73ffffffffffffffffffffffffffffffffffffffff1614611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a9061387a565b60405180910390fd5b80600c8190555050565b60606001805461124c90613395565b80601f016020809104026020016040519081016040528092919081815260200182805461127890613395565b80156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050905090565b6040518060800160405280604381526020016148036043913981565b600c5481565b60006112fb611840565b905061130682611fc4565b5060005b828110156113485761131c600b612343565b6000611328600b611bac565b90506113348382612359565b50808061134090613a94565b91505061130a565b505050565b61135f6113586119c6565b8383612377565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b6113966119c6565b73ffffffffffffffffffffffffffffffffffffffff166113b4611187565b73ffffffffffffffffffffffffffffffffffffffff161461140a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114019061387a565b60405180910390fd5b61271082111561144f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144690613b28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b590613b94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690613c00565b60405180910390fd5b81600d8190555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6115ac6115a66119c6565b83611bba565b6115eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e29061380e565b60405180910390fd5b6115f7848484846124e3565b50505050565b6060611607611637565b6116108361253f565b604051602001611621929190613c5c565b6040516020818303038152906040529050919050565b606060405180608001604052806043815260200161480360439139905090565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016116cf9190612dea565b602060405180830381865afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190613cbe565b73ffffffffffffffffffffffffffffffffffffffff1603611735576001915050611743565b61173f848461269f565b9150505b92915050565b6117516119c6565b73ffffffffffffffffffffffffffffffffffffffff1661176f611187565b73ffffffffffffffffffffffffffffffffffffffff16146117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc9061387a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613d5d565b60405180910390fd5b61183d81611efe565b50565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036118e957600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506118ed565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006119d0611840565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4883610f97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613def565b60405180910390fd5b6001611b11611b0c87612733565b61279b565b83868660405160008152602001604052604051611b319493929190613e1e565b6020604051602081039080840390855afa158015611b53573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611ba49190613e63565b905092915050565b600081600001549050919050565b6000611bc58261195a565b611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90613f2b565b60405180910390fd5b6000611c0f83610f97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c515750611c508185611657565b5b80611c8f57508373ffffffffffffffffffffffffffffffffffffffff16611c778461092e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cb882610f97565b73ffffffffffffffffffffffffffffffffffffffff1614611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0590613fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d749061404f565b60405180910390fd5b611d888383836127d4565b611d936000826119d5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de3919061406f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e3a9190613e63565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ef98383836127d9565b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611fcf611840565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612037906140ef565b60405180910390fd5b600061204b82611048565b90506127108461205b600b611bac565b6120659190613e63565b11156120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d9061415b565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361215057600d54848261210a9190613e63565b111561214b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612142906141c7565b60405180910390fd5b6121a0565b6005848261215e9190613e63565b111561219f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219690614233565b60405180910390fd5b5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461233857600081146122965783600c5461220b9190614253565b34101561229157600061221f600c5461253f565b6122288661253f565b6122313461253f565b60405160200161224393929190614345565b6040516020818303038152906040529050806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122889190612d24565b60405180910390fd5b612337565b6001846122a3919061406f565b600c546122b09190614253565b3410156123365760006122c4600c5461253f565b6122cd8661253f565b6122d63461253f565b6040516020016122e893929190614345565b6040516020818303038152906040529050806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232d9190612d24565b60405180910390fd5b5b5b600192505050919050565b6001816000016000828254019250508190555050565b6123738282604051806020016040528060008152506127de565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dc906143fe565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124d69190612c70565b60405180910390a3505050565b6124ee848484611c98565b6124fa84848484612839565b612539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253090614490565b60405180910390fd5b50505050565b606060008203612586576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061269a565b600082905060005b600082146125b85780806125a190613a94565b915050600a826125b191906144df565b915061258e565b60008167ffffffffffffffff8111156125d4576125d3612e7b565b5b6040519080825280601f01601f1916602001820160405280156126065781602001600182028036833780820191505090505b5090505b600085146126935760018261261f919061406f565b9150600a8561262e9190614510565b603061263a9190613e63565b60f81b8183815181106126505761264f614541565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561268c91906144df565b945061260a565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006040518060800160405280604381526020016147c060439139805190602001208260000151836020015184604001518051906020012060405160200161277e9493929190614570565b604051602081830303815290604052805190602001209050919050565b60006127a5610d86565b826040516020016127b7929190614622565b604051602081830303815290604052805190602001209050919050565b505050565b505050565b6127e883836129c0565b6127f56000848484612839565b612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b90614490565b60405180910390fd5b505050565b600061285a8473ffffffffffffffffffffffffffffffffffffffff16612b99565b156129b3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128836119c6565b8786866040518563ffffffff1660e01b81526004016128a59493929190614659565b6020604051808303816000875af19250505080156128e157506040513d601f19601f820116820180604052508101906128de91906146ba565b60015b612963573d8060008114612911576040519150601f19603f3d011682016040523d82523d6000602084013e612916565b606091505b50600081510361295b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295290614490565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b8565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2690614733565b60405180910390fd5b612a388161195a565b15612a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6f9061479f565b60405180910390fd5b612a84600083836127d4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ad49190613e63565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b95600083836127d9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0581612bd0565b8114612c1057600080fd5b50565b600081359050612c2281612bfc565b92915050565b600060208284031215612c3e57612c3d612bc6565b5b6000612c4c84828501612c13565b91505092915050565b60008115159050919050565b612c6a81612c55565b82525050565b6000602082019050612c856000830184612c61565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cc5578082015181840152602081019050612caa565b83811115612cd4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612cf682612c8b565b612d008185612c96565b9350612d10818560208601612ca7565b612d1981612cda565b840191505092915050565b60006020820190508181036000830152612d3e8184612ceb565b905092915050565b6000819050919050565b612d5981612d46565b8114612d6457600080fd5b50565b600081359050612d7681612d50565b92915050565b600060208284031215612d9257612d91612bc6565b5b6000612da084828501612d67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dd482612da9565b9050919050565b612de481612dc9565b82525050565b6000602082019050612dff6000830184612ddb565b92915050565b612e0e81612dc9565b8114612e1957600080fd5b50565b600081359050612e2b81612e05565b92915050565b60008060408385031215612e4857612e47612bc6565b5b6000612e5685828601612e1c565b9250506020612e6785828601612d67565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612eb382612cda565b810181811067ffffffffffffffff82111715612ed257612ed1612e7b565b5b80604052505050565b6000612ee5612bbc565b9050612ef18282612eaa565b919050565b600067ffffffffffffffff821115612f1157612f10612e7b565b5b612f1a82612cda565b9050602081019050919050565b82818337600083830152505050565b6000612f49612f4484612ef6565b612edb565b905082815260208101848484011115612f6557612f64612e76565b5b612f70848285612f27565b509392505050565b600082601f830112612f8d57612f8c612e71565b5b8135612f9d848260208601612f36565b91505092915050565b6000819050919050565b612fb981612fa6565b8114612fc457600080fd5b50565b600081359050612fd681612fb0565b92915050565b600060ff82169050919050565b612ff281612fdc565b8114612ffd57600080fd5b50565b60008135905061300f81612fe9565b92915050565b600080600080600060a0868803121561303157613030612bc6565b5b600061303f88828901612e1c565b955050602086013567ffffffffffffffff8111156130605761305f612bcb565b5b61306c88828901612f78565b945050604061307d88828901612fc7565b935050606061308e88828901612fc7565b925050608061309f88828901613000565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60006130d3826130ac565b6130dd81856130b7565b93506130ed818560208601612ca7565b6130f681612cda565b840191505092915050565b6000602082019050818103600083015261311b81846130c8565b905092915050565b61312c81612d46565b82525050565b60006020820190506131476000830184613123565b92915050565b61315681612fa6565b82525050565b6000602082019050613171600083018461314d565b92915050565b6000806000606084860312156131905761318f612bc6565b5b600061319e86828701612e1c565b93505060206131af86828701612e1c565b92505060406131c086828701612d67565b9150509250925092565b6000602082840312156131e0576131df612bc6565b5b60006131ee84828501612e1c565b91505092915050565b61320081612c55565b811461320b57600080fd5b50565b60008135905061321d816131f7565b92915050565b6000806040838503121561323a57613239612bc6565b5b600061324885828601612e1c565b92505060206132598582860161320e565b9150509250929050565b6000806040838503121561327a57613279612bc6565b5b600061328885828601612d67565b925050602061329985828601612e1c565b9150509250929050565b600080600080608085870312156132bd576132bc612bc6565b5b60006132cb87828801612e1c565b94505060206132dc87828801612e1c565b93505060406132ed87828801612d67565b925050606085013567ffffffffffffffff81111561330e5761330d612bcb565b5b61331a87828801612f78565b91505092959194509250565b6000806040838503121561333d5761333c612bc6565b5b600061334b85828601612e1c565b925050602061335c85828601612e1c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133ad57607f821691505b6020821081036133c0576133bf613366565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613422602c83612c96565b915061342d826133c6565b604082019050919050565b6000602082019050818103600083015261345181613415565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134b4602183612c96565b91506134bf82613458565b604082019050919050565b600060208201905081810360008301526134e3816134a7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613546603883612c96565b9150613551826134ea565b604082019050919050565b6000602082019050818103600083015261357581613539565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006135d8602183612c96565b91506135e38261357c565b604082019050919050565b60006020820190508181036000830152613607816135cb565b9050919050565b600061361982612da9565b9050919050565b6136298161360e565b82525050565b60006060820190506136446000830186612ddb565b6136516020830185613620565b818103604083015261366381846130c8565b9050949350505050565b600081905092915050565b6000613683826130ac565b61368d818561366d565b935061369d818560208601612ca7565b80840191505092915050565b60008160601b9050919050565b60006136c1826136a9565b9050919050565b60006136d3826136b6565b9050919050565b6136eb6136e682612dc9565b6136c8565b82525050565b60006136fd8285613678565b915061370982846136da565b6014820191508190509392505050565b60006137258284613678565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000613766601c83612c96565b915061377182613730565b602082019050919050565b6000602082019050818103600083015261379581613759565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006137f8603183612c96565b91506138038261379c565b604082019050919050565b60006020820190508181036000830152613827816137eb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613864602083612c96565b915061386f8261382e565b602082019050919050565b6000602082019050818103600083015261389381613857565b9050919050565b50565b60006138aa60008361366d565b91506138b58261389a565b600082019050919050565b60006138cb8261389d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061390b601083612c96565b9150613916826138d5565b602082019050919050565b6000602082019050818103600083015261393a816138fe565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061399d602983612c96565b91506139a882613941565b604082019050919050565b600060208201905081810360008301526139cc81613990565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613a2f602a83612c96565b9150613a3a826139d3565b604082019050919050565b60006020820190508181036000830152613a5e81613a22565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a9f82612d46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ad157613ad0613a65565b5b600182019050919050565b7f636f756e742061646472206572726f7200000000000000000000000000000000600082015250565b6000613b12601083612c96565b9150613b1d82613adc565b602082019050919050565b60006020820190508181036000830152613b4181613b05565b9050919050565b7f6164647220617267206572726f72000000000000000000000000000000000000600082015250565b6000613b7e600e83612c96565b9150613b8982613b48565b602082019050919050565b60006020820190508181036000830152613bad81613b71565b9050919050565b7f737065632061646472206572726f720000000000000000000000000000000000600082015250565b6000613bea600f83612c96565b9150613bf582613bb4565b602082019050919050565b60006020820190508181036000830152613c1981613bdd565b9050919050565b600081905092915050565b6000613c3682612c8b565b613c408185613c20565b9350613c50818560208601612ca7565b80840191505092915050565b6000613c688285613c2b565b9150613c748284613c2b565b91508190509392505050565b6000613c8b82612dc9565b9050919050565b613c9b81613c80565b8114613ca657600080fd5b50565b600081519050613cb881613c92565b92915050565b600060208284031215613cd457613cd3612bc6565b5b6000613ce284828501613ca9565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d47602683612c96565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b6000613dd9602583612c96565b9150613de482613d7d565b604082019050919050565b60006020820190508181036000830152613e0881613dcc565b9050919050565b613e1881612fdc565b82525050565b6000608082019050613e33600083018761314d565b613e406020830186613e0f565b613e4d604083018561314d565b613e5a606083018461314d565b95945050505050565b6000613e6e82612d46565b9150613e7983612d46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eae57613ead613a65565b5b828201905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613f15602c83612c96565b9150613f2082613eb9565b604082019050919050565b60006020820190508181036000830152613f4481613f08565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613fa7602583612c96565b9150613fb282613f4b565b604082019050919050565b60006020820190508181036000830152613fd681613f9a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614039602483612c96565b915061404482613fdd565b604082019050919050565b600060208201905081810360008301526140688161402c565b9050919050565b600061407a82612d46565b915061408583612d46565b92508282101561409857614097613a65565b5b828203905092915050565b7f656d70747920616472657373206572726f720000000000000000000000000000600082015250565b60006140d9601283612c96565b91506140e4826140a3565b602082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b7f45786365656420737570706c79332e0000000000000000000000000000000000600082015250565b6000614145600f83612c96565b91506141508261410f565b602082019050919050565b6000602082019050818103600083015261417481614138565b9050919050565b7f73657063206164647220636f756e74206572726f720000000000000000000000600082015250565b60006141b1601583612c96565b91506141bc8261417b565b602082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f45786365656420737570706c79322e0000000000000000000000000000000000600082015250565b600061421d600f83612c96565b9150614228826141e7565b602082019050919050565b6000602082019050818103600083015261424c81614210565b9050919050565b600061425e82612d46565b915061426983612d46565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142a2576142a1613a65565b5b828202905092915050565b7f70726963653d0000000000000000000000000000000000000000000000000000815250565b7f2626636f756e743d000000000000000000000000000000000000000000000000815250565b7f262676616c75653d000000000000000000000000000000000000000000000000815250565b7f2b2b000000000000000000000000000000000000000000000000000000000000815250565b6000614350826142ad565b6006820191506143608286613c2b565b915061436b826142d3565b60088201915061437b8285613c2b565b9150614386826142f9565b6008820191506143968284613c2b565b91506143a18261431f565b600282019150819050949350505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143e8601983612c96565b91506143f3826143b2565b602082019050919050565b60006020820190508181036000830152614417816143db565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061447a603283612c96565b91506144858261441e565b604082019050919050565b600060208201905081810360008301526144a98161446d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144ea82612d46565b91506144f583612d46565b925082614505576145046144b0565b5b828204905092915050565b600061451b82612d46565b915061452683612d46565b925082614536576145356144b0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082019050614585600083018761314d565b6145926020830186613123565b61459f6040830185612ddb565b6145ac606083018461314d565b95945050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006145eb600283613c20565b91506145f6826145b5565b600282019050919050565b6000819050919050565b61461c61461782612fa6565b614601565b82525050565b600061462d826145de565b9150614639828561460b565b602082019150614649828461460b565b6020820191508190509392505050565b600060808201905061466e6000830187612ddb565b61467b6020830186612ddb565b6146886040830185613123565b818103606083015261469a81846130c8565b905095945050505050565b6000815190506146b481612bfc565b92915050565b6000602082840312156146d0576146cf612bc6565b5b60006146de848285016146a5565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061471d602083612c96565b9150614728826146e7565b602082019050919050565b6000602082019050818103600083015261474c81614710565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614789601c83612c96565b915061479482614753565b602082019050919050565b600060208201905081810360008301526147b88161477c565b905091905056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529697066733a2f2f6261667962656964667278327069683374726d7762776e7064696c6d77656165737a7666726b6f766d773372706c77336d627068637676723536652fa2646970667358221220f8f27eb412c24876f608811175a7ed43e9e643d75cbf3b4fa50724e44fdf343164736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006bb5bd743b59f211de3138a7166cc8687d22219d
-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0x6Bb5BD743b59f211de3138a7166cC8687d22219d
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006bb5bd743b59f211de3138a7166cc8687d22219d
Deployed Bytecode Sourcemap
55152:3347:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38945:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39890:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41450:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40973:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11150:1151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1286:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58206:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2295:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42200:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12727:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55326:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2404:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58323:173;;;;;;;;;;;;;:::i;:::-;;42610:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39584:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39314:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19528:103;;;;;;;;;;;;;:::i;:::-;;18877:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55429:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56179:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40059:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55604:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55285:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56273:354;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41743:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55461:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55375:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55837:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42866:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54012:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58089:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54319:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19786:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38945:305;39047:4;39099:25;39084:40;;;:11;:40;;;;:105;;;;39156:33;39141:48;;;:11;:48;;;;39084:105;:158;;;;39206:36;39230:11;39206:23;:36::i;:::-;39084:158;39064:178;;38945:305;;;:::o;39890:100::-;39944:13;39977:5;39970:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39890:100;:::o;41450:221::-;41526:7;41554:16;41562:7;41554;:16::i;:::-;41546:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41639:15;:24;41655:7;41639:24;;;;;;;;;;;;;;;;;;;;;41632:31;;41450:221;;;:::o;40973:411::-;41054:13;41070:23;41085:7;41070:14;:23::i;:::-;41054:39;;41118:5;41112:11;;:2;:11;;;41104:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41212:5;41196:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41221:37;41238:5;41245:12;:10;:12::i;:::-;41221:16;:37::i;:::-;41196:62;41174:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;41355:21;41364:2;41368:7;41355:8;:21::i;:::-;41043:341;40973:411;;:::o;11150:1151::-;11351:12;11376:29;11408:152;;;;;;;;11446:6;:19;11453:11;11446:19;;;;;;;;;;;;;;;;11408:152;;;;11486:11;11408:152;;;;;;11531:17;11408:152;;;11376:184;;11595:45;11602:11;11615:6;11623:4;11629;11635;11595:6;:45::i;:::-;11573:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;11790:26;11814:1;11790:6;:19;11797:11;11790:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;11768:6;:19;11775:11;11768:19;;;;;;;;;;;;;;;:48;;;;11834:126;11872:11;11906:10;11932:17;11834:126;;;;;;;;:::i;:::-;;;;;;;;12071:12;12085:23;12120:4;12112:18;;12162:17;12181:11;12145:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12112:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12070:134;;;;12223:7;12215:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;12283:10;12276:17;;;;;11150:1151;;;;;;;:::o;1286:43::-;;;;;;;;;;;;;;;;;;;:::o;58206:109::-;58258:7;58285:22;:12;:20;:22::i;:::-;58278:29;;58206:109;:::o;2295:101::-;2346:7;2373:15;;2366:22;;2295:101;:::o;42200:339::-;42395:41;42414:12;:10;:12::i;:::-;42428:7;42395:18;:41::i;:::-;42387:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;42503:28;42513:4;42519:2;42523:7;42503:9;:28::i;:::-;42200:339;;;:::o;12727:107::-;12780:13;12814:6;:12;12821:4;12814:12;;;;;;;;;;;;;;;;12806:20;;12727:107;;;:::o;55326:42::-;55363:5;55326:42;:::o;2404:161::-;2447:7;2467:10;2518:9;2512:15;;2555:2;2548:9;;;2404:161;:::o;58323:173::-;19108:12;:10;:12::i;:::-;19097:23;;:7;:5;:7::i;:::-;:23;;;19089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58374:12:::1;58391:10;:15;;58415:21;58391:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58373:68;;;58460:7;58452:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;58362:134;58323:173::o:0;42610:185::-;42748:39;42765:4;42771:2;42775:7;42748:39;;;;;;;;;;;;:16;:39::i;:::-;42610:185;;;:::o;39584:239::-;39656:7;39676:13;39692:7;:16;39700:7;39692:16;;;;;;;;;;;;;;;;;;;;;39676:32;;39744:1;39727:19;;:5;:19;;;39719:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39810:5;39803:12;;;39584:239;;;:::o;39314:208::-;39386:7;39431:1;39414:19;;:5;:19;;;39406:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39498:9;:16;39508:5;39498:16;;;;;;;;;;;;;;;;39491:23;;39314:208;;;:::o;19528:103::-;19108:12;:10;:12::i;:::-;19097:23;;:7;:5;:7::i;:::-;:23;;;19089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19593:30:::1;19620:1;19593:18;:30::i;:::-;19528:103::o:0;18877:87::-;18923:7;18950:6;;;;;;;;;;;18943:13;;18877:87;:::o;55429:25::-;;;;:::o;56179:86::-;19108:12;:10;:12::i;:::-;19097:23;;:7;:5;:7::i;:::-;:23;;;19089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56251:6:::1;56243:5;:14;;;;56179:86:::0;:::o;40059:104::-;40115:13;40148:7;40141:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40059:104;:::o;55604:103::-;;;;;;;;;;;;;;;;;;;:::o;55285:34::-;;;;:::o;56273:354::-;56337:14;56354:11;:9;:11::i;:::-;56337:28;;56376:21;56387:9;56376:10;:21::i;:::-;;56415:9;56410:210;56434:9;56430:1;:13;56410:210;;;56474:24;:12;:22;:24::i;:::-;56513:22;56538;:12;:20;:22::i;:::-;56513:47;;56575:33;56585:6;56593:14;56575:9;:33::i;:::-;56459:161;56445:3;;;;;:::i;:::-;;;;56410:210;;;;56326:301;56273:354;:::o;41743:155::-;41838:52;41857:12;:10;:12::i;:::-;41871:8;41881;41838:18;:52::i;:::-;41743:155;;:::o;55461:24::-;;;;;;;;;;;;;:::o;55375:47::-;55421:1;55375:47;:::o;55837:334::-;19108:12;:10;:12::i;:::-;19097:23;;:7;:5;:7::i;:::-;:23;;;19089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55363:5:::1;55933:6;:20;;55925:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56015:1;55993:24;;:10;:24;;::::0;55985:51:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56076:1;56055:23;;:9;;;;;;;;;;;:23;;;56047:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56124:6;56111:10;:19;;;;56153:10;56141:9;;:22;;;;;;;;;;;;;;;;;;55837:334:::0;;:::o;42866:328::-;43041:41;43060:12;:10;:12::i;:::-;43074:7;43041:18;:41::i;:::-;43033:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;43147:39;43161:4;43167:2;43171:7;43180:5;43147:13;:39::i;:::-;42866:328;;;;:::o;54012:175::-;54078:13;54135:14;:12;:14::i;:::-;54151:26;54168:8;54151:16;:26::i;:::-;54118:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54104:75;;54012:175;;;:::o;58089:109::-;58151:13;58183:7;;;;;;;;;;;;;;;;;58176:14;;58089:109;:::o;54319:445::-;54444:4;54529:27;54573:20;;;;;;;;;;;54529:65;;54650:8;54609:49;;54617:13;:21;;;54639:5;54617:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54609:49;;;54605:93;;54682:4;54675:11;;;;;54605:93;54717:39;54740:5;54747:8;54717:22;:39::i;:::-;54710:46;;;54319:445;;;;;:::o;19786:201::-;19108:12;:10;:12::i;:::-;19097:23;;:7;:5;:7::i;:::-;:23;;;19089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19895:1:::1;19875:22;;:8;:22;;::::0;19867:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19951:28;19970:8;19951:18;:28::i;:::-;19786:201:::0;:::o;115:650::-;186:22;252:4;230:27;;:10;:27;;;226:508;;274:18;295:8;;274:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;318:13;334:8;;:15;;318:31;;586:42;556:5;549;545:17;539:24;513:134;503:144;;373:289;;226:508;;;711:10;694:28;;226:508;115:650;:::o;31684:157::-;31769:4;31808:25;31793:40;;;:11;:40;;;;31786:47;;31684:157;;;:::o;44704:127::-;44769:4;44821:1;44793:30;;:7;:16;44801:7;44793:16;;;;;;;;;;;;;;;;;;;;;:30;;;;44786:37;;44704:127;;;:::o;54908:161::-;54998:14;55037:24;:22;:24::i;:::-;55030:31;;54908:161;:::o;48850:174::-;48952:2;48925:15;:24;48941:7;48925:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49008:7;49004:2;48970:46;;48979:23;48994:7;48979:14;:23::i;:::-;48970:46;;;;;;;;;;;;48850:174;;:::o;12842:486::-;13020:4;13063:1;13045:20;;:6;:20;;;13037:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;13161:159;13189:47;13208:27;13228:6;13208:19;:27::i;:::-;13189:18;:47::i;:::-;13255:4;13278;13301;13161:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13138:182;;:6;:182;;;13118:202;;12842:486;;;;;;;:::o;6073:98::-;6131:7;6162:1;6158;:5;;;;:::i;:::-;6151:12;;6073:98;;;;:::o;14205:114::-;14270:7;14297;:14;;;14290:21;;14205:114;;;:::o;44998:348::-;45091:4;45116:16;45124:7;45116;:16::i;:::-;45108:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45192:13;45208:23;45223:7;45208:14;:23::i;:::-;45192:39;;45261:5;45250:16;;:7;:16;;;:52;;;;45270:32;45287:5;45294:7;45270:16;:32::i;:::-;45250:52;:87;;;;45330:7;45306:31;;:20;45318:7;45306:11;:20::i;:::-;:31;;;45250:87;45242:96;;;44998:348;;;;:::o;48107:625::-;48266:4;48239:31;;:23;48254:7;48239:14;:23::i;:::-;:31;;;48231:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48345:1;48331:16;;:2;:16;;;48323:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48401:39;48422:4;48428:2;48432:7;48401:20;:39::i;:::-;48505:29;48522:1;48526:7;48505:8;:29::i;:::-;48566:1;48547:9;:15;48557:4;48547:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;48595:1;48578:9;:13;48588:2;48578:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48626:2;48607:7;:16;48615:7;48607:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48665:7;48661:2;48646:27;;48655:4;48646:27;;;;;;;;;;;;48686:38;48706:4;48712:2;48716:7;48686:19;:38::i;:::-;48107:625;;;:::o;20147:191::-;20221:16;20240:6;;;;;;;;;;;20221:25;;20266:8;20257:6;;:17;;;;;;;;;;;;;;;;;;20321:8;20290:40;;20311:8;20290:40;;;;;;;;;;;;20210:128;20147:191;:::o;56635:1446::-;56692:4;56714:14;56731:11;:9;:11::i;:::-;56714:28;;56781:1;56763:20;;:6;:20;;;56755:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56819:21;56843:17;56853:6;56843:9;:17::i;:::-;56819:41;;55363:5;56906:9;56881:22;:12;:20;:22::i;:::-;:34;;;;:::i;:::-;:48;;56873:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56976:9;;;;;;;;;;;56966:19;;:6;:19;;;56962:261;;57048:10;;57035:9;57019:13;:25;;;;:::i;:::-;:39;;57011:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56962:261;;;55421:1;57159:9;57143:13;:25;;;;:::i;:::-;:48;;57135:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56962:261;57249:9;;;;;;;;;;;57239:19;;:6;:19;;;57235:815;;57305:1;57288:13;:18;57284:755;;57364:9;57356:5;;:17;;;;:::i;:::-;57344:9;:29;57340:306;;;57415:15;57457:23;57474:5;;57457:16;:23::i;:::-;57519:27;57536:9;57519:16;:27::i;:::-;57560;57577:9;57560:16;:27::i;:::-;57433:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57415:179;;57624:1;57617:9;;;;;;;;;;;:::i;:::-;;;;;;;;57340:306;57284:755;;;57749:1;57737:9;:13;;;;:::i;:::-;57728:5;;:23;;;;:::i;:::-;57716:9;:35;57712:312;;;57793:15;57835:23;57852:5;;57835:16;:23::i;:::-;57897:27;57914:9;57897:16;:27::i;:::-;57938;57955:9;57938:16;:27::i;:::-;57811:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57793:179;;58002:1;57995:9;;;;;;;;;;;:::i;:::-;;;;;;;;57712:312;57284:755;57235:815;58069:4;58062:11;;;;56635:1446;;;:::o;14327:127::-;14434:1;14416:7;:14;;;:19;;;;;;;;;;;14327:127;:::o;45688:110::-;45764:26;45774:2;45778:7;45764:26;;;;;;;;;;;;:9;:26::i;:::-;45688:110;;:::o;49166:315::-;49321:8;49312:17;;:5;:17;;;49304:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49408:8;49370:18;:25;49389:5;49370:25;;;;;;;;;;;;;;;:35;49396:8;49370:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49454:8;49432:41;;49447:5;49432:41;;;49464:8;49432:41;;;;;;:::i;:::-;;;;;;;;49166:315;;;:::o;44076:::-;44233:28;44243:4;44249:2;44253:7;44233:9;:28::i;:::-;44280:48;44303:4;44309:2;44313:7;44322:5;44280:22;:48::i;:::-;44272:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;44076:315;;;;:::o;15163:723::-;15219:13;15449:1;15440:5;:10;15436:53;;15467:10;;;;;;;;;;;;;;;;;;;;;15436:53;15499:12;15514:5;15499:20;;15530:14;15555:78;15570:1;15562:4;:9;15555:78;;15588:8;;;;;:::i;:::-;;;;15619:2;15611:10;;;;;:::i;:::-;;;15555:78;;;15643:19;15675:6;15665:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15643:39;;15693:154;15709:1;15700:5;:10;15693:154;;15737:1;15727:11;;;;;:::i;:::-;;;15804:2;15796:5;:10;;;;:::i;:::-;15783:2;:24;;;;:::i;:::-;15770:39;;15753:6;15760;15753:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15833:2;15824:11;;;;;:::i;:::-;;;15693:154;;;15871:6;15857:21;;;;;15163:723;;;;:::o;41969:164::-;42066:4;42090:18;:25;42109:5;42090:25;;;;;;;;;;;;;;;:35;42116:8;42090:35;;;;;;;;;;;;;;;;;;;;;;;;;42083:42;;41969:164;;;;:::o;12309:410::-;12419:7;10486:100;;;;;;;;;;;;;;;;;10466:127;;;;;;12573:6;:12;;;12608:6;:11;;;12652:6;:24;;;12642:35;;;;;;12492:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12464:247;;;;;;12444:267;;12309:410;;;:::o;2934:258::-;3033:7;3135:20;:18;:20::i;:::-;3157:11;3106:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3078:106;;;;;;3058:126;;2934:258;;;:::o;51417:126::-;;;;:::o;51928:125::-;;;;:::o;46025:321::-;46155:18;46161:2;46165:7;46155:5;:18::i;:::-;46206:54;46237:1;46241:2;46245:7;46254:5;46206:22;:54::i;:::-;46184:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;46025:321;;;:::o;50046:799::-;50201:4;50222:15;:2;:13;;;:15::i;:::-;50218:620;;;50274:2;50258:36;;;50295:12;:10;:12::i;:::-;50309:4;50315:7;50324:5;50258:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50254:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50517:1;50500:6;:13;:18;50496:272;;50543:60;;;;;;;;;;:::i;:::-;;;;;;;;50496:272;50718:6;50712:13;50703:6;50699:2;50695:15;50688:38;50254:529;50391:41;;;50381:51;;;:6;:51;;;;50374:58;;;;;50218:620;50822:4;50815:11;;50046:799;;;;;;;:::o;46682:439::-;46776:1;46762:16;;:2;:16;;;46754:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46835:16;46843:7;46835;:16::i;:::-;46834:17;46826:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46897:45;46926:1;46930:2;46934:7;46897:20;:45::i;:::-;46972:1;46955:9;:13;46965:2;46955:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47003:2;46984:7;:16;46992:7;46984:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47048:7;47044:2;47023:33;;47040:1;47023:33;;;;;;;;;;;;47069:44;47097:1;47101:2;47105:7;47069:19;:44::i;:::-;46682:439;;:::o;21578:326::-;21638:4;21895:1;21873:7;:19;;;:23;21866:30;;21578:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:307::-;5853:4;5943:18;5935:6;5932:30;5929:56;;;5965:18;;:::i;:::-;5929:56;6003:29;6025:6;6003:29;:::i;:::-;5995:37;;6087:4;6081;6077:15;6069:23;;5792:307;;;:::o;6105:154::-;6189:6;6184:3;6179;6166:30;6251:1;6242:6;6237:3;6233:16;6226:27;6105:154;;;:::o;6265:410::-;6342:5;6367:65;6383:48;6424:6;6383:48;:::i;:::-;6367:65;:::i;:::-;6358:74;;6455:6;6448:5;6441:21;6493:4;6486:5;6482:16;6531:3;6522:6;6517:3;6513:16;6510:25;6507:112;;;6538:79;;:::i;:::-;6507:112;6628:41;6662:6;6657:3;6652;6628:41;:::i;:::-;6348:327;6265:410;;;;;:::o;6694:338::-;6749:5;6798:3;6791:4;6783:6;6779:17;6775:27;6765:122;;6806:79;;:::i;:::-;6765:122;6923:6;6910:20;6948:78;7022:3;7014:6;7007:4;6999:6;6995:17;6948:78;:::i;:::-;6939:87;;6755:277;6694:338;;;;:::o;7038:77::-;7075:7;7104:5;7093:16;;7038:77;;;:::o;7121:122::-;7194:24;7212:5;7194:24;:::i;:::-;7187:5;7184:35;7174:63;;7233:1;7230;7223:12;7174:63;7121:122;:::o;7249:139::-;7295:5;7333:6;7320:20;7311:29;;7349:33;7376:5;7349:33;:::i;:::-;7249:139;;;;:::o;7394:86::-;7429:7;7469:4;7462:5;7458:16;7447:27;;7394:86;;;:::o;7486:118::-;7557:22;7573:5;7557:22;:::i;:::-;7550:5;7547:33;7537:61;;7594:1;7591;7584:12;7537:61;7486:118;:::o;7610:135::-;7654:5;7692:6;7679:20;7670:29;;7708:31;7733:5;7708:31;:::i;:::-;7610:135;;;;:::o;7751:1085::-;7853:6;7861;7869;7877;7885;7934:3;7922:9;7913:7;7909:23;7905:33;7902:120;;;7941:79;;:::i;:::-;7902:120;8061:1;8086:53;8131:7;8122:6;8111:9;8107:22;8086:53;:::i;:::-;8076:63;;8032:117;8216:2;8205:9;8201:18;8188:32;8247:18;8239:6;8236:30;8233:117;;;8269:79;;:::i;:::-;8233:117;8374:62;8428:7;8419:6;8408:9;8404:22;8374:62;:::i;:::-;8364:72;;8159:287;8485:2;8511:53;8556:7;8547:6;8536:9;8532:22;8511:53;:::i;:::-;8501:63;;8456:118;8613:2;8639:53;8684:7;8675:6;8664:9;8660:22;8639:53;:::i;:::-;8629:63;;8584:118;8741:3;8768:51;8811:7;8802:6;8791:9;8787:22;8768:51;:::i;:::-;8758:61;;8712:117;7751:1085;;;;;;;;:::o;8842:98::-;8893:6;8927:5;8921:12;8911:22;;8842:98;;;:::o;8946:168::-;9029:11;9063:6;9058:3;9051:19;9103:4;9098:3;9094:14;9079:29;;8946:168;;;;:::o;9120:360::-;9206:3;9234:38;9266:5;9234:38;:::i;:::-;9288:70;9351:6;9346:3;9288:70;:::i;:::-;9281:77;;9367:52;9412:6;9407:3;9400:4;9393:5;9389:16;9367:52;:::i;:::-;9444:29;9466:6;9444:29;:::i;:::-;9439:3;9435:39;9428:46;;9210:270;9120:360;;;;:::o;9486:309::-;9597:4;9635:2;9624:9;9620:18;9612:26;;9684:9;9678:4;9674:20;9670:1;9659:9;9655:17;9648:47;9712:76;9783:4;9774:6;9712:76;:::i;:::-;9704:84;;9486:309;;;;:::o;9801:118::-;9888:24;9906:5;9888:24;:::i;:::-;9883:3;9876:37;9801:118;;:::o;9925:222::-;10018:4;10056:2;10045:9;10041:18;10033:26;;10069:71;10137:1;10126:9;10122:17;10113:6;10069:71;:::i;:::-;9925:222;;;;:::o;10153:118::-;10240:24;10258:5;10240:24;:::i;:::-;10235:3;10228:37;10153:118;;:::o;10277:222::-;10370:4;10408:2;10397:9;10393:18;10385:26;;10421:71;10489:1;10478:9;10474:17;10465:6;10421:71;:::i;:::-;10277:222;;;;:::o;10505:619::-;10582:6;10590;10598;10647:2;10635:9;10626:7;10622:23;10618:32;10615:119;;;10653:79;;:::i;:::-;10615:119;10773:1;10798:53;10843:7;10834:6;10823:9;10819:22;10798:53;:::i;:::-;10788:63;;10744:117;10900:2;10926:53;10971:7;10962:6;10951:9;10947:22;10926:53;:::i;:::-;10916:63;;10871:118;11028:2;11054:53;11099:7;11090:6;11079:9;11075:22;11054:53;:::i;:::-;11044:63;;10999:118;10505:619;;;;;:::o;11130:329::-;11189:6;11238:2;11226:9;11217:7;11213:23;11209:32;11206:119;;;11244:79;;:::i;:::-;11206:119;11364:1;11389:53;11434:7;11425:6;11414:9;11410:22;11389:53;:::i;:::-;11379:63;;11335:117;11130:329;;;;:::o;11465:116::-;11535:21;11550:5;11535:21;:::i;:::-;11528:5;11525:32;11515:60;;11571:1;11568;11561:12;11515:60;11465:116;:::o;11587:133::-;11630:5;11668:6;11655:20;11646:29;;11684:30;11708:5;11684:30;:::i;:::-;11587:133;;;;:::o;11726:468::-;11791:6;11799;11848:2;11836:9;11827:7;11823:23;11819:32;11816:119;;;11854:79;;:::i;:::-;11816:119;11974:1;11999:53;12044:7;12035:6;12024:9;12020:22;11999:53;:::i;:::-;11989:63;;11945:117;12101:2;12127:50;12169:7;12160:6;12149:9;12145:22;12127:50;:::i;:::-;12117:60;;12072:115;11726:468;;;;;:::o;12200:474::-;12268:6;12276;12325:2;12313:9;12304:7;12300:23;12296:32;12293:119;;;12331:79;;:::i;:::-;12293:119;12451:1;12476:53;12521:7;12512:6;12501:9;12497:22;12476:53;:::i;:::-;12466:63;;12422:117;12578:2;12604:53;12649:7;12640:6;12629:9;12625:22;12604:53;:::i;:::-;12594:63;;12549:118;12200:474;;;;;:::o;12680:943::-;12775:6;12783;12791;12799;12848:3;12836:9;12827:7;12823:23;12819:33;12816:120;;;12855:79;;:::i;:::-;12816:120;12975:1;13000:53;13045:7;13036:6;13025:9;13021:22;13000:53;:::i;:::-;12990:63;;12946:117;13102:2;13128:53;13173:7;13164:6;13153:9;13149:22;13128:53;:::i;:::-;13118:63;;13073:118;13230:2;13256:53;13301:7;13292:6;13281:9;13277:22;13256:53;:::i;:::-;13246:63;;13201:118;13386:2;13375:9;13371:18;13358:32;13417:18;13409:6;13406:30;13403:117;;;13439:79;;:::i;:::-;13403:117;13544:62;13598:7;13589:6;13578:9;13574:22;13544:62;:::i;:::-;13534:72;;13329:287;12680:943;;;;;;;:::o;13629:474::-;13697:6;13705;13754:2;13742:9;13733:7;13729:23;13725:32;13722:119;;;13760:79;;:::i;:::-;13722:119;13880:1;13905:53;13950:7;13941:6;13930:9;13926:22;13905:53;:::i;:::-;13895:63;;13851:117;14007:2;14033:53;14078:7;14069:6;14058:9;14054:22;14033:53;:::i;:::-;14023:63;;13978:118;13629:474;;;;;:::o;14109:180::-;14157:77;14154:1;14147:88;14254:4;14251:1;14244:15;14278:4;14275:1;14268:15;14295:320;14339:6;14376:1;14370:4;14366:12;14356:22;;14423:1;14417:4;14413:12;14444:18;14434:81;;14500:4;14492:6;14488:17;14478:27;;14434:81;14562:2;14554:6;14551:14;14531:18;14528:38;14525:84;;14581:18;;:::i;:::-;14525:84;14346:269;14295:320;;;:::o;14621:231::-;14761:34;14757:1;14749:6;14745:14;14738:58;14830:14;14825:2;14817:6;14813:15;14806:39;14621:231;:::o;14858:366::-;15000:3;15021:67;15085:2;15080:3;15021:67;:::i;:::-;15014:74;;15097:93;15186:3;15097:93;:::i;:::-;15215:2;15210:3;15206:12;15199:19;;14858:366;;;:::o;15230:419::-;15396:4;15434:2;15423:9;15419:18;15411:26;;15483:9;15477:4;15473:20;15469:1;15458:9;15454:17;15447:47;15511:131;15637:4;15511:131;:::i;:::-;15503:139;;15230:419;;;:::o;15655:220::-;15795:34;15791:1;15783:6;15779:14;15772:58;15864:3;15859:2;15851:6;15847:15;15840:28;15655:220;:::o;15881:366::-;16023:3;16044:67;16108:2;16103:3;16044:67;:::i;:::-;16037:74;;16120:93;16209:3;16120:93;:::i;:::-;16238:2;16233:3;16229:12;16222:19;;15881:366;;;:::o;16253:419::-;16419:4;16457:2;16446:9;16442:18;16434:26;;16506:9;16500:4;16496:20;16492:1;16481:9;16477:17;16470:47;16534:131;16660:4;16534:131;:::i;:::-;16526:139;;16253:419;;;:::o;16678:243::-;16818:34;16814:1;16806:6;16802:14;16795:58;16887:26;16882:2;16874:6;16870:15;16863:51;16678:243;:::o;16927:366::-;17069:3;17090:67;17154:2;17149:3;17090:67;:::i;:::-;17083:74;;17166:93;17255:3;17166:93;:::i;:::-;17284:2;17279:3;17275:12;17268:19;;16927:366;;;:::o;17299:419::-;17465:4;17503:2;17492:9;17488:18;17480:26;;17552:9;17546:4;17542:20;17538:1;17527:9;17523:17;17516:47;17580:131;17706:4;17580:131;:::i;:::-;17572:139;;17299:419;;;:::o;17724:220::-;17864:34;17860:1;17852:6;17848:14;17841:58;17933:3;17928:2;17920:6;17916:15;17909:28;17724:220;:::o;17950:366::-;18092:3;18113:67;18177:2;18172:3;18113:67;:::i;:::-;18106:74;;18189:93;18278:3;18189:93;:::i;:::-;18307:2;18302:3;18298:12;18291:19;;17950:366;;;:::o;18322:419::-;18488:4;18526:2;18515:9;18511:18;18503:26;;18575:9;18569:4;18565:20;18561:1;18550:9;18546:17;18539:47;18603:131;18729:4;18603:131;:::i;:::-;18595:139;;18322:419;;;:::o;18747:104::-;18792:7;18821:24;18839:5;18821:24;:::i;:::-;18810:35;;18747:104;;;:::o;18857:142::-;18960:32;18986:5;18960:32;:::i;:::-;18955:3;18948:45;18857:142;;:::o;19005:561::-;19188:4;19226:2;19215:9;19211:18;19203:26;;19239:71;19307:1;19296:9;19292:17;19283:6;19239:71;:::i;:::-;19320:88;19404:2;19393:9;19389:18;19380:6;19320:88;:::i;:::-;19455:9;19449:4;19445:20;19440:2;19429:9;19425:18;19418:48;19483:76;19554:4;19545:6;19483:76;:::i;:::-;19475:84;;19005:561;;;;;;:::o;19572:147::-;19673:11;19710:3;19695:18;;19572:147;;;;:::o;19725:373::-;19829:3;19857:38;19889:5;19857:38;:::i;:::-;19911:88;19992:6;19987:3;19911:88;:::i;:::-;19904:95;;20008:52;20053:6;20048:3;20041:4;20034:5;20030:16;20008:52;:::i;:::-;20085:6;20080:3;20076:16;20069:23;;19833:265;19725:373;;;;:::o;20104:94::-;20137:8;20185:5;20181:2;20177:14;20156:35;;20104:94;;;:::o;20204:::-;20243:7;20272:20;20286:5;20272:20;:::i;:::-;20261:31;;20204:94;;;:::o;20304:100::-;20343:7;20372:26;20392:5;20372:26;:::i;:::-;20361:37;;20304:100;;;:::o;20410:157::-;20515:45;20535:24;20553:5;20535:24;:::i;:::-;20515:45;:::i;:::-;20510:3;20503:58;20410:157;;:::o;20573:412::-;20731:3;20753:93;20842:3;20833:6;20753:93;:::i;:::-;20746:100;;20856:75;20927:3;20918:6;20856:75;:::i;:::-;20956:2;20951:3;20947:12;20940:19;;20976:3;20969:10;;20573:412;;;;;:::o;20991:271::-;21121:3;21143:93;21232:3;21223:6;21143:93;:::i;:::-;21136:100;;21253:3;21246:10;;20991:271;;;;:::o;21268:178::-;21408:30;21404:1;21396:6;21392:14;21385:54;21268:178;:::o;21452:366::-;21594:3;21615:67;21679:2;21674:3;21615:67;:::i;:::-;21608:74;;21691:93;21780:3;21691:93;:::i;:::-;21809:2;21804:3;21800:12;21793:19;;21452:366;;;:::o;21824:419::-;21990:4;22028:2;22017:9;22013:18;22005:26;;22077:9;22071:4;22067:20;22063:1;22052:9;22048:17;22041:47;22105:131;22231:4;22105:131;:::i;:::-;22097:139;;21824:419;;;:::o;22249:236::-;22389:34;22385:1;22377:6;22373:14;22366:58;22458:19;22453:2;22445:6;22441:15;22434:44;22249:236;:::o;22491:366::-;22633:3;22654:67;22718:2;22713:3;22654:67;:::i;:::-;22647:74;;22730:93;22819:3;22730:93;:::i;:::-;22848:2;22843:3;22839:12;22832:19;;22491:366;;;:::o;22863:419::-;23029:4;23067:2;23056:9;23052:18;23044:26;;23116:9;23110:4;23106:20;23102:1;23091:9;23087:17;23080:47;23144:131;23270:4;23144:131;:::i;:::-;23136:139;;22863:419;;;:::o;23288:182::-;23428:34;23424:1;23416:6;23412:14;23405:58;23288:182;:::o;23476:366::-;23618:3;23639:67;23703:2;23698:3;23639:67;:::i;:::-;23632:74;;23715:93;23804:3;23715:93;:::i;:::-;23833:2;23828:3;23824:12;23817:19;;23476:366;;;:::o;23848:419::-;24014:4;24052:2;24041:9;24037:18;24029:26;;24101:9;24095:4;24091:20;24087:1;24076:9;24072:17;24065:47;24129:131;24255:4;24129:131;:::i;:::-;24121:139;;23848:419;;;:::o;24273:114::-;;:::o;24393:398::-;24552:3;24573:83;24654:1;24649:3;24573:83;:::i;:::-;24566:90;;24665:93;24754:3;24665:93;:::i;:::-;24783:1;24778:3;24774:11;24767:18;;24393:398;;;:::o;24797:379::-;24981:3;25003:147;25146:3;25003:147;:::i;:::-;24996:154;;25167:3;25160:10;;24797:379;;;:::o;25182:166::-;25322:18;25318:1;25310:6;25306:14;25299:42;25182:166;:::o;25354:366::-;25496:3;25517:67;25581:2;25576:3;25517:67;:::i;:::-;25510:74;;25593:93;25682:3;25593:93;:::i;:::-;25711:2;25706:3;25702:12;25695:19;;25354:366;;;:::o;25726:419::-;25892:4;25930:2;25919:9;25915:18;25907:26;;25979:9;25973:4;25969:20;25965:1;25954:9;25950:17;25943:47;26007:131;26133:4;26007:131;:::i;:::-;25999:139;;25726:419;;;:::o;26151:228::-;26291:34;26287:1;26279:6;26275:14;26268:58;26360:11;26355:2;26347:6;26343:15;26336:36;26151:228;:::o;26385:366::-;26527:3;26548:67;26612:2;26607:3;26548:67;:::i;:::-;26541:74;;26624:93;26713:3;26624:93;:::i;:::-;26742:2;26737:3;26733:12;26726:19;;26385:366;;;:::o;26757:419::-;26923:4;26961:2;26950:9;26946:18;26938:26;;27010:9;27004:4;27000:20;26996:1;26985:9;26981:17;26974:47;27038:131;27164:4;27038:131;:::i;:::-;27030:139;;26757:419;;;:::o;27182:229::-;27322:34;27318:1;27310:6;27306:14;27299:58;27391:12;27386:2;27378:6;27374:15;27367:37;27182:229;:::o;27417:366::-;27559:3;27580:67;27644:2;27639:3;27580:67;:::i;:::-;27573:74;;27656:93;27745:3;27656:93;:::i;:::-;27774:2;27769:3;27765:12;27758:19;;27417:366;;;:::o;27789:419::-;27955:4;27993:2;27982:9;27978:18;27970:26;;28042:9;28036:4;28032:20;28028:1;28017:9;28013:17;28006:47;28070:131;28196:4;28070:131;:::i;:::-;28062:139;;27789:419;;;:::o;28214:180::-;28262:77;28259:1;28252:88;28359:4;28356:1;28349:15;28383:4;28380:1;28373:15;28400:233;28439:3;28462:24;28480:5;28462:24;:::i;:::-;28453:33;;28508:66;28501:5;28498:77;28495:103;;28578:18;;:::i;:::-;28495:103;28625:1;28618:5;28614:13;28607:20;;28400:233;;;:::o;28639:166::-;28779:18;28775:1;28767:6;28763:14;28756:42;28639:166;:::o;28811:366::-;28953:3;28974:67;29038:2;29033:3;28974:67;:::i;:::-;28967:74;;29050:93;29139:3;29050:93;:::i;:::-;29168:2;29163:3;29159:12;29152:19;;28811:366;;;:::o;29183:419::-;29349:4;29387:2;29376:9;29372:18;29364:26;;29436:9;29430:4;29426:20;29422:1;29411:9;29407:17;29400:47;29464:131;29590:4;29464:131;:::i;:::-;29456:139;;29183:419;;;:::o;29608:164::-;29748:16;29744:1;29736:6;29732:14;29725:40;29608:164;:::o;29778:366::-;29920:3;29941:67;30005:2;30000:3;29941:67;:::i;:::-;29934:74;;30017:93;30106:3;30017:93;:::i;:::-;30135:2;30130:3;30126:12;30119:19;;29778:366;;;:::o;30150:419::-;30316:4;30354:2;30343:9;30339:18;30331:26;;30403:9;30397:4;30393:20;30389:1;30378:9;30374:17;30367:47;30431:131;30557:4;30431:131;:::i;:::-;30423:139;;30150:419;;;:::o;30575:165::-;30715:17;30711:1;30703:6;30699:14;30692:41;30575:165;:::o;30746:366::-;30888:3;30909:67;30973:2;30968:3;30909:67;:::i;:::-;30902:74;;30985:93;31074:3;30985:93;:::i;:::-;31103:2;31098:3;31094:12;31087:19;;30746:366;;;:::o;31118:419::-;31284:4;31322:2;31311:9;31307:18;31299:26;;31371:9;31365:4;31361:20;31357:1;31346:9;31342:17;31335:47;31399:131;31525:4;31399:131;:::i;:::-;31391:139;;31118:419;;;:::o;31543:148::-;31645:11;31682:3;31667:18;;31543:148;;;;:::o;31697:377::-;31803:3;31831:39;31864:5;31831:39;:::i;:::-;31886:89;31968:6;31963:3;31886:89;:::i;:::-;31879:96;;31984:52;32029:6;32024:3;32017:4;32010:5;32006:16;31984:52;:::i;:::-;32061:6;32056:3;32052:16;32045:23;;31807:267;31697:377;;;;:::o;32080:435::-;32260:3;32282:95;32373:3;32364:6;32282:95;:::i;:::-;32275:102;;32394:95;32485:3;32476:6;32394:95;:::i;:::-;32387:102;;32506:3;32499:10;;32080:435;;;;;:::o;32521:125::-;32587:7;32616:24;32634:5;32616:24;:::i;:::-;32605:35;;32521:125;;;:::o;32652:180::-;32754:53;32801:5;32754:53;:::i;:::-;32747:5;32744:64;32734:92;;32822:1;32819;32812:12;32734:92;32652:180;:::o;32838:201::-;32924:5;32955:6;32949:13;32940:22;;32971:62;33027:5;32971:62;:::i;:::-;32838:201;;;;:::o;33045:409::-;33144:6;33193:2;33181:9;33172:7;33168:23;33164:32;33161:119;;;33199:79;;:::i;:::-;33161:119;33319:1;33344:93;33429:7;33420:6;33409:9;33405:22;33344:93;:::i;:::-;33334:103;;33290:157;33045:409;;;;:::o;33460:225::-;33600:34;33596:1;33588:6;33584:14;33577:58;33669:8;33664:2;33656:6;33652:15;33645:33;33460:225;:::o;33691:366::-;33833:3;33854:67;33918:2;33913:3;33854:67;:::i;:::-;33847:74;;33930:93;34019:3;33930:93;:::i;:::-;34048:2;34043:3;34039:12;34032:19;;33691:366;;;:::o;34063:419::-;34229:4;34267:2;34256:9;34252:18;34244:26;;34316:9;34310:4;34306:20;34302:1;34291:9;34287:17;34280:47;34344:131;34470:4;34344:131;:::i;:::-;34336:139;;34063:419;;;:::o;34488:224::-;34628:34;34624:1;34616:6;34612:14;34605:58;34697:7;34692:2;34684:6;34680:15;34673:32;34488:224;:::o;34718:366::-;34860:3;34881:67;34945:2;34940:3;34881:67;:::i;:::-;34874:74;;34957:93;35046:3;34957:93;:::i;:::-;35075:2;35070:3;35066:12;35059:19;;34718:366;;;:::o;35090:419::-;35256:4;35294:2;35283:9;35279:18;35271:26;;35343:9;35337:4;35333:20;35329:1;35318:9;35314:17;35307:47;35371:131;35497:4;35371:131;:::i;:::-;35363:139;;35090:419;;;:::o;35515:112::-;35598:22;35614:5;35598:22;:::i;:::-;35593:3;35586:35;35515:112;;:::o;35633:545::-;35806:4;35844:3;35833:9;35829:19;35821:27;;35858:71;35926:1;35915:9;35911:17;35902:6;35858:71;:::i;:::-;35939:68;36003:2;35992:9;35988:18;35979:6;35939:68;:::i;:::-;36017:72;36085:2;36074:9;36070:18;36061:6;36017:72;:::i;:::-;36099;36167:2;36156:9;36152:18;36143:6;36099:72;:::i;:::-;35633:545;;;;;;;:::o;36184:305::-;36224:3;36243:20;36261:1;36243:20;:::i;:::-;36238:25;;36277:20;36295:1;36277:20;:::i;:::-;36272:25;;36431:1;36363:66;36359:74;36356:1;36353:81;36350:107;;;36437:18;;:::i;:::-;36350:107;36481:1;36478;36474:9;36467:16;;36184:305;;;;:::o;36495:231::-;36635:34;36631:1;36623:6;36619:14;36612:58;36704:14;36699:2;36691:6;36687:15;36680:39;36495:231;:::o;36732:366::-;36874:3;36895:67;36959:2;36954:3;36895:67;:::i;:::-;36888:74;;36971:93;37060:3;36971:93;:::i;:::-;37089:2;37084:3;37080:12;37073:19;;36732:366;;;:::o;37104:419::-;37270:4;37308:2;37297:9;37293:18;37285:26;;37357:9;37351:4;37347:20;37343:1;37332:9;37328:17;37321:47;37385:131;37511:4;37385:131;:::i;:::-;37377:139;;37104:419;;;:::o;37529:224::-;37669:34;37665:1;37657:6;37653:14;37646:58;37738:7;37733:2;37725:6;37721:15;37714:32;37529:224;:::o;37759:366::-;37901:3;37922:67;37986:2;37981:3;37922:67;:::i;:::-;37915:74;;37998:93;38087:3;37998:93;:::i;:::-;38116:2;38111:3;38107:12;38100:19;;37759:366;;;:::o;38131:419::-;38297:4;38335:2;38324:9;38320:18;38312:26;;38384:9;38378:4;38374:20;38370:1;38359:9;38355:17;38348:47;38412:131;38538:4;38412:131;:::i;:::-;38404:139;;38131:419;;;:::o;38556:223::-;38696:34;38692:1;38684:6;38680:14;38673:58;38765:6;38760:2;38752:6;38748:15;38741:31;38556:223;:::o;38785:366::-;38927:3;38948:67;39012:2;39007:3;38948:67;:::i;:::-;38941:74;;39024:93;39113:3;39024:93;:::i;:::-;39142:2;39137:3;39133:12;39126:19;;38785:366;;;:::o;39157:419::-;39323:4;39361:2;39350:9;39346:18;39338:26;;39410:9;39404:4;39400:20;39396:1;39385:9;39381:17;39374:47;39438:131;39564:4;39438:131;:::i;:::-;39430:139;;39157:419;;;:::o;39582:191::-;39622:4;39642:20;39660:1;39642:20;:::i;:::-;39637:25;;39676:20;39694:1;39676:20;:::i;:::-;39671:25;;39715:1;39712;39709:8;39706:34;;;39720:18;;:::i;:::-;39706:34;39765:1;39762;39758:9;39750:17;;39582:191;;;;:::o;39779:168::-;39919:20;39915:1;39907:6;39903:14;39896:44;39779:168;:::o;39953:366::-;40095:3;40116:67;40180:2;40175:3;40116:67;:::i;:::-;40109:74;;40192:93;40281:3;40192:93;:::i;:::-;40310:2;40305:3;40301:12;40294:19;;39953:366;;;:::o;40325:419::-;40491:4;40529:2;40518:9;40514:18;40506:26;;40578:9;40572:4;40568:20;40564:1;40553:9;40549:17;40542:47;40606:131;40732:4;40606:131;:::i;:::-;40598:139;;40325:419;;;:::o;40750:165::-;40890:17;40886:1;40878:6;40874:14;40867:41;40750:165;:::o;40921:366::-;41063:3;41084:67;41148:2;41143:3;41084:67;:::i;:::-;41077:74;;41160:93;41249:3;41160:93;:::i;:::-;41278:2;41273:3;41269:12;41262:19;;40921:366;;;:::o;41293:419::-;41459:4;41497:2;41486:9;41482:18;41474:26;;41546:9;41540:4;41536:20;41532:1;41521:9;41517:17;41510:47;41574:131;41700:4;41574:131;:::i;:::-;41566:139;;41293:419;;;:::o;41718:171::-;41858:23;41854:1;41846:6;41842:14;41835:47;41718:171;:::o;41895:366::-;42037:3;42058:67;42122:2;42117:3;42058:67;:::i;:::-;42051:74;;42134:93;42223:3;42134:93;:::i;:::-;42252:2;42247:3;42243:12;42236:19;;41895:366;;;:::o;42267:419::-;42433:4;42471:2;42460:9;42456:18;42448:26;;42520:9;42514:4;42510:20;42506:1;42495:9;42491:17;42484:47;42548:131;42674:4;42548:131;:::i;:::-;42540:139;;42267:419;;;:::o;42692:165::-;42832:17;42828:1;42820:6;42816:14;42809:41;42692:165;:::o;42863:366::-;43005:3;43026:67;43090:2;43085:3;43026:67;:::i;:::-;43019:74;;43102:93;43191:3;43102:93;:::i;:::-;43220:2;43215:3;43211:12;43204:19;;42863:366;;;:::o;43235:419::-;43401:4;43439:2;43428:9;43424:18;43416:26;;43488:9;43482:4;43478:20;43474:1;43463:9;43459:17;43452:47;43516:131;43642:4;43516:131;:::i;:::-;43508:139;;43235:419;;;:::o;43660:348::-;43700:7;43723:20;43741:1;43723:20;:::i;:::-;43718:25;;43757:20;43775:1;43757:20;:::i;:::-;43752:25;;43945:1;43877:66;43873:74;43870:1;43867:81;43862:1;43855:9;43848:17;43844:105;43841:131;;;43952:18;;:::i;:::-;43841:131;44000:1;43997;43993:9;43982:20;;43660:348;;;;:::o;44014:183::-;44182:8;44177:3;44170:21;44014:183;:::o;44203:185::-;44371:10;44366:3;44359:23;44203:185;:::o;44394:::-;44562:10;44557:3;44550:23;44394:185;:::o;44585:179::-;44753:4;44748:3;44741:17;44585:179;:::o;44770:1651::-;45358:3;45373:137;45506:3;45373:137;:::i;:::-;45535:1;45530:3;45526:11;45519:18;;45554:95;45645:3;45636:6;45554:95;:::i;:::-;45547:102;;45659:137;45792:3;45659:137;:::i;:::-;45821:1;45816:3;45812:11;45805:18;;45840:95;45931:3;45922:6;45840:95;:::i;:::-;45833:102;;45945:137;46078:3;45945:137;:::i;:::-;46107:1;46102:3;46098:11;46091:18;;46126:95;46217:3;46208:6;46126:95;:::i;:::-;46119:102;;46231:137;46364:3;46231:137;:::i;:::-;46393:1;46388:3;46384:11;46377:18;;46412:3;46405:10;;44770:1651;;;;;;:::o;46427:175::-;46567:27;46563:1;46555:6;46551:14;46544:51;46427:175;:::o;46608:366::-;46750:3;46771:67;46835:2;46830:3;46771:67;:::i;:::-;46764:74;;46847:93;46936:3;46847:93;:::i;:::-;46965:2;46960:3;46956:12;46949:19;;46608:366;;;:::o;46980:419::-;47146:4;47184:2;47173:9;47169:18;47161:26;;47233:9;47227:4;47223:20;47219:1;47208:9;47204:17;47197:47;47261:131;47387:4;47261:131;:::i;:::-;47253:139;;46980:419;;;:::o;47405:237::-;47545:34;47541:1;47533:6;47529:14;47522:58;47614:20;47609:2;47601:6;47597:15;47590:45;47405:237;:::o;47648:366::-;47790:3;47811:67;47875:2;47870:3;47811:67;:::i;:::-;47804:74;;47887:93;47976:3;47887:93;:::i;:::-;48005:2;48000:3;47996:12;47989:19;;47648:366;;;:::o;48020:419::-;48186:4;48224:2;48213:9;48209:18;48201:26;;48273:9;48267:4;48263:20;48259:1;48248:9;48244:17;48237:47;48301:131;48427:4;48301:131;:::i;:::-;48293:139;;48020:419;;;:::o;48445:180::-;48493:77;48490:1;48483:88;48590:4;48587:1;48580:15;48614:4;48611:1;48604:15;48631:185;48671:1;48688:20;48706:1;48688:20;:::i;:::-;48683:25;;48722:20;48740:1;48722:20;:::i;:::-;48717:25;;48761:1;48751:35;;48766:18;;:::i;:::-;48751:35;48808:1;48805;48801:9;48796:14;;48631:185;;;;:::o;48822:176::-;48854:1;48871:20;48889:1;48871:20;:::i;:::-;48866:25;;48905:20;48923:1;48905:20;:::i;:::-;48900:25;;48944:1;48934:35;;48949:18;;:::i;:::-;48934:35;48990:1;48987;48983:9;48978:14;;48822:176;;;;:::o;49004:180::-;49052:77;49049:1;49042:88;49149:4;49146:1;49139:15;49173:4;49170:1;49163:15;49190:553;49367:4;49405:3;49394:9;49390:19;49382:27;;49419:71;49487:1;49476:9;49472:17;49463:6;49419:71;:::i;:::-;49500:72;49568:2;49557:9;49553:18;49544:6;49500:72;:::i;:::-;49582;49650:2;49639:9;49635:18;49626:6;49582:72;:::i;:::-;49664;49732:2;49721:9;49717:18;49708:6;49664:72;:::i;:::-;49190:553;;;;;;;:::o;49749:214::-;49889:66;49885:1;49877:6;49873:14;49866:90;49749:214;:::o;49969:400::-;50129:3;50150:84;50232:1;50227:3;50150:84;:::i;:::-;50143:91;;50243:93;50332:3;50243:93;:::i;:::-;50361:1;50356:3;50352:11;50345:18;;49969:400;;;:::o;50375:79::-;50414:7;50443:5;50432:16;;50375:79;;;:::o;50460:157::-;50565:45;50585:24;50603:5;50585:24;:::i;:::-;50565:45;:::i;:::-;50560:3;50553:58;50460:157;;:::o;50623:663::-;50864:3;50886:148;51030:3;50886:148;:::i;:::-;50879:155;;51044:75;51115:3;51106:6;51044:75;:::i;:::-;51144:2;51139:3;51135:12;51128:19;;51157:75;51228:3;51219:6;51157:75;:::i;:::-;51257:2;51252:3;51248:12;51241:19;;51277:3;51270:10;;50623:663;;;;;:::o;51292:640::-;51487:4;51525:3;51514:9;51510:19;51502:27;;51539:71;51607:1;51596:9;51592:17;51583:6;51539:71;:::i;:::-;51620:72;51688:2;51677:9;51673:18;51664:6;51620:72;:::i;:::-;51702;51770:2;51759:9;51755:18;51746:6;51702:72;:::i;:::-;51821:9;51815:4;51811:20;51806:2;51795:9;51791:18;51784:48;51849:76;51920:4;51911:6;51849:76;:::i;:::-;51841:84;;51292:640;;;;;;;:::o;51938:141::-;51994:5;52025:6;52019:13;52010:22;;52041:32;52067:5;52041:32;:::i;:::-;51938:141;;;;:::o;52085:349::-;52154:6;52203:2;52191:9;52182:7;52178:23;52174:32;52171:119;;;52209:79;;:::i;:::-;52171:119;52329:1;52354:63;52409:7;52400:6;52389:9;52385:22;52354:63;:::i;:::-;52344:73;;52300:127;52085:349;;;;:::o;52440:182::-;52580:34;52576:1;52568:6;52564:14;52557:58;52440:182;:::o;52628:366::-;52770:3;52791:67;52855:2;52850:3;52791:67;:::i;:::-;52784:74;;52867:93;52956:3;52867:93;:::i;:::-;52985:2;52980:3;52976:12;52969:19;;52628:366;;;:::o;53000:419::-;53166:4;53204:2;53193:9;53189:18;53181:26;;53253:9;53247:4;53243:20;53239:1;53228:9;53224:17;53217:47;53281:131;53407:4;53281:131;:::i;:::-;53273:139;;53000:419;;;:::o;53425:178::-;53565:30;53561:1;53553:6;53549:14;53542:54;53425:178;:::o;53609:366::-;53751:3;53772:67;53836:2;53831:3;53772:67;:::i;:::-;53765:74;;53848:93;53937:3;53848:93;:::i;:::-;53966:2;53961:3;53957:12;53950:19;;53609:366;;;:::o;53981:419::-;54147:4;54185:2;54174:9;54170:18;54162:26;;54234:9;54228:4;54224:20;54220:1;54209:9;54205:17;54198:47;54262:131;54388:4;54262:131;:::i;:::-;54254:139;;53981:419;;;:::o
Swarm Source
ipfs://f8f27eb412c24876f608811175a7ed43e9e643d75cbf3b4fa50724e44fdf3431
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.