ERC-721
Overview
Max Total Supply
7,833 BLURG
Holders
418
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
20 BLURGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
moonblurgs
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-02 */ // 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 v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/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: contracts/ERC721A.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721A: balance query for the zero address" ); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); string memory baseURIeggs = _baseURIeggs(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : baseURIeggs; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURIeggs() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721A: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721A: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/4_moonblurgs.sol pragma solidity ^0.8.4; contract moonblurgs is Ownable, ERC721A, ReentrancyGuard { uint256 public immutable maxPerAddressDuringMint; uint256 public immutable publicPrice; mapping(address => uint256) public allowlist; constructor() ERC721A("moonblurgs.wtf", "BLURG", 20, 7833) { maxPerAddressDuringMint = 20; publicPrice = 0; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function publicSaleMint(uint256 quantity) external payable callerIsUser { require(isPublicSaleOn(), "public sale has not begun yet"); require( totalSupply() + quantity <= collectionSize, "reached max supply" ); require(quantity <= maxPerAddressDuringMint, "max 20 per transaction"); _safeMint(msg.sender, quantity); } function refundIfOver(uint256 price) private { require(msg.value >= price, "Need to send more ETH."); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } // For marketing etc. function devMint(uint256 quantity) external onlyOwner { for (uint256 i = 0; i < quantity; i++) { _safeMint(msg.sender, maxPerAddressDuringMint); } } string private _baseTokenURI; string private _baseTokenURIeggs; bool private _isPublicSaleActive; function isPublicSaleOn() public view returns (bool) { return _isPublicSaleActive; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function _baseURIeggs() internal view virtual override returns (string memory) { return _baseTokenURIeggs; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function setBaseURIeggs(string calldata baseURI) external onlyOwner { _baseTokenURIeggs = baseURI; } function setPublicSaleState(bool state) external onlyOwner { _isPublicSaleActive = state; } function withdrawMoney() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant { _setOwnersExplicit(quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","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":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURIeggs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052600060015560006008553480156200001c57600080fd5b506040518060400160405280600e81526020017f6d6f6f6e626c757267732e7774660000000000000000000000000000000000008152506040518060400160405280600581526020017f424c5552470000000000000000000000000000000000000000000000000000008152506014611e99620000ae620000a2620001a060201b60201c565b620001a860201b60201c565b60008111620000f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000eb906200038c565b60405180910390fd5b600082116200013a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000131906200036a565b60405180910390fd5b8360029080519060200190620001529291906200026c565b5082600390805190602001906200016b9291906200026c565b508160a081815250508060808181525050505050506001600981905550601460c08181525050600060e08181525050620004c2565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027a90620003bf565b90600052602060002090601f0160209004810192826200029e5760008555620002ea565b82601f10620002b957805160ff1916838001178555620002ea565b82800160010185558215620002ea579182015b82811115620002e9578251825591602001919060010190620002cc565b5b509050620002f99190620002fd565b5090565b5b8082111562000318576000816000905550600101620002fe565b5090565b60006200032b602783620003ae565b9150620003388262000424565b604082019050919050565b600062000352602e83620003ae565b91506200035f8262000473565b604082019050919050565b6000602082019050818103600083015262000385816200031c565b9050919050565b60006020820190508181036000830152620003a78162000343565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620003d857607f821691505b60208210811415620003ef57620003ee620003f5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a05160c05160e051614de062000526600039600061158f015260008181610ef401528181611266015261185e01526000818161255c015281816125850152612da20152600081816117e9015281816122c601526122fa0152614de06000f3fe6080604052600436106101ee5760003560e01c80637987fb471161010d578063a945bf80116100a0578063c87b56dd1161006f578063c87b56dd146106ec578063d7224ba014610729578063dc33e68114610754578063e985e9c514610791578063f2fde38b146107ce576101ee565b8063a945bf8014610665578063ac44600214610690578063b3ab66b0146106a7578063b88d4fde146106c3576101ee565b80639293a5c7116100dc5780639293a5c7146105ab57806395d89b41146105d4578063a22cb465146105ff578063a7cd52cb14610628576101ee565b80637987fb47146104ef5780638bc35c2f146105185780638da5cb5b146105435780639231ab2a1461056e576101ee565b8063375a069a1161018557806355f804b31161015457806355f804b3146104355780636352211e1461045e57806370a082311461049b578063715018a6146104d8576101ee565b8063375a069a1461037b5780633f5e4741146103a457806342842e0e146103cf5780634f6ccce7146103f8576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec5780632d20fb60146103155780632f745c591461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906135df565b6107f7565b6040516102279190613cb8565b60405180910390f35b34801561023c57600080fd5b50610245610941565b6040516102529190613cd3565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613686565b6109d3565b60405161028f9190613c51565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613572565b610a58565b005b3480156102cd57600080fd5b506102d6610b71565b6040516102e391906140b0565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e919061345c565b610b7b565b005b34801561032157600080fd5b5061033c60048036038101906103379190613686565b610b8b565b005b34801561034a57600080fd5b5061036560048036038101906103609190613572565b610c69565b60405161037291906140b0565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190613686565b610e67565b005b3480156103b057600080fd5b506103b9610f2f565b6040516103c69190613cb8565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f1919061345c565b610f46565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613686565b610f66565b60405161042c91906140b0565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613639565b610fb9565b005b34801561046a57600080fd5b5061048560048036038101906104809190613686565b61104b565b6040516104929190613c51565b60405180910390f35b3480156104a757600080fd5b506104c260048036038101906104bd91906133ef565b611061565b6040516104cf91906140b0565b60405180910390f35b3480156104e457600080fd5b506104ed61114a565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613639565b6111d2565b005b34801561052457600080fd5b5061052d611264565b60405161053a91906140b0565b60405180910390f35b34801561054f57600080fd5b50610558611288565b6040516105659190613c51565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613686565b6112b1565b6040516105a29190614095565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906135b2565b6112c9565b005b3480156105e057600080fd5b506105e9611362565b6040516105f69190613cd3565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190613532565b6113f4565b005b34801561063457600080fd5b5061064f600480360381019061064a91906133ef565b611575565b60405161065c91906140b0565b60405180910390f35b34801561067157600080fd5b5061067a61158d565b60405161068791906140b0565b60405180910390f35b34801561069c57600080fd5b506106a56115b1565b005b6106c160048036038101906106bc9190613686565b611732565b005b3480156106cf57600080fd5b506106ea60048036038101906106e591906134af565b6118cc565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613686565b611928565b6040516107209190613cd3565b60405180910390f35b34801561073557600080fd5b5061073e6119cd565b60405161074b91906140b0565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906133ef565b6119d3565b60405161078891906140b0565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b3919061341c565b6119e5565b6040516107c59190613cb8565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f091906133ef565b611a79565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061093a575061093982611b71565b5b9050919050565b606060028054610950906143b4565b80601f016020809104026020016040519081016040528092919081815260200182805461097c906143b4565b80156109c95780601f1061099e576101008083540402835291602001916109c9565b820191906000526020600020905b8154815290600101906020018083116109ac57829003601f168201915b5050505050905090565b60006109de82611bdb565b610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490614055565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a638261104b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90613f35565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af3611be9565b73ffffffffffffffffffffffffffffffffffffffff161480610b225750610b2181610b1c611be9565b6119e5565b5b610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5890613df5565b60405180910390fd5b610b6c838383611bf1565b505050565b6000600154905090565b610b86838383611ca3565b505050565b610b93611be9565b73ffffffffffffffffffffffffffffffffffffffff16610bb1611288565b73ffffffffffffffffffffffffffffffffffffffff1614610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90613e95565b60405180910390fd5b60026009541415610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4490614015565b60405180910390fd5b6002600981905550610c5e8161225c565b600160098190555050565b6000610c7483611061565b8210610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90613cf5565b60405180910390fd5b6000610cbf610b71565b905060008060005b83811015610e25576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610db957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e115786841415610e02578195505050505050610e61565b8380610e0d90614417565b9450505b508080610e1d90614417565b915050610cc7565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613fd5565b60405180910390fd5b92915050565b610e6f611be9565b73ffffffffffffffffffffffffffffffffffffffff16610e8d611288565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda90613e95565b60405180910390fd5b60005b81811015610f2b57610f18337f00000000000000000000000000000000000000000000000000000000000000006124ea565b8080610f2390614417565b915050610ee6565b5050565b6000600d60009054906101000a900460ff16905090565b610f61838383604051806020016040528060008152506118cc565b505050565b6000610f70610b71565b8210610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890613d75565b60405180910390fd5b819050919050565b610fc1611be9565b73ffffffffffffffffffffffffffffffffffffffff16610fdf611288565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90613e95565b60405180910390fd5b8181600b91906110469291906131e3565b505050565b600061105682612508565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613e35565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611152611be9565b73ffffffffffffffffffffffffffffffffffffffff16611170611288565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90613e95565b60405180910390fd5b6111d0600061270b565b565b6111da611be9565b73ffffffffffffffffffffffffffffffffffffffff166111f8611288565b73ffffffffffffffffffffffffffffffffffffffff161461124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613e95565b60405180910390fd5b8181600c919061125f9291906131e3565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112b9613269565b6112c282612508565b9050919050565b6112d1611be9565b73ffffffffffffffffffffffffffffffffffffffff166112ef611288565b73ffffffffffffffffffffffffffffffffffffffff1614611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90613e95565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b606060038054611371906143b4565b80601f016020809104026020016040519081016040528092919081815260200182805461139d906143b4565b80156113ea5780601f106113bf576101008083540402835291602001916113ea565b820191906000526020600020905b8154815290600101906020018083116113cd57829003601f168201915b5050505050905090565b6113fc611be9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561146a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146190613ed5565b60405180910390fd5b8060076000611477611be9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611524611be9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115699190613cb8565b60405180910390a35050565b600a6020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6115b9611be9565b73ffffffffffffffffffffffffffffffffffffffff166115d7611288565b73ffffffffffffffffffffffffffffffffffffffff161461162d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162490613e95565b60405180910390fd5b60026009541415611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90614015565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516116a190613c3c565b60006040518083038185875af1925050503d80600081146116de576040519150601f19603f3d011682016040523d82523d6000602084013e6116e3565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90613f55565b60405180910390fd5b506001600981905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179790613dd5565b60405180910390fd5b6117a8610f2f565b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90613f15565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611811610b71565b61181b91906141b5565b111561185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390613e55565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008111156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613d55565b60405180910390fd5b6118c933826124ea565b50565b6118d7848484611ca3565b6118e3848484846127cf565b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990613f75565b60405180910390fd5b50505050565b606061193382611bdb565b611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990613eb5565b60405180910390fd5b600061197c612966565b905060006119886129f8565b9050600082511161199957806119c4565b816119a385612a8a565b6040516020016119b4929190613c0d565b6040516020818303038152906040525b92505050919050565b60085481565b60006119de82612beb565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a81611be9565b73ffffffffffffffffffffffffffffffffffffffff16611a9f611288565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90613e95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c90613d15565b60405180910390fd5b611b6e8161270b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611cae82612508565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cd5611be9565b73ffffffffffffffffffffffffffffffffffffffff161480611d315750611cfa611be9565b73ffffffffffffffffffffffffffffffffffffffff16611d19846109d3565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d4d5750611d4c8260000151611d47611be9565b6119e5565b5b905080611d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8690613ef5565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df890613e75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890613d95565b60405180910390fd5b611e7e8585856001612cd4565b611e8e6000848460000151611bf1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611efc919061423c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611fa0919061416f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120a691906141b5565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121ec5761211c81611bdb565b156121eb576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122548686866001612cda565b505050505050565b60006008549050600082116122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90613e15565b60405180910390fd5b6000600183836122b691906141b5565b6122c09190614270565b905060017f00000000000000000000000000000000000000000000000000000000000000006122ef9190614270565b8111156123265760017f00000000000000000000000000000000000000000000000000000000000000006123239190614270565b90505b61232f81611bdb565b61236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236590613ff5565b60405180910390fd5b60008290505b8181116124d157600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124be5760006123f182612508565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b80806124c990614417565b915050612374565b506001816124df91906141b5565b600881905550505050565b612504828260405180602001604052806000815250612ce0565b5050565b612510613269565b61251982611bdb565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90613d35565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106125bc5760017f0000000000000000000000000000000000000000000000000000000000000000846125af9190614270565b6125b991906141b5565b90505b60008390505b8181106126ca576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126b657809350505050612706565b5080806126c29061438a565b9150506125c2565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fd90614035565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006127f08473ffffffffffffffffffffffffffffffffffffffff166131c0565b15612959578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612819611be9565b8786866040518563ffffffff1660e01b815260040161283b9493929190613c6c565b602060405180830381600087803b15801561285557600080fd5b505af192505050801561288657506040513d601f19601f82011682018060405250810190612883919061360c565b60015b612909573d80600081146128b6576040519150601f19603f3d011682016040523d82523d6000602084013e6128bb565b606091505b50600081511415612901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f890613f75565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061295e565b600190505b949350505050565b6060600b8054612975906143b4565b80601f01602080910402602001604051908101604052809291908181526020018280546129a1906143b4565b80156129ee5780601f106129c3576101008083540402835291602001916129ee565b820191906000526020600020905b8154815290600101906020018083116129d157829003601f168201915b5050505050905090565b6060600c8054612a07906143b4565b80601f0160208091040260200160405190810160405280929190818152602001828054612a33906143b4565b8015612a805780601f10612a5557610100808354040283529160200191612a80565b820191906000526020600020905b815481529060010190602001808311612a6357829003601f168201915b5050505050905090565b60606000821415612ad2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be6565b600082905060005b60008214612b04578080612aed90614417565b915050600a82612afd919061420b565b9150612ada565b60008167ffffffffffffffff811115612b2057612b1f61454d565b5b6040519080825280601f01601f191660200182016040528015612b525781602001600182028036833780820191505090505b5090505b60008514612bdf57600182612b6b9190614270565b9150600a85612b7a9190614460565b6030612b8691906141b5565b60f81b818381518110612b9c57612b9b61451e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd8919061420b565b9450612b56565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5390613db5565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4e90613fb5565b60405180910390fd5b612d6081611bdb565b15612da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9790613f95565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfa90614075565b60405180910390fd5b612e106000858386612cd4565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612f0d919061416f565b6fffffffffffffffffffffffffffffffff168152602001858360200151612f34919061416f565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156131a357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461314360008884886127cf565b613182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317990613f75565b60405180910390fd5b818061318d90614417565b925050808061319b90614417565b9150506130d2565b50806001819055506131b86000878588612cda565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546131ef906143b4565b90600052602060002090601f0160209004810192826132115760008555613258565b82601f1061322a57803560ff1916838001178555613258565b82800160010185558215613258579182015b8281111561325757823582559160200191906001019061323c565b5b50905061326591906132a3565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156132bc5760008160009055506001016132a4565b5090565b60006132d36132ce846140f0565b6140cb565b9050828152602081018484840111156132ef576132ee61458b565b5b6132fa848285614348565b509392505050565b60008135905061331181614d4e565b92915050565b60008135905061332681614d65565b92915050565b60008135905061333b81614d7c565b92915050565b60008151905061335081614d7c565b92915050565b600082601f83011261336b5761336a614581565b5b813561337b8482602086016132c0565b91505092915050565b60008083601f84011261339a57613399614581565b5b8235905067ffffffffffffffff8111156133b7576133b661457c565b5b6020830191508360018202830111156133d3576133d2614586565b5b9250929050565b6000813590506133e981614d93565b92915050565b60006020828403121561340557613404614595565b5b600061341384828501613302565b91505092915050565b6000806040838503121561343357613432614595565b5b600061344185828601613302565b925050602061345285828601613302565b9150509250929050565b60008060006060848603121561347557613474614595565b5b600061348386828701613302565b935050602061349486828701613302565b92505060406134a5868287016133da565b9150509250925092565b600080600080608085870312156134c9576134c8614595565b5b60006134d787828801613302565b94505060206134e887828801613302565b93505060406134f9878288016133da565b925050606085013567ffffffffffffffff81111561351a57613519614590565b5b61352687828801613356565b91505092959194509250565b6000806040838503121561354957613548614595565b5b600061355785828601613302565b925050602061356885828601613317565b9150509250929050565b6000806040838503121561358957613588614595565b5b600061359785828601613302565b92505060206135a8858286016133da565b9150509250929050565b6000602082840312156135c8576135c7614595565b5b60006135d684828501613317565b91505092915050565b6000602082840312156135f5576135f4614595565b5b60006136038482850161332c565b91505092915050565b60006020828403121561362257613621614595565b5b600061363084828501613341565b91505092915050565b600080602083850312156136505761364f614595565b5b600083013567ffffffffffffffff81111561366e5761366d614590565b5b61367a85828601613384565b92509250509250929050565b60006020828403121561369c5761369b614595565b5b60006136aa848285016133da565b91505092915050565b6136bc816142a4565b82525050565b6136cb816142a4565b82525050565b6136da816142b6565b82525050565b60006136eb82614121565b6136f58185614137565b9350613705818560208601614357565b61370e8161459a565b840191505092915050565b60006137248261412c565b61372e8185614153565b935061373e818560208601614357565b6137478161459a565b840191505092915050565b600061375d8261412c565b6137678185614164565b9350613777818560208601614357565b80840191505092915050565b6000613790602283614153565b915061379b826145ab565b604082019050919050565b60006137b3602683614153565b91506137be826145fa565b604082019050919050565b60006137d6602a83614153565b91506137e182614649565b604082019050919050565b60006137f9601683614153565b915061380482614698565b602082019050919050565b600061381c602383614153565b9150613827826146c1565b604082019050919050565b600061383f602583614153565b915061384a82614710565b604082019050919050565b6000613862603183614153565b915061386d8261475f565b604082019050919050565b6000613885601e83614153565b9150613890826147ae565b602082019050919050565b60006138a8603983614153565b91506138b3826147d7565b604082019050919050565b60006138cb601883614153565b91506138d682614826565b602082019050919050565b60006138ee602b83614153565b91506138f98261484f565b604082019050919050565b6000613911601283614153565b915061391c8261489e565b602082019050919050565b6000613934602683614153565b915061393f826148c7565b604082019050919050565b6000613957600583614164565b915061396282614916565b600582019050919050565b600061397a602083614153565b91506139858261493f565b602082019050919050565b600061399d602f83614153565b91506139a882614968565b604082019050919050565b60006139c0601a83614153565b91506139cb826149b7565b602082019050919050565b60006139e3603283614153565b91506139ee826149e0565b604082019050919050565b6000613a06601d83614153565b9150613a1182614a2f565b602082019050919050565b6000613a29602283614153565b9150613a3482614a58565b604082019050919050565b6000613a4c600083614148565b9150613a5782614aa7565b600082019050919050565b6000613a6f601083614153565b9150613a7a82614aaa565b602082019050919050565b6000613a92603383614153565b9150613a9d82614ad3565b604082019050919050565b6000613ab5601d83614153565b9150613ac082614b22565b602082019050919050565b6000613ad8602183614153565b9150613ae382614b4b565b604082019050919050565b6000613afb602e83614153565b9150613b0682614b9a565b604082019050919050565b6000613b1e602683614153565b9150613b2982614be9565b604082019050919050565b6000613b41601f83614153565b9150613b4c82614c38565b602082019050919050565b6000613b64602f83614153565b9150613b6f82614c61565b604082019050919050565b6000613b87602d83614153565b9150613b9282614cb0565b604082019050919050565b6000613baa602283614153565b9150613bb582614cff565b604082019050919050565b604082016000820151613bd660008501826136b3565b506020820151613be96020850182613bfe565b50505050565b613bf88161432a565b82525050565b613c0781614334565b82525050565b6000613c198285613752565b9150613c258284613752565b9150613c308261394a565b91508190509392505050565b6000613c4782613a3f565b9150819050919050565b6000602082019050613c6660008301846136c2565b92915050565b6000608082019050613c8160008301876136c2565b613c8e60208301866136c2565b613c9b6040830185613bef565b8181036060830152613cad81846136e0565b905095945050505050565b6000602082019050613ccd60008301846136d1565b92915050565b60006020820190508181036000830152613ced8184613719565b905092915050565b60006020820190508181036000830152613d0e81613783565b9050919050565b60006020820190508181036000830152613d2e816137a6565b9050919050565b60006020820190508181036000830152613d4e816137c9565b9050919050565b60006020820190508181036000830152613d6e816137ec565b9050919050565b60006020820190508181036000830152613d8e8161380f565b9050919050565b60006020820190508181036000830152613dae81613832565b9050919050565b60006020820190508181036000830152613dce81613855565b9050919050565b60006020820190508181036000830152613dee81613878565b9050919050565b60006020820190508181036000830152613e0e8161389b565b9050919050565b60006020820190508181036000830152613e2e816138be565b9050919050565b60006020820190508181036000830152613e4e816138e1565b9050919050565b60006020820190508181036000830152613e6e81613904565b9050919050565b60006020820190508181036000830152613e8e81613927565b9050919050565b60006020820190508181036000830152613eae8161396d565b9050919050565b60006020820190508181036000830152613ece81613990565b9050919050565b60006020820190508181036000830152613eee816139b3565b9050919050565b60006020820190508181036000830152613f0e816139d6565b9050919050565b60006020820190508181036000830152613f2e816139f9565b9050919050565b60006020820190508181036000830152613f4e81613a1c565b9050919050565b60006020820190508181036000830152613f6e81613a62565b9050919050565b60006020820190508181036000830152613f8e81613a85565b9050919050565b60006020820190508181036000830152613fae81613aa8565b9050919050565b60006020820190508181036000830152613fce81613acb565b9050919050565b60006020820190508181036000830152613fee81613aee565b9050919050565b6000602082019050818103600083015261400e81613b11565b9050919050565b6000602082019050818103600083015261402e81613b34565b9050919050565b6000602082019050818103600083015261404e81613b57565b9050919050565b6000602082019050818103600083015261406e81613b7a565b9050919050565b6000602082019050818103600083015261408e81613b9d565b9050919050565b60006040820190506140aa6000830184613bc0565b92915050565b60006020820190506140c56000830184613bef565b92915050565b60006140d56140e6565b90506140e182826143e6565b919050565b6000604051905090565b600067ffffffffffffffff82111561410b5761410a61454d565b5b6141148261459a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061417a826142ee565b9150614185836142ee565b9250826fffffffffffffffffffffffffffffffff038211156141aa576141a9614491565b5b828201905092915050565b60006141c08261432a565b91506141cb8361432a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614200576141ff614491565b5b828201905092915050565b60006142168261432a565b91506142218361432a565b925082614231576142306144c0565b5b828204905092915050565b6000614247826142ee565b9150614252836142ee565b92508282101561426557614264614491565b5b828203905092915050565b600061427b8261432a565b91506142868361432a565b92508282101561429957614298614491565b5b828203905092915050565b60006142af8261430a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561437557808201518184015260208101905061435a565b83811115614384576000848401525b50505050565b60006143958261432a565b915060008214156143a9576143a8614491565b5b600182039050919050565b600060028204905060018216806143cc57607f821691505b602082108114156143e0576143df6144ef565b5b50919050565b6143ef8261459a565b810181811067ffffffffffffffff8211171561440e5761440d61454d565b5b80604052505050565b60006144228261432a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561445557614454614491565b5b600182019050919050565b600061446b8261432a565b91506144768361432a565b925082614486576144856144c0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6d617820323020706572207472616e73616374696f6e00000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b614d57816142a4565b8114614d6257600080fd5b50565b614d6e816142b6565b8114614d7957600080fd5b50565b614d85816142c2565b8114614d9057600080fd5b50565b614d9c8161432a565b8114614da757600080fd5b5056fea264697066735822122075369dbeae33ddc5843b8a224be9ed512c4425773df6aac830b43de434e1ff5964736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80637987fb471161010d578063a945bf80116100a0578063c87b56dd1161006f578063c87b56dd146106ec578063d7224ba014610729578063dc33e68114610754578063e985e9c514610791578063f2fde38b146107ce576101ee565b8063a945bf8014610665578063ac44600214610690578063b3ab66b0146106a7578063b88d4fde146106c3576101ee565b80639293a5c7116100dc5780639293a5c7146105ab57806395d89b41146105d4578063a22cb465146105ff578063a7cd52cb14610628576101ee565b80637987fb47146104ef5780638bc35c2f146105185780638da5cb5b146105435780639231ab2a1461056e576101ee565b8063375a069a1161018557806355f804b31161015457806355f804b3146104355780636352211e1461045e57806370a082311461049b578063715018a6146104d8576101ee565b8063375a069a1461037b5780633f5e4741146103a457806342842e0e146103cf5780634f6ccce7146103f8576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec5780632d20fb60146103155780632f745c591461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906135df565b6107f7565b6040516102279190613cb8565b60405180910390f35b34801561023c57600080fd5b50610245610941565b6040516102529190613cd3565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613686565b6109d3565b60405161028f9190613c51565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613572565b610a58565b005b3480156102cd57600080fd5b506102d6610b71565b6040516102e391906140b0565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e919061345c565b610b7b565b005b34801561032157600080fd5b5061033c60048036038101906103379190613686565b610b8b565b005b34801561034a57600080fd5b5061036560048036038101906103609190613572565b610c69565b60405161037291906140b0565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190613686565b610e67565b005b3480156103b057600080fd5b506103b9610f2f565b6040516103c69190613cb8565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f1919061345c565b610f46565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613686565b610f66565b60405161042c91906140b0565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613639565b610fb9565b005b34801561046a57600080fd5b5061048560048036038101906104809190613686565b61104b565b6040516104929190613c51565b60405180910390f35b3480156104a757600080fd5b506104c260048036038101906104bd91906133ef565b611061565b6040516104cf91906140b0565b60405180910390f35b3480156104e457600080fd5b506104ed61114a565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613639565b6111d2565b005b34801561052457600080fd5b5061052d611264565b60405161053a91906140b0565b60405180910390f35b34801561054f57600080fd5b50610558611288565b6040516105659190613c51565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613686565b6112b1565b6040516105a29190614095565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906135b2565b6112c9565b005b3480156105e057600080fd5b506105e9611362565b6040516105f69190613cd3565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190613532565b6113f4565b005b34801561063457600080fd5b5061064f600480360381019061064a91906133ef565b611575565b60405161065c91906140b0565b60405180910390f35b34801561067157600080fd5b5061067a61158d565b60405161068791906140b0565b60405180910390f35b34801561069c57600080fd5b506106a56115b1565b005b6106c160048036038101906106bc9190613686565b611732565b005b3480156106cf57600080fd5b506106ea60048036038101906106e591906134af565b6118cc565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613686565b611928565b6040516107209190613cd3565b60405180910390f35b34801561073557600080fd5b5061073e6119cd565b60405161074b91906140b0565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906133ef565b6119d3565b60405161078891906140b0565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b3919061341c565b6119e5565b6040516107c59190613cb8565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f091906133ef565b611a79565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061093a575061093982611b71565b5b9050919050565b606060028054610950906143b4565b80601f016020809104026020016040519081016040528092919081815260200182805461097c906143b4565b80156109c95780601f1061099e576101008083540402835291602001916109c9565b820191906000526020600020905b8154815290600101906020018083116109ac57829003601f168201915b5050505050905090565b60006109de82611bdb565b610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490614055565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a638261104b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90613f35565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af3611be9565b73ffffffffffffffffffffffffffffffffffffffff161480610b225750610b2181610b1c611be9565b6119e5565b5b610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5890613df5565b60405180910390fd5b610b6c838383611bf1565b505050565b6000600154905090565b610b86838383611ca3565b505050565b610b93611be9565b73ffffffffffffffffffffffffffffffffffffffff16610bb1611288565b73ffffffffffffffffffffffffffffffffffffffff1614610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90613e95565b60405180910390fd5b60026009541415610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4490614015565b60405180910390fd5b6002600981905550610c5e8161225c565b600160098190555050565b6000610c7483611061565b8210610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90613cf5565b60405180910390fd5b6000610cbf610b71565b905060008060005b83811015610e25576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610db957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e115786841415610e02578195505050505050610e61565b8380610e0d90614417565b9450505b508080610e1d90614417565b915050610cc7565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613fd5565b60405180910390fd5b92915050565b610e6f611be9565b73ffffffffffffffffffffffffffffffffffffffff16610e8d611288565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda90613e95565b60405180910390fd5b60005b81811015610f2b57610f18337f00000000000000000000000000000000000000000000000000000000000000146124ea565b8080610f2390614417565b915050610ee6565b5050565b6000600d60009054906101000a900460ff16905090565b610f61838383604051806020016040528060008152506118cc565b505050565b6000610f70610b71565b8210610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890613d75565b60405180910390fd5b819050919050565b610fc1611be9565b73ffffffffffffffffffffffffffffffffffffffff16610fdf611288565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90613e95565b60405180910390fd5b8181600b91906110469291906131e3565b505050565b600061105682612508565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613e35565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611152611be9565b73ffffffffffffffffffffffffffffffffffffffff16611170611288565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90613e95565b60405180910390fd5b6111d0600061270b565b565b6111da611be9565b73ffffffffffffffffffffffffffffffffffffffff166111f8611288565b73ffffffffffffffffffffffffffffffffffffffff161461124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613e95565b60405180910390fd5b8181600c919061125f9291906131e3565b505050565b7f000000000000000000000000000000000000000000000000000000000000001481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112b9613269565b6112c282612508565b9050919050565b6112d1611be9565b73ffffffffffffffffffffffffffffffffffffffff166112ef611288565b73ffffffffffffffffffffffffffffffffffffffff1614611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90613e95565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b606060038054611371906143b4565b80601f016020809104026020016040519081016040528092919081815260200182805461139d906143b4565b80156113ea5780601f106113bf576101008083540402835291602001916113ea565b820191906000526020600020905b8154815290600101906020018083116113cd57829003601f168201915b5050505050905090565b6113fc611be9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561146a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146190613ed5565b60405180910390fd5b8060076000611477611be9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611524611be9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115699190613cb8565b60405180910390a35050565b600a6020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6115b9611be9565b73ffffffffffffffffffffffffffffffffffffffff166115d7611288565b73ffffffffffffffffffffffffffffffffffffffff161461162d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162490613e95565b60405180910390fd5b60026009541415611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90614015565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516116a190613c3c565b60006040518083038185875af1925050503d80600081146116de576040519150601f19603f3d011682016040523d82523d6000602084013e6116e3565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90613f55565b60405180910390fd5b506001600981905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179790613dd5565b60405180910390fd5b6117a8610f2f565b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90613f15565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001e9981611811610b71565b61181b91906141b5565b111561185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390613e55565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000148111156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613d55565b60405180910390fd5b6118c933826124ea565b50565b6118d7848484611ca3565b6118e3848484846127cf565b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990613f75565b60405180910390fd5b50505050565b606061193382611bdb565b611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990613eb5565b60405180910390fd5b600061197c612966565b905060006119886129f8565b9050600082511161199957806119c4565b816119a385612a8a565b6040516020016119b4929190613c0d565b6040516020818303038152906040525b92505050919050565b60085481565b60006119de82612beb565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a81611be9565b73ffffffffffffffffffffffffffffffffffffffff16611a9f611288565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90613e95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c90613d15565b60405180910390fd5b611b6e8161270b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611cae82612508565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cd5611be9565b73ffffffffffffffffffffffffffffffffffffffff161480611d315750611cfa611be9565b73ffffffffffffffffffffffffffffffffffffffff16611d19846109d3565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d4d5750611d4c8260000151611d47611be9565b6119e5565b5b905080611d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8690613ef5565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df890613e75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890613d95565b60405180910390fd5b611e7e8585856001612cd4565b611e8e6000848460000151611bf1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611efc919061423c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611fa0919061416f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120a691906141b5565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121ec5761211c81611bdb565b156121eb576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122548686866001612cda565b505050505050565b60006008549050600082116122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90613e15565b60405180910390fd5b6000600183836122b691906141b5565b6122c09190614270565b905060017f0000000000000000000000000000000000000000000000000000000000001e996122ef9190614270565b8111156123265760017f0000000000000000000000000000000000000000000000000000000000001e996123239190614270565b90505b61232f81611bdb565b61236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236590613ff5565b60405180910390fd5b60008290505b8181116124d157600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124be5760006123f182612508565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b80806124c990614417565b915050612374565b506001816124df91906141b5565b600881905550505050565b612504828260405180602001604052806000815250612ce0565b5050565b612510613269565b61251982611bdb565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90613d35565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000001483106125bc5760017f0000000000000000000000000000000000000000000000000000000000000014846125af9190614270565b6125b991906141b5565b90505b60008390505b8181106126ca576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126b657809350505050612706565b5080806126c29061438a565b9150506125c2565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fd90614035565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006127f08473ffffffffffffffffffffffffffffffffffffffff166131c0565b15612959578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612819611be9565b8786866040518563ffffffff1660e01b815260040161283b9493929190613c6c565b602060405180830381600087803b15801561285557600080fd5b505af192505050801561288657506040513d601f19601f82011682018060405250810190612883919061360c565b60015b612909573d80600081146128b6576040519150601f19603f3d011682016040523d82523d6000602084013e6128bb565b606091505b50600081511415612901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f890613f75565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061295e565b600190505b949350505050565b6060600b8054612975906143b4565b80601f01602080910402602001604051908101604052809291908181526020018280546129a1906143b4565b80156129ee5780601f106129c3576101008083540402835291602001916129ee565b820191906000526020600020905b8154815290600101906020018083116129d157829003601f168201915b5050505050905090565b6060600c8054612a07906143b4565b80601f0160208091040260200160405190810160405280929190818152602001828054612a33906143b4565b8015612a805780601f10612a5557610100808354040283529160200191612a80565b820191906000526020600020905b815481529060010190602001808311612a6357829003601f168201915b5050505050905090565b60606000821415612ad2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be6565b600082905060005b60008214612b04578080612aed90614417565b915050600a82612afd919061420b565b9150612ada565b60008167ffffffffffffffff811115612b2057612b1f61454d565b5b6040519080825280601f01601f191660200182016040528015612b525781602001600182028036833780820191505090505b5090505b60008514612bdf57600182612b6b9190614270565b9150600a85612b7a9190614460565b6030612b8691906141b5565b60f81b818381518110612b9c57612b9b61451e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd8919061420b565b9450612b56565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5390613db5565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4e90613fb5565b60405180910390fd5b612d6081611bdb565b15612da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9790613f95565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000014831115612e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfa90614075565b60405180910390fd5b612e106000858386612cd4565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612f0d919061416f565b6fffffffffffffffffffffffffffffffff168152602001858360200151612f34919061416f565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156131a357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461314360008884886127cf565b613182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317990613f75565b60405180910390fd5b818061318d90614417565b925050808061319b90614417565b9150506130d2565b50806001819055506131b86000878588612cda565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546131ef906143b4565b90600052602060002090601f0160209004810192826132115760008555613258565b82601f1061322a57803560ff1916838001178555613258565b82800160010185558215613258579182015b8281111561325757823582559160200191906001019061323c565b5b50905061326591906132a3565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156132bc5760008160009055506001016132a4565b5090565b60006132d36132ce846140f0565b6140cb565b9050828152602081018484840111156132ef576132ee61458b565b5b6132fa848285614348565b509392505050565b60008135905061331181614d4e565b92915050565b60008135905061332681614d65565b92915050565b60008135905061333b81614d7c565b92915050565b60008151905061335081614d7c565b92915050565b600082601f83011261336b5761336a614581565b5b813561337b8482602086016132c0565b91505092915050565b60008083601f84011261339a57613399614581565b5b8235905067ffffffffffffffff8111156133b7576133b661457c565b5b6020830191508360018202830111156133d3576133d2614586565b5b9250929050565b6000813590506133e981614d93565b92915050565b60006020828403121561340557613404614595565b5b600061341384828501613302565b91505092915050565b6000806040838503121561343357613432614595565b5b600061344185828601613302565b925050602061345285828601613302565b9150509250929050565b60008060006060848603121561347557613474614595565b5b600061348386828701613302565b935050602061349486828701613302565b92505060406134a5868287016133da565b9150509250925092565b600080600080608085870312156134c9576134c8614595565b5b60006134d787828801613302565b94505060206134e887828801613302565b93505060406134f9878288016133da565b925050606085013567ffffffffffffffff81111561351a57613519614590565b5b61352687828801613356565b91505092959194509250565b6000806040838503121561354957613548614595565b5b600061355785828601613302565b925050602061356885828601613317565b9150509250929050565b6000806040838503121561358957613588614595565b5b600061359785828601613302565b92505060206135a8858286016133da565b9150509250929050565b6000602082840312156135c8576135c7614595565b5b60006135d684828501613317565b91505092915050565b6000602082840312156135f5576135f4614595565b5b60006136038482850161332c565b91505092915050565b60006020828403121561362257613621614595565b5b600061363084828501613341565b91505092915050565b600080602083850312156136505761364f614595565b5b600083013567ffffffffffffffff81111561366e5761366d614590565b5b61367a85828601613384565b92509250509250929050565b60006020828403121561369c5761369b614595565b5b60006136aa848285016133da565b91505092915050565b6136bc816142a4565b82525050565b6136cb816142a4565b82525050565b6136da816142b6565b82525050565b60006136eb82614121565b6136f58185614137565b9350613705818560208601614357565b61370e8161459a565b840191505092915050565b60006137248261412c565b61372e8185614153565b935061373e818560208601614357565b6137478161459a565b840191505092915050565b600061375d8261412c565b6137678185614164565b9350613777818560208601614357565b80840191505092915050565b6000613790602283614153565b915061379b826145ab565b604082019050919050565b60006137b3602683614153565b91506137be826145fa565b604082019050919050565b60006137d6602a83614153565b91506137e182614649565b604082019050919050565b60006137f9601683614153565b915061380482614698565b602082019050919050565b600061381c602383614153565b9150613827826146c1565b604082019050919050565b600061383f602583614153565b915061384a82614710565b604082019050919050565b6000613862603183614153565b915061386d8261475f565b604082019050919050565b6000613885601e83614153565b9150613890826147ae565b602082019050919050565b60006138a8603983614153565b91506138b3826147d7565b604082019050919050565b60006138cb601883614153565b91506138d682614826565b602082019050919050565b60006138ee602b83614153565b91506138f98261484f565b604082019050919050565b6000613911601283614153565b915061391c8261489e565b602082019050919050565b6000613934602683614153565b915061393f826148c7565b604082019050919050565b6000613957600583614164565b915061396282614916565b600582019050919050565b600061397a602083614153565b91506139858261493f565b602082019050919050565b600061399d602f83614153565b91506139a882614968565b604082019050919050565b60006139c0601a83614153565b91506139cb826149b7565b602082019050919050565b60006139e3603283614153565b91506139ee826149e0565b604082019050919050565b6000613a06601d83614153565b9150613a1182614a2f565b602082019050919050565b6000613a29602283614153565b9150613a3482614a58565b604082019050919050565b6000613a4c600083614148565b9150613a5782614aa7565b600082019050919050565b6000613a6f601083614153565b9150613a7a82614aaa565b602082019050919050565b6000613a92603383614153565b9150613a9d82614ad3565b604082019050919050565b6000613ab5601d83614153565b9150613ac082614b22565b602082019050919050565b6000613ad8602183614153565b9150613ae382614b4b565b604082019050919050565b6000613afb602e83614153565b9150613b0682614b9a565b604082019050919050565b6000613b1e602683614153565b9150613b2982614be9565b604082019050919050565b6000613b41601f83614153565b9150613b4c82614c38565b602082019050919050565b6000613b64602f83614153565b9150613b6f82614c61565b604082019050919050565b6000613b87602d83614153565b9150613b9282614cb0565b604082019050919050565b6000613baa602283614153565b9150613bb582614cff565b604082019050919050565b604082016000820151613bd660008501826136b3565b506020820151613be96020850182613bfe565b50505050565b613bf88161432a565b82525050565b613c0781614334565b82525050565b6000613c198285613752565b9150613c258284613752565b9150613c308261394a565b91508190509392505050565b6000613c4782613a3f565b9150819050919050565b6000602082019050613c6660008301846136c2565b92915050565b6000608082019050613c8160008301876136c2565b613c8e60208301866136c2565b613c9b6040830185613bef565b8181036060830152613cad81846136e0565b905095945050505050565b6000602082019050613ccd60008301846136d1565b92915050565b60006020820190508181036000830152613ced8184613719565b905092915050565b60006020820190508181036000830152613d0e81613783565b9050919050565b60006020820190508181036000830152613d2e816137a6565b9050919050565b60006020820190508181036000830152613d4e816137c9565b9050919050565b60006020820190508181036000830152613d6e816137ec565b9050919050565b60006020820190508181036000830152613d8e8161380f565b9050919050565b60006020820190508181036000830152613dae81613832565b9050919050565b60006020820190508181036000830152613dce81613855565b9050919050565b60006020820190508181036000830152613dee81613878565b9050919050565b60006020820190508181036000830152613e0e8161389b565b9050919050565b60006020820190508181036000830152613e2e816138be565b9050919050565b60006020820190508181036000830152613e4e816138e1565b9050919050565b60006020820190508181036000830152613e6e81613904565b9050919050565b60006020820190508181036000830152613e8e81613927565b9050919050565b60006020820190508181036000830152613eae8161396d565b9050919050565b60006020820190508181036000830152613ece81613990565b9050919050565b60006020820190508181036000830152613eee816139b3565b9050919050565b60006020820190508181036000830152613f0e816139d6565b9050919050565b60006020820190508181036000830152613f2e816139f9565b9050919050565b60006020820190508181036000830152613f4e81613a1c565b9050919050565b60006020820190508181036000830152613f6e81613a62565b9050919050565b60006020820190508181036000830152613f8e81613a85565b9050919050565b60006020820190508181036000830152613fae81613aa8565b9050919050565b60006020820190508181036000830152613fce81613acb565b9050919050565b60006020820190508181036000830152613fee81613aee565b9050919050565b6000602082019050818103600083015261400e81613b11565b9050919050565b6000602082019050818103600083015261402e81613b34565b9050919050565b6000602082019050818103600083015261404e81613b57565b9050919050565b6000602082019050818103600083015261406e81613b7a565b9050919050565b6000602082019050818103600083015261408e81613b9d565b9050919050565b60006040820190506140aa6000830184613bc0565b92915050565b60006020820190506140c56000830184613bef565b92915050565b60006140d56140e6565b90506140e182826143e6565b919050565b6000604051905090565b600067ffffffffffffffff82111561410b5761410a61454d565b5b6141148261459a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061417a826142ee565b9150614185836142ee565b9250826fffffffffffffffffffffffffffffffff038211156141aa576141a9614491565b5b828201905092915050565b60006141c08261432a565b91506141cb8361432a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614200576141ff614491565b5b828201905092915050565b60006142168261432a565b91506142218361432a565b925082614231576142306144c0565b5b828204905092915050565b6000614247826142ee565b9150614252836142ee565b92508282101561426557614264614491565b5b828203905092915050565b600061427b8261432a565b91506142868361432a565b92508282101561429957614298614491565b5b828203905092915050565b60006142af8261430a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561437557808201518184015260208101905061435a565b83811115614384576000848401525b50505050565b60006143958261432a565b915060008214156143a9576143a8614491565b5b600182039050919050565b600060028204905060018216806143cc57607f821691505b602082108114156143e0576143df6144ef565b5b50919050565b6143ef8261459a565b810181811067ffffffffffffffff8211171561440e5761440d61454d565b5b80604052505050565b60006144228261432a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561445557614454614491565b5b600182019050919050565b600061446b8261432a565b91506144768361432a565b925082614486576144856144c0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6d617820323020706572207472616e73616374696f6e00000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b614d57816142a4565b8114614d6257600080fd5b50565b614d6e816142b6565b8114614d7957600080fd5b50565b614d85816142c2565b8114614d9057600080fd5b50565b614d9c8161432a565b8114614da757600080fd5b5056fea264697066735822122075369dbeae33ddc5843b8a224be9ed512c4425773df6aac830b43de434e1ff5964736f6c63430008070033
Deployed Bytecode Sourcemap
45109:2864:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30689:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32650:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34762:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34283:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29045:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35789:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47518:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29753:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46255:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46562:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36022:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29222:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46970:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32459:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31175:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7489:103;;;;;;;;;;;;;:::i;:::-;;47084:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45173:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6838:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47803:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47206:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32819:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35126:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45273:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45228:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47319:191;;;;;;;;;;;;;:::i;:::-;;45595:393;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36270:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32994:539;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41151:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47682:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35508:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30689:422;30836:4;30893:25;30878:40;;;:11;:40;;;;:105;;;;30950:33;30935:48;;;:11;:48;;;;30878:105;:172;;;;31015:35;31000:50;;;:11;:50;;;;30878:172;:225;;;;31067:36;31091:11;31067:23;:36::i;:::-;30878:225;30858:245;;30689:422;;;:::o;32650:100::-;32704:13;32737:5;32730:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32650:100;:::o;34762:292::-;34866:7;34913:16;34921:7;34913;:16::i;:::-;34891:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35022:15;:24;35038:7;35022:24;;;;;;;;;;;;;;;;;;;;;35015:31;;34762:292;;;:::o;34283:413::-;34356:13;34372:24;34388:7;34372:15;:24::i;:::-;34356:40;;34421:5;34415:11;;:2;:11;;;;34407:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34516:5;34500:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34525:37;34542:5;34549:12;:10;:12::i;:::-;34525:16;:37::i;:::-;34500:62;34478:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;34660:28;34669:2;34673:7;34682:5;34660:8;:28::i;:::-;34345:351;34283:413;;:::o;29045:100::-;29098:7;29125:12;;29118:19;;29045:100;:::o;35789:162::-;35915:28;35925:4;35931:2;35935:7;35915:9;:28::i;:::-;35789:162;;;:::o;47518:156::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;47638:28:::2;47657:8;47638:18;:28::i;:::-;1768:1:::1;2722:7;:22;;;;47518:156:::0;:::o;29753:864::-;29878:7;29919:16;29929:5;29919:9;:16::i;:::-;29911:5;:24;29903:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29985:22;30010:13;:11;:13::i;:::-;29985:38;;30034:19;30068:25;30122:9;30117:426;30141:14;30137:1;:18;30117:426;;;30177:31;30211:11;:14;30223:1;30211:14;;;;;;;;;;;30177:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30270:1;30244:28;;:9;:14;;;:28;;;30240:103;;30313:9;:14;;;30293:34;;30240:103;30382:5;30361:26;;:17;:26;;;30357:175;;;30427:5;30412:11;:20;30408:77;;;30464:1;30457:8;;;;;;;;;30408:77;30503:13;;;;;:::i;:::-;;;;30357:175;30162:381;30157:3;;;;;:::i;:::-;;;;30117:426;;;;30553:56;;;;;;;;;;:::i;:::-;;;;;;;;29753:864;;;;;:::o;46255:184::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46325:9:::1;46320:112;46344:8;46340:1;:12;46320:112;;;46374:46;46384:10;46396:23;46374:9;:46::i;:::-;46354:3;;;;;:::i;:::-;;;;46320:112;;;;46255:184:::0;:::o;46562:98::-;46609:4;46633:19;;;;;;;;;;;46626:26;;46562:98;:::o;36022:177::-;36152:39;36169:4;36175:2;36179:7;36152:39;;;;;;;;;;;;:16;:39::i;:::-;36022:177;;;:::o;29222:228::-;29325:7;29366:13;:11;:13::i;:::-;29358:5;:21;29350:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29437:5;29430:12;;29222:228;;;:::o;46970:106::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47061:7:::1;;47045:13;:23;;;;;;;:::i;:::-;;46970:106:::0;;:::o;32459:124::-;32523:7;32550:20;32562:7;32550:11;:20::i;:::-;:25;;;32543:32;;32459:124;;;:::o;31175:258::-;31239:7;31298:1;31281:19;;:5;:19;;;;31259:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;31397:12;:19;31410:5;31397:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31389:36;;31382:43;;31175:258;;;:::o;7489:103::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:30:::1;7581:1;7554:18;:30::i;:::-;7489:103::o:0;47084:114::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47183:7:::1;;47163:17;:27;;;;;;;:::i;:::-;;47084:114:::0;;:::o;45173:48::-;;;:::o;6838:87::-;6884:7;6911:6;;;;;;;;;;;6904:13;;6838:87;:::o;47803:167::-;47896:21;;:::i;:::-;47942:20;47954:7;47942:11;:20::i;:::-;47935:27;;47803:167;;;:::o;47206:105::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47298:5:::1;47276:19;;:27;;;;;;;;;;;;;;;;;;47206:105:::0;:::o;32819:104::-;32875:13;32908:7;32901:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32819:104;:::o;35126:311::-;35256:12;:10;:12::i;:::-;35244:24;;:8;:24;;;;35236:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35357:8;35312:18;:32;35331:12;:10;:12::i;:::-;35312:32;;;;;;;;;;;;;;;:42;35345:8;35312:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35410:8;35381:48;;35396:12;:10;:12::i;:::-;35381:48;;;35420:8;35381:48;;;;;;:::i;:::-;;;;;;;;35126:311;;:::o;45273:44::-;;;;;;;;;;;;;;;;;:::o;45228:36::-;;;:::o;47319:191::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;47388:12:::2;47406:10;:15;;47429:21;47406:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47387:68;;;47474:7;47466:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;47376:134;1768:1:::1;2722:7;:22;;;;47319:191::o:0;45595:393::-;45522:10;45509:23;;:9;:23;;;45501:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45686:16:::1;:14;:16::i;:::-;45678:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45797:14;45785:8;45769:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;45747:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45888:23;45876:8;:35;;45868:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;45949:31;45959:10;45971:8;45949:9;:31::i;:::-;45595:393:::0;:::o;36270:355::-;36429:28;36439:4;36445:2;36449:7;36429:9;:28::i;:::-;36490:48;36513:4;36519:2;36523:7;36532:5;36490:22;:48::i;:::-;36468:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;36270:355;;;;:::o;32994:539::-;33112:13;33165:16;33173:7;33165;:16::i;:::-;33143:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;33269:21;33293:10;:8;:10::i;:::-;33269:34;;33314:25;33342:14;:12;:14::i;:::-;33314:42;;33411:1;33393:7;33387:21;:25;:138;;33514:11;33387:138;;;33456:7;33465:18;:7;:16;:18::i;:::-;33439:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33387:138;33367:158;;;;32994:539;;;:::o;41151:43::-;;;;:::o;47682:113::-;47740:7;47767:20;47781:5;47767:13;:20::i;:::-;47760:27;;47682:113;;;:::o;35508:214::-;35650:4;35679:18;:25;35698:5;35679:25;;;;;;;;;;;;;;;:35;35705:8;35679:35;;;;;;;;;;;;;;;;;;;;;;;;;35672:42;;35508:214;;;;:::o;7747:201::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7856:1:::1;7836:22;;:8;:22;;;;7828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7912:28;7931:8;7912:18;:28::i;:::-;7747:201:::0;:::o;19645:157::-;19730:4;19769:25;19754:40;;;:11;:40;;;;19747:47;;19645:157;;;:::o;36880:111::-;36937:4;36971:12;;36961:7;:22;36954:29;;36880:111;;;:::o;5562:98::-;5615:7;5642:10;5635:17;;5562:98;:::o;40947:196::-;41089:2;41062:15;:24;41078:7;41062:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41127:7;41123:2;41107:28;;41116:5;41107:28;;;;;;;;;;;;40947:196;;;:::o;39120:1709::-;39235:35;39273:20;39285:7;39273:11;:20::i;:::-;39235:58;;39306:22;39348:13;:18;;;39332:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;39407:12;:10;:12::i;:::-;39383:36;;:20;39395:7;39383:11;:20::i;:::-;:36;;;39332:87;:154;;;;39436:50;39453:13;:18;;;39473:12;:10;:12::i;:::-;39436:16;:50::i;:::-;39332:154;39306:181;;39522:17;39500:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;39674:4;39652:26;;:13;:18;;;:26;;;39630:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;39777:1;39763:16;;:2;:16;;;;39755:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39834:43;39856:4;39862:2;39866:7;39875:1;39834:21;:43::i;:::-;39942:49;39959:1;39963:7;39972:13;:18;;;39942:8;:49::i;:::-;40034:1;40004:12;:18;40017:4;40004:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40074:1;40046:12;:16;40059:2;40046:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40109:43;;;;;;;;40124:2;40109:43;;;;;;40135:15;40109:43;;;;;40086:11;:20;40098:7;40086:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40392:19;40424:1;40414:7;:11;;;;:::i;:::-;40392:33;;40481:1;40440:43;;:11;:24;40452:11;40440:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40436:288;;;40504:20;40512:11;40504:7;:20::i;:::-;40500:213;;;40572:125;;;;;;;;40609:13;:18;;;40572:125;;;;;;40650:13;:28;;;40572:125;;;;;40545:11;:24;40557:11;40545:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40500:213;40436:288;40760:7;40756:2;40741:27;;40750:4;40741:27;;;;;;;;;;;;40779:42;40800:4;40806:2;40810:7;40819:1;40779:20;:42::i;:::-;39224:1605;;;39120:1709;;;:::o;41307:950::-;41373:25;41401:24;;41373:52;;41455:1;41444:8;:12;41436:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;41496:16;41546:1;41535:8;41515:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;41496:51;;41590:1;41573:14;:18;;;;:::i;:::-;41562:8;:29;41558:91;;;41636:1;41619:14;:18;;;;:::i;:::-;41608:29;;41558:91;41772:17;41780:8;41772:7;:17::i;:::-;41764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41848:9;41860:17;41848:29;;41843:357;41884:8;41879:1;:13;41843:357;;41949:1;41918:33;;:11;:14;41930:1;41918:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;41914:275;;;41972:31;42006:14;42018:1;42006:11;:14::i;:::-;41972:48;;42056:117;;;;;;;;42093:9;:14;;;42056:117;;;;;;42130:9;:24;;;42056:117;;;;;42039:11;:14;42051:1;42039:14;;;;;;;;;;;:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41953:236;41914:275;41894:3;;;;;:::i;:::-;;;;41843:357;;;;42248:1;42237:8;:12;;;;:::i;:::-;42210:24;:39;;;;41362:895;;41307:950;:::o;36999:104::-;37068:27;37078:2;37082:8;37068:27;;;;;;;;;;;;:9;:27::i;:::-;36999:104;;:::o;31715:682::-;31803:21;;:::i;:::-;31850:16;31858:7;31850;:16::i;:::-;31842:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31926:26;31978:12;31967:7;:23;31963:103;;32053:1;32038:12;32028:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;32007:47;;31963:103;32083:12;32098:7;32083:22;;32078:242;32115:18;32107:4;:26;32078:242;;32158:31;32192:11;:17;32204:4;32192:17;;;;;;;;;;;32158:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32254:1;32228:28;;:9;:14;;;:28;;;32224:85;;32284:9;32277:16;;;;;;;32224:85;32143:177;32135:6;;;;;:::i;:::-;;;;32078:242;;;;32332:57;;;;;;;;;;:::i;:::-;;;;;;;;31715:682;;;;:::o;8108:191::-;8182:16;8201:6;;;;;;;;;;;8182:25;;8227:8;8218:6;;:17;;;;;;;;;;;;;;;;;;8282:8;8251:40;;8272:8;8251:40;;;;;;;;;;;;8171:128;8108:191;:::o;42822:985::-;42977:4;42998:15;:2;:13;;;:15::i;:::-;42994:806;;;43067:2;43051:36;;;43110:12;:10;:12::i;:::-;43145:4;43172:7;43202:5;43051:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43030:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43430:1;43413:6;:13;:18;43409:321;;;43456:109;;;;;;;;;;:::i;:::-;;;;;;;;43409:321;43680:6;43674:13;43665:6;43661:2;43657:15;43650:38;43030:715;43300:45;;;43290:55;;;:6;:55;;;;43283:62;;;;;42994:806;43784:4;43777:11;;42822:985;;;;;;;:::o;46668:114::-;46728:13;46761;46754:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46668:114;:::o;46790:172::-;46899:13;46937:17;46930:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46790:172;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;31441:266::-;31502:7;31561:1;31544:19;;:5;:19;;;;31522:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;31666:12;:19;31679:5;31666:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;31658:41;;31651:48;;31441:266;;;:::o;44295:159::-;;;;;:::o;44866:158::-;;;;;:::o;37466:1400::-;37589:20;37612:12;;37589:35;;37657:1;37643:16;;:2;:16;;;;37635:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37842:21;37850:12;37842:7;:21::i;:::-;37841:22;37833:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37928:12;37916:8;:24;;37908:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;37992:61;38022:1;38026:2;38030:12;38044:8;37992:21;:61::i;:::-;38066:30;38099:12;:16;38112:2;38099:16;;;;;;;;;;;;;;;38066:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38145:135;;;;;;;;38201:8;38171:11;:19;;;:39;;;;:::i;:::-;38145:135;;;;;;38260:8;38225:11;:24;;;:44;;;;:::i;:::-;38145:135;;;;;38126:12;:16;38139:2;38126:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38319:43;;;;;;;;38334:2;38319:43;;;;;;38345:15;38319:43;;;;;38291:11;:25;38303:12;38291:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38375:20;38398:12;38375:35;;38428:9;38423:325;38447:8;38443:1;:12;38423:325;;;38507:12;38503:2;38482:38;;38499:1;38482:38;;;;;;;;;;;;38561:59;38592:1;38596:2;38600:12;38614:5;38561:22;:59::i;:::-;38535:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;38722:14;;;;;:::i;:::-;;;;38457:3;;;;;:::i;:::-;;;;38423:325;;;;38775:12;38760;:27;;;;38798:60;38827:1;38831:2;38835:12;38849:8;38798:20;:60::i;:::-;37578:1288;;;37466:1400;;;:::o;9539:326::-;9599:4;9856:1;9834:7;:19;;;:23;9827:30;;9539:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:108::-;7379:24;7397:5;7379:24;:::i;:::-;7374:3;7367:37;7302:108;;:::o;7416:118::-;7503:24;7521:5;7503:24;:::i;:::-;7498:3;7491:37;7416:118;;:::o;7540:109::-;7621:21;7636:5;7621:21;:::i;:::-;7616:3;7609:34;7540:109;;:::o;7655:360::-;7741:3;7769:38;7801:5;7769:38;:::i;:::-;7823:70;7886:6;7881:3;7823:70;:::i;:::-;7816:77;;7902:52;7947:6;7942:3;7935:4;7928:5;7924:16;7902:52;:::i;:::-;7979:29;8001:6;7979:29;:::i;:::-;7974:3;7970:39;7963:46;;7745:270;7655:360;;;;:::o;8021:364::-;8109:3;8137:39;8170:5;8137:39;:::i;:::-;8192:71;8256:6;8251:3;8192:71;:::i;:::-;8185:78;;8272:52;8317:6;8312:3;8305:4;8298:5;8294:16;8272:52;:::i;:::-;8349:29;8371:6;8349:29;:::i;:::-;8344:3;8340:39;8333:46;;8113:272;8021:364;;;;:::o;8391:377::-;8497:3;8525:39;8558:5;8525:39;:::i;:::-;8580:89;8662:6;8657:3;8580:89;:::i;:::-;8573:96;;8678:52;8723:6;8718:3;8711:4;8704:5;8700:16;8678:52;:::i;:::-;8755:6;8750:3;8746:16;8739:23;;8501:267;8391:377;;;;:::o;8774:366::-;8916:3;8937:67;9001:2;8996:3;8937:67;:::i;:::-;8930:74;;9013:93;9102:3;9013:93;:::i;:::-;9131:2;9126:3;9122:12;9115:19;;8774:366;;;:::o;9146:::-;9288:3;9309:67;9373:2;9368:3;9309:67;:::i;:::-;9302:74;;9385:93;9474:3;9385:93;:::i;:::-;9503:2;9498:3;9494:12;9487:19;;9146:366;;;:::o;9518:::-;9660:3;9681:67;9745:2;9740:3;9681:67;:::i;:::-;9674:74;;9757:93;9846:3;9757:93;:::i;:::-;9875:2;9870:3;9866:12;9859:19;;9518:366;;;:::o;9890:::-;10032:3;10053:67;10117:2;10112:3;10053:67;:::i;:::-;10046:74;;10129:93;10218:3;10129:93;:::i;:::-;10247:2;10242:3;10238:12;10231:19;;9890:366;;;:::o;10262:::-;10404:3;10425:67;10489:2;10484:3;10425:67;:::i;:::-;10418:74;;10501:93;10590:3;10501:93;:::i;:::-;10619:2;10614:3;10610:12;10603:19;;10262:366;;;:::o;10634:::-;10776:3;10797:67;10861:2;10856:3;10797:67;:::i;:::-;10790:74;;10873:93;10962:3;10873:93;:::i;:::-;10991:2;10986:3;10982:12;10975:19;;10634:366;;;:::o;11006:::-;11148:3;11169:67;11233:2;11228:3;11169:67;:::i;:::-;11162:74;;11245:93;11334:3;11245:93;:::i;:::-;11363:2;11358:3;11354:12;11347:19;;11006:366;;;:::o;11378:::-;11520:3;11541:67;11605:2;11600:3;11541:67;:::i;:::-;11534:74;;11617:93;11706:3;11617:93;:::i;:::-;11735:2;11730:3;11726:12;11719:19;;11378:366;;;:::o;11750:::-;11892:3;11913:67;11977:2;11972:3;11913:67;:::i;:::-;11906:74;;11989:93;12078:3;11989:93;:::i;:::-;12107:2;12102:3;12098:12;12091:19;;11750:366;;;:::o;12122:::-;12264:3;12285:67;12349:2;12344:3;12285:67;:::i;:::-;12278:74;;12361:93;12450:3;12361:93;:::i;:::-;12479:2;12474:3;12470:12;12463:19;;12122:366;;;:::o;12494:::-;12636:3;12657:67;12721:2;12716:3;12657:67;:::i;:::-;12650:74;;12733:93;12822:3;12733:93;:::i;:::-;12851:2;12846:3;12842:12;12835:19;;12494:366;;;:::o;12866:::-;13008:3;13029:67;13093:2;13088:3;13029:67;:::i;:::-;13022:74;;13105:93;13194:3;13105:93;:::i;:::-;13223:2;13218:3;13214:12;13207:19;;12866:366;;;:::o;13238:::-;13380:3;13401:67;13465:2;13460:3;13401:67;:::i;:::-;13394:74;;13477:93;13566:3;13477:93;:::i;:::-;13595:2;13590:3;13586:12;13579:19;;13238:366;;;:::o;13610:400::-;13770:3;13791:84;13873:1;13868:3;13791:84;:::i;:::-;13784:91;;13884:93;13973:3;13884:93;:::i;:::-;14002:1;13997:3;13993:11;13986:18;;13610:400;;;:::o;14016:366::-;14158:3;14179:67;14243:2;14238:3;14179:67;:::i;:::-;14172:74;;14255:93;14344:3;14255:93;:::i;:::-;14373:2;14368:3;14364:12;14357:19;;14016:366;;;:::o;14388:::-;14530:3;14551:67;14615:2;14610:3;14551:67;:::i;:::-;14544:74;;14627:93;14716:3;14627:93;:::i;:::-;14745:2;14740:3;14736:12;14729:19;;14388:366;;;:::o;14760:::-;14902:3;14923:67;14987:2;14982:3;14923:67;:::i;:::-;14916:74;;14999:93;15088:3;14999:93;:::i;:::-;15117:2;15112:3;15108:12;15101:19;;14760:366;;;:::o;15132:::-;15274:3;15295:67;15359:2;15354:3;15295:67;:::i;:::-;15288:74;;15371:93;15460:3;15371:93;:::i;:::-;15489:2;15484:3;15480:12;15473:19;;15132:366;;;:::o;15504:::-;15646:3;15667:67;15731:2;15726:3;15667:67;:::i;:::-;15660:74;;15743:93;15832:3;15743:93;:::i;:::-;15861:2;15856:3;15852:12;15845:19;;15504:366;;;:::o;15876:::-;16018:3;16039:67;16103:2;16098:3;16039:67;:::i;:::-;16032:74;;16115:93;16204:3;16115:93;:::i;:::-;16233:2;16228:3;16224:12;16217:19;;15876:366;;;:::o;16248:398::-;16407:3;16428:83;16509:1;16504:3;16428:83;:::i;:::-;16421:90;;16520:93;16609:3;16520:93;:::i;:::-;16638:1;16633:3;16629:11;16622:18;;16248:398;;;:::o;16652:366::-;16794:3;16815:67;16879:2;16874:3;16815:67;:::i;:::-;16808:74;;16891:93;16980:3;16891:93;:::i;:::-;17009:2;17004:3;17000:12;16993:19;;16652:366;;;:::o;17024:::-;17166:3;17187:67;17251:2;17246:3;17187:67;:::i;:::-;17180:74;;17263:93;17352:3;17263:93;:::i;:::-;17381:2;17376:3;17372:12;17365:19;;17024:366;;;:::o;17396:::-;17538:3;17559:67;17623:2;17618:3;17559:67;:::i;:::-;17552:74;;17635:93;17724:3;17635:93;:::i;:::-;17753:2;17748:3;17744:12;17737:19;;17396:366;;;:::o;17768:::-;17910:3;17931:67;17995:2;17990:3;17931:67;:::i;:::-;17924:74;;18007:93;18096:3;18007:93;:::i;:::-;18125:2;18120:3;18116:12;18109:19;;17768:366;;;:::o;18140:::-;18282:3;18303:67;18367:2;18362:3;18303:67;:::i;:::-;18296:74;;18379:93;18468:3;18379:93;:::i;:::-;18497:2;18492:3;18488:12;18481:19;;18140:366;;;:::o;18512:::-;18654:3;18675:67;18739:2;18734:3;18675:67;:::i;:::-;18668:74;;18751:93;18840:3;18751:93;:::i;:::-;18869:2;18864:3;18860:12;18853:19;;18512:366;;;:::o;18884:::-;19026:3;19047:67;19111:2;19106:3;19047:67;:::i;:::-;19040:74;;19123:93;19212:3;19123:93;:::i;:::-;19241:2;19236:3;19232:12;19225:19;;18884:366;;;:::o;19256:::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19256:366;;;:::o;19628:::-;19770:3;19791:67;19855:2;19850:3;19791:67;:::i;:::-;19784:74;;19867:93;19956:3;19867:93;:::i;:::-;19985:2;19980:3;19976:12;19969:19;;19628:366;;;:::o;20000:::-;20142:3;20163:67;20227:2;20222:3;20163:67;:::i;:::-;20156:74;;20239:93;20328:3;20239:93;:::i;:::-;20357:2;20352:3;20348:12;20341:19;;20000:366;;;:::o;20442:527::-;20601:4;20596:3;20592:14;20688:4;20681:5;20677:16;20671:23;20707:63;20764:4;20759:3;20755:14;20741:12;20707:63;:::i;:::-;20616:164;20872:4;20865:5;20861:16;20855:23;20891:61;20946:4;20941:3;20937:14;20923:12;20891:61;:::i;:::-;20790:172;20570:399;20442:527;;:::o;20975:118::-;21062:24;21080:5;21062:24;:::i;:::-;21057:3;21050:37;20975:118;;:::o;21099:105::-;21174:23;21191:5;21174:23;:::i;:::-;21169:3;21162:36;21099:105;;:::o;21210:701::-;21491:3;21513:95;21604:3;21595:6;21513:95;:::i;:::-;21506:102;;21625:95;21716:3;21707:6;21625:95;:::i;:::-;21618:102;;21737:148;21881:3;21737:148;:::i;:::-;21730:155;;21902:3;21895:10;;21210:701;;;;;:::o;21917:379::-;22101:3;22123:147;22266:3;22123:147;:::i;:::-;22116:154;;22287:3;22280:10;;21917:379;;;:::o;22302:222::-;22395:4;22433:2;22422:9;22418:18;22410:26;;22446:71;22514:1;22503:9;22499:17;22490:6;22446:71;:::i;:::-;22302:222;;;;:::o;22530:640::-;22725:4;22763:3;22752:9;22748:19;22740:27;;22777:71;22845:1;22834:9;22830:17;22821:6;22777:71;:::i;:::-;22858:72;22926:2;22915:9;22911:18;22902:6;22858:72;:::i;:::-;22940;23008:2;22997:9;22993:18;22984:6;22940:72;:::i;:::-;23059:9;23053:4;23049:20;23044:2;23033:9;23029:18;23022:48;23087:76;23158:4;23149:6;23087:76;:::i;:::-;23079:84;;22530:640;;;;;;;:::o;23176:210::-;23263:4;23301:2;23290:9;23286:18;23278:26;;23314:65;23376:1;23365:9;23361:17;23352:6;23314:65;:::i;:::-;23176:210;;;;:::o;23392:313::-;23505:4;23543:2;23532:9;23528:18;23520:26;;23592:9;23586:4;23582:20;23578:1;23567:9;23563:17;23556:47;23620:78;23693:4;23684:6;23620:78;:::i;:::-;23612:86;;23392:313;;;;:::o;23711:419::-;23877:4;23915:2;23904:9;23900:18;23892:26;;23964:9;23958:4;23954:20;23950:1;23939:9;23935:17;23928:47;23992:131;24118:4;23992:131;:::i;:::-;23984:139;;23711:419;;;:::o;24136:::-;24302:4;24340:2;24329:9;24325:18;24317:26;;24389:9;24383:4;24379:20;24375:1;24364:9;24360:17;24353:47;24417:131;24543:4;24417:131;:::i;:::-;24409:139;;24136:419;;;:::o;24561:::-;24727:4;24765:2;24754:9;24750:18;24742:26;;24814:9;24808:4;24804:20;24800:1;24789:9;24785:17;24778:47;24842:131;24968:4;24842:131;:::i;:::-;24834:139;;24561:419;;;:::o;24986:::-;25152:4;25190:2;25179:9;25175:18;25167:26;;25239:9;25233:4;25229:20;25225:1;25214:9;25210:17;25203:47;25267:131;25393:4;25267:131;:::i;:::-;25259:139;;24986:419;;;:::o;25411:::-;25577:4;25615:2;25604:9;25600:18;25592:26;;25664:9;25658:4;25654:20;25650:1;25639:9;25635:17;25628:47;25692:131;25818:4;25692:131;:::i;:::-;25684:139;;25411:419;;;:::o;25836:::-;26002:4;26040:2;26029:9;26025:18;26017:26;;26089:9;26083:4;26079:20;26075:1;26064:9;26060:17;26053:47;26117:131;26243:4;26117:131;:::i;:::-;26109:139;;25836:419;;;:::o;26261:::-;26427:4;26465:2;26454:9;26450:18;26442:26;;26514:9;26508:4;26504:20;26500:1;26489:9;26485:17;26478:47;26542:131;26668:4;26542:131;:::i;:::-;26534:139;;26261:419;;;:::o;26686:::-;26852:4;26890:2;26879:9;26875:18;26867:26;;26939:9;26933:4;26929:20;26925:1;26914:9;26910:17;26903:47;26967:131;27093:4;26967:131;:::i;:::-;26959:139;;26686:419;;;:::o;27111:::-;27277:4;27315:2;27304:9;27300:18;27292:26;;27364:9;27358:4;27354:20;27350:1;27339:9;27335:17;27328:47;27392:131;27518:4;27392:131;:::i;:::-;27384:139;;27111:419;;;:::o;27536:::-;27702:4;27740:2;27729:9;27725:18;27717:26;;27789:9;27783:4;27779:20;27775:1;27764:9;27760:17;27753:47;27817:131;27943:4;27817:131;:::i;:::-;27809:139;;27536:419;;;:::o;27961:::-;28127:4;28165:2;28154:9;28150:18;28142:26;;28214:9;28208:4;28204:20;28200:1;28189:9;28185:17;28178:47;28242:131;28368:4;28242:131;:::i;:::-;28234:139;;27961:419;;;:::o;28386:::-;28552:4;28590:2;28579:9;28575:18;28567:26;;28639:9;28633:4;28629:20;28625:1;28614:9;28610:17;28603:47;28667:131;28793:4;28667:131;:::i;:::-;28659:139;;28386:419;;;:::o;28811:::-;28977:4;29015:2;29004:9;29000:18;28992:26;;29064:9;29058:4;29054:20;29050:1;29039:9;29035:17;29028:47;29092:131;29218:4;29092:131;:::i;:::-;29084:139;;28811:419;;;:::o;29236:::-;29402:4;29440:2;29429:9;29425:18;29417:26;;29489:9;29483:4;29479:20;29475:1;29464:9;29460:17;29453:47;29517:131;29643:4;29517:131;:::i;:::-;29509:139;;29236:419;;;:::o;29661:::-;29827:4;29865:2;29854:9;29850:18;29842:26;;29914:9;29908:4;29904:20;29900:1;29889:9;29885:17;29878:47;29942:131;30068:4;29942:131;:::i;:::-;29934:139;;29661:419;;;:::o;30086:::-;30252:4;30290:2;30279:9;30275:18;30267:26;;30339:9;30333:4;30329:20;30325:1;30314:9;30310:17;30303:47;30367:131;30493:4;30367:131;:::i;:::-;30359:139;;30086:419;;;:::o;30511:::-;30677:4;30715:2;30704:9;30700:18;30692:26;;30764:9;30758:4;30754:20;30750:1;30739:9;30735:17;30728:47;30792:131;30918:4;30792:131;:::i;:::-;30784:139;;30511:419;;;:::o;30936:::-;31102:4;31140:2;31129:9;31125:18;31117:26;;31189:9;31183:4;31179:20;31175:1;31164:9;31160:17;31153:47;31217:131;31343:4;31217:131;:::i;:::-;31209:139;;30936:419;;;:::o;31361:::-;31527:4;31565:2;31554:9;31550:18;31542:26;;31614:9;31608:4;31604:20;31600:1;31589:9;31585:17;31578:47;31642:131;31768:4;31642:131;:::i;:::-;31634:139;;31361:419;;;:::o;31786:::-;31952:4;31990:2;31979:9;31975:18;31967:26;;32039:9;32033:4;32029:20;32025:1;32014:9;32010:17;32003:47;32067:131;32193:4;32067:131;:::i;:::-;32059:139;;31786:419;;;:::o;32211:::-;32377:4;32415:2;32404:9;32400:18;32392:26;;32464:9;32458:4;32454:20;32450:1;32439:9;32435:17;32428:47;32492:131;32618:4;32492:131;:::i;:::-;32484:139;;32211:419;;;:::o;32636:::-;32802:4;32840:2;32829:9;32825:18;32817:26;;32889:9;32883:4;32879:20;32875:1;32864:9;32860:17;32853:47;32917:131;33043:4;32917:131;:::i;:::-;32909:139;;32636:419;;;:::o;33061:::-;33227:4;33265:2;33254:9;33250:18;33242:26;;33314:9;33308:4;33304:20;33300:1;33289:9;33285:17;33278:47;33342:131;33468:4;33342:131;:::i;:::-;33334:139;;33061:419;;;:::o;33486:::-;33652:4;33690:2;33679:9;33675:18;33667:26;;33739:9;33733:4;33729:20;33725:1;33714:9;33710:17;33703:47;33767:131;33893:4;33767:131;:::i;:::-;33759:139;;33486:419;;;:::o;33911:::-;34077:4;34115:2;34104:9;34100:18;34092:26;;34164:9;34158:4;34154:20;34150:1;34139:9;34135:17;34128:47;34192:131;34318:4;34192:131;:::i;:::-;34184:139;;33911:419;;;:::o;34336:::-;34502:4;34540:2;34529:9;34525:18;34517:26;;34589:9;34583:4;34579:20;34575:1;34564:9;34560:17;34553:47;34617:131;34743:4;34617:131;:::i;:::-;34609:139;;34336:419;;;:::o;34761:::-;34927:4;34965:2;34954:9;34950:18;34942:26;;35014:9;35008:4;35004:20;35000:1;34989:9;34985:17;34978:47;35042:131;35168:4;35042:131;:::i;:::-;35034:139;;34761:419;;;:::o;35186:::-;35352:4;35390:2;35379:9;35375:18;35367:26;;35439:9;35433:4;35429:20;35425:1;35414:9;35410:17;35403:47;35467:131;35593:4;35467:131;:::i;:::-;35459:139;;35186:419;;;:::o;35611:::-;35777:4;35815:2;35804:9;35800:18;35792:26;;35864:9;35858:4;35854:20;35850:1;35839:9;35835:17;35828:47;35892:131;36018:4;35892:131;:::i;:::-;35884:139;;35611:419;;;:::o;36036:346::-;36191:4;36229:2;36218:9;36214:18;36206:26;;36242:133;36372:1;36361:9;36357:17;36348:6;36242:133;:::i;:::-;36036:346;;;;:::o;36388:222::-;36481:4;36519:2;36508:9;36504:18;36496:26;;36532:71;36600:1;36589:9;36585:17;36576:6;36532:71;:::i;:::-;36388:222;;;;:::o;36616:129::-;36650:6;36677:20;;:::i;:::-;36667:30;;36706:33;36734:4;36726:6;36706:33;:::i;:::-;36616:129;;;:::o;36751:75::-;36784:6;36817:2;36811:9;36801:19;;36751:75;:::o;36832:307::-;36893:4;36983:18;36975:6;36972:30;36969:56;;;37005:18;;:::i;:::-;36969:56;37043:29;37065:6;37043:29;:::i;:::-;37035:37;;37127:4;37121;37117:15;37109:23;;36832:307;;;:::o;37145:98::-;37196:6;37230:5;37224:12;37214:22;;37145:98;;;:::o;37249:99::-;37301:6;37335:5;37329:12;37319:22;;37249:99;;;:::o;37354:168::-;37437:11;37471:6;37466:3;37459:19;37511:4;37506:3;37502:14;37487:29;;37354:168;;;;:::o;37528:147::-;37629:11;37666:3;37651:18;;37528:147;;;;:::o;37681:169::-;37765:11;37799:6;37794:3;37787:19;37839:4;37834:3;37830:14;37815:29;;37681:169;;;;:::o;37856:148::-;37958:11;37995:3;37980:18;;37856:148;;;;:::o;38010:273::-;38050:3;38069:20;38087:1;38069:20;:::i;:::-;38064:25;;38103:20;38121:1;38103:20;:::i;:::-;38098:25;;38225:1;38189:34;38185:42;38182:1;38179:49;38176:75;;;38231:18;;:::i;:::-;38176:75;38275:1;38272;38268:9;38261:16;;38010:273;;;;:::o;38289:305::-;38329:3;38348:20;38366:1;38348:20;:::i;:::-;38343:25;;38382:20;38400:1;38382:20;:::i;:::-;38377:25;;38536:1;38468:66;38464:74;38461:1;38458:81;38455:107;;;38542:18;;:::i;:::-;38455:107;38586:1;38583;38579:9;38572:16;;38289:305;;;;:::o;38600:185::-;38640:1;38657:20;38675:1;38657:20;:::i;:::-;38652:25;;38691:20;38709:1;38691:20;:::i;:::-;38686:25;;38730:1;38720:35;;38735:18;;:::i;:::-;38720:35;38777:1;38774;38770:9;38765:14;;38600:185;;;;:::o;38791:191::-;38831:4;38851:20;38869:1;38851:20;:::i;:::-;38846:25;;38885:20;38903:1;38885:20;:::i;:::-;38880:25;;38924:1;38921;38918:8;38915:34;;;38929:18;;:::i;:::-;38915:34;38974:1;38971;38967:9;38959:17;;38791:191;;;;:::o;38988:::-;39028:4;39048:20;39066:1;39048:20;:::i;:::-;39043:25;;39082:20;39100:1;39082:20;:::i;:::-;39077:25;;39121:1;39118;39115:8;39112:34;;;39126:18;;:::i;:::-;39112:34;39171:1;39168;39164:9;39156:17;;38988:191;;;;:::o;39185:96::-;39222:7;39251:24;39269:5;39251:24;:::i;:::-;39240:35;;39185:96;;;:::o;39287:90::-;39321:7;39364:5;39357:13;39350:21;39339:32;;39287:90;;;:::o;39383:149::-;39419:7;39459:66;39452:5;39448:78;39437:89;;39383:149;;;:::o;39538:118::-;39575:7;39615:34;39608:5;39604:46;39593:57;;39538:118;;;:::o;39662:126::-;39699:7;39739:42;39732:5;39728:54;39717:65;;39662:126;;;:::o;39794:77::-;39831:7;39860:5;39849:16;;39794:77;;;:::o;39877:101::-;39913:7;39953:18;39946:5;39942:30;39931:41;;39877:101;;;:::o;39984:154::-;40068:6;40063:3;40058;40045:30;40130:1;40121:6;40116:3;40112:16;40105:27;39984:154;;;:::o;40144:307::-;40212:1;40222:113;40236:6;40233:1;40230:13;40222:113;;;40321:1;40316:3;40312:11;40306:18;40302:1;40297:3;40293:11;40286:39;40258:2;40255:1;40251:10;40246:15;;40222:113;;;40353:6;40350:1;40347:13;40344:101;;;40433:1;40424:6;40419:3;40415:16;40408:27;40344:101;40193:258;40144:307;;;:::o;40457:171::-;40496:3;40519:24;40537:5;40519:24;:::i;:::-;40510:33;;40565:4;40558:5;40555:15;40552:41;;;40573:18;;:::i;:::-;40552:41;40620:1;40613:5;40609:13;40602:20;;40457:171;;;:::o;40634:320::-;40678:6;40715:1;40709:4;40705:12;40695:22;;40762:1;40756:4;40752:12;40783:18;40773:81;;40839:4;40831:6;40827:17;40817:27;;40773:81;40901:2;40893:6;40890:14;40870:18;40867:38;40864:84;;;40920:18;;:::i;:::-;40864:84;40685:269;40634:320;;;:::o;40960:281::-;41043:27;41065:4;41043:27;:::i;:::-;41035:6;41031:40;41173:6;41161:10;41158:22;41137:18;41125:10;41122:34;41119:62;41116:88;;;41184:18;;:::i;:::-;41116:88;41224:10;41220:2;41213:22;41003:238;40960:281;;:::o;41247:233::-;41286:3;41309:24;41327:5;41309:24;:::i;:::-;41300:33;;41355:66;41348:5;41345:77;41342:103;;;41425:18;;:::i;:::-;41342:103;41472:1;41465:5;41461:13;41454:20;;41247:233;;;:::o;41486:176::-;41518:1;41535:20;41553:1;41535:20;:::i;:::-;41530:25;;41569:20;41587:1;41569:20;:::i;:::-;41564:25;;41608:1;41598:35;;41613:18;;:::i;:::-;41598:35;41654:1;41651;41647:9;41642:14;;41486:176;;;;:::o;41668:180::-;41716:77;41713:1;41706:88;41813:4;41810:1;41803:15;41837:4;41834:1;41827:15;41854:180;41902:77;41899:1;41892:88;41999:4;41996:1;41989:15;42023:4;42020:1;42013:15;42040:180;42088:77;42085:1;42078:88;42185:4;42182:1;42175:15;42209:4;42206:1;42199:15;42226:180;42274:77;42271:1;42264:88;42371:4;42368:1;42361:15;42395:4;42392:1;42385:15;42412:180;42460:77;42457:1;42450:88;42557:4;42554:1;42547:15;42581:4;42578:1;42571:15;42598:117;42707:1;42704;42697:12;42721:117;42830:1;42827;42820:12;42844:117;42953:1;42950;42943:12;42967:117;43076:1;43073;43066:12;43090:117;43199:1;43196;43189:12;43213:117;43322:1;43319;43312:12;43336:102;43377:6;43428:2;43424:7;43419:2;43412:5;43408:14;43404:28;43394:38;;43336:102;;;:::o;43444:221::-;43584:34;43580:1;43572:6;43568:14;43561:58;43653:4;43648:2;43640:6;43636:15;43629:29;43444:221;:::o;43671:225::-;43811:34;43807:1;43799:6;43795:14;43788:58;43880:8;43875:2;43867:6;43863:15;43856:33;43671:225;:::o;43902:229::-;44042:34;44038:1;44030:6;44026:14;44019:58;44111:12;44106:2;44098:6;44094:15;44087:37;43902:229;:::o;44137:172::-;44277:24;44273:1;44265:6;44261:14;44254:48;44137:172;:::o;44315:222::-;44455:34;44451:1;44443:6;44439:14;44432:58;44524:5;44519:2;44511:6;44507:15;44500:30;44315:222;:::o;44543:224::-;44683:34;44679:1;44671:6;44667:14;44660:58;44752:7;44747:2;44739:6;44735:15;44728:32;44543:224;:::o;44773:236::-;44913:34;44909:1;44901:6;44897:14;44890:58;44982:19;44977:2;44969:6;44965:15;44958:44;44773:236;:::o;45015:180::-;45155:32;45151:1;45143:6;45139:14;45132:56;45015:180;:::o;45201:244::-;45341:34;45337:1;45329:6;45325:14;45318:58;45410:27;45405:2;45397:6;45393:15;45386:52;45201:244;:::o;45451:174::-;45591:26;45587:1;45579:6;45575:14;45568:50;45451:174;:::o;45631:230::-;45771:34;45767:1;45759:6;45755:14;45748:58;45840:13;45835:2;45827:6;45823:15;45816:38;45631:230;:::o;45867:168::-;46007:20;46003:1;45995:6;45991:14;45984:44;45867:168;:::o;46041:225::-;46181:34;46177:1;46169:6;46165:14;46158:58;46250:8;46245:2;46237:6;46233:15;46226:33;46041:225;:::o;46272:155::-;46412:7;46408:1;46400:6;46396:14;46389:31;46272:155;:::o;46433:182::-;46573:34;46569:1;46561:6;46557:14;46550:58;46433:182;:::o;46621:234::-;46761:34;46757:1;46749:6;46745:14;46738:58;46830:17;46825:2;46817:6;46813:15;46806:42;46621:234;:::o;46861:176::-;47001:28;46997:1;46989:6;46985:14;46978:52;46861:176;:::o;47043:237::-;47183:34;47179:1;47171:6;47167:14;47160:58;47252:20;47247:2;47239:6;47235:15;47228:45;47043:237;:::o;47286:179::-;47426:31;47422:1;47414:6;47410:14;47403:55;47286:179;:::o;47471:221::-;47611:34;47607:1;47599:6;47595:14;47588:58;47680:4;47675:2;47667:6;47663:15;47656:29;47471:221;:::o;47698:114::-;;:::o;47818:166::-;47958:18;47954:1;47946:6;47942:14;47935:42;47818:166;:::o;47990:238::-;48130:34;48126:1;48118:6;48114:14;48107:58;48199:21;48194:2;48186:6;48182:15;48175:46;47990:238;:::o;48234:179::-;48374:31;48370:1;48362:6;48358:14;48351:55;48234:179;:::o;48419:220::-;48559:34;48555:1;48547:6;48543:14;48536:58;48628:3;48623:2;48615:6;48611:15;48604:28;48419:220;:::o;48645:233::-;48785:34;48781:1;48773:6;48769:14;48762:58;48854:16;48849:2;48841:6;48837:15;48830:41;48645:233;:::o;48884:225::-;49024:34;49020:1;49012:6;49008:14;49001:58;49093:8;49088:2;49080:6;49076:15;49069:33;48884:225;:::o;49115:181::-;49255:33;49251:1;49243:6;49239:14;49232:57;49115:181;:::o;49302:234::-;49442:34;49438:1;49430:6;49426:14;49419:58;49511:17;49506:2;49498:6;49494:15;49487:42;49302:234;:::o;49542:232::-;49682:34;49678:1;49670:6;49666:14;49659:58;49751:15;49746:2;49738:6;49734:15;49727:40;49542:232;:::o;49780:221::-;49920:34;49916:1;49908:6;49904:14;49897:58;49989:4;49984:2;49976:6;49972:15;49965:29;49780:221;:::o;50007:122::-;50080:24;50098:5;50080:24;:::i;:::-;50073:5;50070:35;50060:63;;50119:1;50116;50109:12;50060:63;50007:122;:::o;50135:116::-;50205:21;50220:5;50205:21;:::i;:::-;50198:5;50195:32;50185:60;;50241:1;50238;50231:12;50185:60;50135:116;:::o;50257:120::-;50329:23;50346:5;50329:23;:::i;:::-;50322:5;50319:34;50309:62;;50367:1;50364;50357:12;50309:62;50257:120;:::o;50383:122::-;50456:24;50474:5;50456:24;:::i;:::-;50449:5;50446:35;50436:63;;50495:1;50492;50485:12;50436:63;50383:122;:::o
Swarm Source
ipfs://75369dbeae33ddc5843b8a224be9ed512c4425773df6aac830b43de434e1ff59
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.