ERC-721
Overview
Max Total Supply
173 COWAII
Holders
63
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
7 COWAIILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MintableNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-03 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.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 /// @solidity memory-safe-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.7.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 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/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // 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.7.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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner 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: caller is not token 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) { 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 an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev 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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // 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: @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: nft.sol pragma solidity ^0.8.4; contract Whitelist is Ownable { mapping(address => bool) public whitelist; event WhitelistedAddressAdded(address addr); event WhitelistedAddressRemoved(address addr); modifier onlyWhitelisted() { require(whitelist[msg.sender], 'no whitelist'); _; } function addAddressToWhitelist(address addr) onlyOwner public returns(bool success) { if (!whitelist[addr]) { whitelist[addr] = true; emit WhitelistedAddressAdded(addr); success = true; } } function addAddressesToWhitelist(address[] memory addrs) onlyOwner public returns(bool success) { for (uint256 i = 0; i < addrs.length; i++) { if (addAddressToWhitelist(addrs[i])) { success = true; } } return success; } function removeAddressFromWhitelist(address addr) onlyOwner public returns(bool success) { if (whitelist[addr]) { whitelist[addr] = false; emit WhitelistedAddressRemoved(addr); success = true; } return success; } function removeAddressesFromWhitelist(address[] memory addrs) onlyOwner public returns(bool success) { for (uint256 i = 0; i < addrs.length; i++) { if (removeAddressFromWhitelist(addrs[i])) { success = true; } } return success; } } contract FeeSplitter is Whitelist { using SafeMath for uint256; ///////////////////////////////// // CONFIGURABLES AND VARIABLES // ///////////////////////////////// mapping (IERC20 => address[]) public feeCollectors; mapping (IERC20 => uint256[]) public feeRates; ////////////////////////////// // CONSTRUCTOR AND FALLBACK // ////////////////////////////// constructor(address _dev) { transferOwnership(_dev); } // FALLBACK FUNCTION: PAYABLE receive () external payable { } // Distribute collected fees between all set collectors, at set rates function distribute(IERC20 token) public { uint256 balance = token.balanceOf(address(this)); require (balance > 0, "Nothing to pay"); address[] memory collectors = feeCollectors[token]; uint256[] memory rates = feeRates[token]; for (uint256 i = 0; i < collectors.length; i++) { address collector = collectors[i]; uint256 rate = rates[i]; if (rate > 0) { uint256 feeAmount = rate * balance / 10000; token.transfer(collector, feeAmount); } } } //////////////////////////////////////////////// // FUNCTIONS RESTRICTED TO THE CONTRACT OWNER // //////////////////////////////////////////////// // Set collectors and rates for a token function setDistribution(IERC20 token, address[] memory collectors, uint256[] memory rates) onlyWhitelisted() public { uint256 totalRate; for (uint256 i = 0; i < rates.length; i++) { totalRate = totalRate + rates[i]; } require (totalRate == 10000, "Total fee rate must be 100%"); if (token.balanceOf(address(this)) > 0) { distribute(token); } feeCollectors[token] = collectors; feeRates[token] = rates; } } contract MintableNFT is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Pausable, Whitelist, ReentrancyGuard { using SafeMath for uint256; using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIds; IERC20 public token; /////////////////////////////// // CONFIGURABLES & VARIABLES // /////////////////////////////// address public manager; address public feeSplitter; bool public initialMinted; string baseURI; string public baseExtension = ".json"; uint8 constant public maxItems = 2; uint8 constant public reservedItems = 20; uint256 constant public itemCap = 500; uint256 constant public itemPrice = 0.2 ether; mapping(address => uint8) public mintedTotalOf; ///////////////////// // CONTRACT EVENTS // ///////////////////// event onMintItem(address indexed recipient, uint256 itemId, uint256 timestamp); event onLaunch(address indexed caller, address indexed recipient, uint256 timestamp); //////////////////////////// // CONSTRUCTOR & FALLBACK // //////////////////////////// constructor(address _manager, address _tkn) ERC721("Gaur Money: Cowaii", "COWAII") { manager = _manager; feeSplitter = address(new FeeSplitter(msg.sender)); addAddressToWhitelist(address(0)); addAddressToWhitelist(msg.sender); addAddressToWhitelist(manager); _tokenIds.increment(); // Set payment token token = IERC20(_tkn); baseURI = "https://nftstorage.link/ipfs/bafybeiefphp2luw7blpb2gm5oqqc5psetcpi6x4tnas62s5c225hzh6txm/"; } //////////////////////////// // PUBLIC WRITE FUNCTIONS // //////////////////////////// // Mint an NFT, paying Wrapped Ether function buyItem() payable external nonReentrant whenNotPaused returns (uint256 _id) { require(initialMinted == true, "ONLY_WHEN_LAUNCHED"); // Find Total Supply of NFTs uint256 supply = totalSupply(); require(supply + 1 <= itemCap, "NFT::LIMIT_REACHED"); // Set Recipient of item address _recipient = msg.sender; // If the caller is not a whitelisted address if (!whitelist[_recipient]) { // Require payment of the mint fee require(token.transferFrom(msg.sender, address(feeSplitter), itemPrice), "MUST_PAY_MINT_FEE"); // Enforce item limits require(itemsOf(_recipient).length + 1 <= maxItems, "MINT_MAX_REACHED"); // Increase minted count for minter mintedTotalOf[_recipient]++; } // Get the item ID as it is minted uint256 _itemId = mintItem(_recipient); // Let 'em know! emit onMintItem(_recipient, _itemId, block.timestamp); return _itemId; } ////////////////////////// // RESTRICTED FUNCTIONS // ////////////////////////// // OWNER: Launch the NFTs function launch() public onlyOwner returns (bool _success) { require(initialMinted == false, "ONLY_ONCE_ALLOWED"); // Mint the reserved items to the DAO wallet for(uint i = 0; i < reservedItems; i++){ mintItem(manager); } // Mint one for the dev mintItem(msg.sender); // Mark function used initialMinted = true; // Let 'em know! emit onLaunch(msg.sender, manager, block.timestamp); return true; } // OWNER: Set Base URI function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } // OWNER: Set URI Extension function setURIExtension(string memory _newExtension) public onlyOwner { baseExtension = _newExtension; } // OWNER: Pause minting function pause() public onlyOwner { _pause(); } // OWNER: Unpause minting function unpause() public onlyOwner { _unpause(); } /////////////////////////// // PUBLIC VIEW FUNCTIONS // /////////////////////////// // Next Mintable Item's tokenId function nextItem() public view returns (uint256) { return (_tokenIds.current()); } // Get mintable items remaining function remainingItems() public view returns (uint256) { return (itemCap - totalSupply()); } // Wallet of NFT Holder function itemsOf(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } // Token URI by Item ID function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } ////////////////////////////////// // INTERNAL & PRIVATE FUNCTIONS // ////////////////////////////////// // Mint NFT item into collection, providing conditions are met function mintItem(address to) internal returns (uint256 tokenId) { tokenId = _tokenIds.current(); // Increment token ids _tokenIds.increment(); // Mint item _safeMint(to, tokenId); } //////////////////////// // OVERRIDE FUNCTIONS // //////////////////////// function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address","name":"_tkn","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"onLaunch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"itemId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"onMintItem","type":"event"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAddressToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyItem","outputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeSplitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"itemsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxItems","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedTotalOf","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextItem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedItems","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newExtension","type":"string"}],"name":"setURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506013908051906020019062000051929190620005ab565b503480156200005f57600080fd5b506040516200740838038062007408833981810160405281019062000085919062000680565b6040518060400160405280601281526020017f47617572204d6f6e65793a20436f7761696900000000000000000000000000008152506040518060400160405280600681526020017f434f574149490000000000000000000000000000000000000000000000000000815250816000908051906020019062000109929190620005ab565b50806001908051906020019062000122929190620005ab565b5050506000600b60006101000a81548160ff02191690831515021790555062000160620001546200030d60201b60201c565b6200031560201b60201c565b6001600d8190555081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033604051620001b8906200063c565b620001c49190620006ff565b604051809103906000f080158015620001e1573d6000803e3d6000fd5b50601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002346000620003db60201b60201c565b506200024633620003db60201b60201c565b506200027a601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620003db60201b60201c565b5062000292600e620004da60201b62001d251760201c565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806080016040528060598152602001620073af605991396012908051906020019062000304929190620005ab565b50505062000830565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000620003ed620004f060201b60201c565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16620004d5576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f82604051620004c89190620006ff565b60405180910390a1600190505b919050565b6001816000016000828254019250508190555050565b620005006200030d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005266200058160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200057f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000576906200071c565b60405180910390fd5b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620005b99062000783565b90600052602060002090601f016020900481019282620005dd576000855562000629565b82601f10620005f857805160ff191683800117855562000629565b8280016001018555821562000629579182015b82811115620006285782518255916020019190600101906200060b565b5b5090506200063891906200064a565b5090565b611d68806200564783390190565b5b80821115620006655760008160009055506001016200064b565b5090565b6000815190506200067a8162000816565b92915050565b600080604083850312156200069a5762000699620007e8565b5b6000620006aa8582860162000669565b9250506020620006bd8582860162000669565b9150509250929050565b620006d2816200074f565b82525050565b6000620006e76020836200073e565b9150620006f482620007ed565b602082019050919050565b6000602082019050620007166000830184620006c7565b92915050565b600060208201905081810360008301526200073781620006d8565b9050919050565b600082825260208201905092915050565b60006200075c8262000763565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200079c57607f821691505b60208210811415620007b357620007b2620007b9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000821816200074f565b81146200082d57600080fd5b50565b614e0780620008406000396000f3fe6080604052600436106102675760003560e01c8063715018a611610144578063a22cb465116100b6578063dac6db1c1161007a578063dac6db1c14610961578063e27567f61461098c578063e2ec6ec3146109b7578063e985e9c5146109f4578063f2fde38b14610a31578063fc0c546a14610a5a57610267565b8063a22cb4651461087c578063b88d4fde146108a5578063c6682862146108ce578063c87b56dd146108f9578063ca1c4de91461093657610267565b80638da5cb5b116101085780638da5cb5b1461076a5780639070975114610795578063951d3bc9146107be57806395d89b41146107e95780639a691d5b146108145780639b19251a1461083f57610267565b8063715018a6146106a45780637231a876146106bb578063795612d6146106f85780637b9417c8146107165780638456cb591461075357610267565b80633c010a3e116101dd5780634f6ccce7116101a15780634f6ccce71461056e57806355f804b3146105ab5780635c975abb146105d45780636052970c146105ff5780636352211e1461062a57806370a082311461066757610267565b80633c010a3e1461049b5780633f4ba83a146104c657806342842e0e146104dd5780634432fcd514610506578063481c6a751461054357610267565b806318160ddd1161022f57806318160ddd146103655780631fd37db31461039057806323b872dd146103bb57806324953eaa146103e4578063286dd3f5146104215780632f745c591461045e57610267565b806301339c211461026c57806301ffc9a71461029757806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610281610a85565b60405161028e9190613e92565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b99190613774565b610be7565b6040516102cb9190613e92565b60405180910390f35b3480156102e057600080fd5b506102e9610bf9565b6040516102f69190613ec8565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190613817565b610c8b565b6040516103339190613dd2565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e91906136be565b610cd1565b005b34801561037157600080fd5b5061037a610de9565b604051610387919061420a565b60405180910390f35b34801561039c57600080fd5b506103a5610df6565b6040516103b2919061420a565b60405180910390f35b3480156103c757600080fd5b506103e260048036038101906103dd91906135a8565b610e12565b005b3480156103f057600080fd5b5061040b600480360381019061040691906136fe565b610e72565b6040516104189190613e92565b60405180910390f35b34801561042d57600080fd5b506104486004803603810190610443919061353b565b610ece565b6040516104559190613e92565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906136be565b610fc3565b604051610492919061420a565b60405180910390f35b3480156104a757600080fd5b506104b0611068565b6040516104bd919061424e565b60405180910390f35b3480156104d257600080fd5b506104db61106d565b005b3480156104e957600080fd5b5061050460048036038101906104ff91906135a8565b61107f565b005b34801561051257600080fd5b5061052d6004803603810190610528919061353b565b61109f565b60405161053a919061424e565b60405180910390f35b34801561054f57600080fd5b506105586110bf565b6040516105659190613dd2565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613817565b6110e5565b6040516105a2919061420a565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906137ce565b611156565b005b3480156105e057600080fd5b506105e9611178565b6040516105f69190613e92565b60405180910390f35b34801561060b57600080fd5b5061061461118f565b6040516106219190613dd2565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190613817565b6111b5565b60405161065e9190613dd2565b60405180910390f35b34801561067357600080fd5b5061068e6004803603810190610689919061353b565b611267565b60405161069b919061420a565b60405180910390f35b3480156106b057600080fd5b506106b961131f565b005b3480156106c757600080fd5b506106e260048036038101906106dd919061353b565b611333565b6040516106ef9190613e70565b60405180910390f35b6107006113e1565b60405161070d919061420a565b60405180910390f35b34801561072257600080fd5b5061073d6004803603810190610738919061353b565b61179c565b60405161074a9190613e92565b60405180910390f35b34801561075f57600080fd5b50610768611890565b005b34801561077657600080fd5b5061077f6118a2565b60405161078c9190613dd2565b60405180910390f35b3480156107a157600080fd5b506107bc60048036038101906107b791906137ce565b6118cc565b005b3480156107ca57600080fd5b506107d36118ee565b6040516107e0919061424e565b60405180910390f35b3480156107f557600080fd5b506107fe6118f3565b60405161080b9190613ec8565b60405180910390f35b34801561082057600080fd5b50610829611985565b604051610836919061420a565b60405180910390f35b34801561084b57600080fd5b506108666004803603810190610861919061353b565b611996565b6040516108739190613e92565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e919061367e565b6119b6565b005b3480156108b157600080fd5b506108cc60048036038101906108c791906135fb565b6119cc565b005b3480156108da57600080fd5b506108e3611a2e565b6040516108f09190613ec8565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190613817565b611abc565b60405161092d9190613ec8565b60405180910390f35b34801561094257600080fd5b5061094b611b66565b6040516109589190613e92565b60405180910390f35b34801561096d57600080fd5b50610976611b79565b604051610983919061420a565b60405180910390f35b34801561099857600080fd5b506109a1611b85565b6040516109ae919061420a565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d991906136fe565b611b8b565b6040516109eb9190613e92565b60405180910390f35b348015610a0057600080fd5b50610a1b6004803603810190610a169190613568565b611be7565b604051610a289190613e92565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a53919061353b565b611c7b565b005b348015610a6657600080fd5b50610a6f611cff565b604051610a7c9190613ead565b60405180910390f35b6000610a8f611d3b565b60001515601160149054906101000a900460ff16151514610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc9061418a565b60405180910390fd5b60005b601460ff16811015610b3357610b1f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611db9565b508080610b2b906145c4565b915050610ae8565b50610b3d33611db9565b506001601160146101000a81548160ff021916908315150217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbd316b06604330313ca095927304d39d3e130154c0ea73f98a4d21f62ccd0a0742604051610bd8919061420a565b60405180910390a36001905090565b6000610bf282611de0565b9050919050565b606060008054610c0890614561565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3490614561565b8015610c815780601f10610c5657610100808354040283529160200191610c81565b820191906000526020600020905b815481529060010190602001808311610c6457829003601f168201915b5050505050905090565b6000610c9682611e5a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cdc826111b5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d449061416a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6c611ea5565b73ffffffffffffffffffffffffffffffffffffffff161480610d9b5750610d9a81610d95611ea5565b611be7565b5b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd1906140ca565b60405180910390fd5b610de48383611ead565b505050565b6000600880549050905090565b6000610e00610de9565b6101f4610e0d9190614434565b905090565b610e23610e1d611ea5565b82611f66565b610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e59906141ca565b60405180910390fd5b610e6d838383611ffb565b505050565b6000610e7c611d3b565b60005b8251811015610ec857610eab838281518110610e9e57610e9d614724565b5b6020026020010151610ece565b15610eb557600191505b8080610ec0906145c4565b915050610e7f565b50919050565b6000610ed8611d3b565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fbe576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a82604051610fb19190613dd2565b60405180910390a1600190505b919050565b6000610fce83611267565b821061100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690613f6a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600281565b611075611d3b565b61107d612262565b565b61109a838383604051806020016040528060008152506119cc565b505050565b60146020528060005260406000206000915054906101000a900460ff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ef610de9565b8210611130576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611127906141aa565b60405180910390fd5b6008828154811061114457611143614724565b5b90600052602060002001549050919050565b61115e611d3b565b806012908051906020019061117492919061329c565b5050565b6000600b60009054906101000a900460ff16905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561125e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112559061414a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf906140aa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611327611d3b565b61133160006122c5565b565b6060600061134083611267565b905060008167ffffffffffffffff81111561135e5761135d614753565b5b60405190808252806020026020018201604052801561138c5781602001602082028036833780820191505090505b50905060005b828110156113d6576113a48582610fc3565b8282815181106113b7576113b6614724565b5b60200260200101818152505080806113ce906145c4565b915050611392565b508092505050919050565b60006002600d541415611429576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611420906141ea565b60405180910390fd5b6002600d8190555061143961238b565b60011515601160149054906101000a900460ff1615151461148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690613f4a565b60405180910390fd5b6000611499610de9565b90506101f46001826114ab91906143ad565b11156114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e390613faa565b60405180910390fd5b6000339050600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661172e57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166702c68af0bb1400006040518463ffffffff1660e01b81526004016115cb93929190613ded565b602060405180830381600087803b1580156115e557600080fd5b505af11580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d9190613747565b61165c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116539061408a565b60405180910390fd5b600260ff16600161166c83611333565b5161167791906143ad565b11156116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af90613f2a565b60405180910390fd5b601460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906117149061460d565b91906101000a81548160ff021916908360ff160217905550505b600061173982611db9565b90508173ffffffffffffffffffffffffffffffffffffffff167f253d872ec1efa2cd60440408e1a31a3b419aa3a959a2c3035cf6513a25579e6e8242604051611783929190614225565b60405180910390a28093505050506001600d8190555090565b60006117a6611d3b565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661188b576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f8260405161187e9190613dd2565b60405180910390a1600190505b919050565b611898611d3b565b6118a06123d5565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118d4611d3b565b80601390805190602001906118ea92919061329c565b5050565b601481565b60606001805461190290614561565b80601f016020809104026020016040519081016040528092919081815260200182805461192e90614561565b801561197b5780601f106119505761010080835404028352916020019161197b565b820191906000526020600020905b81548152906001019060200180831161195e57829003601f168201915b5050505050905090565b6000611991600e612438565b905090565b600c6020528060005260406000206000915054906101000a900460ff1681565b6119c86119c1611ea5565b8383612446565b5050565b6119dd6119d7611ea5565b83611f66565b611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a13906141ca565b60405180910390fd5b611a28848484846125b3565b50505050565b60138054611a3b90614561565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6790614561565b8015611ab45780601f10611a8957610100808354040283529160200191611ab4565b820191906000526020600020905b815481529060010190602001808311611a9757829003601f168201915b505050505081565b6060611ac78261260f565b611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd9061412a565b60405180910390fd5b6000611b1061267b565b90506000815111611b305760405180602001604052806000815250611b5e565b80611b3a8461270d565b6013604051602001611b4e93929190613da1565b6040516020818303038152906040525b915050919050565b601160149054906101000a900460ff1681565b6702c68af0bb14000081565b6101f481565b6000611b95611d3b565b60005b8251811015611be157611bc4838281518110611bb757611bb6614724565b5b602002602001015161179c565b15611bce57600191505b8080611bd9906145c4565b915050611b98565b50919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c83611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cea90613fca565b60405180910390fd5b611cfc816122c5565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6001816000016000828254019250508190555050565b611d43611ea5565b73ffffffffffffffffffffffffffffffffffffffff16611d616118a2565b73ffffffffffffffffffffffffffffffffffffffff1614611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae9061410a565b60405180910390fd5b565b6000611dc5600e612438565b9050611dd1600e611d25565b611ddb828261286e565b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e535750611e528261288c565b5b9050919050565b611e638161260f565b611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e999061414a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f20836111b5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611f72836111b5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fb45750611fb38185611be7565b5b80611ff257508373ffffffffffffffffffffffffffffffffffffffff16611fda84610c8b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661201b826111b5565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613fea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d89061402a565b60405180910390fd5b6120ec83838361296e565b6120f7600082611ead565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121479190614434565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461219e91906143ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461225d83838361297e565b505050565b61226a612983565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122ae611ea5565b6040516122bb9190613dd2565b60405180910390a1565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612393611178565b156123d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ca9061406a565b60405180910390fd5b565b6123dd61238b565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612421611ea5565b60405161242e9190613dd2565b60405180910390a1565b600081600001549050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ac9061404a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125a69190613e92565b60405180910390a3505050565b6125be848484611ffb565b6125ca848484846129cc565b612609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260090613f8a565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606012805461268a90614561565b80601f01602080910402602001604051908101604052809291908181526020018280546126b690614561565b80156127035780601f106126d857610100808354040283529160200191612703565b820191906000526020600020905b8154815290600101906020018083116126e657829003601f168201915b5050505050905090565b60606000821415612755576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612869565b600082905060005b60008214612787578080612770906145c4565b915050600a826127809190614403565b915061275d565b60008167ffffffffffffffff8111156127a3576127a2614753565b5b6040519080825280601f01601f1916602001820160405280156127d55781602001600182028036833780820191505090505b5090505b60008514612862576001826127ee9190614434565b9150600a856127fd9190614637565b603061280991906143ad565b60f81b81838151811061281f5761281e614724565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561285b9190614403565b94506127d9565b8093505050505b919050565b612888828260405180602001604052806000815250612b63565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061295757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612967575061296682612bbe565b5b9050919050565b612979838383612c28565b505050565b505050565b61298b611178565b6129ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c190613f0a565b60405180910390fd5b565b60006129ed8473ffffffffffffffffffffffffffffffffffffffff16612c80565b15612b56578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a16611ea5565b8786866040518563ffffffff1660e01b8152600401612a389493929190613e24565b602060405180830381600087803b158015612a5257600080fd5b505af1925050508015612a8357506040513d601f19601f82011682018060405250810190612a8091906137a1565b60015b612b06573d8060008114612ab3576040519150601f19603f3d011682016040523d82523d6000602084013e612ab8565b606091505b50600081511415612afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af590613f8a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b5b565b600190505b949350505050565b612b6d8383612ca3565b612b7a60008484846129cc565b612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb090613f8a565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c33838383612e7d565b612c3b611178565b15612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7290613eea565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0a906140ea565b60405180910390fd5b612d1c8161260f565b15612d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d539061400a565b60405180910390fd5b612d686000838361296e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612db891906143ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e796000838361297e565b5050565b612e88838383612f91565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ecb57612ec681612f96565b612f0a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f0957612f088382612fdf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4d57612f488161314c565b612f8c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f8b57612f8a828261321d565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fec84611267565b612ff69190614434565b90506000600760008481526020019081526020016000205490508181146130db576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131609190614434565b90506000600960008481526020019081526020016000205490506000600883815481106131905761318f614724565b5b9060005260206000200154905080600883815481106131b2576131b1614724565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613201576132006146f5565b5b6001900381819060005260206000200160009055905550505050565b600061322883611267565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546132a890614561565b90600052602060002090601f0160209004810192826132ca5760008555613311565b82601f106132e357805160ff1916838001178555613311565b82800160010185558215613311579182015b828111156133105782518255916020019190600101906132f5565b5b50905061331e9190613322565b5090565b5b8082111561333b576000816000905550600101613323565b5090565b600061335261334d8461428e565b614269565b9050808382526020820190508285602086028201111561337557613374614787565b5b60005b858110156133a5578161338b8882613433565b845260208401935060208301925050600181019050613378565b5050509392505050565b60006133c26133bd846142ba565b614269565b9050828152602081018484840111156133de576133dd61478c565b5b6133e984828561451f565b509392505050565b60006134046133ff846142eb565b614269565b9050828152602081018484840111156134205761341f61478c565b5b61342b84828561451f565b509392505050565b60008135905061344281614d75565b92915050565b600082601f83011261345d5761345c614782565b5b813561346d84826020860161333f565b91505092915050565b60008135905061348581614d8c565b92915050565b60008151905061349a81614d8c565b92915050565b6000813590506134af81614da3565b92915050565b6000815190506134c481614da3565b92915050565b600082601f8301126134df576134de614782565b5b81356134ef8482602086016133af565b91505092915050565b600082601f83011261350d5761350c614782565b5b813561351d8482602086016133f1565b91505092915050565b60008135905061353581614dba565b92915050565b60006020828403121561355157613550614796565b5b600061355f84828501613433565b91505092915050565b6000806040838503121561357f5761357e614796565b5b600061358d85828601613433565b925050602061359e85828601613433565b9150509250929050565b6000806000606084860312156135c1576135c0614796565b5b60006135cf86828701613433565b93505060206135e086828701613433565b92505060406135f186828701613526565b9150509250925092565b6000806000806080858703121561361557613614614796565b5b600061362387828801613433565b945050602061363487828801613433565b935050604061364587828801613526565b925050606085013567ffffffffffffffff81111561366657613665614791565b5b613672878288016134ca565b91505092959194509250565b6000806040838503121561369557613694614796565b5b60006136a385828601613433565b92505060206136b485828601613476565b9150509250929050565b600080604083850312156136d5576136d4614796565b5b60006136e385828601613433565b92505060206136f485828601613526565b9150509250929050565b60006020828403121561371457613713614796565b5b600082013567ffffffffffffffff81111561373257613731614791565b5b61373e84828501613448565b91505092915050565b60006020828403121561375d5761375c614796565b5b600061376b8482850161348b565b91505092915050565b60006020828403121561378a57613789614796565b5b6000613798848285016134a0565b91505092915050565b6000602082840312156137b7576137b6614796565b5b60006137c5848285016134b5565b91505092915050565b6000602082840312156137e4576137e3614796565b5b600082013567ffffffffffffffff81111561380257613801614791565b5b61380e848285016134f8565b91505092915050565b60006020828403121561382d5761382c614796565b5b600061383b84828501613526565b91505092915050565b60006138508383613d74565b60208301905092915050565b61386581614468565b82525050565b600061387682614341565b613880818561436f565b935061388b8361431c565b8060005b838110156138bc5781516138a38882613844565b97506138ae83614362565b92505060018101905061388f565b5085935050505092915050565b6138d28161447a565b82525050565b60006138e38261434c565b6138ed8185614380565b93506138fd81856020860161452e565b6139068161479b565b840191505092915050565b61391a816144e9565b82525050565b600061392b82614357565b6139358185614391565b935061394581856020860161452e565b61394e8161479b565b840191505092915050565b600061396482614357565b61396e81856143a2565b935061397e81856020860161452e565b80840191505092915050565b6000815461399781614561565b6139a181866143a2565b945060018216600081146139bc57600181146139cd57613a00565b60ff19831686528186019350613a00565b6139d68561432c565b60005b838110156139f8578154818901526001820191506020810190506139d9565b838801955050505b50505092915050565b6000613a16602b83614391565b9150613a21826147ac565b604082019050919050565b6000613a39601483614391565b9150613a44826147fb565b602082019050919050565b6000613a5c601083614391565b9150613a6782614824565b602082019050919050565b6000613a7f601283614391565b9150613a8a8261484d565b602082019050919050565b6000613aa2602b83614391565b9150613aad82614876565b604082019050919050565b6000613ac5603283614391565b9150613ad0826148c5565b604082019050919050565b6000613ae8601283614391565b9150613af382614914565b602082019050919050565b6000613b0b602683614391565b9150613b168261493d565b604082019050919050565b6000613b2e602583614391565b9150613b398261498c565b604082019050919050565b6000613b51601c83614391565b9150613b5c826149db565b602082019050919050565b6000613b74602483614391565b9150613b7f82614a04565b604082019050919050565b6000613b97601983614391565b9150613ba282614a53565b602082019050919050565b6000613bba601083614391565b9150613bc582614a7c565b602082019050919050565b6000613bdd601183614391565b9150613be882614aa5565b602082019050919050565b6000613c00602983614391565b9150613c0b82614ace565b604082019050919050565b6000613c23603e83614391565b9150613c2e82614b1d565b604082019050919050565b6000613c46602083614391565b9150613c5182614b6c565b602082019050919050565b6000613c69602083614391565b9150613c7482614b95565b602082019050919050565b6000613c8c602f83614391565b9150613c9782614bbe565b604082019050919050565b6000613caf601883614391565b9150613cba82614c0d565b602082019050919050565b6000613cd2602183614391565b9150613cdd82614c36565b604082019050919050565b6000613cf5601183614391565b9150613d0082614c85565b602082019050919050565b6000613d18602c83614391565b9150613d2382614cae565b604082019050919050565b6000613d3b602e83614391565b9150613d4682614cfd565b604082019050919050565b6000613d5e601f83614391565b9150613d6982614d4c565b602082019050919050565b613d7d816144d2565b82525050565b613d8c816144d2565b82525050565b613d9b816144dc565b82525050565b6000613dad8286613959565b9150613db98285613959565b9150613dc5828461398a565b9150819050949350505050565b6000602082019050613de7600083018461385c565b92915050565b6000606082019050613e02600083018661385c565b613e0f602083018561385c565b613e1c6040830184613d83565b949350505050565b6000608082019050613e39600083018761385c565b613e46602083018661385c565b613e536040830185613d83565b8181036060830152613e6581846138d8565b905095945050505050565b60006020820190508181036000830152613e8a818461386b565b905092915050565b6000602082019050613ea760008301846138c9565b92915050565b6000602082019050613ec26000830184613911565b92915050565b60006020820190508181036000830152613ee28184613920565b905092915050565b60006020820190508181036000830152613f0381613a09565b9050919050565b60006020820190508181036000830152613f2381613a2c565b9050919050565b60006020820190508181036000830152613f4381613a4f565b9050919050565b60006020820190508181036000830152613f6381613a72565b9050919050565b60006020820190508181036000830152613f8381613a95565b9050919050565b60006020820190508181036000830152613fa381613ab8565b9050919050565b60006020820190508181036000830152613fc381613adb565b9050919050565b60006020820190508181036000830152613fe381613afe565b9050919050565b6000602082019050818103600083015261400381613b21565b9050919050565b6000602082019050818103600083015261402381613b44565b9050919050565b6000602082019050818103600083015261404381613b67565b9050919050565b6000602082019050818103600083015261406381613b8a565b9050919050565b6000602082019050818103600083015261408381613bad565b9050919050565b600060208201905081810360008301526140a381613bd0565b9050919050565b600060208201905081810360008301526140c381613bf3565b9050919050565b600060208201905081810360008301526140e381613c16565b9050919050565b6000602082019050818103600083015261410381613c39565b9050919050565b6000602082019050818103600083015261412381613c5c565b9050919050565b6000602082019050818103600083015261414381613c7f565b9050919050565b6000602082019050818103600083015261416381613ca2565b9050919050565b6000602082019050818103600083015261418381613cc5565b9050919050565b600060208201905081810360008301526141a381613ce8565b9050919050565b600060208201905081810360008301526141c381613d0b565b9050919050565b600060208201905081810360008301526141e381613d2e565b9050919050565b6000602082019050818103600083015261420381613d51565b9050919050565b600060208201905061421f6000830184613d83565b92915050565b600060408201905061423a6000830185613d83565b6142476020830184613d83565b9392505050565b60006020820190506142636000830184613d92565b92915050565b6000614273614284565b905061427f8282614593565b919050565b6000604051905090565b600067ffffffffffffffff8211156142a9576142a8614753565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142d5576142d4614753565b5b6142de8261479b565b9050602081019050919050565b600067ffffffffffffffff82111561430657614305614753565b5b61430f8261479b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143b8826144d2565b91506143c3836144d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143f8576143f7614668565b5b828201905092915050565b600061440e826144d2565b9150614419836144d2565b92508261442957614428614697565b5b828204905092915050565b600061443f826144d2565b915061444a836144d2565b92508282101561445d5761445c614668565b5b828203905092915050565b6000614473826144b2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006144f4826144fb565b9050919050565b60006145068261450d565b9050919050565b6000614518826144b2565b9050919050565b82818337600083830152505050565b60005b8381101561454c578082015181840152602081019050614531565b8381111561455b576000848401525b50505050565b6000600282049050600182168061457957607f821691505b6020821081141561458d5761458c6146c6565b5b50919050565b61459c8261479b565b810181811067ffffffffffffffff821117156145bb576145ba614753565b5b80604052505050565b60006145cf826144d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561460257614601614668565b5b600182019050919050565b6000614618826144dc565b915060ff82141561462c5761462b614668565b5b600182019050919050565b6000614642826144d2565b915061464d836144d2565b92508261465d5761465c614697565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4d494e545f4d41585f5245414348454400000000000000000000000000000000600082015250565b7f4f4e4c595f5748454e5f4c41554e434845440000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e46543a3a4c494d49545f524541434845440000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4d5553545f5041595f4d494e545f464545000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f4e4c595f4f4e43455f414c4c4f574544000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614d7e81614468565b8114614d8957600080fd5b50565b614d958161447a565b8114614da057600080fd5b50565b614dac81614486565b8114614db757600080fd5b50565b614dc3816144d2565b8114614dce57600080fd5b5056fea264697066735822122086dad250f20b489ebb69e4ea5f5d2f94037c3d1ea52255ae0dab926dcfa73a5f64736f6c6343000807003360806040523480156200001157600080fd5b5060405162001d6838038062001d688339818101604052810190620000379190620002a3565b620000576200004b6200006f60201b60201c565b6200007760201b60201c565b62000068816200013b60201b60201c565b5062000443565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200014b620001d260201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620001be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b59062000323565b60405180910390fd5b620001cf816200007760201b60201c565b50565b620001e26200006f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002086200026360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000261576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002589062000345565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000815190506200029d8162000429565b92915050565b600060208284031215620002bc57620002bb620003ac565b5b6000620002cc848285016200028c565b91505092915050565b6000620002e460268362000367565b9150620002f182620003b1565b604082019050919050565b60006200030b60208362000367565b9150620003188262000400565b602082019050919050565b600060208201905081810360008301526200033e81620002d5565b9050919050565b600060208201905081810360008301526200036081620002fc565b9050919050565b600082825260208201905092915050565b600062000385826200038c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620004348162000378565b81146200044057600080fd5b50565b61191580620004536000396000f3fe6080604052600436106100ab5760003560e01c80638da5cb5b116100645780638da5cb5b146101eb5780639b19251a14610216578063b81ff23d14610253578063c8d4bc0a1461027c578063e2ec6ec3146102b9578063f2fde38b146102f6576100b2565b806324953eaa146100b7578063286dd3f5146100f457806363453ae1146101315780636555176b1461015a578063715018a6146101975780637b9417c8146101ae576100b2565b366100b257005b600080fd5b3480156100c357600080fd5b506100de60048036038101906100d991906110db565b61031f565b6040516100eb9190611396565b60405180910390f35b34801561010057600080fd5b5061011b600480360381019061011691906110ae565b61037b565b6040516101289190611396565b60405180910390f35b34801561013d57600080fd5b5061015860048036038101906101539190611151565b610470565b005b34801561016657600080fd5b50610181600480360381019061017c9190611209565b6107b6565b60405161018e9190611352565b60405180910390f35b3480156101a357600080fd5b506101ac610804565b005b3480156101ba57600080fd5b506101d560048036038101906101d091906110ae565b610818565b6040516101e29190611396565b60405180910390f35b3480156101f757600080fd5b5061020061090b565b60405161020d9190611352565b60405180910390f35b34801561022257600080fd5b5061023d600480360381019061023891906110ae565b610934565b60405161024a9190611396565b60405180910390f35b34801561025f57600080fd5b5061027a6004803603810190610275919061117e565b610954565b005b34801561028857600080fd5b506102a3600480360381019061029e9190611209565b610bba565b6040516102b09190611451565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906110db565b610beb565b6040516102ed9190611396565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906110ae565b610c47565b005b6000610329610ccb565b60005b82518110156103755761035883828151811061034b5761034a61170d565b5b602002602001015161037b565b1561036257600191505b808061036d90611666565b91505061032c565b50919050565b6000610385610ccb565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561046b576000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a8260405161045e9190611352565b60405180910390a1600190505b919050565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104ab9190611352565b60206040518083038186803b1580156104c357600080fd5b505afa1580156104d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fb9190611249565b905060008111610540576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610537906113d1565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561060157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116105b7575b505050505090506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561069357602002820191906000526020600020905b81548152602001906001019080831161067f575b5050505050905060005b82518110156107af5760008382815181106106bb576106ba61170d565b5b6020026020010151905060008383815181106106da576106d961170d565b5b60200260200101519050600081111561079a57600061271087836106fe9190611581565b6107089190611550565b90508773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161074592919061136d565b602060405180830381600087803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107979190611124565b50505b505080806107a790611666565b91505061069d565b5050505050565b600260205281600052604060002081815481106107d257600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61080c610ccb565b6108166000610d49565b565b6000610822610ccb565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109065760018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f826040516108f99190611352565b60405180910390a1600190505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60016020528060005260406000206000915054906101000a900460ff1681565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d790611411565b60405180910390fd5b600080600090505b8251811015610a2c57828181518110610a0457610a0361170d565b5b602002602001015182610a1791906114fa565b91508080610a2490611666565b9150506109e8565b506127108114610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a68906113f1565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aac9190611352565b60206040518083038186803b158015610ac457600080fd5b505afa158015610ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afc9190611249565b1115610b0c57610b0b84610470565b5b82600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610b5f929190610e15565b5081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610bb3929190610e9f565b5050505050565b60036020528160005260406000208181548110610bd657600080fd5b90600052602060002001600091509150505481565b6000610bf5610ccb565b60005b8251811015610c4157610c24838281518110610c1757610c1661170d565b5b6020026020010151610818565b15610c2e57600191505b8080610c3990611666565b915050610bf8565b50919050565b610c4f610ccb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb6906113b1565b60405180910390fd5b610cc881610d49565b50565b610cd3610e0d565b73ffffffffffffffffffffffffffffffffffffffff16610cf161090b565b73ffffffffffffffffffffffffffffffffffffffff1614610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90611431565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b828054828255906000526020600020908101928215610e8e579160200282015b82811115610e8d5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610e35565b5b509050610e9b9190610eec565b5090565b828054828255906000526020600020908101928215610edb579160200282015b82811115610eda578251825591602001919060010190610ebf565b5b509050610ee89190610eec565b5090565b5b80821115610f05576000816000905550600101610eed565b5090565b6000610f1c610f1784611491565b61146c565b90508083825260208201905082856020860282011115610f3f57610f3e611770565b5b60005b85811015610f6f5781610f558882610fe9565b845260208401935060208301925050600181019050610f42565b5050509392505050565b6000610f8c610f87846114bd565b61146c565b90508083825260208201905082856020860282011115610faf57610fae611770565b5b60005b85811015610fdf5781610fc58882611084565b845260208401935060208301925050600181019050610fb2565b5050509392505050565b600081359050610ff881611883565b92915050565b600082601f8301126110135761101261176b565b5b8135611023848260208601610f09565b91505092915050565b600082601f8301126110415761104061176b565b5b8135611051848260208601610f79565b91505092915050565b6000815190506110698161189a565b92915050565b60008135905061107e816118b1565b92915050565b600081359050611093816118c8565b92915050565b6000815190506110a8816118c8565b92915050565b6000602082840312156110c4576110c361177a565b5b60006110d284828501610fe9565b91505092915050565b6000602082840312156110f1576110f061177a565b5b600082013567ffffffffffffffff81111561110f5761110e611775565b5b61111b84828501610ffe565b91505092915050565b60006020828403121561113a5761113961177a565b5b60006111488482850161105a565b91505092915050565b6000602082840312156111675761116661177a565b5b60006111758482850161106f565b91505092915050565b6000806000606084860312156111975761119661177a565b5b60006111a58682870161106f565b935050602084013567ffffffffffffffff8111156111c6576111c5611775565b5b6111d286828701610ffe565b925050604084013567ffffffffffffffff8111156111f3576111f2611775565b5b6111ff8682870161102c565b9150509250925092565b600080604083850312156112205761121f61177a565b5b600061122e8582860161106f565b925050602061123f85828601611084565b9150509250929050565b60006020828403121561125f5761125e61177a565b5b600061126d84828501611099565b91505092915050565b61127f816115db565b82525050565b61128e816115ed565b82525050565b60006112a16026836114e9565b91506112ac82611790565b604082019050919050565b60006112c4600e836114e9565b91506112cf826117df565b602082019050919050565b60006112e7601b836114e9565b91506112f282611808565b602082019050919050565b600061130a600c836114e9565b915061131582611831565b602082019050919050565b600061132d6020836114e9565b91506113388261185a565b602082019050919050565b61134c8161162b565b82525050565b60006020820190506113676000830184611276565b92915050565b60006040820190506113826000830185611276565b61138f6020830184611343565b9392505050565b60006020820190506113ab6000830184611285565b92915050565b600060208201905081810360008301526113ca81611294565b9050919050565b600060208201905081810360008301526113ea816112b7565b9050919050565b6000602082019050818103600083015261140a816112da565b9050919050565b6000602082019050818103600083015261142a816112fd565b9050919050565b6000602082019050818103600083015261144a81611320565b9050919050565b60006020820190506114666000830184611343565b92915050565b6000611476611487565b90506114828282611635565b919050565b6000604051905090565b600067ffffffffffffffff8211156114ac576114ab61173c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156114d8576114d761173c565b5b602082029050602081019050919050565b600082825260208201905092915050565b60006115058261162b565b91506115108361162b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611545576115446116af565b5b828201905092915050565b600061155b8261162b565b91506115668361162b565b925082611576576115756116de565b5b828204905092915050565b600061158c8261162b565b91506115978361162b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115d0576115cf6116af565b5b828202905092915050565b60006115e68261160b565b9050919050565b60008115159050919050565b6000611604826115db565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b61163e8261177f565b810181811067ffffffffffffffff8211171561165d5761165c61173c565b5b80604052505050565b60006116718261162b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156116a4576116a36116af565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7468696e6720746f20706179000000000000000000000000000000000000600082015250565b7f546f74616c206665652072617465206d75737420626520313030250000000000600082015250565b7f6e6f2077686974656c6973740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61188c816115db565b811461189757600080fd5b50565b6118a3816115ed565b81146118ae57600080fd5b50565b6118ba816115f9565b81146118c557600080fd5b50565b6118d18161162b565b81146118dc57600080fd5b5056fea264697066735822122061885066131c6c3726d9f0000523a024b9320c66dc8b19972d71de4bf644c61e64736f6c6343000807003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696566706870326c757737626c706232676d356f7171633570736574637069367834746e61733632733563323235687a683674786d2f00000000000000000000000084d55d12384653d9e701f8eb74c60ee9140a67b5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106102675760003560e01c8063715018a611610144578063a22cb465116100b6578063dac6db1c1161007a578063dac6db1c14610961578063e27567f61461098c578063e2ec6ec3146109b7578063e985e9c5146109f4578063f2fde38b14610a31578063fc0c546a14610a5a57610267565b8063a22cb4651461087c578063b88d4fde146108a5578063c6682862146108ce578063c87b56dd146108f9578063ca1c4de91461093657610267565b80638da5cb5b116101085780638da5cb5b1461076a5780639070975114610795578063951d3bc9146107be57806395d89b41146107e95780639a691d5b146108145780639b19251a1461083f57610267565b8063715018a6146106a45780637231a876146106bb578063795612d6146106f85780637b9417c8146107165780638456cb591461075357610267565b80633c010a3e116101dd5780634f6ccce7116101a15780634f6ccce71461056e57806355f804b3146105ab5780635c975abb146105d45780636052970c146105ff5780636352211e1461062a57806370a082311461066757610267565b80633c010a3e1461049b5780633f4ba83a146104c657806342842e0e146104dd5780634432fcd514610506578063481c6a751461054357610267565b806318160ddd1161022f57806318160ddd146103655780631fd37db31461039057806323b872dd146103bb57806324953eaa146103e4578063286dd3f5146104215780632f745c591461045e57610267565b806301339c211461026c57806301ffc9a71461029757806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610281610a85565b60405161028e9190613e92565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b99190613774565b610be7565b6040516102cb9190613e92565b60405180910390f35b3480156102e057600080fd5b506102e9610bf9565b6040516102f69190613ec8565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190613817565b610c8b565b6040516103339190613dd2565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e91906136be565b610cd1565b005b34801561037157600080fd5b5061037a610de9565b604051610387919061420a565b60405180910390f35b34801561039c57600080fd5b506103a5610df6565b6040516103b2919061420a565b60405180910390f35b3480156103c757600080fd5b506103e260048036038101906103dd91906135a8565b610e12565b005b3480156103f057600080fd5b5061040b600480360381019061040691906136fe565b610e72565b6040516104189190613e92565b60405180910390f35b34801561042d57600080fd5b506104486004803603810190610443919061353b565b610ece565b6040516104559190613e92565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906136be565b610fc3565b604051610492919061420a565b60405180910390f35b3480156104a757600080fd5b506104b0611068565b6040516104bd919061424e565b60405180910390f35b3480156104d257600080fd5b506104db61106d565b005b3480156104e957600080fd5b5061050460048036038101906104ff91906135a8565b61107f565b005b34801561051257600080fd5b5061052d6004803603810190610528919061353b565b61109f565b60405161053a919061424e565b60405180910390f35b34801561054f57600080fd5b506105586110bf565b6040516105659190613dd2565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613817565b6110e5565b6040516105a2919061420a565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906137ce565b611156565b005b3480156105e057600080fd5b506105e9611178565b6040516105f69190613e92565b60405180910390f35b34801561060b57600080fd5b5061061461118f565b6040516106219190613dd2565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190613817565b6111b5565b60405161065e9190613dd2565b60405180910390f35b34801561067357600080fd5b5061068e6004803603810190610689919061353b565b611267565b60405161069b919061420a565b60405180910390f35b3480156106b057600080fd5b506106b961131f565b005b3480156106c757600080fd5b506106e260048036038101906106dd919061353b565b611333565b6040516106ef9190613e70565b60405180910390f35b6107006113e1565b60405161070d919061420a565b60405180910390f35b34801561072257600080fd5b5061073d6004803603810190610738919061353b565b61179c565b60405161074a9190613e92565b60405180910390f35b34801561075f57600080fd5b50610768611890565b005b34801561077657600080fd5b5061077f6118a2565b60405161078c9190613dd2565b60405180910390f35b3480156107a157600080fd5b506107bc60048036038101906107b791906137ce565b6118cc565b005b3480156107ca57600080fd5b506107d36118ee565b6040516107e0919061424e565b60405180910390f35b3480156107f557600080fd5b506107fe6118f3565b60405161080b9190613ec8565b60405180910390f35b34801561082057600080fd5b50610829611985565b604051610836919061420a565b60405180910390f35b34801561084b57600080fd5b506108666004803603810190610861919061353b565b611996565b6040516108739190613e92565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e919061367e565b6119b6565b005b3480156108b157600080fd5b506108cc60048036038101906108c791906135fb565b6119cc565b005b3480156108da57600080fd5b506108e3611a2e565b6040516108f09190613ec8565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190613817565b611abc565b60405161092d9190613ec8565b60405180910390f35b34801561094257600080fd5b5061094b611b66565b6040516109589190613e92565b60405180910390f35b34801561096d57600080fd5b50610976611b79565b604051610983919061420a565b60405180910390f35b34801561099857600080fd5b506109a1611b85565b6040516109ae919061420a565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d991906136fe565b611b8b565b6040516109eb9190613e92565b60405180910390f35b348015610a0057600080fd5b50610a1b6004803603810190610a169190613568565b611be7565b604051610a289190613e92565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a53919061353b565b611c7b565b005b348015610a6657600080fd5b50610a6f611cff565b604051610a7c9190613ead565b60405180910390f35b6000610a8f611d3b565b60001515601160149054906101000a900460ff16151514610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc9061418a565b60405180910390fd5b60005b601460ff16811015610b3357610b1f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611db9565b508080610b2b906145c4565b915050610ae8565b50610b3d33611db9565b506001601160146101000a81548160ff021916908315150217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbd316b06604330313ca095927304d39d3e130154c0ea73f98a4d21f62ccd0a0742604051610bd8919061420a565b60405180910390a36001905090565b6000610bf282611de0565b9050919050565b606060008054610c0890614561565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3490614561565b8015610c815780601f10610c5657610100808354040283529160200191610c81565b820191906000526020600020905b815481529060010190602001808311610c6457829003601f168201915b5050505050905090565b6000610c9682611e5a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cdc826111b5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d449061416a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6c611ea5565b73ffffffffffffffffffffffffffffffffffffffff161480610d9b5750610d9a81610d95611ea5565b611be7565b5b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd1906140ca565b60405180910390fd5b610de48383611ead565b505050565b6000600880549050905090565b6000610e00610de9565b6101f4610e0d9190614434565b905090565b610e23610e1d611ea5565b82611f66565b610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e59906141ca565b60405180910390fd5b610e6d838383611ffb565b505050565b6000610e7c611d3b565b60005b8251811015610ec857610eab838281518110610e9e57610e9d614724565b5b6020026020010151610ece565b15610eb557600191505b8080610ec0906145c4565b915050610e7f565b50919050565b6000610ed8611d3b565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fbe576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a82604051610fb19190613dd2565b60405180910390a1600190505b919050565b6000610fce83611267565b821061100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690613f6a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600281565b611075611d3b565b61107d612262565b565b61109a838383604051806020016040528060008152506119cc565b505050565b60146020528060005260406000206000915054906101000a900460ff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ef610de9565b8210611130576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611127906141aa565b60405180910390fd5b6008828154811061114457611143614724565b5b90600052602060002001549050919050565b61115e611d3b565b806012908051906020019061117492919061329c565b5050565b6000600b60009054906101000a900460ff16905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561125e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112559061414a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf906140aa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611327611d3b565b61133160006122c5565b565b6060600061134083611267565b905060008167ffffffffffffffff81111561135e5761135d614753565b5b60405190808252806020026020018201604052801561138c5781602001602082028036833780820191505090505b50905060005b828110156113d6576113a48582610fc3565b8282815181106113b7576113b6614724565b5b60200260200101818152505080806113ce906145c4565b915050611392565b508092505050919050565b60006002600d541415611429576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611420906141ea565b60405180910390fd5b6002600d8190555061143961238b565b60011515601160149054906101000a900460ff1615151461148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690613f4a565b60405180910390fd5b6000611499610de9565b90506101f46001826114ab91906143ad565b11156114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e390613faa565b60405180910390fd5b6000339050600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661172e57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166702c68af0bb1400006040518463ffffffff1660e01b81526004016115cb93929190613ded565b602060405180830381600087803b1580156115e557600080fd5b505af11580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d9190613747565b61165c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116539061408a565b60405180910390fd5b600260ff16600161166c83611333565b5161167791906143ad565b11156116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af90613f2a565b60405180910390fd5b601460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906117149061460d565b91906101000a81548160ff021916908360ff160217905550505b600061173982611db9565b90508173ffffffffffffffffffffffffffffffffffffffff167f253d872ec1efa2cd60440408e1a31a3b419aa3a959a2c3035cf6513a25579e6e8242604051611783929190614225565b60405180910390a28093505050506001600d8190555090565b60006117a6611d3b565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661188b576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f8260405161187e9190613dd2565b60405180910390a1600190505b919050565b611898611d3b565b6118a06123d5565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118d4611d3b565b80601390805190602001906118ea92919061329c565b5050565b601481565b60606001805461190290614561565b80601f016020809104026020016040519081016040528092919081815260200182805461192e90614561565b801561197b5780601f106119505761010080835404028352916020019161197b565b820191906000526020600020905b81548152906001019060200180831161195e57829003601f168201915b5050505050905090565b6000611991600e612438565b905090565b600c6020528060005260406000206000915054906101000a900460ff1681565b6119c86119c1611ea5565b8383612446565b5050565b6119dd6119d7611ea5565b83611f66565b611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a13906141ca565b60405180910390fd5b611a28848484846125b3565b50505050565b60138054611a3b90614561565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6790614561565b8015611ab45780601f10611a8957610100808354040283529160200191611ab4565b820191906000526020600020905b815481529060010190602001808311611a9757829003601f168201915b505050505081565b6060611ac78261260f565b611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd9061412a565b60405180910390fd5b6000611b1061267b565b90506000815111611b305760405180602001604052806000815250611b5e565b80611b3a8461270d565b6013604051602001611b4e93929190613da1565b6040516020818303038152906040525b915050919050565b601160149054906101000a900460ff1681565b6702c68af0bb14000081565b6101f481565b6000611b95611d3b565b60005b8251811015611be157611bc4838281518110611bb757611bb6614724565b5b602002602001015161179c565b15611bce57600191505b8080611bd9906145c4565b915050611b98565b50919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c83611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cea90613fca565b60405180910390fd5b611cfc816122c5565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6001816000016000828254019250508190555050565b611d43611ea5565b73ffffffffffffffffffffffffffffffffffffffff16611d616118a2565b73ffffffffffffffffffffffffffffffffffffffff1614611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae9061410a565b60405180910390fd5b565b6000611dc5600e612438565b9050611dd1600e611d25565b611ddb828261286e565b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e535750611e528261288c565b5b9050919050565b611e638161260f565b611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e999061414a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f20836111b5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611f72836111b5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fb45750611fb38185611be7565b5b80611ff257508373ffffffffffffffffffffffffffffffffffffffff16611fda84610c8b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661201b826111b5565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613fea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d89061402a565b60405180910390fd5b6120ec83838361296e565b6120f7600082611ead565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121479190614434565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461219e91906143ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461225d83838361297e565b505050565b61226a612983565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122ae611ea5565b6040516122bb9190613dd2565b60405180910390a1565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612393611178565b156123d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ca9061406a565b60405180910390fd5b565b6123dd61238b565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612421611ea5565b60405161242e9190613dd2565b60405180910390a1565b600081600001549050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ac9061404a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125a69190613e92565b60405180910390a3505050565b6125be848484611ffb565b6125ca848484846129cc565b612609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260090613f8a565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606012805461268a90614561565b80601f01602080910402602001604051908101604052809291908181526020018280546126b690614561565b80156127035780601f106126d857610100808354040283529160200191612703565b820191906000526020600020905b8154815290600101906020018083116126e657829003601f168201915b5050505050905090565b60606000821415612755576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612869565b600082905060005b60008214612787578080612770906145c4565b915050600a826127809190614403565b915061275d565b60008167ffffffffffffffff8111156127a3576127a2614753565b5b6040519080825280601f01601f1916602001820160405280156127d55781602001600182028036833780820191505090505b5090505b60008514612862576001826127ee9190614434565b9150600a856127fd9190614637565b603061280991906143ad565b60f81b81838151811061281f5761281e614724565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561285b9190614403565b94506127d9565b8093505050505b919050565b612888828260405180602001604052806000815250612b63565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061295757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612967575061296682612bbe565b5b9050919050565b612979838383612c28565b505050565b505050565b61298b611178565b6129ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c190613f0a565b60405180910390fd5b565b60006129ed8473ffffffffffffffffffffffffffffffffffffffff16612c80565b15612b56578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a16611ea5565b8786866040518563ffffffff1660e01b8152600401612a389493929190613e24565b602060405180830381600087803b158015612a5257600080fd5b505af1925050508015612a8357506040513d601f19601f82011682018060405250810190612a8091906137a1565b60015b612b06573d8060008114612ab3576040519150601f19603f3d011682016040523d82523d6000602084013e612ab8565b606091505b50600081511415612afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af590613f8a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b5b565b600190505b949350505050565b612b6d8383612ca3565b612b7a60008484846129cc565b612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb090613f8a565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c33838383612e7d565b612c3b611178565b15612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7290613eea565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0a906140ea565b60405180910390fd5b612d1c8161260f565b15612d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d539061400a565b60405180910390fd5b612d686000838361296e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612db891906143ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e796000838361297e565b5050565b612e88838383612f91565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ecb57612ec681612f96565b612f0a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f0957612f088382612fdf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4d57612f488161314c565b612f8c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f8b57612f8a828261321d565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fec84611267565b612ff69190614434565b90506000600760008481526020019081526020016000205490508181146130db576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131609190614434565b90506000600960008481526020019081526020016000205490506000600883815481106131905761318f614724565b5b9060005260206000200154905080600883815481106131b2576131b1614724565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613201576132006146f5565b5b6001900381819060005260206000200160009055905550505050565b600061322883611267565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546132a890614561565b90600052602060002090601f0160209004810192826132ca5760008555613311565b82601f106132e357805160ff1916838001178555613311565b82800160010185558215613311579182015b828111156133105782518255916020019190600101906132f5565b5b50905061331e9190613322565b5090565b5b8082111561333b576000816000905550600101613323565b5090565b600061335261334d8461428e565b614269565b9050808382526020820190508285602086028201111561337557613374614787565b5b60005b858110156133a5578161338b8882613433565b845260208401935060208301925050600181019050613378565b5050509392505050565b60006133c26133bd846142ba565b614269565b9050828152602081018484840111156133de576133dd61478c565b5b6133e984828561451f565b509392505050565b60006134046133ff846142eb565b614269565b9050828152602081018484840111156134205761341f61478c565b5b61342b84828561451f565b509392505050565b60008135905061344281614d75565b92915050565b600082601f83011261345d5761345c614782565b5b813561346d84826020860161333f565b91505092915050565b60008135905061348581614d8c565b92915050565b60008151905061349a81614d8c565b92915050565b6000813590506134af81614da3565b92915050565b6000815190506134c481614da3565b92915050565b600082601f8301126134df576134de614782565b5b81356134ef8482602086016133af565b91505092915050565b600082601f83011261350d5761350c614782565b5b813561351d8482602086016133f1565b91505092915050565b60008135905061353581614dba565b92915050565b60006020828403121561355157613550614796565b5b600061355f84828501613433565b91505092915050565b6000806040838503121561357f5761357e614796565b5b600061358d85828601613433565b925050602061359e85828601613433565b9150509250929050565b6000806000606084860312156135c1576135c0614796565b5b60006135cf86828701613433565b93505060206135e086828701613433565b92505060406135f186828701613526565b9150509250925092565b6000806000806080858703121561361557613614614796565b5b600061362387828801613433565b945050602061363487828801613433565b935050604061364587828801613526565b925050606085013567ffffffffffffffff81111561366657613665614791565b5b613672878288016134ca565b91505092959194509250565b6000806040838503121561369557613694614796565b5b60006136a385828601613433565b92505060206136b485828601613476565b9150509250929050565b600080604083850312156136d5576136d4614796565b5b60006136e385828601613433565b92505060206136f485828601613526565b9150509250929050565b60006020828403121561371457613713614796565b5b600082013567ffffffffffffffff81111561373257613731614791565b5b61373e84828501613448565b91505092915050565b60006020828403121561375d5761375c614796565b5b600061376b8482850161348b565b91505092915050565b60006020828403121561378a57613789614796565b5b6000613798848285016134a0565b91505092915050565b6000602082840312156137b7576137b6614796565b5b60006137c5848285016134b5565b91505092915050565b6000602082840312156137e4576137e3614796565b5b600082013567ffffffffffffffff81111561380257613801614791565b5b61380e848285016134f8565b91505092915050565b60006020828403121561382d5761382c614796565b5b600061383b84828501613526565b91505092915050565b60006138508383613d74565b60208301905092915050565b61386581614468565b82525050565b600061387682614341565b613880818561436f565b935061388b8361431c565b8060005b838110156138bc5781516138a38882613844565b97506138ae83614362565b92505060018101905061388f565b5085935050505092915050565b6138d28161447a565b82525050565b60006138e38261434c565b6138ed8185614380565b93506138fd81856020860161452e565b6139068161479b565b840191505092915050565b61391a816144e9565b82525050565b600061392b82614357565b6139358185614391565b935061394581856020860161452e565b61394e8161479b565b840191505092915050565b600061396482614357565b61396e81856143a2565b935061397e81856020860161452e565b80840191505092915050565b6000815461399781614561565b6139a181866143a2565b945060018216600081146139bc57600181146139cd57613a00565b60ff19831686528186019350613a00565b6139d68561432c565b60005b838110156139f8578154818901526001820191506020810190506139d9565b838801955050505b50505092915050565b6000613a16602b83614391565b9150613a21826147ac565b604082019050919050565b6000613a39601483614391565b9150613a44826147fb565b602082019050919050565b6000613a5c601083614391565b9150613a6782614824565b602082019050919050565b6000613a7f601283614391565b9150613a8a8261484d565b602082019050919050565b6000613aa2602b83614391565b9150613aad82614876565b604082019050919050565b6000613ac5603283614391565b9150613ad0826148c5565b604082019050919050565b6000613ae8601283614391565b9150613af382614914565b602082019050919050565b6000613b0b602683614391565b9150613b168261493d565b604082019050919050565b6000613b2e602583614391565b9150613b398261498c565b604082019050919050565b6000613b51601c83614391565b9150613b5c826149db565b602082019050919050565b6000613b74602483614391565b9150613b7f82614a04565b604082019050919050565b6000613b97601983614391565b9150613ba282614a53565b602082019050919050565b6000613bba601083614391565b9150613bc582614a7c565b602082019050919050565b6000613bdd601183614391565b9150613be882614aa5565b602082019050919050565b6000613c00602983614391565b9150613c0b82614ace565b604082019050919050565b6000613c23603e83614391565b9150613c2e82614b1d565b604082019050919050565b6000613c46602083614391565b9150613c5182614b6c565b602082019050919050565b6000613c69602083614391565b9150613c7482614b95565b602082019050919050565b6000613c8c602f83614391565b9150613c9782614bbe565b604082019050919050565b6000613caf601883614391565b9150613cba82614c0d565b602082019050919050565b6000613cd2602183614391565b9150613cdd82614c36565b604082019050919050565b6000613cf5601183614391565b9150613d0082614c85565b602082019050919050565b6000613d18602c83614391565b9150613d2382614cae565b604082019050919050565b6000613d3b602e83614391565b9150613d4682614cfd565b604082019050919050565b6000613d5e601f83614391565b9150613d6982614d4c565b602082019050919050565b613d7d816144d2565b82525050565b613d8c816144d2565b82525050565b613d9b816144dc565b82525050565b6000613dad8286613959565b9150613db98285613959565b9150613dc5828461398a565b9150819050949350505050565b6000602082019050613de7600083018461385c565b92915050565b6000606082019050613e02600083018661385c565b613e0f602083018561385c565b613e1c6040830184613d83565b949350505050565b6000608082019050613e39600083018761385c565b613e46602083018661385c565b613e536040830185613d83565b8181036060830152613e6581846138d8565b905095945050505050565b60006020820190508181036000830152613e8a818461386b565b905092915050565b6000602082019050613ea760008301846138c9565b92915050565b6000602082019050613ec26000830184613911565b92915050565b60006020820190508181036000830152613ee28184613920565b905092915050565b60006020820190508181036000830152613f0381613a09565b9050919050565b60006020820190508181036000830152613f2381613a2c565b9050919050565b60006020820190508181036000830152613f4381613a4f565b9050919050565b60006020820190508181036000830152613f6381613a72565b9050919050565b60006020820190508181036000830152613f8381613a95565b9050919050565b60006020820190508181036000830152613fa381613ab8565b9050919050565b60006020820190508181036000830152613fc381613adb565b9050919050565b60006020820190508181036000830152613fe381613afe565b9050919050565b6000602082019050818103600083015261400381613b21565b9050919050565b6000602082019050818103600083015261402381613b44565b9050919050565b6000602082019050818103600083015261404381613b67565b9050919050565b6000602082019050818103600083015261406381613b8a565b9050919050565b6000602082019050818103600083015261408381613bad565b9050919050565b600060208201905081810360008301526140a381613bd0565b9050919050565b600060208201905081810360008301526140c381613bf3565b9050919050565b600060208201905081810360008301526140e381613c16565b9050919050565b6000602082019050818103600083015261410381613c39565b9050919050565b6000602082019050818103600083015261412381613c5c565b9050919050565b6000602082019050818103600083015261414381613c7f565b9050919050565b6000602082019050818103600083015261416381613ca2565b9050919050565b6000602082019050818103600083015261418381613cc5565b9050919050565b600060208201905081810360008301526141a381613ce8565b9050919050565b600060208201905081810360008301526141c381613d0b565b9050919050565b600060208201905081810360008301526141e381613d2e565b9050919050565b6000602082019050818103600083015261420381613d51565b9050919050565b600060208201905061421f6000830184613d83565b92915050565b600060408201905061423a6000830185613d83565b6142476020830184613d83565b9392505050565b60006020820190506142636000830184613d92565b92915050565b6000614273614284565b905061427f8282614593565b919050565b6000604051905090565b600067ffffffffffffffff8211156142a9576142a8614753565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142d5576142d4614753565b5b6142de8261479b565b9050602081019050919050565b600067ffffffffffffffff82111561430657614305614753565b5b61430f8261479b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143b8826144d2565b91506143c3836144d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143f8576143f7614668565b5b828201905092915050565b600061440e826144d2565b9150614419836144d2565b92508261442957614428614697565b5b828204905092915050565b600061443f826144d2565b915061444a836144d2565b92508282101561445d5761445c614668565b5b828203905092915050565b6000614473826144b2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006144f4826144fb565b9050919050565b60006145068261450d565b9050919050565b6000614518826144b2565b9050919050565b82818337600083830152505050565b60005b8381101561454c578082015181840152602081019050614531565b8381111561455b576000848401525b50505050565b6000600282049050600182168061457957607f821691505b6020821081141561458d5761458c6146c6565b5b50919050565b61459c8261479b565b810181811067ffffffffffffffff821117156145bb576145ba614753565b5b80604052505050565b60006145cf826144d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561460257614601614668565b5b600182019050919050565b6000614618826144dc565b915060ff82141561462c5761462b614668565b5b600182019050919050565b6000614642826144d2565b915061464d836144d2565b92508261465d5761465c614697565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4d494e545f4d41585f5245414348454400000000000000000000000000000000600082015250565b7f4f4e4c595f5748454e5f4c41554e434845440000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e46543a3a4c494d49545f524541434845440000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4d5553545f5041595f4d494e545f464545000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f4e4c595f4f4e43455f414c4c4f574544000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614d7e81614468565b8114614d8957600080fd5b50565b614d958161447a565b8114614da057600080fd5b50565b614dac81614486565b8114614db757600080fd5b50565b614dc3816144d2565b8114614dce57600080fd5b5056fea264697066735822122086dad250f20b489ebb69e4ea5f5d2f94037c3d1ea52255ae0dab926dcfa73a5f64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000084d55d12384653d9e701f8eb74c60ee9140a67b5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _manager (address): 0x84D55D12384653d9e701F8eb74C60Ee9140A67b5
Arg [1] : _tkn (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000084d55d12384653d9e701f8eb74c60ee9140a67b5
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
69418:6528:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72502:521;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75772:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32158:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33671:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33188:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48985:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73813:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34371:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67102:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66811:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48653:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69994:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73460:65;;;;;;;;;;;;;:::i;:::-;;34778:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70182:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69829:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49175:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73059:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10522:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69858:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31869:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31600:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8032:103;;;;;;;;;;;;;:::i;:::-;;73957:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71281:1084;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66250:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73360:61;;;;;;;;;;;;;:::i;:::-;;7384:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73204:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70035:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32327:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73671:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65984:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33914:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35034:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69948:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74358:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69893:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70128:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70084:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66509:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34140:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8290:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69688:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72502:521;72546:13;7270;:11;:13::i;:::-;72597:5:::1;72580:22;;:13;;;;;;;;;;;:22;;;72572:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;72695:6;72691:83;70073:2;72707:17;;:1;:17;72691:83;;;72745:17;72754:7;;;;;;;;;;;72745:8;:17::i;:::-;;72726:3;;;;;:::i;:::-;;;;72691:83;;;;72819:20;72828:10;72819:8;:20::i;:::-;;72899:4;72883:13;;:20;;;;;;;;;;;;;;;;;;72968:7;;;;;;;;;;;72947:46;;72956:10;72947:46;;;72977:15;72947:46;;;;;;:::i;:::-;;;;;;;;73011:4;73004:11;;72502:521:::0;:::o;75772:171::-;75875:4;75899:36;75923:11;75899:23;:36::i;:::-;75892:43;;75772:171;;;:::o;32158:100::-;32212:13;32245:5;32238:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32158:100;:::o;33671:171::-;33747:7;33767:23;33782:7;33767:14;:23::i;:::-;33810:15;:24;33826:7;33810:24;;;;;;;;;;;;;;;;;;;;;33803:31;;33671:171;;;:::o;33188:417::-;33269:13;33285:23;33300:7;33285:14;:23::i;:::-;33269:39;;33333:5;33327:11;;:2;:11;;;;33319:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33427:5;33411:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33436:37;33453:5;33460:12;:10;:12::i;:::-;33436:16;:37::i;:::-;33411:62;33389:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;33576:21;33585:2;33589:7;33576:8;:21::i;:::-;33258:347;33188:417;;:::o;48985:113::-;49046:7;49073:10;:17;;;;49066:24;;48985:113;:::o;73813:107::-;73860:7;73898:13;:11;:13::i;:::-;70118:3;73888:23;;;;:::i;:::-;73880:32;;73813:107;:::o;34371:336::-;34566:41;34585:12;:10;:12::i;:::-;34599:7;34566:18;:41::i;:::-;34558:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;34671:28;34681:4;34687:2;34691:7;34671:9;:28::i;:::-;34371:336;;;:::o;67102:304::-;67189:12;7270:13;:11;:13::i;:::-;67219:9:::1;67214:160;67238:5;:12;67234:1;:16;67214:160;;;67276:36;67303:5;67309:1;67303:8;;;;;;;;:::i;:::-;;;;;;;;67276:26;:36::i;:::-;67272:91;;;67343:4;67333:14;;67272:91;67252:3;;;;;:::i;:::-;;;;67214:160;;;;67102:304:::0;;;:::o;66811:283::-;66886:12;7270:13;:11;:13::i;:::-;66915:9:::1;:15;66925:4;66915:15;;;;;;;;;;;;;;;;;;;;;;;;;66911:151;;;66965:5;66947:9;:15;66957:4;66947:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;66990:31;67016:4;66990:31;;;;;;:::i;:::-;;;;;;;;67046:4;67036:14;;66911:151;66811:283:::0;;;:::o;48653:256::-;48750:7;48786:23;48803:5;48786:16;:23::i;:::-;48778:5;:31;48770:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48875:12;:19;48888:5;48875:19;;;;;;;;;;;;;;;:26;48895:5;48875:26;;;;;;;;;;;;48868:33;;48653:256;;;;:::o;69994:34::-;70027:1;69994:34;:::o;73460:65::-;7270:13;:11;:13::i;:::-;73507:10:::1;:8;:10::i;:::-;73460:65::o:0;34778:185::-;34916:39;34933:4;34939:2;34943:7;34916:39;;;;;;;;;;;;:16;:39::i;:::-;34778:185;;;:::o;70182:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;69829:22::-;;;;;;;;;;;;;:::o;49175:233::-;49250:7;49286:30;:28;:30::i;:::-;49278:5;:38;49270:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49383:10;49394:5;49383:17;;;;;;;;:::i;:::-;;;;;;;;;;49376:24;;49175:233;;;:::o;73059:104::-;7270:13;:11;:13::i;:::-;73144:11:::1;73134:7;:21;;;;;;;;;;;;:::i;:::-;;73059:104:::0;:::o;10522:86::-;10569:4;10593:7;;;;;;;;;;;10586:14;;10522:86;:::o;69858:26::-;;;;;;;;;;;;;:::o;31869:222::-;31941:7;31961:13;31977:7;:16;31985:7;31977:16;;;;;;;;;;;;;;;;;;;;;31961:32;;32029:1;32012:19;;:5;:19;;;;32004:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;32078:5;32071:12;;;31869:222;;;:::o;31600:207::-;31672:7;31717:1;31700:19;;:5;:19;;;;31692:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31783:9;:16;31793:5;31783:16;;;;;;;;;;;;;;;;31776:23;;31600:207;;;:::o;8032:103::-;7270:13;:11;:13::i;:::-;8097:30:::1;8124:1;8097:18;:30::i;:::-;8032:103::o:0;73957:364::-;74011:16;74040:23;74066:17;74076:6;74066:9;:17::i;:::-;74040:43;;74094:25;74136:15;74122:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74094:58;;74178:9;74173:113;74193:15;74189:1;:19;74173:113;;;74244:30;74264:6;74272:1;74244:19;:30::i;:::-;74230:8;74239:1;74230:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;74210:3;;;;;:::i;:::-;;;;74173:113;;;;74305:8;74298:15;;;;73957:364;;;:::o;71281:1084::-;71353:11;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;10127:19:::1;:17;:19::i;:::-;71402:4:::2;71385:21;;:13;;;;;;;;;;;:21;;;71377:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;71480:14;71497:13;:11;:13::i;:::-;71480:30;;70118:3;71538:1;71529:6;:10;;;;:::i;:::-;:21;;71521:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;71620:18;71641:10;71620:31;;71724:9;:21;71734:10;71724:21;;;;;;;;;;;;;;;;;;;;;;;;;71719:427;;71820:5;;;;;;;;;;;:18;;;71839:10;71859:11;;;;;;;;;;;70164:9;71820:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71812:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;70027:1;71966:42;;71995:1;71966:19;71974:10;71966:7;:19::i;:::-;:26;:30;;;;:::i;:::-;:42;;71958:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;72107:13;:25;72121:10;72107:25;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;71719:427;72202:15;72220:20;72229:10;72220:8;:20::i;:::-;72202:38;;72295:10;72284:48;;;72307:7;72316:15;72284:48;;;;;;;:::i;:::-;;;;;;;;72350:7;72343:14;;;;;1768:1:::0;2722:7;:22;;;;71281:1084;:::o;66250:251::-;66320:12;7270:13;:11;:13::i;:::-;66350:9:::1;:15;66360:4;66350:15;;;;;;;;;;;;;;;;;;;;;;;;;66345:149;;66400:4;66382:9;:15;66392:4;66382:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;66424:29;66448:4;66424:29;;;;;;:::i;:::-;;;;;;;;66478:4;66468:14;;66345:149;66250:251:::0;;;:::o;73360:61::-;7270:13;:11;:13::i;:::-;73405:8:::1;:6;:8::i;:::-;73360:61::o:0;7384:87::-;7430:7;7457:6;;;;;;;;;;;7450:13;;7384:87;:::o;73204:119::-;7270:13;:11;:13::i;:::-;73302::::1;73286;:29;;;;;;;;;;;;:::i;:::-;;73204:119:::0;:::o;70035:40::-;70073:2;70035:40;:::o;32327:104::-;32383:13;32416:7;32409:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32327:104;:::o;73671:97::-;73712:7;73740:19;:9;:17;:19::i;:::-;73732:28;;73671:97;:::o;65984:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;33914:155::-;34009:52;34028:12;:10;:12::i;:::-;34042:8;34052;34009:18;:52::i;:::-;33914:155;;:::o;35034:323::-;35208:41;35227:12;:10;:12::i;:::-;35241:7;35208:18;:41::i;:::-;35200:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;35311:38;35325:4;35331:2;35335:7;35344:4;35311:13;:38::i;:::-;35034:323;;;;:::o;69948:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74358:428::-;74457:13;74491:16;74499:7;74491;:16::i;:::-;74483:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;74572:28;74603:10;:8;:10::i;:::-;74572:41;;74668:1;74643:14;74637:28;:32;:141;;;;;;;;;;;;;;;;;74709:14;74725:18;:7;:16;:18::i;:::-;74745:13;74692:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74637:141;74630:148;;;74358:428;;;:::o;69893:25::-;;;;;;;;;;;;;:::o;70128:45::-;70164:9;70128:45;:::o;70084:37::-;70118:3;70084:37;:::o;66509:294::-;66591:12;7270:13;:11;:13::i;:::-;66621:9:::1;66616:155;66640:5;:12;66636:1;:16;66616:155;;;66678:31;66700:5;66706:1;66700:8;;;;;;;;:::i;:::-;;;;;;;;66678:21;:31::i;:::-;66674:86;;;66740:4;66730:14;;66674:86;66654:3;;;;;:::i;:::-;;;;66616:155;;;;66509:294:::0;;;:::o;34140:164::-;34237:4;34261:18;:25;34280:5;34261:25;;;;;;;;;;;;;;;:35;34287:8;34261:35;;;;;;;;;;;;;;;;;;;;;;;;;34254:42;;34140:164;;;;:::o;8290:201::-;7270:13;:11;:13::i;:::-;8399:1:::1;8379:22;;:8;:22;;;;8371:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8455:28;8474:8;8455:18;:28::i;:::-;8290:201:::0;:::o;69688:19::-;;;;;;;;;;;;;:::o;65407:127::-;65514:1;65496:7;:14;;;:19;;;;;;;;;;;65407:127;:::o;7549:132::-;7624:12;:10;:12::i;:::-;7613:23;;:7;:5;:7::i;:::-;:23;;;7605:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7549:132::o;74984:244::-;75032:15;75070:19;:9;:17;:19::i;:::-;75060:29;;75134:21;:9;:19;:21::i;:::-;75198:22;75208:2;75212:7;75198:9;:22::i;:::-;74984:244;;;:::o;48345:224::-;48447:4;48486:35;48471:50;;;:11;:50;;;;:90;;;;48525:36;48549:11;48525:23;:36::i;:::-;48471:90;48464:97;;48345:224;;;:::o;41646:135::-;41728:16;41736:7;41728;:16::i;:::-;41720:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;41646:135;:::o;5935:98::-;5988:7;6015:10;6008:17;;5935:98;:::o;40925:174::-;41027:2;41000:15;:24;41016:7;41000:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41083:7;41079:2;41045:46;;41054:23;41069:7;41054:14;:23::i;:::-;41045:46;;;;;;;;;;;;40925:174;;:::o;37158:264::-;37251:4;37268:13;37284:23;37299:7;37284:14;:23::i;:::-;37268:39;;37337:5;37326:16;;:7;:16;;;:52;;;;37346:32;37363:5;37370:7;37346:16;:32::i;:::-;37326:52;:87;;;;37406:7;37382:31;;:20;37394:7;37382:11;:20::i;:::-;:31;;;37326:87;37318:96;;;37158:264;;;;:::o;40181:625::-;40340:4;40313:31;;:23;40328:7;40313:14;:23::i;:::-;:31;;;40305:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40419:1;40405:16;;:2;:16;;;;40397:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40475:39;40496:4;40502:2;40506:7;40475:20;:39::i;:::-;40579:29;40596:1;40600:7;40579:8;:29::i;:::-;40640:1;40621:9;:15;40631:4;40621:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40669:1;40652:9;:13;40662:2;40652:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40700:2;40681:7;:16;40689:7;40681:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40739:7;40735:2;40720:27;;40729:4;40720:27;;;;;;;;;;;;40760:38;40780:4;40786:2;40790:7;40760:19;:38::i;:::-;40181:625;;;:::o;11377:120::-;10386:16;:14;:16::i;:::-;11446:5:::1;11436:7;;:15;;;;;;;;;;;;;;;;;;11467:22;11476:12;:10;:12::i;:::-;11467:22;;;;;;:::i;:::-;;;;;;;;11377:120::o:0;8651:191::-;8725:16;8744:6;;;;;;;;;;;8725:25;;8770:8;8761:6;;:17;;;;;;;;;;;;;;;;;;8825:8;8794:40;;8815:8;8794:40;;;;;;;;;;;;8714:128;8651:191;:::o;10681:108::-;10752:8;:6;:8::i;:::-;10751:9;10743:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;10681:108::o;11118:118::-;10127:19;:17;:19::i;:::-;11188:4:::1;11178:7;;:14;;;;;;;;;;;;;;;;;;11208:20;11215:12;:10;:12::i;:::-;11208:20;;;;;;:::i;:::-;;;;;;;;11118:118::o:0;65285:114::-;65350:7;65377;:14;;;65370:21;;65285:114;;;:::o;41242:315::-;41397:8;41388:17;;:5;:17;;;;41380:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41484:8;41446:18;:25;41465:5;41446:25;;;;;;;;;;;;;;;:35;41472:8;41446:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41530:8;41508:41;;41523:5;41508:41;;;41540:8;41508:41;;;;;;:::i;:::-;;;;;;;;41242:315;;;:::o;36238:313::-;36394:28;36404:4;36410:2;36414:7;36394:9;:28::i;:::-;36441:47;36464:4;36470:2;36474:7;36483:4;36441:22;:47::i;:::-;36433:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;36238:313;;;;:::o;36864:127::-;36929:4;36981:1;36953:30;;:7;:16;36961:7;36953:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36946:37;;36864:127;;;:::o;75328:108::-;75388:13;75421:7;75414:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75328:108;:::o;3189:723::-;3245:13;3475:1;3466:5;:10;3462:53;;;3493:10;;;;;;;;;;;;;;;;;;;;;3462:53;3525:12;3540:5;3525:20;;3556:14;3581:78;3596:1;3588:4;:9;3581:78;;3614:8;;;;;:::i;:::-;;;;3645:2;3637:10;;;;;:::i;:::-;;;3581:78;;;3669:19;3701:6;3691:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3669:39;;3719:154;3735:1;3726:5;:10;3719:154;;3763:1;3753:11;;;;;:::i;:::-;;;3830:2;3822:5;:10;;;;:::i;:::-;3809:2;:24;;;;:::i;:::-;3796:39;;3779:6;3786;3779:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3859:2;3850:11;;;;;:::i;:::-;;;3719:154;;;3897:6;3883:21;;;;;3189:723;;;;:::o;37764:110::-;37840:26;37850:2;37854:7;37840:26;;;;;;;;;;;;:9;:26::i;:::-;37764:110;;:::o;31231:305::-;31333:4;31385:25;31370:40;;;:11;:40;;;;:105;;;;31442:33;31427:48;;;:11;:48;;;;31370:105;:158;;;;31492:36;31516:11;31492:23;:36::i;:::-;31370:158;31350:178;;31231:305;;;:::o;75567:197::-;75711:45;75738:4;75744:2;75748:7;75711:26;:45::i;:::-;75567:197;;;:::o;44281:125::-;;;;:::o;10866:108::-;10933:8;:6;:8::i;:::-;10925:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;10866:108::o;42345:853::-;42499:4;42520:15;:2;:13;;;:15::i;:::-;42516:675;;;42572:2;42556:36;;;42593:12;:10;:12::i;:::-;42607:4;42613:7;42622:4;42556:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42552:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42814:1;42797:6;:13;:18;42793:328;;;42840:60;;;;;;;;;;:::i;:::-;;;;;;;;42793:328;43071:6;43065:13;43056:6;43052:2;43048:15;43041:38;42552:584;42688:41;;;42678:51;;;:6;:51;;;;42671:58;;;;;42516:675;43175:4;43168:11;;42345:853;;;;;;;:::o;38101:319::-;38230:18;38236:2;38240:7;38230:5;:18::i;:::-;38281:53;38312:1;38316:2;38320:7;38329:4;38281:22;:53::i;:::-;38259:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;38101:319;;;:::o;22893:157::-;22978:4;23017:25;23002:40;;;:11;:40;;;;22995:47;;22893:157;;;:::o;45091:275::-;45235:45;45262:4;45268:2;45272:7;45235:26;:45::i;:::-;45302:8;:6;:8::i;:::-;45301:9;45293:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45091:275;;;:::o;12737:326::-;12797:4;13054:1;13032:7;:19;;;:23;13025:30;;12737:326;;;:::o;38756:439::-;38850:1;38836:16;;:2;:16;;;;38828:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38909:16;38917:7;38909;:16::i;:::-;38908:17;38900:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38971:45;39000:1;39004:2;39008:7;38971:20;:45::i;:::-;39046:1;39029:9;:13;39039:2;39029:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39077:2;39058:7;:16;39066:7;39058:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39122:7;39118:2;39097:33;;39114:1;39097:33;;;;;;;;;;;;39143:44;39171:1;39175:2;39179:7;39143:19;:44::i;:::-;38756:439;;:::o;50021:589::-;50165:45;50192:4;50198:2;50202:7;50165:26;:45::i;:::-;50243:1;50227:18;;:4;:18;;;50223:187;;;50262:40;50294:7;50262:31;:40::i;:::-;50223:187;;;50332:2;50324:10;;:4;:10;;;50320:90;;50351:47;50384:4;50390:7;50351:32;:47::i;:::-;50320:90;50223:187;50438:1;50424:16;;:2;:16;;;50420:183;;;50457:45;50494:7;50457:36;:45::i;:::-;50420:183;;;50530:4;50524:10;;:2;:10;;;50520:83;;50551:40;50579:2;50583:7;50551:27;:40::i;:::-;50520:83;50420:183;50021:589;;;:::o;43770:126::-;;;;:::o;51333:164::-;51437:10;:17;;;;51410:15;:24;51426:7;51410:24;;;;;;;;;;;:44;;;;51465:10;51481:7;51465:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51333:164;:::o;52124:988::-;52390:22;52440:1;52415:22;52432:4;52415:16;:22::i;:::-;:26;;;;:::i;:::-;52390:51;;52452:18;52473:17;:26;52491:7;52473:26;;;;;;;;;;;;52452:47;;52620:14;52606:10;:28;52602:328;;52651:19;52673:12;:18;52686:4;52673:18;;;;;;;;;;;;;;;:34;52692:14;52673:34;;;;;;;;;;;;52651:56;;52757:11;52724:12;:18;52737:4;52724:18;;;;;;;;;;;;;;;:30;52743:10;52724:30;;;;;;;;;;;:44;;;;52874:10;52841:17;:30;52859:11;52841:30;;;;;;;;;;;:43;;;;52636:294;52602:328;53026:17;:26;53044:7;53026:26;;;;;;;;;;;53019:33;;;53070:12;:18;53083:4;53070:18;;;;;;;;;;;;;;;:34;53089:14;53070:34;;;;;;;;;;;53063:41;;;52205:907;;52124:988;;:::o;53407:1079::-;53660:22;53705:1;53685:10;:17;;;;:21;;;;:::i;:::-;53660:46;;53717:18;53738:15;:24;53754:7;53738:24;;;;;;;;;;;;53717:45;;54089:19;54111:10;54122:14;54111:26;;;;;;;;:::i;:::-;;;;;;;;;;54089:48;;54175:11;54150:10;54161;54150:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54286:10;54255:15;:28;54271:11;54255:28;;;;;;;;;;;:41;;;;54427:15;:24;54443:7;54427:24;;;;;;;;;;;54420:31;;;54462:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53478:1008;;;53407:1079;:::o;50911:221::-;50996:14;51013:20;51030:2;51013:16;:20::i;:::-;50996:37;;51071:7;51044:12;:16;51057:2;51044:16;;;;;;;;;;;;;;;:24;51061:6;51044:24;;;;;;;;;;;:34;;;;51118:6;51089:17;:26;51107:7;51089:26;;;;;;;;;;;:35;;;;50985:147;50911:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2317:5;2348:6;2342:13;2333:22;;2364:30;2388:5;2364:30;:::i;:::-;2263:137;;;;:::o;2406:::-;2451:5;2489:6;2476:20;2467:29;;2505:32;2531:5;2505:32;:::i;:::-;2406:137;;;;:::o;2549:141::-;2605:5;2636:6;2630:13;2621:22;;2652:32;2678:5;2652:32;:::i;:::-;2549:141;;;;:::o;2709:338::-;2764:5;2813:3;2806:4;2798:6;2794:17;2790:27;2780:122;;2821:79;;:::i;:::-;2780:122;2938:6;2925:20;2963:78;3037:3;3029:6;3022:4;3014:6;3010:17;2963:78;:::i;:::-;2954:87;;2770:277;2709:338;;;;:::o;3067:340::-;3123:5;3172:3;3165:4;3157:6;3153:17;3149:27;3139:122;;3180:79;;:::i;:::-;3139:122;3297:6;3284:20;3322:79;3397:3;3389:6;3382:4;3374:6;3370:17;3322:79;:::i;:::-;3313:88;;3129:278;3067:340;;;;:::o;3413:139::-;3459:5;3497:6;3484:20;3475:29;;3513:33;3540:5;3513:33;:::i;:::-;3413:139;;;;:::o;3558:329::-;3617:6;3666:2;3654:9;3645:7;3641:23;3637:32;3634:119;;;3672:79;;:::i;:::-;3634:119;3792:1;3817:53;3862:7;3853:6;3842:9;3838:22;3817:53;:::i;:::-;3807:63;;3763:117;3558:329;;;;:::o;3893:474::-;3961:6;3969;4018:2;4006:9;3997:7;3993:23;3989:32;3986:119;;;4024:79;;:::i;:::-;3986:119;4144:1;4169:53;4214:7;4205:6;4194:9;4190:22;4169:53;:::i;:::-;4159:63;;4115:117;4271:2;4297:53;4342:7;4333:6;4322:9;4318:22;4297:53;:::i;:::-;4287:63;;4242:118;3893:474;;;;;:::o;4373:619::-;4450:6;4458;4466;4515:2;4503:9;4494:7;4490:23;4486:32;4483:119;;;4521:79;;:::i;:::-;4483:119;4641:1;4666:53;4711:7;4702:6;4691:9;4687:22;4666:53;:::i;:::-;4656:63;;4612:117;4768:2;4794:53;4839:7;4830:6;4819:9;4815:22;4794:53;:::i;:::-;4784:63;;4739:118;4896:2;4922:53;4967:7;4958:6;4947:9;4943:22;4922:53;:::i;:::-;4912:63;;4867:118;4373:619;;;;;:::o;4998:943::-;5093:6;5101;5109;5117;5166:3;5154:9;5145:7;5141:23;5137:33;5134:120;;;5173:79;;:::i;:::-;5134:120;5293:1;5318:53;5363:7;5354:6;5343:9;5339:22;5318:53;:::i;:::-;5308:63;;5264:117;5420:2;5446:53;5491:7;5482:6;5471:9;5467:22;5446:53;:::i;:::-;5436:63;;5391:118;5548:2;5574:53;5619:7;5610:6;5599:9;5595:22;5574:53;:::i;:::-;5564:63;;5519:118;5704:2;5693:9;5689:18;5676:32;5735:18;5727:6;5724:30;5721:117;;;5757:79;;:::i;:::-;5721:117;5862:62;5916:7;5907:6;5896:9;5892:22;5862:62;:::i;:::-;5852:72;;5647:287;4998:943;;;;;;;:::o;5947:468::-;6012:6;6020;6069:2;6057:9;6048:7;6044:23;6040:32;6037:119;;;6075:79;;:::i;:::-;6037:119;6195:1;6220:53;6265:7;6256:6;6245:9;6241:22;6220:53;:::i;:::-;6210:63;;6166:117;6322:2;6348:50;6390:7;6381:6;6370:9;6366:22;6348:50;:::i;:::-;6338:60;;6293:115;5947:468;;;;;:::o;6421:474::-;6489:6;6497;6546:2;6534:9;6525:7;6521:23;6517:32;6514:119;;;6552:79;;:::i;:::-;6514:119;6672:1;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6643:117;6799:2;6825:53;6870:7;6861:6;6850:9;6846:22;6825:53;:::i;:::-;6815:63;;6770:118;6421:474;;;;;:::o;6901:539::-;6985:6;7034:2;7022:9;7013:7;7009:23;7005:32;7002:119;;;7040:79;;:::i;:::-;7002:119;7188:1;7177:9;7173:17;7160:31;7218:18;7210:6;7207:30;7204:117;;;7240:79;;:::i;:::-;7204:117;7345:78;7415:7;7406:6;7395:9;7391:22;7345:78;:::i;:::-;7335:88;;7131:302;6901:539;;;;:::o;7446:345::-;7513:6;7562:2;7550:9;7541:7;7537:23;7533:32;7530:119;;;7568:79;;:::i;:::-;7530:119;7688:1;7713:61;7766:7;7757:6;7746:9;7742:22;7713:61;:::i;:::-;7703:71;;7659:125;7446:345;;;;:::o;7797:327::-;7855:6;7904:2;7892:9;7883:7;7879:23;7875:32;7872:119;;;7910:79;;:::i;:::-;7872:119;8030:1;8055:52;8099:7;8090:6;8079:9;8075:22;8055:52;:::i;:::-;8045:62;;8001:116;7797:327;;;;:::o;8130:349::-;8199:6;8248:2;8236:9;8227:7;8223:23;8219:32;8216:119;;;8254:79;;:::i;:::-;8216:119;8374:1;8399:63;8454:7;8445:6;8434:9;8430:22;8399:63;:::i;:::-;8389:73;;8345:127;8130:349;;;;:::o;8485:509::-;8554:6;8603:2;8591:9;8582:7;8578:23;8574:32;8571:119;;;8609:79;;:::i;:::-;8571:119;8757:1;8746:9;8742:17;8729:31;8787:18;8779:6;8776:30;8773:117;;;8809:79;;:::i;:::-;8773:117;8914:63;8969:7;8960:6;8949:9;8945:22;8914:63;:::i;:::-;8904:73;;8700:287;8485:509;;;;:::o;9000:329::-;9059:6;9108:2;9096:9;9087:7;9083:23;9079:32;9076:119;;;9114:79;;:::i;:::-;9076:119;9234:1;9259:53;9304:7;9295:6;9284:9;9280:22;9259:53;:::i;:::-;9249:63;;9205:117;9000:329;;;;:::o;9335:179::-;9404:10;9425:46;9467:3;9459:6;9425:46;:::i;:::-;9503:4;9498:3;9494:14;9480:28;;9335:179;;;;:::o;9520:118::-;9607:24;9625:5;9607:24;:::i;:::-;9602:3;9595:37;9520:118;;:::o;9674:732::-;9793:3;9822:54;9870:5;9822:54;:::i;:::-;9892:86;9971:6;9966:3;9892:86;:::i;:::-;9885:93;;10002:56;10052:5;10002:56;:::i;:::-;10081:7;10112:1;10097:284;10122:6;10119:1;10116:13;10097:284;;;10198:6;10192:13;10225:63;10284:3;10269:13;10225:63;:::i;:::-;10218:70;;10311:60;10364:6;10311:60;:::i;:::-;10301:70;;10157:224;10144:1;10141;10137:9;10132:14;;10097:284;;;10101:14;10397:3;10390:10;;9798:608;;;9674:732;;;;:::o;10412:109::-;10493:21;10508:5;10493:21;:::i;:::-;10488:3;10481:34;10412:109;;:::o;10527:360::-;10613:3;10641:38;10673:5;10641:38;:::i;:::-;10695:70;10758:6;10753:3;10695:70;:::i;:::-;10688:77;;10774:52;10819:6;10814:3;10807:4;10800:5;10796:16;10774:52;:::i;:::-;10851:29;10873:6;10851:29;:::i;:::-;10846:3;10842:39;10835:46;;10617:270;10527:360;;;;:::o;10893:161::-;10995:52;11041:5;10995:52;:::i;:::-;10990:3;10983:65;10893:161;;:::o;11060:364::-;11148:3;11176:39;11209:5;11176:39;:::i;:::-;11231:71;11295:6;11290:3;11231:71;:::i;:::-;11224:78;;11311:52;11356:6;11351:3;11344:4;11337:5;11333:16;11311:52;:::i;:::-;11388:29;11410:6;11388:29;:::i;:::-;11383:3;11379:39;11372:46;;11152:272;11060:364;;;;:::o;11430:377::-;11536:3;11564:39;11597:5;11564:39;:::i;:::-;11619:89;11701:6;11696:3;11619:89;:::i;:::-;11612:96;;11717:52;11762:6;11757:3;11750:4;11743:5;11739:16;11717:52;:::i;:::-;11794:6;11789:3;11785:16;11778:23;;11540:267;11430:377;;;;:::o;11837:845::-;11940:3;11977:5;11971:12;12006:36;12032:9;12006:36;:::i;:::-;12058:89;12140:6;12135:3;12058:89;:::i;:::-;12051:96;;12178:1;12167:9;12163:17;12194:1;12189:137;;;;12340:1;12335:341;;;;12156:520;;12189:137;12273:4;12269:9;12258;12254:25;12249:3;12242:38;12309:6;12304:3;12300:16;12293:23;;12189:137;;12335:341;12402:38;12434:5;12402:38;:::i;:::-;12462:1;12476:154;12490:6;12487:1;12484:13;12476:154;;;12564:7;12558:14;12554:1;12549:3;12545:11;12538:35;12614:1;12605:7;12601:15;12590:26;;12512:4;12509:1;12505:12;12500:17;;12476:154;;;12659:6;12654:3;12650:16;12643:23;;12342:334;;12156:520;;11944:738;;11837:845;;;;:::o;12688:366::-;12830:3;12851:67;12915:2;12910:3;12851:67;:::i;:::-;12844:74;;12927:93;13016:3;12927:93;:::i;:::-;13045:2;13040:3;13036:12;13029:19;;12688:366;;;:::o;13060:::-;13202:3;13223:67;13287:2;13282:3;13223:67;:::i;:::-;13216:74;;13299:93;13388:3;13299:93;:::i;:::-;13417:2;13412:3;13408:12;13401:19;;13060:366;;;:::o;13432:::-;13574:3;13595:67;13659:2;13654:3;13595:67;:::i;:::-;13588:74;;13671:93;13760:3;13671:93;:::i;:::-;13789:2;13784:3;13780:12;13773:19;;13432:366;;;:::o;13804:::-;13946:3;13967:67;14031:2;14026:3;13967:67;:::i;:::-;13960:74;;14043:93;14132:3;14043:93;:::i;:::-;14161:2;14156:3;14152:12;14145:19;;13804:366;;;:::o;14176:::-;14318:3;14339:67;14403:2;14398:3;14339:67;:::i;:::-;14332:74;;14415:93;14504:3;14415:93;:::i;:::-;14533:2;14528:3;14524:12;14517:19;;14176:366;;;:::o;14548:::-;14690:3;14711:67;14775:2;14770:3;14711:67;:::i;:::-;14704:74;;14787:93;14876:3;14787:93;:::i;:::-;14905:2;14900:3;14896:12;14889:19;;14548:366;;;:::o;14920:::-;15062:3;15083:67;15147:2;15142:3;15083:67;:::i;:::-;15076:74;;15159:93;15248:3;15159:93;:::i;:::-;15277:2;15272:3;15268:12;15261:19;;14920:366;;;:::o;15292:::-;15434:3;15455:67;15519:2;15514:3;15455:67;:::i;:::-;15448:74;;15531:93;15620:3;15531:93;:::i;:::-;15649:2;15644:3;15640:12;15633:19;;15292:366;;;:::o;15664:::-;15806:3;15827:67;15891:2;15886:3;15827:67;:::i;:::-;15820:74;;15903:93;15992:3;15903:93;:::i;:::-;16021:2;16016:3;16012:12;16005:19;;15664:366;;;:::o;16036:::-;16178:3;16199:67;16263:2;16258:3;16199:67;:::i;:::-;16192:74;;16275:93;16364:3;16275:93;:::i;:::-;16393:2;16388:3;16384:12;16377:19;;16036:366;;;:::o;16408:::-;16550:3;16571:67;16635:2;16630:3;16571:67;:::i;:::-;16564:74;;16647:93;16736:3;16647:93;:::i;:::-;16765:2;16760:3;16756:12;16749:19;;16408:366;;;:::o;16780:::-;16922:3;16943:67;17007:2;17002:3;16943:67;:::i;:::-;16936:74;;17019:93;17108:3;17019:93;:::i;:::-;17137:2;17132:3;17128:12;17121:19;;16780:366;;;:::o;17152:::-;17294:3;17315:67;17379:2;17374:3;17315:67;:::i;:::-;17308:74;;17391:93;17480:3;17391:93;:::i;:::-;17509:2;17504:3;17500:12;17493:19;;17152:366;;;:::o;17524:::-;17666:3;17687:67;17751:2;17746:3;17687:67;:::i;:::-;17680:74;;17763:93;17852:3;17763:93;:::i;:::-;17881:2;17876:3;17872:12;17865:19;;17524:366;;;:::o;17896:::-;18038:3;18059:67;18123:2;18118:3;18059:67;:::i;:::-;18052:74;;18135:93;18224:3;18135:93;:::i;:::-;18253:2;18248:3;18244:12;18237:19;;17896:366;;;:::o;18268:::-;18410:3;18431:67;18495:2;18490:3;18431:67;:::i;:::-;18424:74;;18507:93;18596:3;18507:93;:::i;:::-;18625:2;18620:3;18616:12;18609:19;;18268:366;;;:::o;18640:::-;18782:3;18803:67;18867:2;18862:3;18803:67;:::i;:::-;18796:74;;18879:93;18968:3;18879:93;:::i;:::-;18997:2;18992:3;18988:12;18981:19;;18640:366;;;:::o;19012:::-;19154:3;19175:67;19239:2;19234:3;19175:67;:::i;:::-;19168:74;;19251:93;19340:3;19251:93;:::i;:::-;19369:2;19364:3;19360:12;19353:19;;19012:366;;;:::o;19384:::-;19526:3;19547:67;19611:2;19606:3;19547:67;:::i;:::-;19540:74;;19623:93;19712:3;19623:93;:::i;:::-;19741:2;19736:3;19732:12;19725:19;;19384:366;;;:::o;19756:::-;19898:3;19919:67;19983:2;19978:3;19919:67;:::i;:::-;19912:74;;19995:93;20084:3;19995:93;:::i;:::-;20113:2;20108:3;20104:12;20097:19;;19756:366;;;:::o;20128:::-;20270:3;20291:67;20355:2;20350:3;20291:67;:::i;:::-;20284:74;;20367:93;20456:3;20367:93;:::i;:::-;20485:2;20480:3;20476:12;20469:19;;20128:366;;;:::o;20500:::-;20642:3;20663:67;20727:2;20722:3;20663:67;:::i;:::-;20656:74;;20739:93;20828:3;20739:93;:::i;:::-;20857:2;20852:3;20848:12;20841:19;;20500:366;;;:::o;20872:::-;21014:3;21035:67;21099:2;21094:3;21035:67;:::i;:::-;21028:74;;21111:93;21200:3;21111:93;:::i;:::-;21229:2;21224:3;21220:12;21213:19;;20872:366;;;:::o;21244:::-;21386:3;21407:67;21471:2;21466:3;21407:67;:::i;:::-;21400:74;;21483:93;21572:3;21483:93;:::i;:::-;21601:2;21596:3;21592:12;21585:19;;21244:366;;;:::o;21616:::-;21758:3;21779:67;21843:2;21838:3;21779:67;:::i;:::-;21772:74;;21855:93;21944:3;21855:93;:::i;:::-;21973:2;21968:3;21964:12;21957:19;;21616:366;;;:::o;21988:108::-;22065:24;22083:5;22065:24;:::i;:::-;22060:3;22053:37;21988:108;;:::o;22102:118::-;22189:24;22207:5;22189:24;:::i;:::-;22184:3;22177:37;22102:118;;:::o;22226:112::-;22309:22;22325:5;22309:22;:::i;:::-;22304:3;22297:35;22226:112;;:::o;22344:589::-;22569:3;22591:95;22682:3;22673:6;22591:95;:::i;:::-;22584:102;;22703:95;22794:3;22785:6;22703:95;:::i;:::-;22696:102;;22815:92;22903:3;22894:6;22815:92;:::i;:::-;22808:99;;22924:3;22917:10;;22344:589;;;;;;:::o;22939:222::-;23032:4;23070:2;23059:9;23055:18;23047:26;;23083:71;23151:1;23140:9;23136:17;23127:6;23083:71;:::i;:::-;22939:222;;;;:::o;23167:442::-;23316:4;23354:2;23343:9;23339:18;23331:26;;23367:71;23435:1;23424:9;23420:17;23411:6;23367:71;:::i;:::-;23448:72;23516:2;23505:9;23501:18;23492:6;23448:72;:::i;:::-;23530;23598:2;23587:9;23583:18;23574:6;23530:72;:::i;:::-;23167:442;;;;;;:::o;23615:640::-;23810:4;23848:3;23837:9;23833:19;23825:27;;23862:71;23930:1;23919:9;23915:17;23906:6;23862:71;:::i;:::-;23943:72;24011:2;24000:9;23996:18;23987:6;23943:72;:::i;:::-;24025;24093:2;24082:9;24078:18;24069:6;24025:72;:::i;:::-;24144:9;24138:4;24134:20;24129:2;24118:9;24114:18;24107:48;24172:76;24243:4;24234:6;24172:76;:::i;:::-;24164:84;;23615:640;;;;;;;:::o;24261:373::-;24404:4;24442:2;24431:9;24427:18;24419:26;;24491:9;24485:4;24481:20;24477:1;24466:9;24462:17;24455:47;24519:108;24622:4;24613:6;24519:108;:::i;:::-;24511:116;;24261:373;;;;:::o;24640:210::-;24727:4;24765:2;24754:9;24750:18;24742:26;;24778:65;24840:1;24829:9;24825:17;24816:6;24778:65;:::i;:::-;24640:210;;;;:::o;24856:252::-;24964:4;25002:2;24991:9;24987:18;24979:26;;25015:86;25098:1;25087:9;25083:17;25074:6;25015:86;:::i;:::-;24856:252;;;;:::o;25114:313::-;25227:4;25265:2;25254:9;25250:18;25242:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25342:78;25415:4;25406:6;25342:78;:::i;:::-;25334:86;;25114:313;;;;:::o;25433:419::-;25599:4;25637:2;25626:9;25622:18;25614:26;;25686:9;25680:4;25676:20;25672:1;25661:9;25657:17;25650:47;25714:131;25840:4;25714:131;:::i;:::-;25706:139;;25433:419;;;:::o;25858:::-;26024:4;26062:2;26051:9;26047:18;26039:26;;26111:9;26105:4;26101:20;26097:1;26086:9;26082:17;26075:47;26139:131;26265:4;26139:131;:::i;:::-;26131:139;;25858:419;;;:::o;26283:::-;26449:4;26487:2;26476:9;26472:18;26464:26;;26536:9;26530:4;26526:20;26522:1;26511:9;26507:17;26500:47;26564:131;26690:4;26564:131;:::i;:::-;26556:139;;26283:419;;;:::o;26708:::-;26874:4;26912:2;26901:9;26897:18;26889:26;;26961:9;26955:4;26951:20;26947:1;26936:9;26932:17;26925:47;26989:131;27115:4;26989:131;:::i;:::-;26981:139;;26708:419;;;:::o;27133:::-;27299:4;27337:2;27326:9;27322:18;27314:26;;27386:9;27380:4;27376:20;27372:1;27361:9;27357:17;27350:47;27414:131;27540:4;27414:131;:::i;:::-;27406:139;;27133:419;;;:::o;27558:::-;27724:4;27762:2;27751:9;27747:18;27739:26;;27811:9;27805:4;27801:20;27797:1;27786:9;27782:17;27775:47;27839:131;27965:4;27839:131;:::i;:::-;27831:139;;27558:419;;;:::o;27983:::-;28149:4;28187:2;28176:9;28172:18;28164:26;;28236:9;28230:4;28226:20;28222:1;28211:9;28207:17;28200:47;28264:131;28390:4;28264:131;:::i;:::-;28256:139;;27983:419;;;:::o;28408:::-;28574:4;28612:2;28601:9;28597:18;28589:26;;28661:9;28655:4;28651:20;28647:1;28636:9;28632:17;28625:47;28689:131;28815:4;28689:131;:::i;:::-;28681:139;;28408:419;;;:::o;28833:::-;28999:4;29037:2;29026:9;29022:18;29014:26;;29086:9;29080:4;29076:20;29072:1;29061:9;29057:17;29050:47;29114:131;29240:4;29114:131;:::i;:::-;29106:139;;28833:419;;;:::o;29258:::-;29424:4;29462:2;29451:9;29447:18;29439:26;;29511:9;29505:4;29501:20;29497:1;29486:9;29482:17;29475:47;29539:131;29665:4;29539:131;:::i;:::-;29531:139;;29258:419;;;:::o;29683:::-;29849:4;29887:2;29876:9;29872:18;29864:26;;29936:9;29930:4;29926:20;29922:1;29911:9;29907:17;29900:47;29964:131;30090:4;29964:131;:::i;:::-;29956:139;;29683:419;;;:::o;30108:::-;30274:4;30312:2;30301:9;30297:18;30289:26;;30361:9;30355:4;30351:20;30347:1;30336:9;30332:17;30325:47;30389:131;30515:4;30389:131;:::i;:::-;30381:139;;30108:419;;;:::o;30533:::-;30699:4;30737:2;30726:9;30722:18;30714:26;;30786:9;30780:4;30776:20;30772:1;30761:9;30757:17;30750:47;30814:131;30940:4;30814:131;:::i;:::-;30806:139;;30533:419;;;:::o;30958:::-;31124:4;31162:2;31151:9;31147:18;31139:26;;31211:9;31205:4;31201:20;31197:1;31186:9;31182:17;31175:47;31239:131;31365:4;31239:131;:::i;:::-;31231:139;;30958:419;;;:::o;31383:::-;31549:4;31587:2;31576:9;31572:18;31564:26;;31636:9;31630:4;31626:20;31622:1;31611:9;31607:17;31600:47;31664:131;31790:4;31664:131;:::i;:::-;31656:139;;31383:419;;;:::o;31808:::-;31974:4;32012:2;32001:9;31997:18;31989:26;;32061:9;32055:4;32051:20;32047:1;32036:9;32032:17;32025:47;32089:131;32215:4;32089:131;:::i;:::-;32081:139;;31808:419;;;:::o;32233:::-;32399:4;32437:2;32426:9;32422:18;32414:26;;32486:9;32480:4;32476:20;32472:1;32461:9;32457:17;32450:47;32514:131;32640:4;32514:131;:::i;:::-;32506:139;;32233:419;;;:::o;32658:::-;32824:4;32862:2;32851:9;32847:18;32839:26;;32911:9;32905:4;32901:20;32897:1;32886:9;32882:17;32875:47;32939:131;33065:4;32939:131;:::i;:::-;32931:139;;32658:419;;;:::o;33083:::-;33249:4;33287:2;33276:9;33272:18;33264:26;;33336:9;33330:4;33326:20;33322:1;33311:9;33307:17;33300:47;33364:131;33490:4;33364:131;:::i;:::-;33356:139;;33083:419;;;:::o;33508:::-;33674:4;33712:2;33701:9;33697:18;33689:26;;33761:9;33755:4;33751:20;33747:1;33736:9;33732:17;33725:47;33789:131;33915:4;33789:131;:::i;:::-;33781:139;;33508:419;;;:::o;33933:::-;34099:4;34137:2;34126:9;34122:18;34114:26;;34186:9;34180:4;34176:20;34172:1;34161:9;34157:17;34150:47;34214:131;34340:4;34214:131;:::i;:::-;34206:139;;33933:419;;;:::o;34358:::-;34524:4;34562:2;34551:9;34547:18;34539:26;;34611:9;34605:4;34601:20;34597:1;34586:9;34582:17;34575:47;34639:131;34765:4;34639:131;:::i;:::-;34631:139;;34358:419;;;:::o;34783:::-;34949:4;34987:2;34976:9;34972:18;34964:26;;35036:9;35030:4;35026:20;35022:1;35011:9;35007:17;35000:47;35064:131;35190:4;35064:131;:::i;:::-;35056:139;;34783:419;;;:::o;35208:::-;35374:4;35412:2;35401:9;35397:18;35389:26;;35461:9;35455:4;35451:20;35447:1;35436:9;35432:17;35425:47;35489:131;35615:4;35489:131;:::i;:::-;35481:139;;35208:419;;;:::o;35633:::-;35799:4;35837:2;35826:9;35822:18;35814:26;;35886:9;35880:4;35876:20;35872:1;35861:9;35857:17;35850:47;35914:131;36040:4;35914:131;:::i;:::-;35906:139;;35633:419;;;:::o;36058:222::-;36151:4;36189:2;36178:9;36174:18;36166:26;;36202:71;36270:1;36259:9;36255:17;36246:6;36202:71;:::i;:::-;36058:222;;;;:::o;36286:332::-;36407:4;36445:2;36434:9;36430:18;36422:26;;36458:71;36526:1;36515:9;36511:17;36502:6;36458:71;:::i;:::-;36539:72;36607:2;36596:9;36592:18;36583:6;36539:72;:::i;:::-;36286:332;;;;;:::o;36624:214::-;36713:4;36751:2;36740:9;36736:18;36728:26;;36764:67;36828:1;36817:9;36813:17;36804:6;36764:67;:::i;:::-;36624:214;;;;:::o;36844:129::-;36878:6;36905:20;;:::i;:::-;36895:30;;36934:33;36962:4;36954:6;36934:33;:::i;:::-;36844:129;;;:::o;36979:75::-;37012:6;37045:2;37039:9;37029:19;;36979:75;:::o;37060:311::-;37137:4;37227:18;37219:6;37216:30;37213:56;;;37249:18;;:::i;:::-;37213:56;37299:4;37291:6;37287:17;37279:25;;37359:4;37353;37349:15;37341:23;;37060:311;;;:::o;37377:307::-;37438:4;37528:18;37520:6;37517:30;37514:56;;;37550:18;;:::i;:::-;37514:56;37588:29;37610:6;37588:29;:::i;:::-;37580:37;;37672:4;37666;37662:15;37654:23;;37377:307;;;:::o;37690:308::-;37752:4;37842:18;37834:6;37831:30;37828:56;;;37864:18;;:::i;:::-;37828:56;37902:29;37924:6;37902:29;:::i;:::-;37894:37;;37986:4;37980;37976:15;37968:23;;37690:308;;;:::o;38004:132::-;38071:4;38094:3;38086:11;;38124:4;38119:3;38115:14;38107:22;;38004:132;;;:::o;38142:141::-;38191:4;38214:3;38206:11;;38237:3;38234:1;38227:14;38271:4;38268:1;38258:18;38250:26;;38142:141;;;:::o;38289:114::-;38356:6;38390:5;38384:12;38374:22;;38289:114;;;:::o;38409:98::-;38460:6;38494:5;38488:12;38478:22;;38409:98;;;:::o;38513:99::-;38565:6;38599:5;38593:12;38583:22;;38513:99;;;:::o;38618:113::-;38688:4;38720;38715:3;38711:14;38703:22;;38618:113;;;:::o;38737:184::-;38836:11;38870:6;38865:3;38858:19;38910:4;38905:3;38901:14;38886:29;;38737:184;;;;:::o;38927:168::-;39010:11;39044:6;39039:3;39032:19;39084:4;39079:3;39075:14;39060:29;;38927:168;;;;:::o;39101:169::-;39185:11;39219:6;39214:3;39207:19;39259:4;39254:3;39250:14;39235:29;;39101:169;;;;:::o;39276:148::-;39378:11;39415:3;39400:18;;39276:148;;;;:::o;39430:305::-;39470:3;39489:20;39507:1;39489:20;:::i;:::-;39484:25;;39523:20;39541:1;39523:20;:::i;:::-;39518:25;;39677:1;39609:66;39605:74;39602:1;39599:81;39596:107;;;39683:18;;:::i;:::-;39596:107;39727:1;39724;39720:9;39713:16;;39430:305;;;;:::o;39741:185::-;39781:1;39798:20;39816:1;39798:20;:::i;:::-;39793:25;;39832:20;39850:1;39832:20;:::i;:::-;39827:25;;39871:1;39861:35;;39876:18;;:::i;:::-;39861:35;39918:1;39915;39911:9;39906:14;;39741:185;;;;:::o;39932:191::-;39972:4;39992:20;40010:1;39992:20;:::i;:::-;39987:25;;40026:20;40044:1;40026:20;:::i;:::-;40021:25;;40065:1;40062;40059:8;40056:34;;;40070:18;;:::i;:::-;40056:34;40115:1;40112;40108:9;40100:17;;39932:191;;;;:::o;40129:96::-;40166:7;40195:24;40213:5;40195:24;:::i;:::-;40184:35;;40129:96;;;:::o;40231:90::-;40265:7;40308:5;40301:13;40294:21;40283:32;;40231:90;;;:::o;40327:149::-;40363:7;40403:66;40396:5;40392:78;40381:89;;40327:149;;;:::o;40482:126::-;40519:7;40559:42;40552:5;40548:54;40537:65;;40482:126;;;:::o;40614:77::-;40651:7;40680:5;40669:16;;40614:77;;;:::o;40697:86::-;40732:7;40772:4;40765:5;40761:16;40750:27;;40697:86;;;:::o;40789:141::-;40854:9;40887:37;40918:5;40887:37;:::i;:::-;40874:50;;40789:141;;;:::o;40936:126::-;40986:9;41019:37;41050:5;41019:37;:::i;:::-;41006:50;;40936:126;;;:::o;41068:113::-;41118:9;41151:24;41169:5;41151:24;:::i;:::-;41138:37;;41068:113;;;:::o;41187:154::-;41271:6;41266:3;41261;41248:30;41333:1;41324:6;41319:3;41315:16;41308:27;41187:154;;;:::o;41347:307::-;41415:1;41425:113;41439:6;41436:1;41433:13;41425:113;;;41524:1;41519:3;41515:11;41509:18;41505:1;41500:3;41496:11;41489:39;41461:2;41458:1;41454:10;41449:15;;41425:113;;;41556:6;41553:1;41550:13;41547:101;;;41636:1;41627:6;41622:3;41618:16;41611:27;41547:101;41396:258;41347:307;;;:::o;41660:320::-;41704:6;41741:1;41735:4;41731:12;41721:22;;41788:1;41782:4;41778:12;41809:18;41799:81;;41865:4;41857:6;41853:17;41843:27;;41799:81;41927:2;41919:6;41916:14;41896:18;41893:38;41890:84;;;41946:18;;:::i;:::-;41890:84;41711:269;41660:320;;;:::o;41986:281::-;42069:27;42091:4;42069:27;:::i;:::-;42061:6;42057:40;42199:6;42187:10;42184:22;42163:18;42151:10;42148:34;42145:62;42142:88;;;42210:18;;:::i;:::-;42142:88;42250:10;42246:2;42239:22;42029:238;41986:281;;:::o;42273:233::-;42312:3;42335:24;42353:5;42335:24;:::i;:::-;42326:33;;42381:66;42374:5;42371:77;42368:103;;;42451:18;;:::i;:::-;42368:103;42498:1;42491:5;42487:13;42480:20;;42273:233;;;:::o;42512:167::-;42549:3;42572:22;42588:5;42572:22;:::i;:::-;42563:31;;42616:4;42609:5;42606:15;42603:41;;;42624:18;;:::i;:::-;42603:41;42671:1;42664:5;42660:13;42653:20;;42512:167;;;:::o;42685:176::-;42717:1;42734:20;42752:1;42734:20;:::i;:::-;42729:25;;42768:20;42786:1;42768:20;:::i;:::-;42763:25;;42807:1;42797:35;;42812:18;;:::i;:::-;42797:35;42853:1;42850;42846:9;42841:14;;42685:176;;;;:::o;42867:180::-;42915:77;42912:1;42905:88;43012:4;43009:1;43002:15;43036:4;43033:1;43026:15;43053:180;43101:77;43098:1;43091:88;43198:4;43195:1;43188:15;43222:4;43219:1;43212:15;43239:180;43287:77;43284:1;43277:88;43384:4;43381:1;43374:15;43408:4;43405:1;43398:15;43425:180;43473:77;43470:1;43463:88;43570:4;43567:1;43560:15;43594:4;43591:1;43584:15;43611:180;43659:77;43656:1;43649:88;43756:4;43753:1;43746:15;43780:4;43777:1;43770:15;43797:180;43845:77;43842:1;43835:88;43942:4;43939:1;43932:15;43966:4;43963:1;43956:15;43983:117;44092:1;44089;44082:12;44106:117;44215:1;44212;44205:12;44229:117;44338:1;44335;44328:12;44352:117;44461:1;44458;44451:12;44475:117;44584:1;44581;44574:12;44598:102;44639:6;44690:2;44686:7;44681:2;44674:5;44670:14;44666:28;44656:38;;44598:102;;;:::o;44706:230::-;44846:34;44842:1;44834:6;44830:14;44823:58;44915:13;44910:2;44902:6;44898:15;44891:38;44706:230;:::o;44942:170::-;45082:22;45078:1;45070:6;45066:14;45059:46;44942:170;:::o;45118:166::-;45258:18;45254:1;45246:6;45242:14;45235:42;45118:166;:::o;45290:168::-;45430:20;45426:1;45418:6;45414:14;45407:44;45290:168;:::o;45464:230::-;45604:34;45600:1;45592:6;45588:14;45581:58;45673:13;45668:2;45660:6;45656:15;45649:38;45464:230;:::o;45700:237::-;45840:34;45836:1;45828:6;45824:14;45817:58;45909:20;45904:2;45896:6;45892:15;45885:45;45700:237;:::o;45943:168::-;46083:20;46079:1;46071:6;46067:14;46060:44;45943:168;:::o;46117:225::-;46257:34;46253:1;46245:6;46241:14;46234:58;46326:8;46321:2;46313:6;46309:15;46302:33;46117:225;:::o;46348:224::-;46488:34;46484:1;46476:6;46472:14;46465:58;46557:7;46552:2;46544:6;46540:15;46533:32;46348:224;:::o;46578:178::-;46718:30;46714:1;46706:6;46702:14;46695:54;46578:178;:::o;46762:223::-;46902:34;46898:1;46890:6;46886:14;46879:58;46971:6;46966:2;46958:6;46954:15;46947:31;46762:223;:::o;46991:175::-;47131:27;47127:1;47119:6;47115:14;47108:51;46991:175;:::o;47172:166::-;47312:18;47308:1;47300:6;47296:14;47289:42;47172:166;:::o;47344:167::-;47484:19;47480:1;47472:6;47468:14;47461:43;47344:167;:::o;47517:228::-;47657:34;47653:1;47645:6;47641:14;47634:58;47726:11;47721:2;47713:6;47709:15;47702:36;47517:228;:::o;47751:249::-;47891:34;47887:1;47879:6;47875:14;47868:58;47960:32;47955:2;47947:6;47943:15;47936:57;47751:249;:::o;48006:182::-;48146:34;48142:1;48134:6;48130:14;48123:58;48006:182;:::o;48194:::-;48334:34;48330:1;48322:6;48318:14;48311:58;48194:182;:::o;48382:234::-;48522:34;48518:1;48510:6;48506:14;48499:58;48591:17;48586:2;48578:6;48574:15;48567:42;48382:234;:::o;48622:174::-;48762:26;48758:1;48750:6;48746:14;48739:50;48622:174;:::o;48802:220::-;48942:34;48938:1;48930:6;48926:14;48919:58;49011:3;49006:2;48998:6;48994:15;48987:28;48802:220;:::o;49028:167::-;49168:19;49164:1;49156:6;49152:14;49145:43;49028:167;:::o;49201:231::-;49341:34;49337:1;49329:6;49325:14;49318:58;49410:14;49405:2;49397:6;49393:15;49386:39;49201:231;:::o;49438:233::-;49578:34;49574:1;49566:6;49562:14;49555:58;49647:16;49642:2;49634:6;49630:15;49623:41;49438:233;:::o;49677:181::-;49817:33;49813:1;49805:6;49801:14;49794:57;49677:181;:::o;49864:122::-;49937:24;49955:5;49937:24;:::i;:::-;49930:5;49927:35;49917:63;;49976:1;49973;49966:12;49917:63;49864:122;:::o;49992:116::-;50062:21;50077:5;50062:21;:::i;:::-;50055:5;50052:32;50042:60;;50098:1;50095;50088:12;50042:60;49992:116;:::o;50114:120::-;50186:23;50203:5;50186:23;:::i;:::-;50179:5;50176:34;50166:62;;50224:1;50221;50214:12;50166:62;50114:120;:::o;50240:122::-;50313:24;50331:5;50313:24;:::i;:::-;50306:5;50303:35;50293:63;;50352:1;50349;50342:12;50293:63;50240:122;:::o
Swarm Source
ipfs://61885066131c6c3726d9f0000523a024b9320c66dc8b19972d71de4bf644c61e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.