ERC-721
NFT
Overview
Max Total Supply
8,888 SUCK
Holders
1,986
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 SUCKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Suckers
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-09 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (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 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/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: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs 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..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply */ 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 internal _nextTokenId; // 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) internal _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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _nextTokenId = 1; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _nextTokenId - 1; } /** * @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(totalSupply). 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'); for (uint256 curr = tokenId; ; 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(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public 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 < _nextTokenId; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `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 = _nextTokenId; 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 > 0, 'ERC721A: quantity must be greater 0'); _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++; } _nextTokenId = 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); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _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); } /** * @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: @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); } } pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } pragma solidity ^0.8.0; contract Suckers is ERC721A, Ownable { using Strings for uint256; address public contractOwner; uint256 public mintPrice = 0.0055 ether; uint256 public presalePrice = 0.0 ether; uint256 public supply = 8888; uint256 public freeAmount = 2900; string private baseURI = "https://suckersnft.io/api/nft/"; bytes32 public presaleMerkleRoot; uint8 public phase = 1; uint8 public maxBuy = 10; uint8 public presaleMaxBuy = 1; mapping(address => uint8) public walletBuys; constructor() ERC721A("Suckers", "SUCK") { contractOwner = msg.sender; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ""; } function mintForAddress(address[] calldata _addresses, uint256 quantity) public onlyOwner { for (uint i=0; i<_addresses.length; i++) { _safeMint(_addresses[i], quantity); } } function mint(uint8 _mintAmount) external payable { require(phase == 3, "This sale has not started"); require(totalSupply() + _mintAmount <= supply, "You can't mint more then the total supply"); require(walletBuys[msg.sender] + _mintAmount <= maxBuy, "Buy limit reached"); require(msg.value >= mintPrice * _mintAmount, "Insufficient funds"); walletBuys[msg.sender] += _mintAmount; _safeMint(msg.sender, _mintAmount); } function publicMint(uint8 _mintAmount) external payable { require(phase == 2, "This sale has not started"); require(totalSupply() + _mintAmount <= supply, "You can't mint more then the total supply"); require(walletBuys[msg.sender] + _mintAmount <= presaleMaxBuy, "Buy limit reached"); require(totalSupply() + _mintAmount < freeAmount, "All free mints have been claimed"); require(msg.value >= presalePrice * _mintAmount, "Insufficient funds"); walletBuys[msg.sender] += _mintAmount; _safeMint(msg.sender, _mintAmount); } function presaleMint(uint8 _mintAmount, bytes32[] calldata _merkleProof) public payable { // Verify presale list requirements require(phase == 1, "This sale has not started"); require(walletBuys[msg.sender] + _mintAmount <= presaleMaxBuy, "Buy limit reached"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, presaleMerkleRoot, leaf), "Invalid proof!"); walletBuys[msg.sender] += _mintAmount; _safeMint(msg.sender, _mintAmount); } function getBaseURI() public view returns (string memory) { return baseURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory baseURI_) external onlyOwner { baseURI = baseURI_; } function setMintPrice (uint256 _newPrice) external onlyOwner { mintPrice = _newPrice; } function setPresalePrice (uint256 _newPrice) external onlyOwner { presalePrice = _newPrice; } function setPhase(uint8 _phase) public onlyOwner { phase = _phase; } function setMaxBuy(uint8 _maxBuy) external onlyOwner { maxBuy = _maxBuy; } function setPresaleMaxBuy(uint8 _maxBuy) external onlyOwner { presaleMaxBuy = _maxBuy; } function updateSupply(uint256 _supply) external onlyOwner { supply = _supply; } function updateFreeAmount(uint256 _amount) external onlyOwner { freeAmount = _amount; } function changePresaleRootHash(bytes32 _rootHash) external onlyOwner { presaleMerkleRoot = _rootHash; } function getContractBalance () external view onlyOwner returns (uint256) { return address(this).balance; } function changeTreasury(address payable _newWallet) external onlyOwner { contractOwner = _newWallet; } function withdraw() external payable onlyOwner { (bool os, ) = payable(contractOwner).call{value: address(this).balance}(""); require(os); } }
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":"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":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"changePresaleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newWallet","type":"address"}],"name":"changeTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","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":"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":"phase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"publicMint","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":"uint8","name":"_maxBuy","type":"uint8"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_phase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxBuy","type":"uint8"}],"name":"setPresaleMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"updateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletBuys","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405266138a388a43c0006009556000600a556122b8600b55610b54600c556040518060400160405280601e81526020017f68747470733a2f2f7375636b6572736e66742e696f2f6170692f6e66742f0000815250600d90805190602001906200006d929190620002ad565b506001600f60006101000a81548160ff021916908360ff160217905550600a600f60016101000a81548160ff021916908360ff1602179055506001600f60026101000a81548160ff021916908360ff160217905550348015620000cf57600080fd5b506040518060400160405280600781526020017f5375636b657273000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5355434b00000000000000000000000000000000000000000000000000000000815250816001908051906020019062000154929190620002ad565b5080600290805190602001906200016d929190620002ad565b5060016000819055505050620001986200018c620001df60201b60201c565b620001e760201b60201c565b33600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003c1565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002bb906200038c565b90600052602060002090601f016020900481019282620002df57600085556200032b565b82601f10620002fa57805160ff19168380011785556200032b565b828001600101855582156200032b579182015b828111156200032a5782518255916020019190600101906200030d565b5b5090506200033a91906200033e565b5090565b5b80821115620003595760008160009055506001016200033f565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003a557607f821691505b602082108103620003bb57620003ba6200035d565b5b50919050565b61567b80620003d16000396000f3fe60806040526004361061027c5760003560e01c806370a082311161014f578063b88d4fde116100c1578063dea96c981161007a578063dea96c9814610948578063dfcf15b014610985578063e985e9c5146109ae578063f218c01c146109eb578063f2fde38b14610a07578063f4a0a52814610a305761027c565b8063b88d4fde1461083c578063c03afb5914610865578063c87b56dd1461088e578063ce606ee0146108cb578063cf1ec4bd146108f6578063dbdf2dc01461091f5761027c565b80638da5cb5b116101135780638da5cb5b1461074057806395d89b411461076b578063a22cb46514610796578063ad0b4cc3146107bf578063b14f2a39146107e8578063b1c9fe6e146108115761027c565b806370a082311461067a57806370db69d6146106b7578063714c5398146106e2578063715018a61461070d578063858e83b5146107245761027c565b80633549345e116101f357806355f804b3116101ac57806355f804b3146105795780636352211e146105a25780636817c76c146105df5780636bd080491461060a5780636ecd2306146106335780636f9fb98a1461064f5761027c565b80633549345e1461048c5780633a3f716a146104b55780633c4201d2146104e05780633ccfd60b1461050957806342842e0e146105135780634f6ccce71461053c5761027c565b8063081812fc11610245578063081812fc1461036a578063095ea7b3146103a757806318160ddd146103d057806322212e2b146103fb57806323b872dd146104265780632f745c591461044f5761027c565b80620e7fa81461028157806301ffc9a7146102ac5780630451a9f1146102e9578063047fc9aa1461031457806306fdde031461033f575b600080fd5b34801561028d57600080fd5b50610296610a59565b6040516102a3919061398d565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613a14565b610a5f565b6040516102e09190613a5c565b60405180910390f35b3480156102f557600080fd5b506102fe610ba9565b60405161030b919061398d565b60405180910390f35b34801561032057600080fd5b50610329610baf565b604051610336919061398d565b60405180910390f35b34801561034b57600080fd5b50610354610bb5565b6040516103619190613b10565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c9190613b5e565b610c47565b60405161039e9190613bcc565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190613c13565b610ccc565b005b3480156103dc57600080fd5b506103e5610de4565b6040516103f2919061398d565b60405180910390f35b34801561040757600080fd5b50610410610dfa565b60405161041d9190613c6c565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190613c87565b610e00565b005b34801561045b57600080fd5b5061047660048036038101906104719190613c13565b610e10565b604051610483919061398d565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190613b5e565b61100c565b005b3480156104c157600080fd5b506104ca611092565b6040516104d79190613cf6565b60405180910390f35b3480156104ec57600080fd5b5061050760048036038101906105029190613d3d565b6110a5565b005b61051161112b565b005b34801561051f57600080fd5b5061053a60048036038101906105359190613c87565b611242565b005b34801561054857600080fd5b50610563600480360381019061055e9190613b5e565b611262565b604051610570919061398d565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190613e9f565b6112b5565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190613b5e565b61134b565b6040516105d69190613bcc565b60405180910390f35b3480156105eb57600080fd5b506105f4611361565b604051610601919061398d565b60405180910390f35b34801561061657600080fd5b50610631600480360381019061062c9190613b5e565b611367565b005b61064d60048036038101906106489190613f14565b6113ed565b005b34801561065b57600080fd5b50610664611621565b604051610671919061398d565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613f41565b6116a5565b6040516106ae919061398d565b60405180910390f35b3480156106c357600080fd5b506106cc61178d565b6040516106d99190613cf6565b60405180910390f35b3480156106ee57600080fd5b506106f76117a0565b6040516107049190613b10565b60405180910390f35b34801561071957600080fd5b50610722611832565b005b61073e60048036038101906107399190613f14565b6118ba565b005b34801561074c57600080fd5b50610755611b47565b6040516107629190613bcc565b60405180910390f35b34801561077757600080fd5b50610780611b71565b60405161078d9190613b10565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b89190613f9a565b611c03565b005b3480156107cb57600080fd5b506107e660048036038101906107e19190613f14565b611d83565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190614018565b611e1d565b005b34801561081d57600080fd5b50610826611edd565b6040516108339190613cf6565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e91906140e6565b611ef0565b005b34801561087157600080fd5b5061088c60048036038101906108879190613f14565b611f4c565b005b34801561089a57600080fd5b506108b560048036038101906108b09190613b5e565b611fe6565b6040516108c29190613b10565b60405180910390f35b3480156108d757600080fd5b506108e061208e565b6040516108ed9190613bcc565b60405180910390f35b34801561090257600080fd5b5061091d60048036038101906109189190613b5e565b6120b4565b005b34801561092b57600080fd5b5061094660048036038101906109419190613f14565b61213a565b005b34801561095457600080fd5b5061096f600480360381019061096a9190613f41565b6121d4565b60405161097c9190613cf6565b60405180910390f35b34801561099157600080fd5b506109ac60048036038101906109a791906141c9565b6121f4565b005b3480156109ba57600080fd5b506109d560048036038101906109d09190614229565b6122c8565b6040516109e29190613a5c565b60405180910390f35b610a056004803603810190610a0091906142bf565b61235c565b005b348015610a1357600080fd5b50610a2e6004803603810190610a299190613f41565b61259e565b005b348015610a3c57600080fd5b50610a576004803603810190610a529190613b5e565b612695565b005b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b9257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ba25750610ba18261271b565b5b9050919050565b600c5481565b600b5481565b606060018054610bc49061434e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf09061434e565b8015610c3d5780601f10610c1257610100808354040283529160200191610c3d565b820191906000526020600020905b815481529060010190602001808311610c2057829003601f168201915b5050505050905090565b6000610c5282612785565b610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906143f1565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cd78261134b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90614483565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d66612792565b73ffffffffffffffffffffffffffffffffffffffff161480610d955750610d9481610d8f612792565b6122c8565b5b610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614515565b60405180910390fd5b610ddf83838361279a565b505050565b60006001600054610df59190614564565b905090565b600e5481565b610e0b83838361284c565b505050565b6000610e1b836116a5565b8210610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e539061460a565b60405180910390fd5b6000610e66610de4565b905060008060005b83811015610fca576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f6057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fb657868403610fa7578195505050505050611006565b8380610fb29061462a565b9450505b508080610fc29061462a565b915050610e6e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd906146e4565b60405180910390fd5b92915050565b611014612792565b73ffffffffffffffffffffffffffffffffffffffff16611032611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90614750565b60405180910390fd5b80600a8190555050565b600f60029054906101000a900460ff1681565b6110ad612792565b73ffffffffffffffffffffffffffffffffffffffff166110cb611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890614750565b60405180910390fd5b80600e8190555050565b611133612792565b73ffffffffffffffffffffffffffffffffffffffff16611151611b47565b73ffffffffffffffffffffffffffffffffffffffff16146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90614750565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516111ef906147a1565b60006040518083038185875af1925050503d806000811461122c576040519150601f19603f3d011682016040523d82523d6000602084013e611231565b606091505b505090508061123f57600080fd5b50565b61125d83838360405180602001604052806000815250611ef0565b505050565b600061126c610de4565b82106112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490614828565b60405180910390fd5b819050919050565b6112bd612792565b73ffffffffffffffffffffffffffffffffffffffff166112db611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890614750565b60405180910390fd5b80600d9080519060200190611347929190613897565b5050565b600061135682612df1565b600001519050919050565b60095481565b61136f612792565b73ffffffffffffffffffffffffffffffffffffffff1661138d611b47565b73ffffffffffffffffffffffffffffffffffffffff16146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614750565b60405180910390fd5b80600b8190555050565b6003600f60009054906101000a900460ff1660ff1614611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614894565b60405180910390fd5b600b548160ff16611451610de4565b61145b91906148b4565b111561149c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114939061497c565b60405180910390fd5b600f60019054906101000a900460ff1660ff1681601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611507919061499c565b60ff16111561154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290614a1f565b60405180910390fd5b8060ff1660095461155c9190614a3f565b34101561159e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159590614ae5565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166115f9919061499c565b92506101000a81548160ff021916908360ff16021790555061161e338260ff16612f4c565b50565b600061162b612792565b73ffffffffffffffffffffffffffffffffffffffff16611649611b47565b73ffffffffffffffffffffffffffffffffffffffff161461169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690614750565b60405180910390fd5b47905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c90614b77565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600f60019054906101000a900460ff1681565b6060600d80546117af9061434e565b80601f01602080910402602001604051908101604052809291908181526020018280546117db9061434e565b80156118285780601f106117fd57610100808354040283529160200191611828565b820191906000526020600020905b81548152906001019060200180831161180b57829003601f168201915b5050505050905090565b61183a612792565b73ffffffffffffffffffffffffffffffffffffffff16611858611b47565b73ffffffffffffffffffffffffffffffffffffffff16146118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590614750565b60405180910390fd5b6118b86000612f6a565b565b6002600f60009054906101000a900460ff1660ff161461190f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190690614894565b60405180910390fd5b600b548160ff1661191e610de4565b61192891906148b4565b1115611969576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119609061497c565b60405180910390fd5b600f60029054906101000a900460ff1660ff1681601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119d4919061499c565b60ff161115611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90614a1f565b60405180910390fd5b600c548160ff16611a27610de4565b611a3191906148b4565b10611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614be3565b60405180910390fd5b8060ff16600a54611a829190614a3f565b341015611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614ae5565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611b1f919061499c565b92506101000a81548160ff021916908360ff160217905550611b44338260ff16612f4c565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611b809061434e565b80601f0160208091040260200160405190810160405280929190818152602001828054611bac9061434e565b8015611bf95780601f10611bce57610100808354040283529160200191611bf9565b820191906000526020600020905b815481529060010190602001808311611bdc57829003601f168201915b5050505050905090565b611c0b612792565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90614c4f565b60405180910390fd5b8060066000611c85612792565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d32612792565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d779190613a5c565b60405180910390a35050565b611d8b612792565b73ffffffffffffffffffffffffffffffffffffffff16611da9611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df690614750565b60405180910390fd5b80600f60026101000a81548160ff021916908360ff16021790555050565b611e25612792565b73ffffffffffffffffffffffffffffffffffffffff16611e43611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9090614750565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900460ff1681565b611efb84848461284c565b611f0784848484613030565b611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90614ce1565b60405180910390fd5b50505050565b611f54612792565b73ffffffffffffffffffffffffffffffffffffffff16611f72611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90614750565b60405180910390fd5b80600f60006101000a81548160ff021916908360ff16021790555050565b6060611ff182612785565b612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790614d73565b60405180910390fd5b6000600d805461203f9061434e565b90501161205b5760405180602001604052806000815250612087565b600d612066836131b7565b604051602001612077929190614eaf565b6040516020818303038152906040525b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120bc612792565b73ffffffffffffffffffffffffffffffffffffffff166120da611b47565b73ffffffffffffffffffffffffffffffffffffffff1614612130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212790614750565b60405180910390fd5b80600c8190555050565b612142612792565b73ffffffffffffffffffffffffffffffffffffffff16612160611b47565b73ffffffffffffffffffffffffffffffffffffffff16146121b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ad90614750565b60405180910390fd5b80600f60016101000a81548160ff021916908360ff16021790555050565b60106020528060005260406000206000915054906101000a900460ff1681565b6121fc612792565b73ffffffffffffffffffffffffffffffffffffffff1661221a611b47565b73ffffffffffffffffffffffffffffffffffffffff1614612270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226790614750565b60405180910390fd5b60005b838390508110156122c2576122af84848381811061229457612293614ede565b5b90506020020160208101906122a99190613f41565b83612f4c565b80806122ba9061462a565b915050612273565b50505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6001600f60009054906101000a900460ff1660ff16146123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890614894565b60405180910390fd5b600f60029054906101000a900460ff1660ff1683601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661241c919061499c565b60ff161115612460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245790614a1f565b60405180910390fd5b6000336040516020016124739190614f55565b6040516020818303038152906040528051906020012090506124d9838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483613317565b612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250f90614fbc565b60405180910390fd5b83601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16612573919061499c565b92506101000a81548160ff021916908360ff160217905550612598338560ff16612f4c565b50505050565b6125a6612792565b73ffffffffffffffffffffffffffffffffffffffff166125c4611b47565b73ffffffffffffffffffffffffffffffffffffffff161461261a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261190614750565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612689576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126809061504e565b60405180910390fd5b61269281612f6a565b50565b61269d612792565b73ffffffffffffffffffffffffffffffffffffffff166126bb611b47565b73ffffffffffffffffffffffffffffffffffffffff1614612711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270890614750565b60405180910390fd5b8060098190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061285782612df1565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661287e612792565b73ffffffffffffffffffffffffffffffffffffffff1614806128da57506128a3612792565b73ffffffffffffffffffffffffffffffffffffffff166128c284610c47565b73ffffffffffffffffffffffffffffffffffffffff16145b806128f657506128f582600001516128f0612792565b6122c8565b5b905080612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f906150e0565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146129aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a190615172565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1090615204565b60405180910390fd5b612a26858585600161332e565b612a36600084846000015161279a565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c3c91906148b4565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612d8157612cb181612785565b15612d80576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612de98686866001613334565b505050505050565b612df961391d565b612e0282612785565b612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890615296565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f33578092505050612f47565b508080612f3f906152b6565b915050612e47565b919050565b612f6682826040518060200160405280600081525061333a565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006130518473ffffffffffffffffffffffffffffffffffffffff166137f8565b156131aa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307a612792565b8786866040518563ffffffff1660e01b815260040161309c9493929190615334565b6020604051808303816000875af19250505080156130d857506040513d601f19601f820116820180604052508101906130d59190615395565b60015b61315a573d8060008114613108576040519150601f19603f3d011682016040523d82523d6000602084013e61310d565b606091505b506000815103613152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314990614ce1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131af565b600190505b949350505050565b6060600082036131fe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613312565b600082905060005b600082146132305780806132199061462a565b915050600a8261322991906153f1565b9150613206565b60008167ffffffffffffffff81111561324c5761324b613d74565b5b6040519080825280601f01601f19166020018201604052801561327e5781602001600182028036833780820191505090505b5090505b6000851461330b576001826132979190614564565b9150600a856132a69190615422565b60306132b291906148b4565b60f81b8183815181106132c8576132c7614ede565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561330491906153f1565b9450613282565b8093505050505b919050565b600082613324858461380b565b1490509392505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a6906154c5565b60405180910390fd5b6133b881612785565b156133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef90615531565b60405180910390fd5b6000831161343b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613432906155c3565b60405180910390fd5b613448600085838661332e565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161354591906155ff565b6fffffffffffffffffffffffffffffffff16815260200185836020015161356c91906155ff565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156137db57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461377b6000888488613030565b6137ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b190614ce1565b60405180910390fd5b81806137c59061462a565b92505080806137d39061462a565b91505061370a565b50806000819055506137f06000878588613334565b505050505050565b600080823b905060008111915050919050565b60008082905060005b845181101561387557600085828151811061383257613831614ede565b5b602002602001015190508083116138545761384d8382613880565b9250613861565b61385e8184613880565b92505b50808061386d9061462a565b915050613814565b508091505092915050565b600082600052816020526040600020905092915050565b8280546138a39061434e565b90600052602060002090601f0160209004810192826138c5576000855561390c565b82601f106138de57805160ff191683800117855561390c565b8280016001018555821561390c579182015b8281111561390b5782518255916020019190600101906138f0565b5b5090506139199190613957565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613970576000816000905550600101613958565b5090565b6000819050919050565b61398781613974565b82525050565b60006020820190506139a2600083018461397e565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139f1816139bc565b81146139fc57600080fd5b50565b600081359050613a0e816139e8565b92915050565b600060208284031215613a2a57613a296139b2565b5b6000613a38848285016139ff565b91505092915050565b60008115159050919050565b613a5681613a41565b82525050565b6000602082019050613a716000830184613a4d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ab1578082015181840152602081019050613a96565b83811115613ac0576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ae282613a77565b613aec8185613a82565b9350613afc818560208601613a93565b613b0581613ac6565b840191505092915050565b60006020820190508181036000830152613b2a8184613ad7565b905092915050565b613b3b81613974565b8114613b4657600080fd5b50565b600081359050613b5881613b32565b92915050565b600060208284031215613b7457613b736139b2565b5b6000613b8284828501613b49565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bb682613b8b565b9050919050565b613bc681613bab565b82525050565b6000602082019050613be16000830184613bbd565b92915050565b613bf081613bab565b8114613bfb57600080fd5b50565b600081359050613c0d81613be7565b92915050565b60008060408385031215613c2a57613c296139b2565b5b6000613c3885828601613bfe565b9250506020613c4985828601613b49565b9150509250929050565b6000819050919050565b613c6681613c53565b82525050565b6000602082019050613c816000830184613c5d565b92915050565b600080600060608486031215613ca057613c9f6139b2565b5b6000613cae86828701613bfe565b9350506020613cbf86828701613bfe565b9250506040613cd086828701613b49565b9150509250925092565b600060ff82169050919050565b613cf081613cda565b82525050565b6000602082019050613d0b6000830184613ce7565b92915050565b613d1a81613c53565b8114613d2557600080fd5b50565b600081359050613d3781613d11565b92915050565b600060208284031215613d5357613d526139b2565b5b6000613d6184828501613d28565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dac82613ac6565b810181811067ffffffffffffffff82111715613dcb57613dca613d74565b5b80604052505050565b6000613dde6139a8565b9050613dea8282613da3565b919050565b600067ffffffffffffffff821115613e0a57613e09613d74565b5b613e1382613ac6565b9050602081019050919050565b82818337600083830152505050565b6000613e42613e3d84613def565b613dd4565b905082815260208101848484011115613e5e57613e5d613d6f565b5b613e69848285613e20565b509392505050565b600082601f830112613e8657613e85613d6a565b5b8135613e96848260208601613e2f565b91505092915050565b600060208284031215613eb557613eb46139b2565b5b600082013567ffffffffffffffff811115613ed357613ed26139b7565b5b613edf84828501613e71565b91505092915050565b613ef181613cda565b8114613efc57600080fd5b50565b600081359050613f0e81613ee8565b92915050565b600060208284031215613f2a57613f296139b2565b5b6000613f3884828501613eff565b91505092915050565b600060208284031215613f5757613f566139b2565b5b6000613f6584828501613bfe565b91505092915050565b613f7781613a41565b8114613f8257600080fd5b50565b600081359050613f9481613f6e565b92915050565b60008060408385031215613fb157613fb06139b2565b5b6000613fbf85828601613bfe565b9250506020613fd085828601613f85565b9150509250929050565b6000613fe582613b8b565b9050919050565b613ff581613fda565b811461400057600080fd5b50565b60008135905061401281613fec565b92915050565b60006020828403121561402e5761402d6139b2565b5b600061403c84828501614003565b91505092915050565b600067ffffffffffffffff8211156140605761405f613d74565b5b61406982613ac6565b9050602081019050919050565b600061408961408484614045565b613dd4565b9050828152602081018484840111156140a5576140a4613d6f565b5b6140b0848285613e20565b509392505050565b600082601f8301126140cd576140cc613d6a565b5b81356140dd848260208601614076565b91505092915050565b60008060008060808587031215614100576140ff6139b2565b5b600061410e87828801613bfe565b945050602061411f87828801613bfe565b935050604061413087828801613b49565b925050606085013567ffffffffffffffff811115614151576141506139b7565b5b61415d878288016140b8565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261418957614188613d6a565b5b8235905067ffffffffffffffff8111156141a6576141a5614169565b5b6020830191508360208202830111156141c2576141c161416e565b5b9250929050565b6000806000604084860312156141e2576141e16139b2565b5b600084013567ffffffffffffffff811115614200576141ff6139b7565b5b61420c86828701614173565b9350935050602061421f86828701613b49565b9150509250925092565b600080604083850312156142405761423f6139b2565b5b600061424e85828601613bfe565b925050602061425f85828601613bfe565b9150509250929050565b60008083601f84011261427f5761427e613d6a565b5b8235905067ffffffffffffffff81111561429c5761429b614169565b5b6020830191508360208202830111156142b8576142b761416e565b5b9250929050565b6000806000604084860312156142d8576142d76139b2565b5b60006142e686828701613eff565b935050602084013567ffffffffffffffff811115614307576143066139b7565b5b61431386828701614269565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061436657607f821691505b6020821081036143795761437861431f565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006143db602d83613a82565b91506143e68261437f565b604082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061446d602283613a82565b915061447882614411565b604082019050919050565b6000602082019050818103600083015261449c81614460565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006144ff603983613a82565b915061450a826144a3565b604082019050919050565b6000602082019050818103600083015261452e816144f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061456f82613974565b915061457a83613974565b92508282101561458d5761458c614535565b5b828203905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006145f4602283613a82565b91506145ff82614598565b604082019050919050565b60006020820190508181036000830152614623816145e7565b9050919050565b600061463582613974565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361466757614666614535565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006146ce602e83613a82565b91506146d982614672565b604082019050919050565b600060208201905081810360008301526146fd816146c1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061473a602083613a82565b915061474582614704565b602082019050919050565b600060208201905081810360008301526147698161472d565b9050919050565b600081905092915050565b50565b600061478b600083614770565b91506147968261477b565b600082019050919050565b60006147ac8261477e565b9150819050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614812602383613a82565b915061481d826147b6565b604082019050919050565b6000602082019050818103600083015261484181614805565b9050919050565b7f546869732073616c6520686173206e6f74207374617274656400000000000000600082015250565b600061487e601983613a82565b915061488982614848565b602082019050919050565b600060208201905081810360008301526148ad81614871565b9050919050565b60006148bf82613974565b91506148ca83613974565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148ff576148fe614535565b5b828201905092915050565b7f596f752063616e2774206d696e74206d6f7265207468656e2074686520746f7460008201527f616c20737570706c790000000000000000000000000000000000000000000000602082015250565b6000614966602983613a82565b91506149718261490a565b604082019050919050565b6000602082019050818103600083015261499581614959565b9050919050565b60006149a782613cda565b91506149b283613cda565b92508260ff038211156149c8576149c7614535565b5b828201905092915050565b7f427579206c696d69742072656163686564000000000000000000000000000000600082015250565b6000614a09601183613a82565b9150614a14826149d3565b602082019050919050565b60006020820190508181036000830152614a38816149fc565b9050919050565b6000614a4a82613974565b9150614a5583613974565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a8e57614a8d614535565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614acf601283613a82565b9150614ada82614a99565b602082019050919050565b60006020820190508181036000830152614afe81614ac2565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614b61602b83613a82565b9150614b6c82614b05565b604082019050919050565b60006020820190508181036000830152614b9081614b54565b9050919050565b7f416c6c2066726565206d696e74732068617665206265656e20636c61696d6564600082015250565b6000614bcd602083613a82565b9150614bd882614b97565b602082019050919050565b60006020820190508181036000830152614bfc81614bc0565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614c39601a83613a82565b9150614c4482614c03565b602082019050919050565b60006020820190508181036000830152614c6881614c2c565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614ccb603383613a82565b9150614cd682614c6f565b604082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d5d602f83613a82565b9150614d6882614d01565b604082019050919050565b60006020820190508181036000830152614d8c81614d50565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614dc08161434e565b614dca8186614d93565b94506001821660008114614de55760018114614df657614e29565b60ff19831686528186019350614e29565b614dff85614d9e565b60005b83811015614e2157815481890152600182019150602081019050614e02565b838801955050505b50505092915050565b6000614e3d82613a77565b614e478185614d93565b9350614e57818560208601613a93565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614e99600583614d93565b9150614ea482614e63565b600582019050919050565b6000614ebb8285614db3565b9150614ec78284614e32565b9150614ed282614e8c565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160601b9050919050565b6000614f2582614f0d565b9050919050565b6000614f3782614f1a565b9050919050565b614f4f614f4a82613bab565b614f2c565b82525050565b6000614f618284614f3e565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614fa6600e83613a82565b9150614fb182614f70565b602082019050919050565b60006020820190508181036000830152614fd581614f99565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615038602683613a82565b915061504382614fdc565b604082019050919050565b600060208201905081810360008301526150678161502b565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006150ca603283613a82565b91506150d58261506e565b604082019050919050565b600060208201905081810360008301526150f9816150bd565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061515c602683613a82565b915061516782615100565b604082019050919050565b6000602082019050818103600083015261518b8161514f565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006151ee602583613a82565b91506151f982615192565b604082019050919050565b6000602082019050818103600083015261521d816151e1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615280602a83613a82565b915061528b82615224565b604082019050919050565b600060208201905081810360008301526152af81615273565b9050919050565b60006152c182613974565b9150600082036152d4576152d3614535565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000615306826152df565b61531081856152ea565b9350615320818560208601613a93565b61532981613ac6565b840191505092915050565b60006080820190506153496000830187613bbd565b6153566020830186613bbd565b615363604083018561397e565b818103606083015261537581846152fb565b905095945050505050565b60008151905061538f816139e8565b92915050565b6000602082840312156153ab576153aa6139b2565b5b60006153b984828501615380565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153fc82613974565b915061540783613974565b925082615417576154166153c2565b5b828204905092915050565b600061542d82613974565b915061543883613974565b925082615448576154476153c2565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006154af602183613a82565b91506154ba82615453565b604082019050919050565b600060208201905081810360008301526154de816154a2565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b600061551b601d83613a82565b9150615526826154e5565b602082019050919050565b6000602082019050818103600083015261554a8161550e565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b60006155ad602383613a82565b91506155b882615551565b604082019050919050565b600060208201905081810360008301526155dc816155a0565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061560a826155e3565b9150615615836155e3565b9250826fffffffffffffffffffffffffffffffff0382111561563a57615639614535565b5b82820190509291505056fea2646970667358221220c4de581d8810f328e736b0241fb37dd2cfa35a818574d007d3346d7ae72d384f64736f6c634300080e0033
Deployed Bytecode
0x60806040526004361061027c5760003560e01c806370a082311161014f578063b88d4fde116100c1578063dea96c981161007a578063dea96c9814610948578063dfcf15b014610985578063e985e9c5146109ae578063f218c01c146109eb578063f2fde38b14610a07578063f4a0a52814610a305761027c565b8063b88d4fde1461083c578063c03afb5914610865578063c87b56dd1461088e578063ce606ee0146108cb578063cf1ec4bd146108f6578063dbdf2dc01461091f5761027c565b80638da5cb5b116101135780638da5cb5b1461074057806395d89b411461076b578063a22cb46514610796578063ad0b4cc3146107bf578063b14f2a39146107e8578063b1c9fe6e146108115761027c565b806370a082311461067a57806370db69d6146106b7578063714c5398146106e2578063715018a61461070d578063858e83b5146107245761027c565b80633549345e116101f357806355f804b3116101ac57806355f804b3146105795780636352211e146105a25780636817c76c146105df5780636bd080491461060a5780636ecd2306146106335780636f9fb98a1461064f5761027c565b80633549345e1461048c5780633a3f716a146104b55780633c4201d2146104e05780633ccfd60b1461050957806342842e0e146105135780634f6ccce71461053c5761027c565b8063081812fc11610245578063081812fc1461036a578063095ea7b3146103a757806318160ddd146103d057806322212e2b146103fb57806323b872dd146104265780632f745c591461044f5761027c565b80620e7fa81461028157806301ffc9a7146102ac5780630451a9f1146102e9578063047fc9aa1461031457806306fdde031461033f575b600080fd5b34801561028d57600080fd5b50610296610a59565b6040516102a3919061398d565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613a14565b610a5f565b6040516102e09190613a5c565b60405180910390f35b3480156102f557600080fd5b506102fe610ba9565b60405161030b919061398d565b60405180910390f35b34801561032057600080fd5b50610329610baf565b604051610336919061398d565b60405180910390f35b34801561034b57600080fd5b50610354610bb5565b6040516103619190613b10565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c9190613b5e565b610c47565b60405161039e9190613bcc565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190613c13565b610ccc565b005b3480156103dc57600080fd5b506103e5610de4565b6040516103f2919061398d565b60405180910390f35b34801561040757600080fd5b50610410610dfa565b60405161041d9190613c6c565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190613c87565b610e00565b005b34801561045b57600080fd5b5061047660048036038101906104719190613c13565b610e10565b604051610483919061398d565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190613b5e565b61100c565b005b3480156104c157600080fd5b506104ca611092565b6040516104d79190613cf6565b60405180910390f35b3480156104ec57600080fd5b5061050760048036038101906105029190613d3d565b6110a5565b005b61051161112b565b005b34801561051f57600080fd5b5061053a60048036038101906105359190613c87565b611242565b005b34801561054857600080fd5b50610563600480360381019061055e9190613b5e565b611262565b604051610570919061398d565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190613e9f565b6112b5565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190613b5e565b61134b565b6040516105d69190613bcc565b60405180910390f35b3480156105eb57600080fd5b506105f4611361565b604051610601919061398d565b60405180910390f35b34801561061657600080fd5b50610631600480360381019061062c9190613b5e565b611367565b005b61064d60048036038101906106489190613f14565b6113ed565b005b34801561065b57600080fd5b50610664611621565b604051610671919061398d565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613f41565b6116a5565b6040516106ae919061398d565b60405180910390f35b3480156106c357600080fd5b506106cc61178d565b6040516106d99190613cf6565b60405180910390f35b3480156106ee57600080fd5b506106f76117a0565b6040516107049190613b10565b60405180910390f35b34801561071957600080fd5b50610722611832565b005b61073e60048036038101906107399190613f14565b6118ba565b005b34801561074c57600080fd5b50610755611b47565b6040516107629190613bcc565b60405180910390f35b34801561077757600080fd5b50610780611b71565b60405161078d9190613b10565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b89190613f9a565b611c03565b005b3480156107cb57600080fd5b506107e660048036038101906107e19190613f14565b611d83565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190614018565b611e1d565b005b34801561081d57600080fd5b50610826611edd565b6040516108339190613cf6565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e91906140e6565b611ef0565b005b34801561087157600080fd5b5061088c60048036038101906108879190613f14565b611f4c565b005b34801561089a57600080fd5b506108b560048036038101906108b09190613b5e565b611fe6565b6040516108c29190613b10565b60405180910390f35b3480156108d757600080fd5b506108e061208e565b6040516108ed9190613bcc565b60405180910390f35b34801561090257600080fd5b5061091d60048036038101906109189190613b5e565b6120b4565b005b34801561092b57600080fd5b5061094660048036038101906109419190613f14565b61213a565b005b34801561095457600080fd5b5061096f600480360381019061096a9190613f41565b6121d4565b60405161097c9190613cf6565b60405180910390f35b34801561099157600080fd5b506109ac60048036038101906109a791906141c9565b6121f4565b005b3480156109ba57600080fd5b506109d560048036038101906109d09190614229565b6122c8565b6040516109e29190613a5c565b60405180910390f35b610a056004803603810190610a0091906142bf565b61235c565b005b348015610a1357600080fd5b50610a2e6004803603810190610a299190613f41565b61259e565b005b348015610a3c57600080fd5b50610a576004803603810190610a529190613b5e565b612695565b005b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b9257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ba25750610ba18261271b565b5b9050919050565b600c5481565b600b5481565b606060018054610bc49061434e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf09061434e565b8015610c3d5780601f10610c1257610100808354040283529160200191610c3d565b820191906000526020600020905b815481529060010190602001808311610c2057829003601f168201915b5050505050905090565b6000610c5282612785565b610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906143f1565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cd78261134b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90614483565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d66612792565b73ffffffffffffffffffffffffffffffffffffffff161480610d955750610d9481610d8f612792565b6122c8565b5b610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614515565b60405180910390fd5b610ddf83838361279a565b505050565b60006001600054610df59190614564565b905090565b600e5481565b610e0b83838361284c565b505050565b6000610e1b836116a5565b8210610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e539061460a565b60405180910390fd5b6000610e66610de4565b905060008060005b83811015610fca576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f6057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fb657868403610fa7578195505050505050611006565b8380610fb29061462a565b9450505b508080610fc29061462a565b915050610e6e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd906146e4565b60405180910390fd5b92915050565b611014612792565b73ffffffffffffffffffffffffffffffffffffffff16611032611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90614750565b60405180910390fd5b80600a8190555050565b600f60029054906101000a900460ff1681565b6110ad612792565b73ffffffffffffffffffffffffffffffffffffffff166110cb611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890614750565b60405180910390fd5b80600e8190555050565b611133612792565b73ffffffffffffffffffffffffffffffffffffffff16611151611b47565b73ffffffffffffffffffffffffffffffffffffffff16146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90614750565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516111ef906147a1565b60006040518083038185875af1925050503d806000811461122c576040519150601f19603f3d011682016040523d82523d6000602084013e611231565b606091505b505090508061123f57600080fd5b50565b61125d83838360405180602001604052806000815250611ef0565b505050565b600061126c610de4565b82106112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490614828565b60405180910390fd5b819050919050565b6112bd612792565b73ffffffffffffffffffffffffffffffffffffffff166112db611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890614750565b60405180910390fd5b80600d9080519060200190611347929190613897565b5050565b600061135682612df1565b600001519050919050565b60095481565b61136f612792565b73ffffffffffffffffffffffffffffffffffffffff1661138d611b47565b73ffffffffffffffffffffffffffffffffffffffff16146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614750565b60405180910390fd5b80600b8190555050565b6003600f60009054906101000a900460ff1660ff1614611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614894565b60405180910390fd5b600b548160ff16611451610de4565b61145b91906148b4565b111561149c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114939061497c565b60405180910390fd5b600f60019054906101000a900460ff1660ff1681601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611507919061499c565b60ff16111561154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290614a1f565b60405180910390fd5b8060ff1660095461155c9190614a3f565b34101561159e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159590614ae5565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166115f9919061499c565b92506101000a81548160ff021916908360ff16021790555061161e338260ff16612f4c565b50565b600061162b612792565b73ffffffffffffffffffffffffffffffffffffffff16611649611b47565b73ffffffffffffffffffffffffffffffffffffffff161461169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690614750565b60405180910390fd5b47905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c90614b77565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600f60019054906101000a900460ff1681565b6060600d80546117af9061434e565b80601f01602080910402602001604051908101604052809291908181526020018280546117db9061434e565b80156118285780601f106117fd57610100808354040283529160200191611828565b820191906000526020600020905b81548152906001019060200180831161180b57829003601f168201915b5050505050905090565b61183a612792565b73ffffffffffffffffffffffffffffffffffffffff16611858611b47565b73ffffffffffffffffffffffffffffffffffffffff16146118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590614750565b60405180910390fd5b6118b86000612f6a565b565b6002600f60009054906101000a900460ff1660ff161461190f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190690614894565b60405180910390fd5b600b548160ff1661191e610de4565b61192891906148b4565b1115611969576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119609061497c565b60405180910390fd5b600f60029054906101000a900460ff1660ff1681601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119d4919061499c565b60ff161115611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90614a1f565b60405180910390fd5b600c548160ff16611a27610de4565b611a3191906148b4565b10611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614be3565b60405180910390fd5b8060ff16600a54611a829190614a3f565b341015611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614ae5565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611b1f919061499c565b92506101000a81548160ff021916908360ff160217905550611b44338260ff16612f4c565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611b809061434e565b80601f0160208091040260200160405190810160405280929190818152602001828054611bac9061434e565b8015611bf95780601f10611bce57610100808354040283529160200191611bf9565b820191906000526020600020905b815481529060010190602001808311611bdc57829003601f168201915b5050505050905090565b611c0b612792565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90614c4f565b60405180910390fd5b8060066000611c85612792565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d32612792565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d779190613a5c565b60405180910390a35050565b611d8b612792565b73ffffffffffffffffffffffffffffffffffffffff16611da9611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df690614750565b60405180910390fd5b80600f60026101000a81548160ff021916908360ff16021790555050565b611e25612792565b73ffffffffffffffffffffffffffffffffffffffff16611e43611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9090614750565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900460ff1681565b611efb84848461284c565b611f0784848484613030565b611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90614ce1565b60405180910390fd5b50505050565b611f54612792565b73ffffffffffffffffffffffffffffffffffffffff16611f72611b47565b73ffffffffffffffffffffffffffffffffffffffff1614611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90614750565b60405180910390fd5b80600f60006101000a81548160ff021916908360ff16021790555050565b6060611ff182612785565b612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790614d73565b60405180910390fd5b6000600d805461203f9061434e565b90501161205b5760405180602001604052806000815250612087565b600d612066836131b7565b604051602001612077929190614eaf565b6040516020818303038152906040525b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120bc612792565b73ffffffffffffffffffffffffffffffffffffffff166120da611b47565b73ffffffffffffffffffffffffffffffffffffffff1614612130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212790614750565b60405180910390fd5b80600c8190555050565b612142612792565b73ffffffffffffffffffffffffffffffffffffffff16612160611b47565b73ffffffffffffffffffffffffffffffffffffffff16146121b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ad90614750565b60405180910390fd5b80600f60016101000a81548160ff021916908360ff16021790555050565b60106020528060005260406000206000915054906101000a900460ff1681565b6121fc612792565b73ffffffffffffffffffffffffffffffffffffffff1661221a611b47565b73ffffffffffffffffffffffffffffffffffffffff1614612270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226790614750565b60405180910390fd5b60005b838390508110156122c2576122af84848381811061229457612293614ede565b5b90506020020160208101906122a99190613f41565b83612f4c565b80806122ba9061462a565b915050612273565b50505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6001600f60009054906101000a900460ff1660ff16146123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890614894565b60405180910390fd5b600f60029054906101000a900460ff1660ff1683601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661241c919061499c565b60ff161115612460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245790614a1f565b60405180910390fd5b6000336040516020016124739190614f55565b6040516020818303038152906040528051906020012090506124d9838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483613317565b612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250f90614fbc565b60405180910390fd5b83601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16612573919061499c565b92506101000a81548160ff021916908360ff160217905550612598338560ff16612f4c565b50505050565b6125a6612792565b73ffffffffffffffffffffffffffffffffffffffff166125c4611b47565b73ffffffffffffffffffffffffffffffffffffffff161461261a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261190614750565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612689576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126809061504e565b60405180910390fd5b61269281612f6a565b50565b61269d612792565b73ffffffffffffffffffffffffffffffffffffffff166126bb611b47565b73ffffffffffffffffffffffffffffffffffffffff1614612711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270890614750565b60405180910390fd5b8060098190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061285782612df1565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661287e612792565b73ffffffffffffffffffffffffffffffffffffffff1614806128da57506128a3612792565b73ffffffffffffffffffffffffffffffffffffffff166128c284610c47565b73ffffffffffffffffffffffffffffffffffffffff16145b806128f657506128f582600001516128f0612792565b6122c8565b5b905080612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f906150e0565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146129aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a190615172565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1090615204565b60405180910390fd5b612a26858585600161332e565b612a36600084846000015161279a565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c3c91906148b4565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612d8157612cb181612785565b15612d80576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612de98686866001613334565b505050505050565b612df961391d565b612e0282612785565b612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890615296565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f33578092505050612f47565b508080612f3f906152b6565b915050612e47565b919050565b612f6682826040518060200160405280600081525061333a565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006130518473ffffffffffffffffffffffffffffffffffffffff166137f8565b156131aa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307a612792565b8786866040518563ffffffff1660e01b815260040161309c9493929190615334565b6020604051808303816000875af19250505080156130d857506040513d601f19601f820116820180604052508101906130d59190615395565b60015b61315a573d8060008114613108576040519150601f19603f3d011682016040523d82523d6000602084013e61310d565b606091505b506000815103613152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314990614ce1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131af565b600190505b949350505050565b6060600082036131fe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613312565b600082905060005b600082146132305780806132199061462a565b915050600a8261322991906153f1565b9150613206565b60008167ffffffffffffffff81111561324c5761324b613d74565b5b6040519080825280601f01601f19166020018201604052801561327e5781602001600182028036833780820191505090505b5090505b6000851461330b576001826132979190614564565b9150600a856132a69190615422565b60306132b291906148b4565b60f81b8183815181106132c8576132c7614ede565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561330491906153f1565b9450613282565b8093505050505b919050565b600082613324858461380b565b1490509392505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a6906154c5565b60405180910390fd5b6133b881612785565b156133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef90615531565b60405180910390fd5b6000831161343b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613432906155c3565b60405180910390fd5b613448600085838661332e565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161354591906155ff565b6fffffffffffffffffffffffffffffffff16815260200185836020015161356c91906155ff565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156137db57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461377b6000888488613030565b6137ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b190614ce1565b60405180910390fd5b81806137c59061462a565b92505080806137d39061462a565b91505061370a565b50806000819055506137f06000878588613334565b505050505050565b600080823b905060008111915050919050565b60008082905060005b845181101561387557600085828151811061383257613831614ede565b5b602002602001015190508083116138545761384d8382613880565b9250613861565b61385e8184613880565b92505b50808061386d9061462a565b915050613814565b508091505092915050565b600082600052816020526040600020905092915050565b8280546138a39061434e565b90600052602060002090601f0160209004810192826138c5576000855561390c565b82601f106138de57805160ff191683800117855561390c565b8280016001018555821561390c579182015b8281111561390b5782518255916020019190600101906138f0565b5b5090506139199190613957565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613970576000816000905550600101613958565b5090565b6000819050919050565b61398781613974565b82525050565b60006020820190506139a2600083018461397e565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139f1816139bc565b81146139fc57600080fd5b50565b600081359050613a0e816139e8565b92915050565b600060208284031215613a2a57613a296139b2565b5b6000613a38848285016139ff565b91505092915050565b60008115159050919050565b613a5681613a41565b82525050565b6000602082019050613a716000830184613a4d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ab1578082015181840152602081019050613a96565b83811115613ac0576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ae282613a77565b613aec8185613a82565b9350613afc818560208601613a93565b613b0581613ac6565b840191505092915050565b60006020820190508181036000830152613b2a8184613ad7565b905092915050565b613b3b81613974565b8114613b4657600080fd5b50565b600081359050613b5881613b32565b92915050565b600060208284031215613b7457613b736139b2565b5b6000613b8284828501613b49565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bb682613b8b565b9050919050565b613bc681613bab565b82525050565b6000602082019050613be16000830184613bbd565b92915050565b613bf081613bab565b8114613bfb57600080fd5b50565b600081359050613c0d81613be7565b92915050565b60008060408385031215613c2a57613c296139b2565b5b6000613c3885828601613bfe565b9250506020613c4985828601613b49565b9150509250929050565b6000819050919050565b613c6681613c53565b82525050565b6000602082019050613c816000830184613c5d565b92915050565b600080600060608486031215613ca057613c9f6139b2565b5b6000613cae86828701613bfe565b9350506020613cbf86828701613bfe565b9250506040613cd086828701613b49565b9150509250925092565b600060ff82169050919050565b613cf081613cda565b82525050565b6000602082019050613d0b6000830184613ce7565b92915050565b613d1a81613c53565b8114613d2557600080fd5b50565b600081359050613d3781613d11565b92915050565b600060208284031215613d5357613d526139b2565b5b6000613d6184828501613d28565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dac82613ac6565b810181811067ffffffffffffffff82111715613dcb57613dca613d74565b5b80604052505050565b6000613dde6139a8565b9050613dea8282613da3565b919050565b600067ffffffffffffffff821115613e0a57613e09613d74565b5b613e1382613ac6565b9050602081019050919050565b82818337600083830152505050565b6000613e42613e3d84613def565b613dd4565b905082815260208101848484011115613e5e57613e5d613d6f565b5b613e69848285613e20565b509392505050565b600082601f830112613e8657613e85613d6a565b5b8135613e96848260208601613e2f565b91505092915050565b600060208284031215613eb557613eb46139b2565b5b600082013567ffffffffffffffff811115613ed357613ed26139b7565b5b613edf84828501613e71565b91505092915050565b613ef181613cda565b8114613efc57600080fd5b50565b600081359050613f0e81613ee8565b92915050565b600060208284031215613f2a57613f296139b2565b5b6000613f3884828501613eff565b91505092915050565b600060208284031215613f5757613f566139b2565b5b6000613f6584828501613bfe565b91505092915050565b613f7781613a41565b8114613f8257600080fd5b50565b600081359050613f9481613f6e565b92915050565b60008060408385031215613fb157613fb06139b2565b5b6000613fbf85828601613bfe565b9250506020613fd085828601613f85565b9150509250929050565b6000613fe582613b8b565b9050919050565b613ff581613fda565b811461400057600080fd5b50565b60008135905061401281613fec565b92915050565b60006020828403121561402e5761402d6139b2565b5b600061403c84828501614003565b91505092915050565b600067ffffffffffffffff8211156140605761405f613d74565b5b61406982613ac6565b9050602081019050919050565b600061408961408484614045565b613dd4565b9050828152602081018484840111156140a5576140a4613d6f565b5b6140b0848285613e20565b509392505050565b600082601f8301126140cd576140cc613d6a565b5b81356140dd848260208601614076565b91505092915050565b60008060008060808587031215614100576140ff6139b2565b5b600061410e87828801613bfe565b945050602061411f87828801613bfe565b935050604061413087828801613b49565b925050606085013567ffffffffffffffff811115614151576141506139b7565b5b61415d878288016140b8565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261418957614188613d6a565b5b8235905067ffffffffffffffff8111156141a6576141a5614169565b5b6020830191508360208202830111156141c2576141c161416e565b5b9250929050565b6000806000604084860312156141e2576141e16139b2565b5b600084013567ffffffffffffffff811115614200576141ff6139b7565b5b61420c86828701614173565b9350935050602061421f86828701613b49565b9150509250925092565b600080604083850312156142405761423f6139b2565b5b600061424e85828601613bfe565b925050602061425f85828601613bfe565b9150509250929050565b60008083601f84011261427f5761427e613d6a565b5b8235905067ffffffffffffffff81111561429c5761429b614169565b5b6020830191508360208202830111156142b8576142b761416e565b5b9250929050565b6000806000604084860312156142d8576142d76139b2565b5b60006142e686828701613eff565b935050602084013567ffffffffffffffff811115614307576143066139b7565b5b61431386828701614269565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061436657607f821691505b6020821081036143795761437861431f565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006143db602d83613a82565b91506143e68261437f565b604082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061446d602283613a82565b915061447882614411565b604082019050919050565b6000602082019050818103600083015261449c81614460565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006144ff603983613a82565b915061450a826144a3565b604082019050919050565b6000602082019050818103600083015261452e816144f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061456f82613974565b915061457a83613974565b92508282101561458d5761458c614535565b5b828203905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006145f4602283613a82565b91506145ff82614598565b604082019050919050565b60006020820190508181036000830152614623816145e7565b9050919050565b600061463582613974565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361466757614666614535565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006146ce602e83613a82565b91506146d982614672565b604082019050919050565b600060208201905081810360008301526146fd816146c1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061473a602083613a82565b915061474582614704565b602082019050919050565b600060208201905081810360008301526147698161472d565b9050919050565b600081905092915050565b50565b600061478b600083614770565b91506147968261477b565b600082019050919050565b60006147ac8261477e565b9150819050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614812602383613a82565b915061481d826147b6565b604082019050919050565b6000602082019050818103600083015261484181614805565b9050919050565b7f546869732073616c6520686173206e6f74207374617274656400000000000000600082015250565b600061487e601983613a82565b915061488982614848565b602082019050919050565b600060208201905081810360008301526148ad81614871565b9050919050565b60006148bf82613974565b91506148ca83613974565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148ff576148fe614535565b5b828201905092915050565b7f596f752063616e2774206d696e74206d6f7265207468656e2074686520746f7460008201527f616c20737570706c790000000000000000000000000000000000000000000000602082015250565b6000614966602983613a82565b91506149718261490a565b604082019050919050565b6000602082019050818103600083015261499581614959565b9050919050565b60006149a782613cda565b91506149b283613cda565b92508260ff038211156149c8576149c7614535565b5b828201905092915050565b7f427579206c696d69742072656163686564000000000000000000000000000000600082015250565b6000614a09601183613a82565b9150614a14826149d3565b602082019050919050565b60006020820190508181036000830152614a38816149fc565b9050919050565b6000614a4a82613974565b9150614a5583613974565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a8e57614a8d614535565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614acf601283613a82565b9150614ada82614a99565b602082019050919050565b60006020820190508181036000830152614afe81614ac2565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614b61602b83613a82565b9150614b6c82614b05565b604082019050919050565b60006020820190508181036000830152614b9081614b54565b9050919050565b7f416c6c2066726565206d696e74732068617665206265656e20636c61696d6564600082015250565b6000614bcd602083613a82565b9150614bd882614b97565b602082019050919050565b60006020820190508181036000830152614bfc81614bc0565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614c39601a83613a82565b9150614c4482614c03565b602082019050919050565b60006020820190508181036000830152614c6881614c2c565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614ccb603383613a82565b9150614cd682614c6f565b604082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d5d602f83613a82565b9150614d6882614d01565b604082019050919050565b60006020820190508181036000830152614d8c81614d50565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614dc08161434e565b614dca8186614d93565b94506001821660008114614de55760018114614df657614e29565b60ff19831686528186019350614e29565b614dff85614d9e565b60005b83811015614e2157815481890152600182019150602081019050614e02565b838801955050505b50505092915050565b6000614e3d82613a77565b614e478185614d93565b9350614e57818560208601613a93565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614e99600583614d93565b9150614ea482614e63565b600582019050919050565b6000614ebb8285614db3565b9150614ec78284614e32565b9150614ed282614e8c565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160601b9050919050565b6000614f2582614f0d565b9050919050565b6000614f3782614f1a565b9050919050565b614f4f614f4a82613bab565b614f2c565b82525050565b6000614f618284614f3e565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614fa6600e83613a82565b9150614fb182614f70565b602082019050919050565b60006020820190508181036000830152614fd581614f99565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615038602683613a82565b915061504382614fdc565b604082019050919050565b600060208201905081810360008301526150678161502b565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006150ca603283613a82565b91506150d58261506e565b604082019050919050565b600060208201905081810360008301526150f9816150bd565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061515c602683613a82565b915061516782615100565b604082019050919050565b6000602082019050818103600083015261518b8161514f565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006151ee602583613a82565b91506151f982615192565b604082019050919050565b6000602082019050818103600083015261521d816151e1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615280602a83613a82565b915061528b82615224565b604082019050919050565b600060208201905081810360008301526152af81615273565b9050919050565b60006152c182613974565b9150600082036152d4576152d3614535565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000615306826152df565b61531081856152ea565b9350615320818560208601613a93565b61532981613ac6565b840191505092915050565b60006080820190506153496000830187613bbd565b6153566020830186613bbd565b615363604083018561397e565b818103606083015261537581846152fb565b905095945050505050565b60008151905061538f816139e8565b92915050565b6000602082840312156153ab576153aa6139b2565b5b60006153b984828501615380565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153fc82613974565b915061540783613974565b925082615417576154166153c2565b5b828204905092915050565b600061542d82613974565b915061543883613974565b925082615448576154476153c2565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006154af602183613a82565b91506154ba82615453565b604082019050919050565b600060208201905081810360008301526154de816154a2565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b600061551b601d83613a82565b9150615526826154e5565b602082019050919050565b6000602082019050818103600083015261554a8161550e565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b60006155ad602383613a82565b91506155b882615551565b604082019050919050565b600060208201905081810360008301526155dc816155a0565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061560a826155e3565b9150615615836155e3565b9250826fffffffffffffffffffffffffffffffff0382111561563a57615639614535565b5b82820190509291505056fea2646970667358221220c4de581d8810f328e736b0241fb37dd2cfa35a818574d007d3346d7ae72d384f64736f6c634300080e0033
Deployed Bytecode Sourcemap
41404:4145:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41553:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24333:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41630:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41597:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25960:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27521:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27042:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22770:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41729:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28397:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23438:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44457:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41822:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45038:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45391:153;;;:::i;:::-;;28630:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22951:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44256:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25769:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41509:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44840:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42490:453;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45155:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24769:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41793:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44065:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38034:103;;;;;;;;;;;;;:::i;:::-;;42949:579;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37383:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26129:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27807:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44736:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45275:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41766:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28878:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44564:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41996:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41476:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44935:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44646:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41859:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42290:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28166:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43534:525;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38292:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44356:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41553:39;;;;:::o;24333:372::-;24435:4;24487:25;24472:40;;;:11;:40;;;;:105;;;;24544:33;24529:48;;;:11;:48;;;;24472:105;:172;;;;24609:35;24594:50;;;:11;:50;;;;24472:172;:225;;;;24661:36;24685:11;24661:23;:36::i;:::-;24472:225;24452:245;;24333:372;;;:::o;41630:32::-;;;;:::o;41597:28::-;;;;:::o;25960:100::-;26014:13;26047:5;26040:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25960:100;:::o;27521:214::-;27589:7;27617:16;27625:7;27617;:16::i;:::-;27609:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27703:15;:24;27719:7;27703:24;;;;;;;;;;;;;;;;;;;;;27696:31;;27521:214;;;:::o;27042:413::-;27115:13;27131:24;27147:7;27131:15;:24::i;:::-;27115:40;;27180:5;27174:11;;:2;:11;;;27166:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27275:5;27259:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27284:37;27301:5;27308:12;:10;:12::i;:::-;27284:16;:37::i;:::-;27259:62;27237:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;27419:28;27428:2;27432:7;27441:5;27419:8;:28::i;:::-;27104:351;27042:413;;:::o;22770:104::-;22823:7;22865:1;22850:12;;:16;;;;:::i;:::-;22843:23;;22770:104;:::o;41729:32::-;;;;:::o;28397:162::-;28523:28;28533:4;28539:2;28543:7;28523:9;:28::i;:::-;28397:162;;;:::o;23438:823::-;23527:7;23563:16;23573:5;23563:9;:16::i;:::-;23555:5;:24;23547:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23629:22;23654:13;:11;:13::i;:::-;23629:38;;23678:19;23712:25;23766:9;23761:426;23785:14;23781:1;:18;23761:426;;;23821:31;23855:11;:14;23867:1;23855:14;;;;;;;;;;;23821:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23914:1;23888:28;;:9;:14;;;:28;;;23884:103;;23957:9;:14;;;23937:34;;23884:103;24026:5;24005:26;;:17;:26;;;24001:175;;24071:5;24056:11;:20;24052:77;;24108:1;24101:8;;;;;;;;;24052:77;24147:13;;;;;:::i;:::-;;;;24001:175;23806:381;23801:3;;;;;:::i;:::-;;;;23761:426;;;;24197:56;;;;;;;;;;:::i;:::-;;;;;;;;23438:823;;;;;:::o;44457:101::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44543:9:::1;44528:12;:24;;;;44457:101:::0;:::o;41822:30::-;;;;;;;;;;;;;:::o;45038:111::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45134:9:::1;45114:17;:29;;;;45038:111:::0;:::o;45391:153::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45446:7:::1;45467:13;;;;;;;;;;;45459:27;;45494:21;45459:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45445:75;;;45535:2;45527:11;;;::::0;::::1;;45438:106;45391:153::o:0;28630:177::-;28760:39;28777:4;28783:2;28787:7;28760:39;;;;;;;;;;;;:16;:39::i;:::-;28630:177;;;:::o;22951:187::-;23018:7;23054:13;:11;:13::i;:::-;23046:5;:21;23038:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23125:5;23118:12;;22951:187;;;:::o;44256:94::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44336:8:::1;44326:7;:18;;;;;;;;;;;;:::i;:::-;;44256:94:::0;:::o;25769:124::-;25833:7;25860:20;25872:7;25860:11;:20::i;:::-;:25;;;25853:32;;25769:124;;;:::o;41509:39::-;;;;:::o;44840:89::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44916:7:::1;44907:6;:16;;;;44840:89:::0;:::o;42490:453::-;42564:1;42555:5;;;;;;;;;;;:10;;;42547:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;42641:6;;42626:11;42610:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:37;;42602:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;42748:6;;;;;;;;;;;42708:46;;42733:11;42708:10;:22;42719:10;42708:22;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:46;;;;42700:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42816:11;42804:23;;:9;;:23;;;;:::i;:::-;42791:9;:36;;42783:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42885:11;42859:10;:22;42870:10;42859:22;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42903:34;42913:10;42925:11;42903:34;;:9;:34::i;:::-;42490:453;:::o;45155:114::-;45219:7;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45242:21:::1;45235:28;;45155:114:::0;:::o;24769:221::-;24833:7;24878:1;24861:19;;:5;:19;;;24853:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;24954:12;:19;24967:5;24954:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24946:36;;24939:43;;24769:221;;;:::o;41793:24::-;;;;;;;;;;;;;:::o;44065:85::-;44108:13;44137:7;44130:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44065:85;:::o;38034:103::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38099:30:::1;38126:1;38099:18;:30::i;:::-;38034:103::o:0;42949:579::-;43029:1;43020:5;;;;;;;;;;;:10;;;43012:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;43106:6;;43091:11;43075:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:37;;43067:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;43213:13;;;;;;;;;;;43173:53;;43198:11;43173:10;:22;43184:10;43173:22;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:53;;;;43165:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;43301:10;;43287:11;43271:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;43263:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43391:11;43376:26;;:12;;:26;;;;:::i;:::-;43363:9;:39;;43355:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;43464:11;43438:10;:22;43449:10;43438:22;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43482:34;43492:10;43504:11;43482:34;;:9;:34::i;:::-;42949:579;:::o;37383:87::-;37429:7;37456:6;;;;;;;;;;;37449:13;;37383:87;:::o;26129:104::-;26185:13;26218:7;26211:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26129:104;:::o;27807:288::-;27914:12;:10;:12::i;:::-;27902:24;;:8;:24;;;27894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28015:8;27970:18;:32;27989:12;:10;:12::i;:::-;27970:32;;;;;;;;;;;;;;;:42;28003:8;27970:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28068:8;28039:48;;28054:12;:10;:12::i;:::-;28039:48;;;28078:8;28039:48;;;;;;:::i;:::-;;;;;;;;27807:288;;:::o;44736:98::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44821:7:::1;44805:13;;:23;;;;;;;;;;;;;;;;;;44736:98:::0;:::o;45275:110::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45369:10:::1;45353:13;;:26;;;;;;;;;;;;;;;;;;45275:110:::0;:::o;41766:22::-;;;;;;;;;;;;;:::o;28878:355::-;29037:28;29047:4;29053:2;29057:7;29037:9;:28::i;:::-;29098:48;29121:4;29127:2;29131:7;29140:5;29098:22;:48::i;:::-;29076:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;28878:355;;;;:::o;44564:76::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44628:6:::1;44620:5;;:14;;;;;;;;;;;;;;;;;;44564:76:::0;:::o;41996:288::-;42069:13;42099:16;42107:7;42099;:16::i;:::-;42091:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42207:1;42189:7;42183:21;;;;;:::i;:::-;;;:25;:95;;;;;;;;;;;;;;;;;42235:7;42244:18;:7;:16;:18::i;:::-;42218:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42183:95;42176:102;;41996:288;;;:::o;41476:28::-;;;;;;;;;;;;;:::o;44935:97::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45019:7:::1;45006:10;:20;;;;44935:97:::0;:::o;44646:84::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44717:7:::1;44708:6;;:16;;;;;;;;;;;;;;;;;;44646:84:::0;:::o;41859:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;42290:194::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42392:6:::1;42387:92;42404:10;;:17;;42402:1;:19;42387:92;;;42437:34;42447:10;;42458:1;42447:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42462:8;42437:9;:34::i;:::-;42423:3;;;;;:::i;:::-;;;;42387:92;;;;42290:194:::0;;;:::o;28166:164::-;28263:4;28287:18;:25;28306:5;28287:25;;;;;;;;;;;;;;;:35;28313:8;28287:35;;;;;;;;;;;;;;;;;;;;;;;;;28280:42;;28166:164;;;;:::o;43534:525::-;43687:1;43678:5;;;;;;;;;;;:10;;;43670:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;43773:13;;;;;;;;;;;43733:53;;43758:11;43733:10;:22;43744:10;43733:22;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:53;;;;43725:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;43821:12;43863:10;43846:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;43836:39;;;;;;43821:54;;43890:57;43909:12;;43890:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43923:17;;43942:4;43890:18;:57::i;:::-;43882:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;44001:11;43975:10;:22;43986:10;43975:22;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44019:34;44029:10;44041:11;44019:34;;:9;:34::i;:::-;43622:437;43534:525;;;:::o;38292:201::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38401:1:::1;38381:22;;:8;:22;;::::0;38373:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38457:28;38476:8;38457:18;:28::i;:::-;38292:201:::0;:::o;44356:95::-;37614:12;:10;:12::i;:::-;37603:23;;:7;:5;:7::i;:::-;:23;;;37595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44436:9:::1;44424;:21;;;;44356:95:::0;:::o;13121:157::-;13206:4;13245:25;13230:40;;;:11;:40;;;;13223:47;;13121:157;;;:::o;29488:111::-;29545:4;29579:12;;29569:7;:22;29562:29;;29488:111;;;:::o;20712:98::-;20765:7;20792:10;20785:17;;20712:98;:::o;33532:196::-;33674:2;33647:15;:24;33663:7;33647:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33712:7;33708:2;33692:28;;33701:5;33692:28;;;;;;;;;;;;33532:196;;;:::o;31631:1783::-;31746:35;31784:20;31796:7;31784:11;:20::i;:::-;31746:58;;31817:22;31859:13;:18;;;31843:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;31918:12;:10;:12::i;:::-;31894:36;;:20;31906:7;31894:11;:20::i;:::-;:36;;;31843:87;:154;;;;31947:50;31964:13;:18;;;31984:12;:10;:12::i;:::-;31947:16;:50::i;:::-;31843:154;31817:181;;32019:17;32011:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;32134:4;32112:26;;:13;:18;;;:26;;;32104:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;32214:1;32200:16;;:2;:16;;;32192:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32271:43;32293:4;32299:2;32303:7;32312:1;32271:21;:43::i;:::-;32379:49;32396:1;32400:7;32409:13;:18;;;32379:8;:49::i;:::-;32663:1;32633:12;:18;32646:4;32633:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32707:1;32679:12;:16;32692:2;32679:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32755:43;;;;;;;;32770:2;32755:43;;;;;;32781:15;32755:43;;;;;32732:11;:20;32744:7;32732:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33038:19;33070:1;33060:7;:11;;;;:::i;:::-;33038:33;;33127:1;33086:43;;:11;:24;33098:11;33086:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;33082:227;;33150:20;33158:11;33150:7;:20::i;:::-;33146:152;;;33218:64;;;;;;;;33233:13;:18;;;33218:64;;;;;;33253:13;:28;;;33218:64;;;;;33191:11;:24;33203:11;33191:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33146:152;33082:227;33345:7;33341:2;33326:27;;33335:4;33326:27;;;;;;;;;;;;33364:42;33385:4;33391:2;33395:7;33404:1;33364:20;:42::i;:::-;31735:1679;;;31631:1783;;;:::o;25235:472::-;25296:21;;:::i;:::-;25338:16;25346:7;25338;:16::i;:::-;25330:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25419:12;25434:7;25419:22;;25414:216;25468:31;25502:11;:17;25514:4;25502:17;;;;;;;;;;;25468:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25564:1;25538:28;;:9;:14;;;:28;;;25534:85;;25594:9;25587:16;;;;;;25534:85;25453:177;25445:6;;;;;:::i;:::-;;;;25414:216;;25235:472;;;;:::o;29607:104::-;29676:27;29686:2;29690:8;29676:27;;;;;;;;;;;;:9;:27::i;:::-;29607:104;;:::o;38653:191::-;38727:16;38746:6;;;;;;;;;;;38727:25;;38772:8;38763:6;;:17;;;;;;;;;;;;;;;;;;38827:8;38796:40;;38817:8;38796:40;;;;;;;;;;;;38716:128;38653:191;:::o;34293:804::-;34448:4;34469:15;:2;:13;;;:15::i;:::-;34465:625;;;34521:2;34505:36;;;34542:12;:10;:12::i;:::-;34556:4;34562:7;34571:5;34505:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34501:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34768:1;34751:6;:13;:18;34747:273;;34794:61;;;;;;;;;;:::i;:::-;;;;;;;;34747:273;34970:6;34964:13;34955:6;34951:2;34947:15;34940:38;34501:534;34638:45;;;34628:55;;;:6;:55;;;;34621:62;;;;;34465:625;35074:4;35067:11;;34293:804;;;;;;;:::o;398:723::-;454:13;684:1;675:5;:10;671:53;;702:10;;;;;;;;;;;;;;;;;;;;;671:53;734:12;749:5;734:20;;765:14;790:78;805:1;797:4;:9;790:78;;823:8;;;;;:::i;:::-;;;;854:2;846:10;;;;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;878:39;;928:154;944:1;935:5;:10;928:154;;972:1;962:11;;;;;:::i;:::-;;;1039:2;1031:5;:10;;;;:::i;:::-;1018:2;:24;;;;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1068:2;1059:11;;;;;:::i;:::-;;;928:154;;;1106:6;1092:21;;;;;398:723;;;;:::o;39910:190::-;40035:4;40088;40059:25;40072:5;40079:4;40059:12;:25::i;:::-;:33;40052:40;;39910:190;;;;;:::o;35585:159::-;;;;;:::o;36156:158::-;;;;;:::o;29988:1389::-;30111:20;30134:12;;30111:35;;30179:1;30165:16;;:2;:16;;;30157:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30364:21;30372:12;30364:7;:21::i;:::-;30363:22;30355:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30449:1;30438:8;:12;30430:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30503:61;30533:1;30537:2;30541:12;30555:8;30503:21;:61::i;:::-;30577:30;30610:12;:16;30623:2;30610:16;;;;;;;;;;;;;;;30577:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30656:135;;;;;;;;30712:8;30682:11;:19;;;:39;;;;:::i;:::-;30656:135;;;;;;30771:8;30736:11;:24;;;:44;;;;:::i;:::-;30656:135;;;;;30637:12;:16;30650:2;30637:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30830:43;;;;;;;;30845:2;30830:43;;;;;;30856:15;30830:43;;;;;30802:11;:25;30814:12;30802:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30886:20;30909:12;30886:35;;30939:9;30934:325;30958:8;30954:1;:12;30934:325;;;31018:12;31014:2;30993:38;;31010:1;30993:38;;;;;;;;;;;;31072:59;31103:1;31107:2;31111:12;31125:5;31072:22;:59::i;:::-;31046:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;31233:14;;;;;:::i;:::-;;;;30968:3;;;;;:::i;:::-;;;;30934:325;;;;31286:12;31271;:27;;;;31309:60;31338:1;31342:2;31346:12;31360:8;31309:20;:60::i;:::-;30100:1277;;;29988:1389;;;:::o;2977:387::-;3037:4;3245:12;3312:7;3300:20;3292:28;;3355:1;3348:4;:8;3341:15;;;2977:387;;;:::o;40461:675::-;40544:7;40564:20;40587:4;40564:27;;40607:9;40602:497;40626:5;:12;40622:1;:16;40602:497;;;40660:20;40683:5;40689:1;40683:8;;;;;;;;:::i;:::-;;;;;;;;40660:31;;40726:12;40710;:28;40706:382;;40853:42;40868:12;40882;40853:14;:42::i;:::-;40838:57;;40706:382;;;41030:42;41045:12;41059;41030:14;:42::i;:::-;41015:57;;40706:382;40645:454;40640:3;;;;;:::i;:::-;;;;40602:497;;;;41116:12;41109:19;;;40461:675;;;;:::o;41144:224::-;41212:13;41275:1;41269:4;41262:15;41304:1;41298:4;41291:15;41345:4;41339;41329:21;41320:30;;41144:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:77::-;5327:7;5356:5;5345:16;;5290:77;;;:::o;5373:118::-;5460:24;5478:5;5460:24;:::i;:::-;5455:3;5448:37;5373:118;;:::o;5497:222::-;5590:4;5628:2;5617:9;5613:18;5605:26;;5641:71;5709:1;5698:9;5694:17;5685:6;5641:71;:::i;:::-;5497:222;;;;:::o;5725:619::-;5802:6;5810;5818;5867:2;5855:9;5846:7;5842:23;5838:32;5835:119;;;5873:79;;:::i;:::-;5835:119;5993:1;6018:53;6063:7;6054:6;6043:9;6039:22;6018:53;:::i;:::-;6008:63;;5964:117;6120:2;6146:53;6191:7;6182:6;6171:9;6167:22;6146:53;:::i;:::-;6136:63;;6091:118;6248:2;6274:53;6319:7;6310:6;6299:9;6295:22;6274:53;:::i;:::-;6264:63;;6219:118;5725:619;;;;;:::o;6350:86::-;6385:7;6425:4;6418:5;6414:16;6403:27;;6350:86;;;:::o;6442:112::-;6525:22;6541:5;6525:22;:::i;:::-;6520:3;6513:35;6442:112;;:::o;6560:214::-;6649:4;6687:2;6676:9;6672:18;6664:26;;6700:67;6764:1;6753:9;6749:17;6740:6;6700:67;:::i;:::-;6560:214;;;;:::o;6780:122::-;6853:24;6871:5;6853:24;:::i;:::-;6846:5;6843:35;6833:63;;6892:1;6889;6882:12;6833:63;6780:122;:::o;6908:139::-;6954:5;6992:6;6979:20;6970:29;;7008:33;7035:5;7008:33;:::i;:::-;6908:139;;;;:::o;7053:329::-;7112:6;7161:2;7149:9;7140:7;7136:23;7132:32;7129:119;;;7167:79;;:::i;:::-;7129:119;7287:1;7312:53;7357:7;7348:6;7337:9;7333:22;7312:53;:::i;:::-;7302:63;;7258:117;7053:329;;;;:::o;7388:117::-;7497:1;7494;7487:12;7511:117;7620:1;7617;7610:12;7634:180;7682:77;7679:1;7672:88;7779:4;7776:1;7769:15;7803:4;7800:1;7793:15;7820:281;7903:27;7925:4;7903:27;:::i;:::-;7895:6;7891:40;8033:6;8021:10;8018:22;7997:18;7985:10;7982:34;7979:62;7976:88;;;8044:18;;:::i;:::-;7976:88;8084:10;8080:2;8073:22;7863:238;7820:281;;:::o;8107:129::-;8141:6;8168:20;;:::i;:::-;8158:30;;8197:33;8225:4;8217:6;8197:33;:::i;:::-;8107:129;;;:::o;8242:308::-;8304:4;8394:18;8386:6;8383:30;8380:56;;;8416:18;;:::i;:::-;8380:56;8454:29;8476:6;8454:29;:::i;:::-;8446:37;;8538:4;8532;8528:15;8520:23;;8242:308;;;:::o;8556:154::-;8640:6;8635:3;8630;8617:30;8702:1;8693:6;8688:3;8684:16;8677:27;8556:154;;;:::o;8716:412::-;8794:5;8819:66;8835:49;8877:6;8835:49;:::i;:::-;8819:66;:::i;:::-;8810:75;;8908:6;8901:5;8894:21;8946:4;8939:5;8935:16;8984:3;8975:6;8970:3;8966:16;8963:25;8960:112;;;8991:79;;:::i;:::-;8960:112;9081:41;9115:6;9110:3;9105;9081:41;:::i;:::-;8800:328;8716:412;;;;;:::o;9148:340::-;9204:5;9253:3;9246:4;9238:6;9234:17;9230:27;9220:122;;9261:79;;:::i;:::-;9220:122;9378:6;9365:20;9403:79;9478:3;9470:6;9463:4;9455:6;9451:17;9403:79;:::i;:::-;9394:88;;9210:278;9148:340;;;;:::o;9494:509::-;9563:6;9612:2;9600:9;9591:7;9587:23;9583:32;9580:119;;;9618:79;;:::i;:::-;9580:119;9766:1;9755:9;9751:17;9738:31;9796:18;9788:6;9785:30;9782:117;;;9818:79;;:::i;:::-;9782:117;9923:63;9978:7;9969:6;9958:9;9954:22;9923:63;:::i;:::-;9913:73;;9709:287;9494:509;;;;:::o;10009:118::-;10080:22;10096:5;10080:22;:::i;:::-;10073:5;10070:33;10060:61;;10117:1;10114;10107:12;10060:61;10009:118;:::o;10133:135::-;10177:5;10215:6;10202:20;10193:29;;10231:31;10256:5;10231:31;:::i;:::-;10133:135;;;;:::o;10274:325::-;10331:6;10380:2;10368:9;10359:7;10355:23;10351:32;10348:119;;;10386:79;;:::i;:::-;10348:119;10506:1;10531:51;10574:7;10565:6;10554:9;10550:22;10531:51;:::i;:::-;10521:61;;10477:115;10274:325;;;;:::o;10605:329::-;10664:6;10713:2;10701:9;10692:7;10688:23;10684:32;10681:119;;;10719:79;;:::i;:::-;10681:119;10839:1;10864:53;10909:7;10900:6;10889:9;10885:22;10864:53;:::i;:::-;10854:63;;10810:117;10605:329;;;;:::o;10940:116::-;11010:21;11025:5;11010:21;:::i;:::-;11003:5;11000:32;10990:60;;11046:1;11043;11036:12;10990:60;10940:116;:::o;11062:133::-;11105:5;11143:6;11130:20;11121:29;;11159:30;11183:5;11159:30;:::i;:::-;11062:133;;;;:::o;11201:468::-;11266:6;11274;11323:2;11311:9;11302:7;11298:23;11294:32;11291:119;;;11329:79;;:::i;:::-;11291:119;11449:1;11474:53;11519:7;11510:6;11499:9;11495:22;11474:53;:::i;:::-;11464:63;;11420:117;11576:2;11602:50;11644:7;11635:6;11624:9;11620:22;11602:50;:::i;:::-;11592:60;;11547:115;11201:468;;;;;:::o;11675:104::-;11720:7;11749:24;11767:5;11749:24;:::i;:::-;11738:35;;11675:104;;;:::o;11785:138::-;11866:32;11892:5;11866:32;:::i;:::-;11859:5;11856:43;11846:71;;11913:1;11910;11903:12;11846:71;11785:138;:::o;11929:155::-;11983:5;12021:6;12008:20;11999:29;;12037:41;12072:5;12037:41;:::i;:::-;11929:155;;;;:::o;12090:345::-;12157:6;12206:2;12194:9;12185:7;12181:23;12177:32;12174:119;;;12212:79;;:::i;:::-;12174:119;12332:1;12357:61;12410:7;12401:6;12390:9;12386:22;12357:61;:::i;:::-;12347:71;;12303:125;12090:345;;;;:::o;12441:307::-;12502:4;12592:18;12584:6;12581:30;12578:56;;;12614:18;;:::i;:::-;12578:56;12652:29;12674:6;12652:29;:::i;:::-;12644:37;;12736:4;12730;12726:15;12718:23;;12441:307;;;:::o;12754:410::-;12831:5;12856:65;12872:48;12913:6;12872:48;:::i;:::-;12856:65;:::i;:::-;12847:74;;12944:6;12937:5;12930:21;12982:4;12975:5;12971:16;13020:3;13011:6;13006:3;13002:16;12999:25;12996:112;;;13027:79;;:::i;:::-;12996:112;13117:41;13151:6;13146:3;13141;13117:41;:::i;:::-;12837:327;12754:410;;;;;:::o;13183:338::-;13238:5;13287:3;13280:4;13272:6;13268:17;13264:27;13254:122;;13295:79;;:::i;:::-;13254:122;13412:6;13399:20;13437:78;13511:3;13503:6;13496:4;13488:6;13484:17;13437:78;:::i;:::-;13428:87;;13244:277;13183:338;;;;:::o;13527:943::-;13622:6;13630;13638;13646;13695:3;13683:9;13674:7;13670:23;13666:33;13663:120;;;13702:79;;:::i;:::-;13663:120;13822:1;13847:53;13892:7;13883:6;13872:9;13868:22;13847:53;:::i;:::-;13837:63;;13793:117;13949:2;13975:53;14020:7;14011:6;14000:9;13996:22;13975:53;:::i;:::-;13965:63;;13920:118;14077:2;14103:53;14148:7;14139:6;14128:9;14124:22;14103:53;:::i;:::-;14093:63;;14048:118;14233:2;14222:9;14218:18;14205:32;14264:18;14256:6;14253:30;14250:117;;;14286:79;;:::i;:::-;14250:117;14391:62;14445:7;14436:6;14425:9;14421:22;14391:62;:::i;:::-;14381:72;;14176:287;13527:943;;;;;;;:::o;14476:117::-;14585:1;14582;14575:12;14599:117;14708:1;14705;14698:12;14739:568;14812:8;14822:6;14872:3;14865:4;14857:6;14853:17;14849:27;14839:122;;14880:79;;:::i;:::-;14839:122;14993:6;14980:20;14970:30;;15023:18;15015:6;15012:30;15009:117;;;15045:79;;:::i;:::-;15009:117;15159:4;15151:6;15147:17;15135:29;;15213:3;15205:4;15197:6;15193:17;15183:8;15179:32;15176:41;15173:128;;;15220:79;;:::i;:::-;15173:128;14739:568;;;;;:::o;15313:704::-;15408:6;15416;15424;15473:2;15461:9;15452:7;15448:23;15444:32;15441:119;;;15479:79;;:::i;:::-;15441:119;15627:1;15616:9;15612:17;15599:31;15657:18;15649:6;15646:30;15643:117;;;15679:79;;:::i;:::-;15643:117;15792:80;15864:7;15855:6;15844:9;15840:22;15792:80;:::i;:::-;15774:98;;;;15570:312;15921:2;15947:53;15992:7;15983:6;15972:9;15968:22;15947:53;:::i;:::-;15937:63;;15892:118;15313:704;;;;;:::o;16023:474::-;16091:6;16099;16148:2;16136:9;16127:7;16123:23;16119:32;16116:119;;;16154:79;;:::i;:::-;16116:119;16274:1;16299:53;16344:7;16335:6;16324:9;16320:22;16299:53;:::i;:::-;16289:63;;16245:117;16401:2;16427:53;16472:7;16463:6;16452:9;16448:22;16427:53;:::i;:::-;16417:63;;16372:118;16023:474;;;;;:::o;16520:568::-;16593:8;16603:6;16653:3;16646:4;16638:6;16634:17;16630:27;16620:122;;16661:79;;:::i;:::-;16620:122;16774:6;16761:20;16751:30;;16804:18;16796:6;16793:30;16790:117;;;16826:79;;:::i;:::-;16790:117;16940:4;16932:6;16928:17;16916:29;;16994:3;16986:4;16978:6;16974:17;16964:8;16960:32;16957:41;16954:128;;;17001:79;;:::i;:::-;16954:128;16520:568;;;;;:::o;17094:700::-;17187:6;17195;17203;17252:2;17240:9;17231:7;17227:23;17223:32;17220:119;;;17258:79;;:::i;:::-;17220:119;17378:1;17403:51;17446:7;17437:6;17426:9;17422:22;17403:51;:::i;:::-;17393:61;;17349:115;17531:2;17520:9;17516:18;17503:32;17562:18;17554:6;17551:30;17548:117;;;17584:79;;:::i;:::-;17548:117;17697:80;17769:7;17760:6;17749:9;17745:22;17697:80;:::i;:::-;17679:98;;;;17474:313;17094:700;;;;;:::o;17800:180::-;17848:77;17845:1;17838:88;17945:4;17942:1;17935:15;17969:4;17966:1;17959:15;17986:320;18030:6;18067:1;18061:4;18057:12;18047:22;;18114:1;18108:4;18104:12;18135:18;18125:81;;18191:4;18183:6;18179:17;18169:27;;18125:81;18253:2;18245:6;18242:14;18222:18;18219:38;18216:84;;18272:18;;:::i;:::-;18216:84;18037:269;17986:320;;;:::o;18312:232::-;18452:34;18448:1;18440:6;18436:14;18429:58;18521:15;18516:2;18508:6;18504:15;18497:40;18312:232;:::o;18550:366::-;18692:3;18713:67;18777:2;18772:3;18713:67;:::i;:::-;18706:74;;18789:93;18878:3;18789:93;:::i;:::-;18907:2;18902:3;18898:12;18891:19;;18550:366;;;:::o;18922:419::-;19088:4;19126:2;19115:9;19111:18;19103:26;;19175:9;19169:4;19165:20;19161:1;19150:9;19146:17;19139:47;19203:131;19329:4;19203:131;:::i;:::-;19195:139;;18922:419;;;:::o;19347:221::-;19487:34;19483:1;19475:6;19471:14;19464:58;19556:4;19551:2;19543:6;19539:15;19532:29;19347:221;:::o;19574:366::-;19716:3;19737:67;19801:2;19796:3;19737:67;:::i;:::-;19730:74;;19813:93;19902:3;19813:93;:::i;:::-;19931:2;19926:3;19922:12;19915:19;;19574:366;;;:::o;19946:419::-;20112:4;20150:2;20139:9;20135:18;20127:26;;20199:9;20193:4;20189:20;20185:1;20174:9;20170:17;20163:47;20227:131;20353:4;20227:131;:::i;:::-;20219:139;;19946:419;;;:::o;20371:244::-;20511:34;20507:1;20499:6;20495:14;20488:58;20580:27;20575:2;20567:6;20563:15;20556:52;20371:244;:::o;20621:366::-;20763:3;20784:67;20848:2;20843:3;20784:67;:::i;:::-;20777:74;;20860:93;20949:3;20860:93;:::i;:::-;20978:2;20973:3;20969:12;20962:19;;20621:366;;;:::o;20993:419::-;21159:4;21197:2;21186:9;21182:18;21174:26;;21246:9;21240:4;21236:20;21232:1;21221:9;21217:17;21210:47;21274:131;21400:4;21274:131;:::i;:::-;21266:139;;20993:419;;;:::o;21418:180::-;21466:77;21463:1;21456:88;21563:4;21560:1;21553:15;21587:4;21584:1;21577:15;21604:191;21644:4;21664:20;21682:1;21664:20;:::i;:::-;21659:25;;21698:20;21716:1;21698:20;:::i;:::-;21693:25;;21737:1;21734;21731:8;21728:34;;;21742:18;;:::i;:::-;21728:34;21787:1;21784;21780:9;21772:17;;21604:191;;;;:::o;21801:221::-;21941:34;21937:1;21929:6;21925:14;21918:58;22010:4;22005:2;21997:6;21993:15;21986:29;21801:221;:::o;22028:366::-;22170:3;22191:67;22255:2;22250:3;22191:67;:::i;:::-;22184:74;;22267:93;22356:3;22267:93;:::i;:::-;22385:2;22380:3;22376:12;22369:19;;22028:366;;;:::o;22400:419::-;22566:4;22604:2;22593:9;22589:18;22581:26;;22653:9;22647:4;22643:20;22639:1;22628:9;22624:17;22617:47;22681:131;22807:4;22681:131;:::i;:::-;22673:139;;22400:419;;;:::o;22825:233::-;22864:3;22887:24;22905:5;22887:24;:::i;:::-;22878:33;;22933:66;22926:5;22923:77;22920:103;;23003:18;;:::i;:::-;22920:103;23050:1;23043:5;23039:13;23032:20;;22825:233;;;:::o;23064:::-;23204:34;23200:1;23192:6;23188:14;23181:58;23273:16;23268:2;23260:6;23256:15;23249:41;23064:233;:::o;23303:366::-;23445:3;23466:67;23530:2;23525:3;23466:67;:::i;:::-;23459:74;;23542:93;23631:3;23542:93;:::i;:::-;23660:2;23655:3;23651:12;23644:19;;23303:366;;;:::o;23675:419::-;23841:4;23879:2;23868:9;23864:18;23856:26;;23928:9;23922:4;23918:20;23914:1;23903:9;23899:17;23892:47;23956:131;24082:4;23956:131;:::i;:::-;23948:139;;23675:419;;;:::o;24100:182::-;24240:34;24236:1;24228:6;24224:14;24217:58;24100:182;:::o;24288:366::-;24430:3;24451:67;24515:2;24510:3;24451:67;:::i;:::-;24444:74;;24527:93;24616:3;24527:93;:::i;:::-;24645:2;24640:3;24636:12;24629:19;;24288:366;;;:::o;24660:419::-;24826:4;24864:2;24853:9;24849:18;24841:26;;24913:9;24907:4;24903:20;24899:1;24888:9;24884:17;24877:47;24941:131;25067:4;24941:131;:::i;:::-;24933:139;;24660:419;;;:::o;25085:147::-;25186:11;25223:3;25208:18;;25085:147;;;;:::o;25238:114::-;;:::o;25358:398::-;25517:3;25538:83;25619:1;25614:3;25538:83;:::i;:::-;25531:90;;25630:93;25719:3;25630:93;:::i;:::-;25748:1;25743:3;25739:11;25732:18;;25358:398;;;:::o;25762:379::-;25946:3;25968:147;26111:3;25968:147;:::i;:::-;25961:154;;26132:3;26125:10;;25762:379;;;:::o;26147:222::-;26287:34;26283:1;26275:6;26271:14;26264:58;26356:5;26351:2;26343:6;26339:15;26332:30;26147:222;:::o;26375:366::-;26517:3;26538:67;26602:2;26597:3;26538:67;:::i;:::-;26531:74;;26614:93;26703:3;26614:93;:::i;:::-;26732:2;26727:3;26723:12;26716:19;;26375:366;;;:::o;26747:419::-;26913:4;26951:2;26940:9;26936:18;26928:26;;27000:9;26994:4;26990:20;26986:1;26975:9;26971:17;26964:47;27028:131;27154:4;27028:131;:::i;:::-;27020:139;;26747:419;;;:::o;27172:175::-;27312:27;27308:1;27300:6;27296:14;27289:51;27172:175;:::o;27353:366::-;27495:3;27516:67;27580:2;27575:3;27516:67;:::i;:::-;27509:74;;27592:93;27681:3;27592:93;:::i;:::-;27710:2;27705:3;27701:12;27694:19;;27353:366;;;:::o;27725:419::-;27891:4;27929:2;27918:9;27914:18;27906:26;;27978:9;27972:4;27968:20;27964:1;27953:9;27949:17;27942:47;28006:131;28132:4;28006:131;:::i;:::-;27998:139;;27725:419;;;:::o;28150:305::-;28190:3;28209:20;28227:1;28209:20;:::i;:::-;28204:25;;28243:20;28261:1;28243:20;:::i;:::-;28238:25;;28397:1;28329:66;28325:74;28322:1;28319:81;28316:107;;;28403:18;;:::i;:::-;28316:107;28447:1;28444;28440:9;28433:16;;28150:305;;;;:::o;28461:228::-;28601:34;28597:1;28589:6;28585:14;28578:58;28670:11;28665:2;28657:6;28653:15;28646:36;28461:228;:::o;28695:366::-;28837:3;28858:67;28922:2;28917:3;28858:67;:::i;:::-;28851:74;;28934:93;29023:3;28934:93;:::i;:::-;29052:2;29047:3;29043:12;29036:19;;28695:366;;;:::o;29067:419::-;29233:4;29271:2;29260:9;29256:18;29248:26;;29320:9;29314:4;29310:20;29306:1;29295:9;29291:17;29284:47;29348:131;29474:4;29348:131;:::i;:::-;29340:139;;29067:419;;;:::o;29492:237::-;29530:3;29549:18;29565:1;29549:18;:::i;:::-;29544:23;;29581:18;29597:1;29581:18;:::i;:::-;29576:23;;29671:1;29665:4;29661:12;29658:1;29655:19;29652:45;;;29677:18;;:::i;:::-;29652:45;29721:1;29718;29714:9;29707:16;;29492:237;;;;:::o;29735:167::-;29875:19;29871:1;29863:6;29859:14;29852:43;29735:167;:::o;29908:366::-;30050:3;30071:67;30135:2;30130:3;30071:67;:::i;:::-;30064:74;;30147:93;30236:3;30147:93;:::i;:::-;30265:2;30260:3;30256:12;30249:19;;29908:366;;;:::o;30280:419::-;30446:4;30484:2;30473:9;30469:18;30461:26;;30533:9;30527:4;30523:20;30519:1;30508:9;30504:17;30497:47;30561:131;30687:4;30561:131;:::i;:::-;30553:139;;30280:419;;;:::o;30705:348::-;30745:7;30768:20;30786:1;30768:20;:::i;:::-;30763:25;;30802:20;30820:1;30802:20;:::i;:::-;30797:25;;30990:1;30922:66;30918:74;30915:1;30912:81;30907:1;30900:9;30893:17;30889:105;30886:131;;;30997:18;;:::i;:::-;30886:131;31045:1;31042;31038:9;31027:20;;30705:348;;;;:::o;31059:168::-;31199:20;31195:1;31187:6;31183:14;31176:44;31059:168;:::o;31233:366::-;31375:3;31396:67;31460:2;31455:3;31396:67;:::i;:::-;31389:74;;31472:93;31561:3;31472:93;:::i;:::-;31590:2;31585:3;31581:12;31574:19;;31233:366;;;:::o;31605:419::-;31771:4;31809:2;31798:9;31794:18;31786:26;;31858:9;31852:4;31848:20;31844:1;31833:9;31829:17;31822:47;31886:131;32012:4;31886:131;:::i;:::-;31878:139;;31605:419;;;:::o;32030:230::-;32170:34;32166:1;32158:6;32154:14;32147:58;32239:13;32234:2;32226:6;32222:15;32215:38;32030:230;:::o;32266:366::-;32408:3;32429:67;32493:2;32488:3;32429:67;:::i;:::-;32422:74;;32505:93;32594:3;32505:93;:::i;:::-;32623:2;32618:3;32614:12;32607:19;;32266:366;;;:::o;32638:419::-;32804:4;32842:2;32831:9;32827:18;32819:26;;32891:9;32885:4;32881:20;32877:1;32866:9;32862:17;32855:47;32919:131;33045:4;32919:131;:::i;:::-;32911:139;;32638:419;;;:::o;33063:182::-;33203:34;33199:1;33191:6;33187:14;33180:58;33063:182;:::o;33251:366::-;33393:3;33414:67;33478:2;33473:3;33414:67;:::i;:::-;33407:74;;33490:93;33579:3;33490:93;:::i;:::-;33608:2;33603:3;33599:12;33592:19;;33251:366;;;:::o;33623:419::-;33789:4;33827:2;33816:9;33812:18;33804:26;;33876:9;33870:4;33866:20;33862:1;33851:9;33847:17;33840:47;33904:131;34030:4;33904:131;:::i;:::-;33896:139;;33623:419;;;:::o;34048:176::-;34188:28;34184:1;34176:6;34172:14;34165:52;34048:176;:::o;34230:366::-;34372:3;34393:67;34457:2;34452:3;34393:67;:::i;:::-;34386:74;;34469:93;34558:3;34469:93;:::i;:::-;34587:2;34582:3;34578:12;34571:19;;34230:366;;;:::o;34602:419::-;34768:4;34806:2;34795:9;34791:18;34783:26;;34855:9;34849:4;34845:20;34841:1;34830:9;34826:17;34819:47;34883:131;35009:4;34883:131;:::i;:::-;34875:139;;34602:419;;;:::o;35027:238::-;35167:34;35163:1;35155:6;35151:14;35144:58;35236:21;35231:2;35223:6;35219:15;35212:46;35027:238;:::o;35271:366::-;35413:3;35434:67;35498:2;35493:3;35434:67;:::i;:::-;35427:74;;35510:93;35599:3;35510:93;:::i;:::-;35628:2;35623:3;35619:12;35612:19;;35271:366;;;:::o;35643:419::-;35809:4;35847:2;35836:9;35832:18;35824:26;;35896:9;35890:4;35886:20;35882:1;35871:9;35867:17;35860:47;35924:131;36050:4;35924:131;:::i;:::-;35916:139;;35643:419;;;:::o;36068:234::-;36208:34;36204:1;36196:6;36192:14;36185:58;36277:17;36272:2;36264:6;36260:15;36253:42;36068:234;:::o;36308:366::-;36450:3;36471:67;36535:2;36530:3;36471:67;:::i;:::-;36464:74;;36547:93;36636:3;36547:93;:::i;:::-;36665:2;36660:3;36656:12;36649:19;;36308:366;;;:::o;36680:419::-;36846:4;36884:2;36873:9;36869:18;36861:26;;36933:9;36927:4;36923:20;36919:1;36908:9;36904:17;36897:47;36961:131;37087:4;36961:131;:::i;:::-;36953:139;;36680:419;;;:::o;37105:148::-;37207:11;37244:3;37229:18;;37105:148;;;;:::o;37259:141::-;37308:4;37331:3;37323:11;;37354:3;37351:1;37344:14;37388:4;37385:1;37375:18;37367:26;;37259:141;;;:::o;37430:845::-;37533:3;37570:5;37564:12;37599:36;37625:9;37599:36;:::i;:::-;37651:89;37733:6;37728:3;37651:89;:::i;:::-;37644:96;;37771:1;37760:9;37756:17;37787:1;37782:137;;;;37933:1;37928:341;;;;37749:520;;37782:137;37866:4;37862:9;37851;37847:25;37842:3;37835:38;37902:6;37897:3;37893:16;37886:23;;37782:137;;37928:341;37995:38;38027:5;37995:38;:::i;:::-;38055:1;38069:154;38083:6;38080:1;38077:13;38069:154;;;38157:7;38151:14;38147:1;38142:3;38138:11;38131:35;38207:1;38198:7;38194:15;38183:26;;38105:4;38102:1;38098:12;38093:17;;38069:154;;;38252:6;38247:3;38243:16;38236:23;;37935:334;;37749:520;;37537:738;;37430:845;;;;:::o;38281:377::-;38387:3;38415:39;38448:5;38415:39;:::i;:::-;38470:89;38552:6;38547:3;38470:89;:::i;:::-;38463:96;;38568:52;38613:6;38608:3;38601:4;38594:5;38590:16;38568:52;:::i;:::-;38645:6;38640:3;38636:16;38629:23;;38391:267;38281:377;;;;:::o;38664:155::-;38804:7;38800:1;38792:6;38788:14;38781:31;38664:155;:::o;38825:400::-;38985:3;39006:84;39088:1;39083:3;39006:84;:::i;:::-;38999:91;;39099:93;39188:3;39099:93;:::i;:::-;39217:1;39212:3;39208:11;39201:18;;38825:400;;;:::o;39231:695::-;39509:3;39531:92;39619:3;39610:6;39531:92;:::i;:::-;39524:99;;39640:95;39731:3;39722:6;39640:95;:::i;:::-;39633:102;;39752:148;39896:3;39752:148;:::i;:::-;39745:155;;39917:3;39910:10;;39231:695;;;;;:::o;39932:180::-;39980:77;39977:1;39970:88;40077:4;40074:1;40067:15;40101:4;40098:1;40091:15;40118:94;40151:8;40199:5;40195:2;40191:14;40170:35;;40118:94;;;:::o;40218:::-;40257:7;40286:20;40300:5;40286:20;:::i;:::-;40275:31;;40218:94;;;:::o;40318:100::-;40357:7;40386:26;40406:5;40386:26;:::i;:::-;40375:37;;40318:100;;;:::o;40424:157::-;40529:45;40549:24;40567:5;40549:24;:::i;:::-;40529:45;:::i;:::-;40524:3;40517:58;40424:157;;:::o;40587:256::-;40699:3;40714:75;40785:3;40776:6;40714:75;:::i;:::-;40814:2;40809:3;40805:12;40798:19;;40834:3;40827:10;;40587:256;;;;:::o;40849:164::-;40989:16;40985:1;40977:6;40973:14;40966:40;40849:164;:::o;41019:366::-;41161:3;41182:67;41246:2;41241:3;41182:67;:::i;:::-;41175:74;;41258:93;41347:3;41258:93;:::i;:::-;41376:2;41371:3;41367:12;41360:19;;41019:366;;;:::o;41391:419::-;41557:4;41595:2;41584:9;41580:18;41572:26;;41644:9;41638:4;41634:20;41630:1;41619:9;41615:17;41608:47;41672:131;41798:4;41672:131;:::i;:::-;41664:139;;41391:419;;;:::o;41816:225::-;41956:34;41952:1;41944:6;41940:14;41933:58;42025:8;42020:2;42012:6;42008:15;42001:33;41816:225;:::o;42047:366::-;42189:3;42210:67;42274:2;42269:3;42210:67;:::i;:::-;42203:74;;42286:93;42375:3;42286:93;:::i;:::-;42404:2;42399:3;42395:12;42388:19;;42047:366;;;:::o;42419:419::-;42585:4;42623:2;42612:9;42608:18;42600:26;;42672:9;42666:4;42662:20;42658:1;42647:9;42643:17;42636:47;42700:131;42826:4;42700:131;:::i;:::-;42692:139;;42419:419;;;:::o;42844:237::-;42984:34;42980:1;42972:6;42968:14;42961:58;43053:20;43048:2;43040:6;43036:15;43029:45;42844:237;:::o;43087:366::-;43229:3;43250:67;43314:2;43309:3;43250:67;:::i;:::-;43243:74;;43326:93;43415:3;43326:93;:::i;:::-;43444:2;43439:3;43435:12;43428:19;;43087:366;;;:::o;43459:419::-;43625:4;43663:2;43652:9;43648:18;43640:26;;43712:9;43706:4;43702:20;43698:1;43687:9;43683:17;43676:47;43740:131;43866:4;43740:131;:::i;:::-;43732:139;;43459:419;;;:::o;43884:225::-;44024:34;44020:1;44012:6;44008:14;44001:58;44093:8;44088:2;44080:6;44076:15;44069:33;43884:225;:::o;44115:366::-;44257:3;44278:67;44342:2;44337:3;44278:67;:::i;:::-;44271:74;;44354:93;44443:3;44354:93;:::i;:::-;44472:2;44467:3;44463:12;44456:19;;44115:366;;;:::o;44487:419::-;44653:4;44691:2;44680:9;44676:18;44668:26;;44740:9;44734:4;44730:20;44726:1;44715:9;44711:17;44704:47;44768:131;44894:4;44768:131;:::i;:::-;44760:139;;44487:419;;;:::o;44912:224::-;45052:34;45048:1;45040:6;45036:14;45029:58;45121:7;45116:2;45108:6;45104:15;45097:32;44912:224;:::o;45142:366::-;45284:3;45305:67;45369:2;45364:3;45305:67;:::i;:::-;45298:74;;45381:93;45470:3;45381:93;:::i;:::-;45499:2;45494:3;45490:12;45483:19;;45142:366;;;:::o;45514:419::-;45680:4;45718:2;45707:9;45703:18;45695:26;;45767:9;45761:4;45757:20;45753:1;45742:9;45738:17;45731:47;45795:131;45921:4;45795:131;:::i;:::-;45787:139;;45514:419;;;:::o;45939:229::-;46079:34;46075:1;46067:6;46063:14;46056:58;46148:12;46143:2;46135:6;46131:15;46124:37;45939:229;:::o;46174:366::-;46316:3;46337:67;46401:2;46396:3;46337:67;:::i;:::-;46330:74;;46413:93;46502:3;46413:93;:::i;:::-;46531:2;46526:3;46522:12;46515:19;;46174:366;;;:::o;46546:419::-;46712:4;46750:2;46739:9;46735:18;46727:26;;46799:9;46793:4;46789:20;46785:1;46774:9;46770:17;46763:47;46827:131;46953:4;46827:131;:::i;:::-;46819:139;;46546:419;;;:::o;46971:171::-;47010:3;47033:24;47051:5;47033:24;:::i;:::-;47024:33;;47079:4;47072:5;47069:15;47066:41;;47087:18;;:::i;:::-;47066:41;47134:1;47127:5;47123:13;47116:20;;46971:171;;;:::o;48185:98::-;48236:6;48270:5;48264:12;48254:22;;48185:98;;;:::o;48289:168::-;48372:11;48406:6;48401:3;48394:19;48446:4;48441:3;48437:14;48422:29;;48289:168;;;;:::o;48463:360::-;48549:3;48577:38;48609:5;48577:38;:::i;:::-;48631:70;48694:6;48689:3;48631:70;:::i;:::-;48624:77;;48710:52;48755:6;48750:3;48743:4;48736:5;48732:16;48710:52;:::i;:::-;48787:29;48809:6;48787:29;:::i;:::-;48782:3;48778:39;48771:46;;48553:270;48463:360;;;;:::o;48829:640::-;49024:4;49062:3;49051:9;49047:19;49039:27;;49076:71;49144:1;49133:9;49129:17;49120:6;49076:71;:::i;:::-;49157:72;49225:2;49214:9;49210:18;49201:6;49157:72;:::i;:::-;49239;49307:2;49296:9;49292:18;49283:6;49239:72;:::i;:::-;49358:9;49352:4;49348:20;49343:2;49332:9;49328:18;49321:48;49386:76;49457:4;49448:6;49386:76;:::i;:::-;49378:84;;48829:640;;;;;;;:::o;49475:141::-;49531:5;49562:6;49556:13;49547:22;;49578:32;49604:5;49578:32;:::i;:::-;49475:141;;;;:::o;49622:349::-;49691:6;49740:2;49728:9;49719:7;49715:23;49711:32;49708:119;;;49746:79;;:::i;:::-;49708:119;49866:1;49891:63;49946:7;49937:6;49926:9;49922:22;49891:63;:::i;:::-;49881:73;;49837:127;49622:349;;;;:::o;49977:180::-;50025:77;50022:1;50015:88;50122:4;50119:1;50112:15;50146:4;50143:1;50136:15;50163:185;50203:1;50220:20;50238:1;50220:20;:::i;:::-;50215:25;;50254:20;50272:1;50254:20;:::i;:::-;50249:25;;50293:1;50283:35;;50298:18;;:::i;:::-;50283:35;50340:1;50337;50333:9;50328:14;;50163:185;;;;:::o;50354:176::-;50386:1;50403:20;50421:1;50403:20;:::i;:::-;50398:25;;50437:20;50455:1;50437:20;:::i;:::-;50432:25;;50476:1;50466:35;;50481:18;;:::i;:::-;50466:35;50522:1;50519;50515:9;50510:14;;50354:176;;;;:::o;50536:220::-;50676:34;50672:1;50664:6;50660:14;50653:58;50745:3;50740:2;50732:6;50728:15;50721:28;50536:220;:::o;50762:366::-;50904:3;50925:67;50989:2;50984:3;50925:67;:::i;:::-;50918:74;;51001:93;51090:3;51001:93;:::i;:::-;51119:2;51114:3;51110:12;51103:19;;50762:366;;;:::o;51134:419::-;51300:4;51338:2;51327:9;51323:18;51315:26;;51387:9;51381:4;51377:20;51373:1;51362:9;51358:17;51351:47;51415:131;51541:4;51415:131;:::i;:::-;51407:139;;51134:419;;;:::o;51559:179::-;51699:31;51695:1;51687:6;51683:14;51676:55;51559:179;:::o;51744:366::-;51886:3;51907:67;51971:2;51966:3;51907:67;:::i;:::-;51900:74;;51983:93;52072:3;51983:93;:::i;:::-;52101:2;52096:3;52092:12;52085:19;;51744:366;;;:::o;52116:419::-;52282:4;52320:2;52309:9;52305:18;52297:26;;52369:9;52363:4;52359:20;52355:1;52344:9;52340:17;52333:47;52397:131;52523:4;52397:131;:::i;:::-;52389:139;;52116:419;;;:::o;52541:222::-;52681:34;52677:1;52669:6;52665:14;52658:58;52750:5;52745:2;52737:6;52733:15;52726:30;52541:222;:::o;52769:366::-;52911:3;52932:67;52996:2;52991:3;52932:67;:::i;:::-;52925:74;;53008:93;53097:3;53008:93;:::i;:::-;53126:2;53121:3;53117:12;53110:19;;52769:366;;;:::o;53141:419::-;53307:4;53345:2;53334:9;53330:18;53322:26;;53394:9;53388:4;53384:20;53380:1;53369:9;53365:17;53358:47;53422:131;53548:4;53422:131;:::i;:::-;53414:139;;53141:419;;;:::o;53566:118::-;53603:7;53643:34;53636:5;53632:46;53621:57;;53566:118;;;:::o;53690:273::-;53730:3;53749:20;53767:1;53749:20;:::i;:::-;53744:25;;53783:20;53801:1;53783:20;:::i;:::-;53778:25;;53905:1;53869:34;53865:42;53862:1;53859:49;53856:75;;;53911:18;;:::i;:::-;53856:75;53955:1;53952;53948:9;53941:16;;53690:273;;;;:::o
Swarm Source
ipfs://c4de581d8810f328e736b0241fb37dd2cfa35a818574d007d3346d7ae72d384f
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.