ERC-721
Overview
Max Total Supply
1,637 DEGENZ
Holders
228
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 DEGENZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TotalDegenz
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-04 */ // SPDX-License-Identifier: MIT // 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/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: contracts/ERC721A.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721A: balance query for the zero address" ); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); 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 < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721A: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/TotalDegenz.sol pragma solidity ^0.8.0; contract TotalDegenz is ERC721A, Ownable { constructor() ERC721A("Total Degenz", "DEGENZ", 10, 6969) {} uint256 public PRICE = 0.025 ether; uint256 public constant MINT_LIMIT = 20; uint256 public constant PRIVATE_LIMIT = 10; uint256 public constant PUBLIC_FREE = 1000; uint256 public constant PRIVATE_RESERVED = 500; uint256 public privateMintEndTime; bool public isPublicSaleActive = false; mapping(address => uint256) private privateMints; uint256 public PUBLIC_MINTED = 0; uint256 public PRIVATE_MINTED = 0; string private baseURI = ""; bytes32 privateSaleRoot; address public constant ADDRESS_1 = 0x188A3c584F0dE9ee0eABe04316A94A41F0867C0C; //B address public constant ADDRESS_2 = 0xbC905EbFA0D1D0e636550432D497F86D602Cf643; //C //Essential function mint(uint256 numberOfTokens) external payable { require(msg.sender == tx.origin, "No contracts allowed"); if (block.timestamp <= privateMintEndTime) { require( numberOfTokens + PRIVATE_RESERVED + PUBLIC_MINTED <= collectionSize, "Not enough supply, private mint ongoing" ); } else { require( numberOfTokens + totalSupply() <= collectionSize, "Not enough supply" ); } require( numberMinted(msg.sender) + numberOfTokens <= MINT_LIMIT, "Exceeding max mint limit" ); require(isPublicSaleActive, "Public sale not active"); if (PUBLIC_MINTED + numberOfTokens > PUBLIC_FREE) { require(msg.value >= PRICE * numberOfTokens, "Not enough ETH"); } PUBLIC_MINTED += numberOfTokens; _safeMint(msg.sender, numberOfTokens); } function privateMint(uint256 numberOfTokens, bytes32[] memory proof) external payable { require(msg.sender == tx.origin, "No contracts allowed"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(verify(leaf, proof), "Address is not in presale list"); require( block.timestamp <= privateMintEndTime, "Private mint reservation has ended" ); require( numberOfTokens + totalSupply() <= collectionSize, "Not enough supply" ); require( privateMints[msg.sender] + numberOfTokens <= PRIVATE_LIMIT, "Exceeding max private sale limit" ); require( numberMinted(msg.sender) + numberOfTokens <= MINT_LIMIT, "Exceeding max mint limit" ); require( PRIVATE_MINTED + numberOfTokens <= PRIVATE_RESERVED, "Ran out of private reserved" ); require(isPublicSaleActive, "Public sale not active"); privateMints[msg.sender] += numberOfTokens; PRIVATE_MINTED += numberOfTokens; _safeMint(msg.sender, numberOfTokens); } //Essential function setBaseURI(string calldata URI) external onlyOwner { baseURI = URI; } //Essential function setPublicSaleStatus() external onlyOwner { isPublicSaleActive = !isPublicSaleActive; } function setPrivateSaleEndTime(uint256 duration) external onlyOwner { privateMintEndTime = block.timestamp + (duration); } //Essential function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(ADDRESS_1).transfer((balance * 1500) / 10000); payable(ADDRESS_2).transfer(address(this).balance); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Token does not exist"); return string(abi.encodePacked(baseURI, Strings.toString(tokenId))); } function tokensOfOwner(address owner) public view returns (uint256[] memory) { uint256 tokenCount = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(owner, i); } return tokenIds; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function verify(bytes32 leaf, bytes32[] memory proof) public view returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { computedHash = keccak256( abi.encodePacked(computedHash, proofElement) ); } else { computedHash = keccak256( abi.encodePacked(proofElement, computedHash) ); } } return computedHash == privateSaleRoot; } function setRoot(bytes32 _root) external onlyOwner { privateSaleRoot = _root; } function isPrivateSaleActive() external view returns (bool) { return block.timestamp <= privateMintEndTime; } function isPrivateListed(bytes32 leaf, bytes32[] memory proof) external view returns (bool) { return verify(leaf, proof); } function releaseDegenz() external onlyOwner { PRICE = 0 ether; } }
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":[],"name":"ADDRESS_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isPrivateListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPrivateSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privateMintEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseDegenz","outputs":[],"stateMutability":"nonpayable","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":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setPrivateSaleEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000805560006007556658d15e176280006009556000600b60006101000a81548160ff0219169083151502179055506000600d556000600e5560405180602001604052806000815250600f908051906020019062000064929190620002aa565b503480156200007257600080fd5b506040518060400160405280600c81526020017f546f74616c20446567656e7a00000000000000000000000000000000000000008152506040518060400160405280600681526020017f444547454e5a0000000000000000000000000000000000000000000000000000815250600a611b39600081116200012a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012190620003ca565b60405180910390fd5b6000821162000170576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200016790620003a8565b60405180910390fd5b836001908051906020019062000188929190620002aa565b508260029080519060200190620001a1929190620002aa565b508160a08181525050806080818152505050505050620001d6620001ca620001dc60201b60201c565b620001e460201b60201c565b62000500565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002b890620003fd565b90600052602060002090601f016020900481019282620002dc576000855562000328565b82601f10620002f757805160ff191683800117855562000328565b8280016001018555821562000328579182015b82811115620003275782518255916020019190600101906200030a565b5b5090506200033791906200033b565b5090565b5b80821115620003565760008160009055506001016200033c565b5090565b600062000369602783620003ec565b9150620003768262000462565b604082019050919050565b600062000390602e83620003ec565b91506200039d82620004b1565b604082019050919050565b60006020820190508181036000830152620003c3816200035a565b9050919050565b60006020820190508181036000830152620003e58162000381565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200041657607f821691505b602082108114156200042d576200042c62000433565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a0516155736200054260003960008181612a0f01528181612a3801526131500152600081816117b6015281816118380152611d8f01526155736000f3fe6080604052600436106102675760003560e01c806376bc456611610144578063b709dec6116100b6578063d8a9e1e91161007a578063d8a9e1e914610906578063dab5f34014610931578063dc33e6811461095a578063de97536b14610997578063e985e9c5146109c2578063f2fde38b146109ff57610267565b8063b709dec614610830578063b88d4fde14610859578063b977fe5514610882578063c87b56dd1461089e578063d7224ba0146108db57610267565b80638d859f3e116101085780638d859f3e1461073f5780638da5cb5b1461076a57806395d89b4114610795578063a0712d68146107c0578063a22cb465146107dc578063b08da3421461080557610267565b806376bc45661461067e5780637dfed9fe146106a95780637ff0c853146106c05780638462151c146106d757806389b790141461071457610267565b80633ccfd60b116101dd57806360df4c96116101a157806360df4c961461055a57806361697a24146105855780636352211e146105b05780636df4d241146105ed57806370a082311461062a578063715018a61461066757610267565b80633ccfd60b1461048957806342842e0e146104a0578063434e02d4146104c95780634f6ccce7146104f457806355f804b31461053157610267565b80631521b3111161022f5780631521b3111461036557806318160ddd146103a25780631e84c413146103cd57806323b872dd146103f857806326c8cf03146104215780632f745c591461044c57610267565b806301ffc9a71461026c57806302775240146102a957806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613a8c565b610a28565b6040516102a091906142ef565b60405180910390f35b3480156102b557600080fd5b506102be610b72565b6040516102cb919061470c565b60405180910390f35b3480156102e057600080fd5b506102e9610b77565b6040516102f6919061430a565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190613b33565b610c09565b6040516103339190614266565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e91906139c3565b610c8e565b005b34801561037157600080fd5b5061038c60048036038101906103879190613a30565b610da7565b60405161039991906142ef565b60405180910390f35b3480156103ae57600080fd5b506103b7610dbb565b6040516103c4919061470c565b60405180910390f35b3480156103d957600080fd5b506103e2610dc4565b6040516103ef91906142ef565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a91906138ad565b610dd7565b005b34801561042d57600080fd5b50610436610de7565b604051610443919061470c565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e91906139c3565b610dec565b604051610480919061470c565b60405180910390f35b34801561049557600080fd5b5061049e610fea565b005b3480156104ac57600080fd5b506104c760048036038101906104c291906138ad565b61113e565b005b3480156104d557600080fd5b506104de61115e565b6040516104eb919061470c565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613b33565b611164565b604051610528919061470c565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613ae6565b6111b7565b005b34801561056657600080fd5b5061056f611249565b60405161057c919061470c565b60405180910390f35b34801561059157600080fd5b5061059a61124f565b6040516105a7919061470c565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613b33565b611255565b6040516105e49190614266565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190613a30565b61126b565b60405161062191906142ef565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190613840565b611322565b60405161065e919061470c565b60405180910390f35b34801561067357600080fd5b5061067c61140b565b005b34801561068a57600080fd5b50610693611493565b6040516106a0919061470c565b60405180910390f35b3480156106b557600080fd5b506106be611499565b005b3480156106cc57600080fd5b506106d5611541565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190613840565b6115c7565b60405161070b91906142cd565b60405180910390f35b34801561072057600080fd5b50610729611675565b604051610736919061470c565b60405180910390f35b34801561074b57600080fd5b5061075461167b565b604051610761919061470c565b60405180910390f35b34801561077657600080fd5b5061077f611681565b60405161078c9190614266565b60405180910390f35b3480156107a157600080fd5b506107aa6116ab565b6040516107b7919061430a565b60405180910390f35b6107da60048036038101906107d59190613b33565b61173d565b005b3480156107e857600080fd5b5061080360048036038101906107fe9190613983565b6119e0565b005b34801561081157600080fd5b5061081a611b61565b6040516108279190614266565b60405180910390f35b34801561083c57600080fd5b5061085760048036038101906108529190613b33565b611b79565b005b34801561086557600080fd5b50610880600480360381019061087b9190613900565b611c0a565b005b61089c60048036038101906108979190613b60565b611c66565b005b3480156108aa57600080fd5b506108c560048036038101906108c09190613b33565b612006565b6040516108d2919061430a565b60405180910390f35b3480156108e757600080fd5b506108f0612082565b6040516108fd919061470c565b60405180910390f35b34801561091257600080fd5b5061091b612088565b60405161092891906142ef565b60405180910390f35b34801561093d57600080fd5b5061095860048036038101906109539190613a03565b612095565b005b34801561096657600080fd5b50610981600480360381019061097c9190613840565b61211b565b60405161098e919061470c565b60405180910390f35b3480156109a357600080fd5b506109ac61212d565b6040516109b99190614266565b60405180910390f35b3480156109ce57600080fd5b506109e960048036038101906109e4919061386d565b612145565b6040516109f691906142ef565b60405180910390f35b348015610a0b57600080fd5b50610a266004803603810190610a219190613840565b6121d9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5b57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b6b5750610b6a826122d1565b5b9050919050565b601481565b606060018054610b8690614acf565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb290614acf565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b5050505050905090565b6000610c148261233b565b610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a906146cc565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c9982611255565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d01906145ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d29612348565b73ffffffffffffffffffffffffffffffffffffffff161480610d585750610d5781610d52612348565b612145565b5b610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e9061448c565b60405180910390fd5b610da2838383612350565b505050565b6000610db3838361126b565b905092915050565b60008054905090565b600b60009054906101000a900460ff1681565b610de2838383612402565b505050565b600a81565b6000610df783611322565b8210610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f9061432c565b60405180910390fd5b6000610e42610dbb565b905060008060005b83811015610fa8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f3c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f945786841415610f85578195505050505050610fe4565b8380610f9090614b32565b9450505b508080610fa090614b32565b915050610e4a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb9061466c565b60405180910390fd5b92915050565b610ff2612348565b73ffffffffffffffffffffffffffffffffffffffff16611010611681565b73ffffffffffffffffffffffffffffffffffffffff1614611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d9061454c565b60405180910390fd5b600047905073188a3c584f0de9ee0eabe04316a94a41f0867c0c73ffffffffffffffffffffffffffffffffffffffff166108fc6127106105dc846110aa9190614907565b6110b491906148d6565b9081150290604051600060405180830381858888f193505050501580156110df573d6000803e3d6000fd5b5073bc905ebfa0d1d0e636550432d497f86d602cf64373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561113a573d6000803e3d6000fd5b5050565b61115983838360405180602001604052806000815250611c0a565b505050565b600e5481565b600061116e610dbb565b82106111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a6906143cc565b60405180910390fd5b819050919050565b6111bf612348565b73ffffffffffffffffffffffffffffffffffffffff166111dd611681565b73ffffffffffffffffffffffffffffffffffffffff1614611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a9061454c565b60405180910390fd5b8181600f9190611244929190613581565b505050565b6101f481565b6103e881565b6000611260826129bb565b600001519050919050565b60008083905060005b835181101561131357600084828151811061129257611291614c67565b5b602002602001015190508083116112d35782816040516020016112b6929190614216565b6040516020818303038152906040528051906020012092506112ff565b80836040516020016112e6929190614216565b6040516020818303038152906040528051906020012092505b50808061130b90614b32565b915050611274565b50601054811491505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a906144cc565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611413612348565b73ffffffffffffffffffffffffffffffffffffffff16611431611681565b73ffffffffffffffffffffffffffffffffffffffff1614611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e9061454c565b60405180910390fd5b6114916000612bbe565b565b600a5481565b6114a1612348565b73ffffffffffffffffffffffffffffffffffffffff166114bf611681565b73ffffffffffffffffffffffffffffffffffffffff1614611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c9061454c565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b611549612348565b73ffffffffffffffffffffffffffffffffffffffff16611567611681565b73ffffffffffffffffffffffffffffffffffffffff16146115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b49061454c565b60405180910390fd5b6000600981905550565b606060006115d483611322565b905060008167ffffffffffffffff8111156115f2576115f1614c96565b5b6040519080825280602002602001820160405280156116205781602001602082028036833780820191505090505b50905060005b8281101561166a576116388582610dec565b82828151811061164b5761164a614c67565b5b602002602001018181525050808061166290614b32565b915050611626565b508092505050919050565b600d5481565b60095481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546116ba90614acf565b80601f01602080910402602001604051908101604052809291908181526020018280546116e690614acf565b80156117335780601f1061170857610100808354040283529160200191611733565b820191906000526020600020905b81548152906001019060200180831161171657829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a29061464c565b60405180910390fd5b600a544211611836577f0000000000000000000000000000000000000000000000000000000000000000600d546101f4836117e69190614880565b6117f09190614880565b1115611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061442c565b60405180910390fd5b6118ac565b7f000000000000000000000000000000000000000000000000000000000000000061185f610dbb565b8261186a9190614880565b11156118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a29061434c565b60405180910390fd5b5b6014816118b83361211b565b6118c29190614880565b1115611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa9061446c565b60405180910390fd5b600b60009054906101000a900460ff16611952576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119499061452c565b60405180910390fd5b6103e881600d546119639190614880565b11156119ba57806009546119779190614907565b3410156119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b09061450c565b60405180910390fd5b5b80600d60008282546119cc9190614880565b925050819055506119dd3382612c84565b50565b6119e8612348565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d9061456c565b60405180910390fd5b8060066000611a63612348565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b10612348565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b5591906142ef565b60405180910390a35050565b73188a3c584f0de9ee0eabe04316a94a41f0867c0c81565b611b81612348565b73ffffffffffffffffffffffffffffffffffffffff16611b9f611681565b73ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec9061454c565b60405180910390fd5b8042611c019190614880565b600a8190555050565b611c15848484612402565b611c2184848484612ca2565b611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c57906145cc565b60405180910390fd5b50505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb9061464c565b60405180910390fd5b600033604051602001611ce791906141fb565b604051602081830303815290604052805190602001209050611d09818361126b565b611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f906143ac565b60405180910390fd5b600a54421115611d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d84906144ac565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000611db6610dbb565b84611dc19190614880565b1115611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df99061434c565b60405180910390fd5b600a83600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e4f9190614880565b1115611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e879061468c565b60405180910390fd5b601483611e9c3361211b565b611ea69190614880565b1115611ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ede9061446c565b60405180910390fd5b6101f483600e54611ef89190614880565b1115611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f309061462c565b60405180910390fd5b600b60009054906101000a900460ff16611f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7f9061452c565b60405180910390fd5b82600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd79190614880565b9250508190555082600e6000828254611ff09190614880565b925050819055506120013384612c84565b505050565b60606120118261233b565b612050576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120479061444c565b60405180910390fd5b600f61205b83612e39565b60405160200161206c929190614242565b6040516020818303038152906040529050919050565b60075481565b6000600a54421115905090565b61209d612348565b73ffffffffffffffffffffffffffffffffffffffff166120bb611681565b73ffffffffffffffffffffffffffffffffffffffff1614612111576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121089061454c565b60405180910390fd5b8060108190555050565b600061212682612f9a565b9050919050565b73bc905ebfa0d1d0e636550432d497f86d602cf64381565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121e1612348565b73ffffffffffffffffffffffffffffffffffffffff166121ff611681565b73ffffffffffffffffffffffffffffffffffffffff1614612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c9061454c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bc9061436c565b60405180910390fd5b6122ce81612bbe565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061240d826129bb565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612434612348565b73ffffffffffffffffffffffffffffffffffffffff1614806124905750612459612348565b73ffffffffffffffffffffffffffffffffffffffff1661247884610c09565b73ffffffffffffffffffffffffffffffffffffffff16145b806124ac57506124ab82600001516124a6612348565b612145565b5b9050806124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e59061458c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612557906144ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c7906143ec565b60405180910390fd5b6125dd8585856001613083565b6125ed6000848460000151612350565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661265b9190614961565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166126ff919061483a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846128059190614880565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561294b5761287b8161233b565b1561294a576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129b38686866001613089565b505050505050565b6129c3613607565b6129cc8261233b565b612a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a029061438c565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612a6f5760017f000000000000000000000000000000000000000000000000000000000000000084612a629190614995565b612a6c9190614880565b90505b60008390505b818110612b7d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b6957809350505050612bb9565b508080612b7590614aa5565b915050612a75565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb0906146ac565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c9e82826040518060200160405280600081525061308f565b5050565b6000612cc38473ffffffffffffffffffffffffffffffffffffffff1661356e565b15612e2c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cec612348565b8786866040518563ffffffff1660e01b8152600401612d0e9493929190614281565b602060405180830381600087803b158015612d2857600080fd5b505af1925050508015612d5957506040513d601f19601f82011682018060405250810190612d569190613ab9565b60015b612ddc573d8060008114612d89576040519150601f19603f3d011682016040523d82523d6000602084013e612d8e565b606091505b50600081511415612dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcb906145cc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e31565b600190505b949350505050565b60606000821415612e81576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f95565b600082905060005b60008214612eb3578080612e9c90614b32565b915050600a82612eac91906148d6565b9150612e89565b60008167ffffffffffffffff811115612ecf57612ece614c96565b5b6040519080825280601f01601f191660200182016040528015612f015781602001600182028036833780820191505090505b5090505b60008514612f8e57600182612f1a9190614995565b9150600a85612f299190614ba9565b6030612f359190614880565b60f81b818381518110612f4b57612f4a614c67565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f8791906148d6565b9450612f05565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561300b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130029061440c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fc9061460c565b60405180910390fd5b61310e8161233b565b1561314e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613145906145ec565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156131b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a8906146ec565b60405180910390fd5b6131be6000858386613083565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516132bb919061483a565b6fffffffffffffffffffffffffffffffff1681526020018583602001516132e2919061483a565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561355157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134f16000888488612ca2565b613530576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613527906145cc565b60405180910390fd5b818061353b90614b32565b925050808061354990614b32565b915050613480565b50806000819055506135666000878588613089565b505050505050565b600080823b905060008111915050919050565b82805461358d90614acf565b90600052602060002090601f0160209004810192826135af57600085556135f6565b82601f106135c857803560ff19168380011785556135f6565b828001600101855582156135f6579182015b828111156135f55782358255916020019190600101906135da565b5b5090506136039190613641565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561365a576000816000905550600101613642565b5090565b600061367161366c8461474c565b614727565b9050808382526020820190508285602086028201111561369457613693614ccf565b5b60005b858110156136c457816136aa8882613768565b845260208401935060208301925050600181019050613697565b5050509392505050565b60006136e16136dc84614778565b614727565b9050828152602081018484840111156136fd576136fc614cd4565b5b613708848285614a63565b509392505050565b60008135905061371f816154ca565b92915050565b600082601f83011261373a57613739614cca565b5b813561374a84826020860161365e565b91505092915050565b600081359050613762816154e1565b92915050565b600081359050613777816154f8565b92915050565b60008135905061378c8161550f565b92915050565b6000815190506137a18161550f565b92915050565b600082601f8301126137bc576137bb614cca565b5b81356137cc8482602086016136ce565b91505092915050565b60008083601f8401126137eb576137ea614cca565b5b8235905067ffffffffffffffff81111561380857613807614cc5565b5b60208301915083600182028301111561382457613823614ccf565b5b9250929050565b60008135905061383a81615526565b92915050565b60006020828403121561385657613855614cde565b5b600061386484828501613710565b91505092915050565b6000806040838503121561388457613883614cde565b5b600061389285828601613710565b92505060206138a385828601613710565b9150509250929050565b6000806000606084860312156138c6576138c5614cde565b5b60006138d486828701613710565b93505060206138e586828701613710565b92505060406138f68682870161382b565b9150509250925092565b6000806000806080858703121561391a57613919614cde565b5b600061392887828801613710565b945050602061393987828801613710565b935050604061394a8782880161382b565b925050606085013567ffffffffffffffff81111561396b5761396a614cd9565b5b613977878288016137a7565b91505092959194509250565b6000806040838503121561399a57613999614cde565b5b60006139a885828601613710565b92505060206139b985828601613753565b9150509250929050565b600080604083850312156139da576139d9614cde565b5b60006139e885828601613710565b92505060206139f98582860161382b565b9150509250929050565b600060208284031215613a1957613a18614cde565b5b6000613a2784828501613768565b91505092915050565b60008060408385031215613a4757613a46614cde565b5b6000613a5585828601613768565b925050602083013567ffffffffffffffff811115613a7657613a75614cd9565b5b613a8285828601613725565b9150509250929050565b600060208284031215613aa257613aa1614cde565b5b6000613ab08482850161377d565b91505092915050565b600060208284031215613acf57613ace614cde565b5b6000613add84828501613792565b91505092915050565b60008060208385031215613afd57613afc614cde565b5b600083013567ffffffffffffffff811115613b1b57613b1a614cd9565b5b613b27858286016137d5565b92509250509250929050565b600060208284031215613b4957613b48614cde565b5b6000613b578482850161382b565b91505092915050565b60008060408385031215613b7757613b76614cde565b5b6000613b858582860161382b565b925050602083013567ffffffffffffffff811115613ba657613ba5614cd9565b5b613bb285828601613725565b9150509250929050565b6000613bc883836141dd565b60208301905092915050565b613bdd816149c9565b82525050565b613bf4613bef826149c9565b614b7b565b82525050565b6000613c05826147ce565b613c0f81856147fc565b9350613c1a836147a9565b8060005b83811015613c4b578151613c328882613bbc565b9750613c3d836147ef565b925050600181019050613c1e565b5085935050505092915050565b613c61816149db565b82525050565b613c78613c73826149e7565b614b8d565b82525050565b6000613c89826147d9565b613c93818561480d565b9350613ca3818560208601614a72565b613cac81614ce3565b840191505092915050565b6000613cc2826147e4565b613ccc818561481e565b9350613cdc818560208601614a72565b613ce581614ce3565b840191505092915050565b6000613cfb826147e4565b613d05818561482f565b9350613d15818560208601614a72565b80840191505092915050565b60008154613d2e81614acf565b613d38818661482f565b94506001821660008114613d535760018114613d6457613d97565b60ff19831686528186019350613d97565b613d6d856147b9565b60005b83811015613d8f57815481890152600182019150602081019050613d70565b838801955050505b50505092915050565b6000613dad60228361481e565b9150613db882614d01565b604082019050919050565b6000613dd060118361481e565b9150613ddb82614d50565b602082019050919050565b6000613df360268361481e565b9150613dfe82614d79565b604082019050919050565b6000613e16602a8361481e565b9150613e2182614dc8565b604082019050919050565b6000613e39601e8361481e565b9150613e4482614e17565b602082019050919050565b6000613e5c60238361481e565b9150613e6782614e40565b604082019050919050565b6000613e7f60258361481e565b9150613e8a82614e8f565b604082019050919050565b6000613ea260318361481e565b9150613ead82614ede565b604082019050919050565b6000613ec560278361481e565b9150613ed082614f2d565b604082019050919050565b6000613ee860148361481e565b9150613ef382614f7c565b602082019050919050565b6000613f0b60188361481e565b9150613f1682614fa5565b602082019050919050565b6000613f2e60398361481e565b9150613f3982614fce565b604082019050919050565b6000613f5160228361481e565b9150613f5c8261501d565b604082019050919050565b6000613f74602b8361481e565b9150613f7f8261506c565b604082019050919050565b6000613f9760268361481e565b9150613fa2826150bb565b604082019050919050565b6000613fba600e8361481e565b9150613fc58261510a565b602082019050919050565b6000613fdd60168361481e565b9150613fe882615133565b602082019050919050565b600061400060208361481e565b915061400b8261515c565b602082019050919050565b6000614023601a8361481e565b915061402e82615185565b602082019050919050565b600061404660328361481e565b9150614051826151ae565b604082019050919050565b600061406960228361481e565b9150614074826151fd565b604082019050919050565b600061408c60338361481e565b91506140978261524c565b604082019050919050565b60006140af601d8361481e565b91506140ba8261529b565b602082019050919050565b60006140d260218361481e565b91506140dd826152c4565b604082019050919050565b60006140f5601b8361481e565b915061410082615313565b602082019050919050565b600061411860148361481e565b91506141238261533c565b602082019050919050565b600061413b602e8361481e565b915061414682615365565b604082019050919050565b600061415e60208361481e565b9150614169826153b4565b602082019050919050565b6000614181602f8361481e565b915061418c826153dd565b604082019050919050565b60006141a4602d8361481e565b91506141af8261542c565b604082019050919050565b60006141c760228361481e565b91506141d28261547b565b604082019050919050565b6141e681614a59565b82525050565b6141f581614a59565b82525050565b60006142078284613be3565b60148201915081905092915050565b60006142228285613c67565b6020820191506142328284613c67565b6020820191508190509392505050565b600061424e8285613d21565b915061425a8284613cf0565b91508190509392505050565b600060208201905061427b6000830184613bd4565b92915050565b60006080820190506142966000830187613bd4565b6142a36020830186613bd4565b6142b060408301856141ec565b81810360608301526142c28184613c7e565b905095945050505050565b600060208201905081810360008301526142e78184613bfa565b905092915050565b60006020820190506143046000830184613c58565b92915050565b600060208201905081810360008301526143248184613cb7565b905092915050565b6000602082019050818103600083015261434581613da0565b9050919050565b6000602082019050818103600083015261436581613dc3565b9050919050565b6000602082019050818103600083015261438581613de6565b9050919050565b600060208201905081810360008301526143a581613e09565b9050919050565b600060208201905081810360008301526143c581613e2c565b9050919050565b600060208201905081810360008301526143e581613e4f565b9050919050565b6000602082019050818103600083015261440581613e72565b9050919050565b6000602082019050818103600083015261442581613e95565b9050919050565b6000602082019050818103600083015261444581613eb8565b9050919050565b6000602082019050818103600083015261446581613edb565b9050919050565b6000602082019050818103600083015261448581613efe565b9050919050565b600060208201905081810360008301526144a581613f21565b9050919050565b600060208201905081810360008301526144c581613f44565b9050919050565b600060208201905081810360008301526144e581613f67565b9050919050565b6000602082019050818103600083015261450581613f8a565b9050919050565b6000602082019050818103600083015261452581613fad565b9050919050565b6000602082019050818103600083015261454581613fd0565b9050919050565b6000602082019050818103600083015261456581613ff3565b9050919050565b6000602082019050818103600083015261458581614016565b9050919050565b600060208201905081810360008301526145a581614039565b9050919050565b600060208201905081810360008301526145c58161405c565b9050919050565b600060208201905081810360008301526145e58161407f565b9050919050565b60006020820190508181036000830152614605816140a2565b9050919050565b60006020820190508181036000830152614625816140c5565b9050919050565b60006020820190508181036000830152614645816140e8565b9050919050565b600060208201905081810360008301526146658161410b565b9050919050565b600060208201905081810360008301526146858161412e565b9050919050565b600060208201905081810360008301526146a581614151565b9050919050565b600060208201905081810360008301526146c581614174565b9050919050565b600060208201905081810360008301526146e581614197565b9050919050565b60006020820190508181036000830152614705816141ba565b9050919050565b600060208201905061472160008301846141ec565b92915050565b6000614731614742565b905061473d8282614b01565b919050565b6000604051905090565b600067ffffffffffffffff82111561476757614766614c96565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561479357614792614c96565b5b61479c82614ce3565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061484582614a1d565b915061485083614a1d565b9250826fffffffffffffffffffffffffffffffff0382111561487557614874614bda565b5b828201905092915050565b600061488b82614a59565b915061489683614a59565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148cb576148ca614bda565b5b828201905092915050565b60006148e182614a59565b91506148ec83614a59565b9250826148fc576148fb614c09565b5b828204905092915050565b600061491282614a59565b915061491d83614a59565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561495657614955614bda565b5b828202905092915050565b600061496c82614a1d565b915061497783614a1d565b92508282101561498a57614989614bda565b5b828203905092915050565b60006149a082614a59565b91506149ab83614a59565b9250828210156149be576149bd614bda565b5b828203905092915050565b60006149d482614a39565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a90578082015181840152602081019050614a75565b83811115614a9f576000848401525b50505050565b6000614ab082614a59565b91506000821415614ac457614ac3614bda565b5b600182039050919050565b60006002820490506001821680614ae757607f821691505b60208210811415614afb57614afa614c38565b5b50919050565b614b0a82614ce3565b810181811067ffffffffffffffff82111715614b2957614b28614c96565b5b80604052505050565b6000614b3d82614a59565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b7057614b6f614bda565b5b600182019050919050565b6000614b8682614b97565b9050919050565b6000819050919050565b6000614ba282614cf4565b9050919050565b6000614bb482614a59565b9150614bbf83614a59565b925082614bcf57614bce614c09565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f41646472657373206973206e6f7420696e2070726573616c65206c6973740000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820737570706c792c2070726976617465206d696e742060008201527f6f6e676f696e6700000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f457863656564696e67206d6178206d696e74206c696d69740000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f50726976617465206d696e74207265736572766174696f6e2068617320656e6460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f5075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f52616e206f7574206f6620707269766174652072657365727665640000000000600082015250565b7f4e6f20636f6e74726163747320616c6c6f776564000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f457863656564696e67206d617820707269766174652073616c65206c696d6974600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6154d3816149c9565b81146154de57600080fd5b50565b6154ea816149db565b81146154f557600080fd5b50565b615501816149e7565b811461550c57600080fd5b50565b615518816149f1565b811461552357600080fd5b50565b61552f81614a59565b811461553a57600080fd5b5056fea264697066735822122065a333d2aff92b1ddfe5b8adfaf8dec22d2056fea0dc97fb2febed343dd4f10a64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102675760003560e01c806376bc456611610144578063b709dec6116100b6578063d8a9e1e91161007a578063d8a9e1e914610906578063dab5f34014610931578063dc33e6811461095a578063de97536b14610997578063e985e9c5146109c2578063f2fde38b146109ff57610267565b8063b709dec614610830578063b88d4fde14610859578063b977fe5514610882578063c87b56dd1461089e578063d7224ba0146108db57610267565b80638d859f3e116101085780638d859f3e1461073f5780638da5cb5b1461076a57806395d89b4114610795578063a0712d68146107c0578063a22cb465146107dc578063b08da3421461080557610267565b806376bc45661461067e5780637dfed9fe146106a95780637ff0c853146106c05780638462151c146106d757806389b790141461071457610267565b80633ccfd60b116101dd57806360df4c96116101a157806360df4c961461055a57806361697a24146105855780636352211e146105b05780636df4d241146105ed57806370a082311461062a578063715018a61461066757610267565b80633ccfd60b1461048957806342842e0e146104a0578063434e02d4146104c95780634f6ccce7146104f457806355f804b31461053157610267565b80631521b3111161022f5780631521b3111461036557806318160ddd146103a25780631e84c413146103cd57806323b872dd146103f857806326c8cf03146104215780632f745c591461044c57610267565b806301ffc9a71461026c57806302775240146102a957806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613a8c565b610a28565b6040516102a091906142ef565b60405180910390f35b3480156102b557600080fd5b506102be610b72565b6040516102cb919061470c565b60405180910390f35b3480156102e057600080fd5b506102e9610b77565b6040516102f6919061430a565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190613b33565b610c09565b6040516103339190614266565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e91906139c3565b610c8e565b005b34801561037157600080fd5b5061038c60048036038101906103879190613a30565b610da7565b60405161039991906142ef565b60405180910390f35b3480156103ae57600080fd5b506103b7610dbb565b6040516103c4919061470c565b60405180910390f35b3480156103d957600080fd5b506103e2610dc4565b6040516103ef91906142ef565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a91906138ad565b610dd7565b005b34801561042d57600080fd5b50610436610de7565b604051610443919061470c565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e91906139c3565b610dec565b604051610480919061470c565b60405180910390f35b34801561049557600080fd5b5061049e610fea565b005b3480156104ac57600080fd5b506104c760048036038101906104c291906138ad565b61113e565b005b3480156104d557600080fd5b506104de61115e565b6040516104eb919061470c565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613b33565b611164565b604051610528919061470c565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613ae6565b6111b7565b005b34801561056657600080fd5b5061056f611249565b60405161057c919061470c565b60405180910390f35b34801561059157600080fd5b5061059a61124f565b6040516105a7919061470c565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613b33565b611255565b6040516105e49190614266565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190613a30565b61126b565b60405161062191906142ef565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190613840565b611322565b60405161065e919061470c565b60405180910390f35b34801561067357600080fd5b5061067c61140b565b005b34801561068a57600080fd5b50610693611493565b6040516106a0919061470c565b60405180910390f35b3480156106b557600080fd5b506106be611499565b005b3480156106cc57600080fd5b506106d5611541565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190613840565b6115c7565b60405161070b91906142cd565b60405180910390f35b34801561072057600080fd5b50610729611675565b604051610736919061470c565b60405180910390f35b34801561074b57600080fd5b5061075461167b565b604051610761919061470c565b60405180910390f35b34801561077657600080fd5b5061077f611681565b60405161078c9190614266565b60405180910390f35b3480156107a157600080fd5b506107aa6116ab565b6040516107b7919061430a565b60405180910390f35b6107da60048036038101906107d59190613b33565b61173d565b005b3480156107e857600080fd5b5061080360048036038101906107fe9190613983565b6119e0565b005b34801561081157600080fd5b5061081a611b61565b6040516108279190614266565b60405180910390f35b34801561083c57600080fd5b5061085760048036038101906108529190613b33565b611b79565b005b34801561086557600080fd5b50610880600480360381019061087b9190613900565b611c0a565b005b61089c60048036038101906108979190613b60565b611c66565b005b3480156108aa57600080fd5b506108c560048036038101906108c09190613b33565b612006565b6040516108d2919061430a565b60405180910390f35b3480156108e757600080fd5b506108f0612082565b6040516108fd919061470c565b60405180910390f35b34801561091257600080fd5b5061091b612088565b60405161092891906142ef565b60405180910390f35b34801561093d57600080fd5b5061095860048036038101906109539190613a03565b612095565b005b34801561096657600080fd5b50610981600480360381019061097c9190613840565b61211b565b60405161098e919061470c565b60405180910390f35b3480156109a357600080fd5b506109ac61212d565b6040516109b99190614266565b60405180910390f35b3480156109ce57600080fd5b506109e960048036038101906109e4919061386d565b612145565b6040516109f691906142ef565b60405180910390f35b348015610a0b57600080fd5b50610a266004803603810190610a219190613840565b6121d9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5b57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b6b5750610b6a826122d1565b5b9050919050565b601481565b606060018054610b8690614acf565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb290614acf565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b5050505050905090565b6000610c148261233b565b610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a906146cc565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c9982611255565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d01906145ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d29612348565b73ffffffffffffffffffffffffffffffffffffffff161480610d585750610d5781610d52612348565b612145565b5b610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e9061448c565b60405180910390fd5b610da2838383612350565b505050565b6000610db3838361126b565b905092915050565b60008054905090565b600b60009054906101000a900460ff1681565b610de2838383612402565b505050565b600a81565b6000610df783611322565b8210610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f9061432c565b60405180910390fd5b6000610e42610dbb565b905060008060005b83811015610fa8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f3c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f945786841415610f85578195505050505050610fe4565b8380610f9090614b32565b9450505b508080610fa090614b32565b915050610e4a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb9061466c565b60405180910390fd5b92915050565b610ff2612348565b73ffffffffffffffffffffffffffffffffffffffff16611010611681565b73ffffffffffffffffffffffffffffffffffffffff1614611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d9061454c565b60405180910390fd5b600047905073188a3c584f0de9ee0eabe04316a94a41f0867c0c73ffffffffffffffffffffffffffffffffffffffff166108fc6127106105dc846110aa9190614907565b6110b491906148d6565b9081150290604051600060405180830381858888f193505050501580156110df573d6000803e3d6000fd5b5073bc905ebfa0d1d0e636550432d497f86d602cf64373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561113a573d6000803e3d6000fd5b5050565b61115983838360405180602001604052806000815250611c0a565b505050565b600e5481565b600061116e610dbb565b82106111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a6906143cc565b60405180910390fd5b819050919050565b6111bf612348565b73ffffffffffffffffffffffffffffffffffffffff166111dd611681565b73ffffffffffffffffffffffffffffffffffffffff1614611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a9061454c565b60405180910390fd5b8181600f9190611244929190613581565b505050565b6101f481565b6103e881565b6000611260826129bb565b600001519050919050565b60008083905060005b835181101561131357600084828151811061129257611291614c67565b5b602002602001015190508083116112d35782816040516020016112b6929190614216565b6040516020818303038152906040528051906020012092506112ff565b80836040516020016112e6929190614216565b6040516020818303038152906040528051906020012092505b50808061130b90614b32565b915050611274565b50601054811491505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a906144cc565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611413612348565b73ffffffffffffffffffffffffffffffffffffffff16611431611681565b73ffffffffffffffffffffffffffffffffffffffff1614611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e9061454c565b60405180910390fd5b6114916000612bbe565b565b600a5481565b6114a1612348565b73ffffffffffffffffffffffffffffffffffffffff166114bf611681565b73ffffffffffffffffffffffffffffffffffffffff1614611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c9061454c565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b611549612348565b73ffffffffffffffffffffffffffffffffffffffff16611567611681565b73ffffffffffffffffffffffffffffffffffffffff16146115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b49061454c565b60405180910390fd5b6000600981905550565b606060006115d483611322565b905060008167ffffffffffffffff8111156115f2576115f1614c96565b5b6040519080825280602002602001820160405280156116205781602001602082028036833780820191505090505b50905060005b8281101561166a576116388582610dec565b82828151811061164b5761164a614c67565b5b602002602001018181525050808061166290614b32565b915050611626565b508092505050919050565b600d5481565b60095481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546116ba90614acf565b80601f01602080910402602001604051908101604052809291908181526020018280546116e690614acf565b80156117335780601f1061170857610100808354040283529160200191611733565b820191906000526020600020905b81548152906001019060200180831161171657829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a29061464c565b60405180910390fd5b600a544211611836577f0000000000000000000000000000000000000000000000000000000000001b39600d546101f4836117e69190614880565b6117f09190614880565b1115611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061442c565b60405180910390fd5b6118ac565b7f0000000000000000000000000000000000000000000000000000000000001b3961185f610dbb565b8261186a9190614880565b11156118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a29061434c565b60405180910390fd5b5b6014816118b83361211b565b6118c29190614880565b1115611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa9061446c565b60405180910390fd5b600b60009054906101000a900460ff16611952576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119499061452c565b60405180910390fd5b6103e881600d546119639190614880565b11156119ba57806009546119779190614907565b3410156119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b09061450c565b60405180910390fd5b5b80600d60008282546119cc9190614880565b925050819055506119dd3382612c84565b50565b6119e8612348565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d9061456c565b60405180910390fd5b8060066000611a63612348565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b10612348565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b5591906142ef565b60405180910390a35050565b73188a3c584f0de9ee0eabe04316a94a41f0867c0c81565b611b81612348565b73ffffffffffffffffffffffffffffffffffffffff16611b9f611681565b73ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec9061454c565b60405180910390fd5b8042611c019190614880565b600a8190555050565b611c15848484612402565b611c2184848484612ca2565b611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c57906145cc565b60405180910390fd5b50505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb9061464c565b60405180910390fd5b600033604051602001611ce791906141fb565b604051602081830303815290604052805190602001209050611d09818361126b565b611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f906143ac565b60405180910390fd5b600a54421115611d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d84906144ac565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001b39611db6610dbb565b84611dc19190614880565b1115611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df99061434c565b60405180910390fd5b600a83600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e4f9190614880565b1115611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e879061468c565b60405180910390fd5b601483611e9c3361211b565b611ea69190614880565b1115611ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ede9061446c565b60405180910390fd5b6101f483600e54611ef89190614880565b1115611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f309061462c565b60405180910390fd5b600b60009054906101000a900460ff16611f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7f9061452c565b60405180910390fd5b82600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd79190614880565b9250508190555082600e6000828254611ff09190614880565b925050819055506120013384612c84565b505050565b60606120118261233b565b612050576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120479061444c565b60405180910390fd5b600f61205b83612e39565b60405160200161206c929190614242565b6040516020818303038152906040529050919050565b60075481565b6000600a54421115905090565b61209d612348565b73ffffffffffffffffffffffffffffffffffffffff166120bb611681565b73ffffffffffffffffffffffffffffffffffffffff1614612111576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121089061454c565b60405180910390fd5b8060108190555050565b600061212682612f9a565b9050919050565b73bc905ebfa0d1d0e636550432d497f86d602cf64381565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121e1612348565b73ffffffffffffffffffffffffffffffffffffffff166121ff611681565b73ffffffffffffffffffffffffffffffffffffffff1614612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c9061454c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bc9061436c565b60405180910390fd5b6122ce81612bbe565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061240d826129bb565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612434612348565b73ffffffffffffffffffffffffffffffffffffffff1614806124905750612459612348565b73ffffffffffffffffffffffffffffffffffffffff1661247884610c09565b73ffffffffffffffffffffffffffffffffffffffff16145b806124ac57506124ab82600001516124a6612348565b612145565b5b9050806124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e59061458c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612557906144ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c7906143ec565b60405180910390fd5b6125dd8585856001613083565b6125ed6000848460000151612350565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661265b9190614961565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166126ff919061483a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846128059190614880565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561294b5761287b8161233b565b1561294a576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129b38686866001613089565b505050505050565b6129c3613607565b6129cc8261233b565b612a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a029061438c565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a8310612a6f5760017f000000000000000000000000000000000000000000000000000000000000000a84612a629190614995565b612a6c9190614880565b90505b60008390505b818110612b7d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b6957809350505050612bb9565b508080612b7590614aa5565b915050612a75565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb0906146ac565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c9e82826040518060200160405280600081525061308f565b5050565b6000612cc38473ffffffffffffffffffffffffffffffffffffffff1661356e565b15612e2c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cec612348565b8786866040518563ffffffff1660e01b8152600401612d0e9493929190614281565b602060405180830381600087803b158015612d2857600080fd5b505af1925050508015612d5957506040513d601f19601f82011682018060405250810190612d569190613ab9565b60015b612ddc573d8060008114612d89576040519150601f19603f3d011682016040523d82523d6000602084013e612d8e565b606091505b50600081511415612dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcb906145cc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e31565b600190505b949350505050565b60606000821415612e81576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f95565b600082905060005b60008214612eb3578080612e9c90614b32565b915050600a82612eac91906148d6565b9150612e89565b60008167ffffffffffffffff811115612ecf57612ece614c96565b5b6040519080825280601f01601f191660200182016040528015612f015781602001600182028036833780820191505090505b5090505b60008514612f8e57600182612f1a9190614995565b9150600a85612f299190614ba9565b6030612f359190614880565b60f81b818381518110612f4b57612f4a614c67565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f8791906148d6565b9450612f05565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561300b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130029061440c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fc9061460c565b60405180910390fd5b61310e8161233b565b1561314e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613145906145ec565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a8311156131b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a8906146ec565b60405180910390fd5b6131be6000858386613083565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516132bb919061483a565b6fffffffffffffffffffffffffffffffff1681526020018583602001516132e2919061483a565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561355157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134f16000888488612ca2565b613530576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613527906145cc565b60405180910390fd5b818061353b90614b32565b925050808061354990614b32565b915050613480565b50806000819055506135666000878588613089565b505050505050565b600080823b905060008111915050919050565b82805461358d90614acf565b90600052602060002090601f0160209004810192826135af57600085556135f6565b82601f106135c857803560ff19168380011785556135f6565b828001600101855582156135f6579182015b828111156135f55782358255916020019190600101906135da565b5b5090506136039190613641565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561365a576000816000905550600101613642565b5090565b600061367161366c8461474c565b614727565b9050808382526020820190508285602086028201111561369457613693614ccf565b5b60005b858110156136c457816136aa8882613768565b845260208401935060208301925050600181019050613697565b5050509392505050565b60006136e16136dc84614778565b614727565b9050828152602081018484840111156136fd576136fc614cd4565b5b613708848285614a63565b509392505050565b60008135905061371f816154ca565b92915050565b600082601f83011261373a57613739614cca565b5b813561374a84826020860161365e565b91505092915050565b600081359050613762816154e1565b92915050565b600081359050613777816154f8565b92915050565b60008135905061378c8161550f565b92915050565b6000815190506137a18161550f565b92915050565b600082601f8301126137bc576137bb614cca565b5b81356137cc8482602086016136ce565b91505092915050565b60008083601f8401126137eb576137ea614cca565b5b8235905067ffffffffffffffff81111561380857613807614cc5565b5b60208301915083600182028301111561382457613823614ccf565b5b9250929050565b60008135905061383a81615526565b92915050565b60006020828403121561385657613855614cde565b5b600061386484828501613710565b91505092915050565b6000806040838503121561388457613883614cde565b5b600061389285828601613710565b92505060206138a385828601613710565b9150509250929050565b6000806000606084860312156138c6576138c5614cde565b5b60006138d486828701613710565b93505060206138e586828701613710565b92505060406138f68682870161382b565b9150509250925092565b6000806000806080858703121561391a57613919614cde565b5b600061392887828801613710565b945050602061393987828801613710565b935050604061394a8782880161382b565b925050606085013567ffffffffffffffff81111561396b5761396a614cd9565b5b613977878288016137a7565b91505092959194509250565b6000806040838503121561399a57613999614cde565b5b60006139a885828601613710565b92505060206139b985828601613753565b9150509250929050565b600080604083850312156139da576139d9614cde565b5b60006139e885828601613710565b92505060206139f98582860161382b565b9150509250929050565b600060208284031215613a1957613a18614cde565b5b6000613a2784828501613768565b91505092915050565b60008060408385031215613a4757613a46614cde565b5b6000613a5585828601613768565b925050602083013567ffffffffffffffff811115613a7657613a75614cd9565b5b613a8285828601613725565b9150509250929050565b600060208284031215613aa257613aa1614cde565b5b6000613ab08482850161377d565b91505092915050565b600060208284031215613acf57613ace614cde565b5b6000613add84828501613792565b91505092915050565b60008060208385031215613afd57613afc614cde565b5b600083013567ffffffffffffffff811115613b1b57613b1a614cd9565b5b613b27858286016137d5565b92509250509250929050565b600060208284031215613b4957613b48614cde565b5b6000613b578482850161382b565b91505092915050565b60008060408385031215613b7757613b76614cde565b5b6000613b858582860161382b565b925050602083013567ffffffffffffffff811115613ba657613ba5614cd9565b5b613bb285828601613725565b9150509250929050565b6000613bc883836141dd565b60208301905092915050565b613bdd816149c9565b82525050565b613bf4613bef826149c9565b614b7b565b82525050565b6000613c05826147ce565b613c0f81856147fc565b9350613c1a836147a9565b8060005b83811015613c4b578151613c328882613bbc565b9750613c3d836147ef565b925050600181019050613c1e565b5085935050505092915050565b613c61816149db565b82525050565b613c78613c73826149e7565b614b8d565b82525050565b6000613c89826147d9565b613c93818561480d565b9350613ca3818560208601614a72565b613cac81614ce3565b840191505092915050565b6000613cc2826147e4565b613ccc818561481e565b9350613cdc818560208601614a72565b613ce581614ce3565b840191505092915050565b6000613cfb826147e4565b613d05818561482f565b9350613d15818560208601614a72565b80840191505092915050565b60008154613d2e81614acf565b613d38818661482f565b94506001821660008114613d535760018114613d6457613d97565b60ff19831686528186019350613d97565b613d6d856147b9565b60005b83811015613d8f57815481890152600182019150602081019050613d70565b838801955050505b50505092915050565b6000613dad60228361481e565b9150613db882614d01565b604082019050919050565b6000613dd060118361481e565b9150613ddb82614d50565b602082019050919050565b6000613df360268361481e565b9150613dfe82614d79565b604082019050919050565b6000613e16602a8361481e565b9150613e2182614dc8565b604082019050919050565b6000613e39601e8361481e565b9150613e4482614e17565b602082019050919050565b6000613e5c60238361481e565b9150613e6782614e40565b604082019050919050565b6000613e7f60258361481e565b9150613e8a82614e8f565b604082019050919050565b6000613ea260318361481e565b9150613ead82614ede565b604082019050919050565b6000613ec560278361481e565b9150613ed082614f2d565b604082019050919050565b6000613ee860148361481e565b9150613ef382614f7c565b602082019050919050565b6000613f0b60188361481e565b9150613f1682614fa5565b602082019050919050565b6000613f2e60398361481e565b9150613f3982614fce565b604082019050919050565b6000613f5160228361481e565b9150613f5c8261501d565b604082019050919050565b6000613f74602b8361481e565b9150613f7f8261506c565b604082019050919050565b6000613f9760268361481e565b9150613fa2826150bb565b604082019050919050565b6000613fba600e8361481e565b9150613fc58261510a565b602082019050919050565b6000613fdd60168361481e565b9150613fe882615133565b602082019050919050565b600061400060208361481e565b915061400b8261515c565b602082019050919050565b6000614023601a8361481e565b915061402e82615185565b602082019050919050565b600061404660328361481e565b9150614051826151ae565b604082019050919050565b600061406960228361481e565b9150614074826151fd565b604082019050919050565b600061408c60338361481e565b91506140978261524c565b604082019050919050565b60006140af601d8361481e565b91506140ba8261529b565b602082019050919050565b60006140d260218361481e565b91506140dd826152c4565b604082019050919050565b60006140f5601b8361481e565b915061410082615313565b602082019050919050565b600061411860148361481e565b91506141238261533c565b602082019050919050565b600061413b602e8361481e565b915061414682615365565b604082019050919050565b600061415e60208361481e565b9150614169826153b4565b602082019050919050565b6000614181602f8361481e565b915061418c826153dd565b604082019050919050565b60006141a4602d8361481e565b91506141af8261542c565b604082019050919050565b60006141c760228361481e565b91506141d28261547b565b604082019050919050565b6141e681614a59565b82525050565b6141f581614a59565b82525050565b60006142078284613be3565b60148201915081905092915050565b60006142228285613c67565b6020820191506142328284613c67565b6020820191508190509392505050565b600061424e8285613d21565b915061425a8284613cf0565b91508190509392505050565b600060208201905061427b6000830184613bd4565b92915050565b60006080820190506142966000830187613bd4565b6142a36020830186613bd4565b6142b060408301856141ec565b81810360608301526142c28184613c7e565b905095945050505050565b600060208201905081810360008301526142e78184613bfa565b905092915050565b60006020820190506143046000830184613c58565b92915050565b600060208201905081810360008301526143248184613cb7565b905092915050565b6000602082019050818103600083015261434581613da0565b9050919050565b6000602082019050818103600083015261436581613dc3565b9050919050565b6000602082019050818103600083015261438581613de6565b9050919050565b600060208201905081810360008301526143a581613e09565b9050919050565b600060208201905081810360008301526143c581613e2c565b9050919050565b600060208201905081810360008301526143e581613e4f565b9050919050565b6000602082019050818103600083015261440581613e72565b9050919050565b6000602082019050818103600083015261442581613e95565b9050919050565b6000602082019050818103600083015261444581613eb8565b9050919050565b6000602082019050818103600083015261446581613edb565b9050919050565b6000602082019050818103600083015261448581613efe565b9050919050565b600060208201905081810360008301526144a581613f21565b9050919050565b600060208201905081810360008301526144c581613f44565b9050919050565b600060208201905081810360008301526144e581613f67565b9050919050565b6000602082019050818103600083015261450581613f8a565b9050919050565b6000602082019050818103600083015261452581613fad565b9050919050565b6000602082019050818103600083015261454581613fd0565b9050919050565b6000602082019050818103600083015261456581613ff3565b9050919050565b6000602082019050818103600083015261458581614016565b9050919050565b600060208201905081810360008301526145a581614039565b9050919050565b600060208201905081810360008301526145c58161405c565b9050919050565b600060208201905081810360008301526145e58161407f565b9050919050565b60006020820190508181036000830152614605816140a2565b9050919050565b60006020820190508181036000830152614625816140c5565b9050919050565b60006020820190508181036000830152614645816140e8565b9050919050565b600060208201905081810360008301526146658161410b565b9050919050565b600060208201905081810360008301526146858161412e565b9050919050565b600060208201905081810360008301526146a581614151565b9050919050565b600060208201905081810360008301526146c581614174565b9050919050565b600060208201905081810360008301526146e581614197565b9050919050565b60006020820190508181036000830152614705816141ba565b9050919050565b600060208201905061472160008301846141ec565b92915050565b6000614731614742565b905061473d8282614b01565b919050565b6000604051905090565b600067ffffffffffffffff82111561476757614766614c96565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561479357614792614c96565b5b61479c82614ce3565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061484582614a1d565b915061485083614a1d565b9250826fffffffffffffffffffffffffffffffff0382111561487557614874614bda565b5b828201905092915050565b600061488b82614a59565b915061489683614a59565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148cb576148ca614bda565b5b828201905092915050565b60006148e182614a59565b91506148ec83614a59565b9250826148fc576148fb614c09565b5b828204905092915050565b600061491282614a59565b915061491d83614a59565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561495657614955614bda565b5b828202905092915050565b600061496c82614a1d565b915061497783614a1d565b92508282101561498a57614989614bda565b5b828203905092915050565b60006149a082614a59565b91506149ab83614a59565b9250828210156149be576149bd614bda565b5b828203905092915050565b60006149d482614a39565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a90578082015181840152602081019050614a75565b83811115614a9f576000848401525b50505050565b6000614ab082614a59565b91506000821415614ac457614ac3614bda565b5b600182039050919050565b60006002820490506001821680614ae757607f821691505b60208210811415614afb57614afa614c38565b5b50919050565b614b0a82614ce3565b810181811067ffffffffffffffff82111715614b2957614b28614c96565b5b80604052505050565b6000614b3d82614a59565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b7057614b6f614bda565b5b600182019050919050565b6000614b8682614b97565b9050919050565b6000819050919050565b6000614ba282614cf4565b9050919050565b6000614bb482614a59565b9150614bbf83614a59565b925082614bcf57614bce614c09565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f41646472657373206973206e6f7420696e2070726573616c65206c6973740000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820737570706c792c2070726976617465206d696e742060008201527f6f6e676f696e6700000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f457863656564696e67206d6178206d696e74206c696d69740000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f50726976617465206d696e74207265736572766174696f6e2068617320656e6460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f5075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f52616e206f7574206f6620707269766174652072657365727665640000000000600082015250565b7f4e6f20636f6e74726163747320616c6c6f776564000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f457863656564696e67206d617820707269766174652073616c65206c696d6974600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6154d3816149c9565b81146154de57600080fd5b50565b6154ea816149db565b81146154f557600080fd5b50565b615501816149e7565b811461550c57600080fd5b50565b615518816149f1565b811461552357600080fd5b50565b61552f81614a59565b811461553a57600080fd5b5056fea264697066735822122065a333d2aff92b1ddfe5b8adfaf8dec22d2056fea0dc97fb2febed343dd4f10a64736f6c63430008070033
Deployed Bytecode Sourcemap
41564:5704:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25036:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41721:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26997:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28692:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28213:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47010:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23392:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41960:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29719:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41767:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24100:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45074:222;;;;;;;;;;;;;:::i;:::-;;29952:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42101:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23569:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44679:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41865:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41816:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26806:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46103:667;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25522:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40674:103;;;;;;;;;;;;;:::i;:::-;;41920:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44796:109;;;;;;;;;;;;;:::i;:::-;;47187:78;;;;;;;;;;;;;:::i;:::-;;45598:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42062:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41680:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40023:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27166:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42424:1004;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29056:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42209:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44913:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30200:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43436:1218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45304:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35081:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46879:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46778:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45982:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42307:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29438:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40932:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25036:422;25183:4;25240:25;25225:40;;;:11;:40;;;;:105;;;;25297:33;25282:48;;;:11;:48;;;;25225:105;:172;;;;25362:35;25347:50;;;:11;:50;;;;25225:172;:225;;;;25414:36;25438:11;25414:23;:36::i;:::-;25225:225;25205:245;;25036:422;;;:::o;41721:39::-;41758:2;41721:39;:::o;26997:100::-;27051:13;27084:5;27077:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26997:100;:::o;28692:292::-;28796:7;28843:16;28851:7;28843;:16::i;:::-;28821:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28952:15;:24;28968:7;28952:24;;;;;;;;;;;;;;;;;;;;;28945:31;;28692:292;;;:::o;28213:413::-;28286:13;28302:24;28318:7;28302:15;:24::i;:::-;28286:40;;28351:5;28345:11;;:2;:11;;;;28337:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28446:5;28430:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28455:37;28472:5;28479:12;:10;:12::i;:::-;28455:16;:37::i;:::-;28430:62;28408:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;28590:28;28599:2;28603:7;28612:5;28590:8;:28::i;:::-;28275:351;28213:413;;:::o;47010:169::-;47123:4;47152:19;47159:4;47165:5;47152:6;:19::i;:::-;47145:26;;47010:169;;;;:::o;23392:100::-;23445:7;23472:12;;23465:19;;23392:100;:::o;41960:38::-;;;;;;;;;;;;;:::o;29719:162::-;29845:28;29855:4;29861:2;29865:7;29845:9;:28::i;:::-;29719:162;;;:::o;41767:42::-;41807:2;41767:42;:::o;24100:864::-;24225:7;24266:16;24276:5;24266:9;:16::i;:::-;24258:5;:24;24250:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24332:22;24357:13;:11;:13::i;:::-;24332:38;;24381:19;24415:25;24469:9;24464:426;24488:14;24484:1;:18;24464:426;;;24524:31;24558:11;:14;24570:1;24558:14;;;;;;;;;;;24524:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24617:1;24591:28;;:9;:14;;;:28;;;24587:103;;24660:9;:14;;;24640:34;;24587:103;24729:5;24708:26;;:17;:26;;;24704:175;;;24774:5;24759:11;:20;24755:77;;;24811:1;24804:8;;;;;;;;;24755:77;24850:13;;;;;:::i;:::-;;;;24704:175;24509:381;24504:3;;;;;:::i;:::-;;;;24464:426;;;;24900:56;;;;;;;;;;:::i;:::-;;;;;;;;24100:864;;;;;:::o;45074:222::-;40254:12;:10;:12::i;:::-;40243:23;;:7;:5;:7::i;:::-;:23;;;40235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45124:15:::1;45142:21;45124:39;;42254:42;45174:27;;:53;45221:5;45213:4;45203:7;:14;;;;:::i;:::-;45202:24;;;;:::i;:::-;45174:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42352:42;45238:27;;:50;45266:21;45238:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45113:183;45074:222::o:0;29952:177::-;30082:39;30099:4;30105:2;30109:7;30082:39;;;;;;;;;;;;:16;:39::i;:::-;29952:177;;;:::o;42101:33::-;;;;:::o;23569:228::-;23672:7;23713:13;:11;:13::i;:::-;23705:5;:21;23697:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23784:5;23777:12;;23569:228;;;:::o;44679:92::-;40254:12;:10;:12::i;:::-;40243:23;;:7;:5;:7::i;:::-;:23;;;40235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44760:3:::1;;44750:7;:13;;;;;;;:::i;:::-;;44679:92:::0;;:::o;41865:46::-;41908:3;41865:46;:::o;41816:42::-;41854:4;41816:42;:::o;26806:124::-;26870:7;26897:20;26909:7;26897:11;:20::i;:::-;:25;;;26890:32;;26806:124;;;:::o;46103:667::-;46205:4;46227:20;46250:4;46227:27;;46272:9;46267:447;46291:5;:12;46287:1;:16;46267:447;;;46325:20;46348:5;46354:1;46348:8;;;;;;;;:::i;:::-;;;;;;;;46325:31;;46393:12;46377;:28;46373:330;;46490:12;46504;46473:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46441:95;;;;;;46426:110;;46373:330;;;46641:12;46655;46624:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46592:95;;;;;;46577:110;;46373:330;46310:404;46305:3;;;;;:::i;:::-;;;;46267:447;;;;46747:15;;46731:12;:31;46724:38;;;46103:667;;;;:::o;25522:258::-;25586:7;25645:1;25628:19;;:5;:19;;;;25606:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;25744:12;:19;25757:5;25744:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25736:36;;25729:43;;25522:258;;;:::o;40674:103::-;40254:12;:10;:12::i;:::-;40243:23;;:7;:5;:7::i;:::-;:23;;;40235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40739:30:::1;40766:1;40739:18;:30::i;:::-;40674:103::o:0;41920:33::-;;;;:::o;44796:109::-;40254:12;:10;:12::i;:::-;40243:23;;:7;:5;:7::i;:::-;:23;;;40235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44879:18:::1;;;;;;;;;;;44878:19;44857:18;;:40;;;;;;;;;;;;;;;;;;44796:109::o:0;47187:78::-;40254:12;:10;:12::i;:::-;40243:23;;:7;:5;:7::i;:::-;:23;;;40235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47250:7:::1;47242:5;:15;;;;47187:78::o:0;45598:376::-;45684:16;45718:18;45739:16;45749:5;45739:9;:16::i;:::-;45718:37;;45766:25;45808:10;45794:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45766:53;;45835:9;45830:111;45854:10;45850:1;:14;45830:111;;;45900:29;45920:5;45927:1;45900:19;:29::i;:::-;45886:8;45895:1;45886:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;45866:3;;;;;:::i;:::-;;;;45830:111;;;;45958:8;45951:15;;;;45598:376;;;:::o;42062:32::-;;;;:::o;41680:34::-;;;;:::o;40023:87::-;40069:7;40096:6;;;;;;;;;;;40089:13;;40023:87;:::o;27166:104::-;27222:13;27255:7;27248:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27166:104;:::o;42424:1004::-;42512:9;42498:23;;:10;:23;;;42490:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42580:18;;42561:15;:37;42557:419;;42715:14;42677:13;;41908:3;42641:14;:33;;;;:::i;:::-;:49;;;;:::i;:::-;:88;;42615:189;;;;;;;;;;;;:::i;:::-;;;;;;;;;42557:419;;;42897:14;42880:13;:11;:13::i;:::-;42863:14;:30;;;;:::i;:::-;:48;;42837:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;42557:419;41758:2;43037:14;43010:24;43023:10;43010:12;:24::i;:::-;:41;;;;:::i;:::-;:55;;42988:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;43136:18;;;;;;;;;;;43128:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;41854:4;43212:14;43196:13;;:30;;;;:::i;:::-;:44;43192:139;;;43286:14;43278:5;;:22;;;;:::i;:::-;43265:9;:35;;43257:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43192:139;43358:14;43341:13;;:31;;;;;;;:::i;:::-;;;;;;;;43383:37;43393:10;43405:14;43383:9;:37::i;:::-;42424:1004;:::o;29056:311::-;29186:12;:10;:12::i;:::-;29174:24;;:8;:24;;;;29166:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29287:8;29242:18;:32;29261:12;:10;:12::i;:::-;29242:32;;;;;;;;;;;;;;;:42;29275:8;29242:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29340:8;29311:48;;29326:12;:10;:12::i;:::-;29311:48;;;29350:8;29311:48;;;;;;:::i;:::-;;;;;;;;29056:311;;:::o;42209:87::-;42254:42;42209:87;:::o;44913:136::-;40254:12;:10;:12::i;:::-;40243:23;;:7;:5;:7::i;:::-;:23;;;40235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45032:8:::1;45013:15;:28;;;;:::i;:::-;44992:18;:49;;;;44913:136:::0;:::o;30200:355::-;30359:28;30369:4;30375:2;30379:7;30359:9;:28::i;:::-;30420:48;30443:4;30449:2;30453:7;30462:5;30420:22;:48::i;:::-;30398:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;30200:355;;;;:::o;43436:1218::-;43578:9;43564:23;;:10;:23;;;43556:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;43623:12;43665:10;43648:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;43638:39;;;;;;43623:54;;43696:19;43703:4;43709:5;43696:6;:19::i;:::-;43688:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43802:18;;43783:15;:37;;43761:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;43949:14;43932:13;:11;:13::i;:::-;43915:14;:30;;;;:::i;:::-;:48;;43893:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;41807:2;44068:14;44041:12;:24;44054:10;44041:24;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:58;;44019:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;41758:2;44219:14;44192:24;44205:10;44192:12;:24::i;:::-;:41;;;;:::i;:::-;:55;;44170:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;41908:3;44349:14;44332;;:31;;;;:::i;:::-;:51;;44310:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;44457:18;;;;;;;;;;;44449:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44541:14;44513:12;:24;44526:10;44513:24;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;44584:14;44566;;:32;;;;;;;:::i;:::-;;;;;;;;44609:37;44619:10;44631:14;44609:9;:37::i;:::-;43545:1109;43436:1218;;:::o;45304:286::-;45422:13;45461:16;45469:7;45461;:16::i;:::-;45453:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;45546:7;45555:25;45572:7;45555:16;:25::i;:::-;45529:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45515:67;;45304:286;;;:::o;35081:43::-;;;;:::o;46879:123::-;46933:4;46976:18;;46957:15;:37;;46950:44;;46879:123;:::o;46778:93::-;40254:12;:10;:12::i;:::-;40243:23;;:7;:5;:7::i;:::-;:23;;;40235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46858:5:::1;46840:15;:23;;;;46778:93:::0;:::o;45982:113::-;46040:7;46067:20;46081:5;46067:13;:20::i;:::-;46060:27;;45982:113;;;:::o;42307:87::-;42352:42;42307:87;:::o;29438:214::-;29580:4;29609:18;:25;29628:5;29609:25;;;;;;;;;;;;;;;:35;29635:8;29609:35;;;;;;;;;;;;;;;;;;;;;;;;;29602:42;;29438:214;;;;:::o;40932:201::-;40254:12;:10;:12::i;:::-;40243:23;;:7;:5;:7::i;:::-;:23;;;40235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41041:1:::1;41021:22;;:8;:22;;;;41013:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41097:28;41116:8;41097:18;:28::i;:::-;40932:201:::0;:::o;10997:157::-;11082:4;11121:25;11106:40;;;:11;:40;;;;11099:47;;10997:157;;;:::o;30810:111::-;30867:4;30901:12;;30891:7;:22;30884:29;;30810:111;;;:::o;20712:98::-;20765:7;20792:10;20785:17;;20712:98;:::o;34877:196::-;35019:2;34992:15;:24;35008:7;34992:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35057:7;35053:2;35037:28;;35046:5;35037:28;;;;;;;;;;;;34877:196;;;:::o;33050:1709::-;33165:35;33203:20;33215:7;33203:11;:20::i;:::-;33165:58;;33236:22;33278:13;:18;;;33262:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;33337:12;:10;:12::i;:::-;33313:36;;:20;33325:7;33313:11;:20::i;:::-;:36;;;33262:87;:154;;;;33366:50;33383:13;:18;;;33403:12;:10;:12::i;:::-;33366:16;:50::i;:::-;33262:154;33236:181;;33452:17;33430:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;33604:4;33582:26;;:13;:18;;;:26;;;33560:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;33707:1;33693:16;;:2;:16;;;;33685:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33764:43;33786:4;33792:2;33796:7;33805:1;33764:21;:43::i;:::-;33872:49;33889:1;33893:7;33902:13;:18;;;33872:8;:49::i;:::-;33964:1;33934:12;:18;33947:4;33934:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34004:1;33976:12;:16;33989:2;33976:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34039:43;;;;;;;;34054:2;34039:43;;;;;;34065:15;34039:43;;;;;34016:11;:20;34028:7;34016:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34322:19;34354:1;34344:7;:11;;;;:::i;:::-;34322:33;;34411:1;34370:43;;:11;:24;34382:11;34370:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;34366:288;;;34434:20;34442:11;34434:7;:20::i;:::-;34430:213;;;34502:125;;;;;;;;34539:13;:18;;;34502:125;;;;;;34580:13;:28;;;34502:125;;;;;34475:11;:24;34487:11;34475:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34430:213;34366:288;34690:7;34686:2;34671:27;;34680:4;34671:27;;;;;;;;;;;;34709:42;34730:4;34736:2;34740:7;34749:1;34709:20;:42::i;:::-;33154:1605;;;33050:1709;;;:::o;26062:682::-;26150:21;;:::i;:::-;26197:16;26205:7;26197;:16::i;:::-;26189:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26273:26;26325:12;26314:7;:23;26310:103;;26400:1;26385:12;26375:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;26354:47;;26310:103;26430:12;26445:7;26430:22;;26425:242;26462:18;26454:4;:26;26425:242;;26505:31;26539:11;:17;26551:4;26539:17;;;;;;;;;;;26505:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26601:1;26575:28;;:9;:14;;;:28;;;26571:85;;26631:9;26624:16;;;;;;;26571:85;26490:177;26482:6;;;;;:::i;:::-;;;;26425:242;;;;26679:57;;;;;;;;;;:::i;:::-;;;;;;;;26062:682;;;;:::o;41293:191::-;41367:16;41386:6;;;;;;;;;;;41367:25;;41412:8;41403:6;;:17;;;;;;;;;;;;;;;;;;41467:8;41436:40;;41457:8;41436:40;;;;;;;;;;;;41356:128;41293:191;:::o;30929:104::-;30998:27;31008:2;31012:8;30998:27;;;;;;;;;;;;:9;:27::i;:::-;30929:104;;:::o;36752:985::-;36907:4;36928:15;:2;:13;;;:15::i;:::-;36924:806;;;36997:2;36981:36;;;37040:12;:10;:12::i;:::-;37075:4;37102:7;37132:5;36981:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36960:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37360:1;37343:6;:13;:18;37339:321;;;37386:109;;;;;;;;;;:::i;:::-;;;;;;;;37339:321;37610:6;37604:13;37595:6;37591:2;37587:15;37580:38;36960:715;37230:45;;;37220:55;;;:6;:55;;;;37213:62;;;;;36924:806;37714:4;37707:11;;36752:985;;;;;;;:::o;18274:723::-;18330:13;18560:1;18551:5;:10;18547:53;;;18578:10;;;;;;;;;;;;;;;;;;;;;18547:53;18610:12;18625:5;18610:20;;18641:14;18666:78;18681:1;18673:4;:9;18666:78;;18699:8;;;;;:::i;:::-;;;;18730:2;18722:10;;;;;:::i;:::-;;;18666:78;;;18754:19;18786:6;18776:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18754:39;;18804:154;18820:1;18811:5;:10;18804:154;;18848:1;18838:11;;;;;:::i;:::-;;;18915:2;18907:5;:10;;;;:::i;:::-;18894:2;:24;;;;:::i;:::-;18881:39;;18864:6;18871;18864:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18944:2;18935:11;;;;;:::i;:::-;;;18804:154;;;18982:6;18968:21;;;;;18274:723;;;;:::o;25788:266::-;25849:7;25908:1;25891:19;;:5;:19;;;;25869:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;26013:12;:19;26026:5;26013:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;26005:41;;25998:48;;25788:266;;;:::o;38225:159::-;;;;;:::o;38796:158::-;;;;;:::o;31396:1400::-;31519:20;31542:12;;31519:35;;31587:1;31573:16;;:2;:16;;;;31565:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31772:21;31780:12;31772:7;:21::i;:::-;31771:22;31763:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31858:12;31846:8;:24;;31838:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31922:61;31952:1;31956:2;31960:12;31974:8;31922:21;:61::i;:::-;31996:30;32029:12;:16;32042:2;32029:16;;;;;;;;;;;;;;;31996:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32075:135;;;;;;;;32131:8;32101:11;:19;;;:39;;;;:::i;:::-;32075:135;;;;;;32190:8;32155:11;:24;;;:44;;;;:::i;:::-;32075:135;;;;;32056:12;:16;32069:2;32056:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32249:43;;;;;;;;32264:2;32249:43;;;;;;32275:15;32249:43;;;;;32221:11;:25;32233:12;32221:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32305:20;32328:12;32305:35;;32358:9;32353:325;32377:8;32373:1;:12;32353:325;;;32437:12;32433:2;32412:38;;32429:1;32412:38;;;;;;;;;;;;32491:59;32522:1;32526:2;32530:12;32544:5;32491:22;:59::i;:::-;32465:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;32652:14;;;;;:::i;:::-;;;;32387:3;;;;;:::i;:::-;;;;32353:325;;;;32705:12;32690;:27;;;;32728:60;32757:1;32761:2;32765:12;32779:8;32728:20;:60::i;:::-;31508:1288;;;31396:1400;;;:::o;853:387::-;913:4;1121:12;1188:7;1176:20;1168:28;;1231:1;1224:4;:8;1217:15;;;853:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:139::-;1891:5;1929:6;1916:20;1907:29;;1945:33;1972:5;1945:33;:::i;:::-;1845:139;;;;:::o;1990:137::-;2035:5;2073:6;2060:20;2051:29;;2089:32;2115:5;2089:32;:::i;:::-;1990:137;;;;:::o;2133:141::-;2189:5;2220:6;2214:13;2205:22;;2236:32;2262:5;2236:32;:::i;:::-;2133:141;;;;:::o;2293:338::-;2348:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:122;;2405:79;;:::i;:::-;2364:122;2522:6;2509:20;2547:78;2621:3;2613:6;2606:4;2598:6;2594:17;2547:78;:::i;:::-;2538:87;;2354:277;2293:338;;;;:::o;2651:553::-;2709:8;2719:6;2769:3;2762:4;2754:6;2750:17;2746:27;2736:122;;2777:79;;:::i;:::-;2736:122;2890:6;2877:20;2867:30;;2920:18;2912:6;2909:30;2906:117;;;2942:79;;:::i;:::-;2906:117;3056:4;3048:6;3044:17;3032:29;;3110:3;3102:4;3094:6;3090:17;3080:8;3076:32;3073:41;3070:128;;;3117:79;;:::i;:::-;3070:128;2651:553;;;;;:::o;3210:139::-;3256:5;3294:6;3281:20;3272:29;;3310:33;3337:5;3310:33;:::i;:::-;3210:139;;;;:::o;3355:329::-;3414:6;3463:2;3451:9;3442:7;3438:23;3434:32;3431:119;;;3469:79;;:::i;:::-;3431:119;3589:1;3614:53;3659:7;3650:6;3639:9;3635:22;3614:53;:::i;:::-;3604:63;;3560:117;3355:329;;;;:::o;3690:474::-;3758:6;3766;3815:2;3803:9;3794:7;3790:23;3786:32;3783:119;;;3821:79;;:::i;:::-;3783:119;3941:1;3966:53;4011:7;4002:6;3991:9;3987:22;3966:53;:::i;:::-;3956:63;;3912:117;4068:2;4094:53;4139:7;4130:6;4119:9;4115:22;4094:53;:::i;:::-;4084:63;;4039:118;3690:474;;;;;:::o;4170:619::-;4247:6;4255;4263;4312:2;4300:9;4291:7;4287:23;4283:32;4280:119;;;4318:79;;:::i;:::-;4280:119;4438:1;4463:53;4508:7;4499:6;4488:9;4484:22;4463:53;:::i;:::-;4453:63;;4409:117;4565:2;4591:53;4636:7;4627:6;4616:9;4612:22;4591:53;:::i;:::-;4581:63;;4536:118;4693:2;4719:53;4764:7;4755:6;4744:9;4740:22;4719:53;:::i;:::-;4709:63;;4664:118;4170:619;;;;;:::o;4795:943::-;4890:6;4898;4906;4914;4963:3;4951:9;4942:7;4938:23;4934:33;4931:120;;;4970:79;;:::i;:::-;4931:120;5090:1;5115:53;5160:7;5151:6;5140:9;5136:22;5115:53;:::i;:::-;5105:63;;5061:117;5217:2;5243:53;5288:7;5279:6;5268:9;5264:22;5243:53;:::i;:::-;5233:63;;5188:118;5345:2;5371:53;5416:7;5407:6;5396:9;5392:22;5371:53;:::i;:::-;5361:63;;5316:118;5501:2;5490:9;5486:18;5473:32;5532:18;5524:6;5521:30;5518:117;;;5554:79;;:::i;:::-;5518:117;5659:62;5713:7;5704:6;5693:9;5689:22;5659:62;:::i;:::-;5649:72;;5444:287;4795:943;;;;;;;:::o;5744:468::-;5809:6;5817;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:53;6062:7;6053:6;6042:9;6038:22;6017:53;:::i;:::-;6007:63;;5963:117;6119:2;6145:50;6187:7;6178:6;6167:9;6163:22;6145:50;:::i;:::-;6135:60;;6090:115;5744:468;;;;;:::o;6218:474::-;6286:6;6294;6343:2;6331:9;6322:7;6318:23;6314:32;6311:119;;;6349:79;;:::i;:::-;6311:119;6469:1;6494:53;6539:7;6530:6;6519:9;6515:22;6494:53;:::i;:::-;6484:63;;6440:117;6596:2;6622:53;6667:7;6658:6;6647:9;6643:22;6622:53;:::i;:::-;6612:63;;6567:118;6218:474;;;;;:::o;6698:329::-;6757:6;6806:2;6794:9;6785:7;6781:23;6777:32;6774:119;;;6812:79;;:::i;:::-;6774:119;6932:1;6957:53;7002:7;6993:6;6982:9;6978:22;6957:53;:::i;:::-;6947:63;;6903:117;6698:329;;;;:::o;7033:684::-;7126:6;7134;7183:2;7171:9;7162:7;7158:23;7154:32;7151:119;;;7189:79;;:::i;:::-;7151:119;7309:1;7334:53;7379:7;7370:6;7359:9;7355:22;7334:53;:::i;:::-;7324:63;;7280:117;7464:2;7453:9;7449:18;7436:32;7495:18;7487:6;7484:30;7481:117;;;7517:79;;:::i;:::-;7481:117;7622:78;7692:7;7683:6;7672:9;7668:22;7622:78;:::i;:::-;7612:88;;7407:303;7033:684;;;;;:::o;7723:327::-;7781:6;7830:2;7818:9;7809:7;7805:23;7801:32;7798:119;;;7836:79;;:::i;:::-;7798:119;7956:1;7981:52;8025:7;8016:6;8005:9;8001:22;7981:52;:::i;:::-;7971:62;;7927:116;7723:327;;;;:::o;8056:349::-;8125:6;8174:2;8162:9;8153:7;8149:23;8145:32;8142:119;;;8180:79;;:::i;:::-;8142:119;8300:1;8325:63;8380:7;8371:6;8360:9;8356:22;8325:63;:::i;:::-;8315:73;;8271:127;8056:349;;;;:::o;8411:529::-;8482:6;8490;8539:2;8527:9;8518:7;8514:23;8510:32;8507:119;;;8545:79;;:::i;:::-;8507:119;8693:1;8682:9;8678:17;8665:31;8723:18;8715:6;8712:30;8709:117;;;8745:79;;:::i;:::-;8709:117;8858:65;8915:7;8906:6;8895:9;8891:22;8858:65;:::i;:::-;8840:83;;;;8636:297;8411:529;;;;;:::o;8946:329::-;9005:6;9054:2;9042:9;9033:7;9029:23;9025:32;9022:119;;;9060:79;;:::i;:::-;9022:119;9180:1;9205:53;9250:7;9241:6;9230:9;9226:22;9205:53;:::i;:::-;9195:63;;9151:117;8946:329;;;;:::o;9281:684::-;9374:6;9382;9431:2;9419:9;9410:7;9406:23;9402:32;9399:119;;;9437:79;;:::i;:::-;9399:119;9557:1;9582:53;9627:7;9618:6;9607:9;9603:22;9582:53;:::i;:::-;9572:63;;9528:117;9712:2;9701:9;9697:18;9684:32;9743:18;9735:6;9732:30;9729:117;;;9765:79;;:::i;:::-;9729:117;9870:78;9940:7;9931:6;9920:9;9916:22;9870:78;:::i;:::-;9860:88;;9655:303;9281:684;;;;;:::o;9971:179::-;10040:10;10061:46;10103:3;10095:6;10061:46;:::i;:::-;10139:4;10134:3;10130:14;10116:28;;9971:179;;;;:::o;10156:118::-;10243:24;10261:5;10243:24;:::i;:::-;10238:3;10231:37;10156:118;;:::o;10280:157::-;10385:45;10405:24;10423:5;10405:24;:::i;:::-;10385:45;:::i;:::-;10380:3;10373:58;10280:157;;:::o;10473:732::-;10592:3;10621:54;10669:5;10621:54;:::i;:::-;10691:86;10770:6;10765:3;10691:86;:::i;:::-;10684:93;;10801:56;10851:5;10801:56;:::i;:::-;10880:7;10911:1;10896:284;10921:6;10918:1;10915:13;10896:284;;;10997:6;10991:13;11024:63;11083:3;11068:13;11024:63;:::i;:::-;11017:70;;11110:60;11163:6;11110:60;:::i;:::-;11100:70;;10956:224;10943:1;10940;10936:9;10931:14;;10896:284;;;10900:14;11196:3;11189:10;;10597:608;;;10473:732;;;;:::o;11211:109::-;11292:21;11307:5;11292:21;:::i;:::-;11287:3;11280:34;11211:109;;:::o;11326:157::-;11431:45;11451:24;11469:5;11451:24;:::i;:::-;11431:45;:::i;:::-;11426:3;11419:58;11326:157;;:::o;11489:360::-;11575:3;11603:38;11635:5;11603:38;:::i;:::-;11657:70;11720:6;11715:3;11657:70;:::i;:::-;11650:77;;11736:52;11781:6;11776:3;11769:4;11762:5;11758:16;11736:52;:::i;:::-;11813:29;11835:6;11813:29;:::i;:::-;11808:3;11804:39;11797:46;;11579:270;11489:360;;;;:::o;11855:364::-;11943:3;11971:39;12004:5;11971:39;:::i;:::-;12026:71;12090:6;12085:3;12026:71;:::i;:::-;12019:78;;12106:52;12151:6;12146:3;12139:4;12132:5;12128:16;12106:52;:::i;:::-;12183:29;12205:6;12183:29;:::i;:::-;12178:3;12174:39;12167:46;;11947:272;11855:364;;;;:::o;12225:377::-;12331:3;12359:39;12392:5;12359:39;:::i;:::-;12414:89;12496:6;12491:3;12414:89;:::i;:::-;12407:96;;12512:52;12557:6;12552:3;12545:4;12538:5;12534:16;12512:52;:::i;:::-;12589:6;12584:3;12580:16;12573:23;;12335:267;12225:377;;;;:::o;12632:845::-;12735:3;12772:5;12766:12;12801:36;12827:9;12801:36;:::i;:::-;12853:89;12935:6;12930:3;12853:89;:::i;:::-;12846:96;;12973:1;12962:9;12958:17;12989:1;12984:137;;;;13135:1;13130:341;;;;12951:520;;12984:137;13068:4;13064:9;13053;13049:25;13044:3;13037:38;13104:6;13099:3;13095:16;13088:23;;12984:137;;13130:341;13197:38;13229:5;13197:38;:::i;:::-;13257:1;13271:154;13285:6;13282:1;13279:13;13271:154;;;13359:7;13353:14;13349:1;13344:3;13340:11;13333:35;13409:1;13400:7;13396:15;13385:26;;13307:4;13304:1;13300:12;13295:17;;13271:154;;;13454:6;13449:3;13445:16;13438:23;;13137:334;;12951:520;;12739:738;;12632:845;;;;:::o;13483:366::-;13625:3;13646:67;13710:2;13705:3;13646:67;:::i;:::-;13639:74;;13722:93;13811:3;13722:93;:::i;:::-;13840:2;13835:3;13831:12;13824:19;;13483:366;;;:::o;13855:::-;13997:3;14018:67;14082:2;14077:3;14018:67;:::i;:::-;14011:74;;14094:93;14183:3;14094:93;:::i;:::-;14212:2;14207:3;14203:12;14196:19;;13855:366;;;:::o;14227:::-;14369:3;14390:67;14454:2;14449:3;14390:67;:::i;:::-;14383:74;;14466:93;14555:3;14466:93;:::i;:::-;14584:2;14579:3;14575:12;14568:19;;14227:366;;;:::o;14599:::-;14741:3;14762:67;14826:2;14821:3;14762:67;:::i;:::-;14755:74;;14838:93;14927:3;14838:93;:::i;:::-;14956:2;14951:3;14947:12;14940:19;;14599:366;;;:::o;14971:::-;15113:3;15134:67;15198:2;15193:3;15134:67;:::i;:::-;15127:74;;15210:93;15299:3;15210:93;:::i;:::-;15328:2;15323:3;15319:12;15312:19;;14971:366;;;:::o;15343:::-;15485:3;15506:67;15570:2;15565:3;15506:67;:::i;:::-;15499:74;;15582:93;15671:3;15582:93;:::i;:::-;15700:2;15695:3;15691:12;15684:19;;15343:366;;;:::o;15715:::-;15857:3;15878:67;15942:2;15937:3;15878:67;:::i;:::-;15871:74;;15954:93;16043:3;15954:93;:::i;:::-;16072:2;16067:3;16063:12;16056:19;;15715:366;;;:::o;16087:::-;16229:3;16250:67;16314:2;16309:3;16250:67;:::i;:::-;16243:74;;16326:93;16415:3;16326:93;:::i;:::-;16444:2;16439:3;16435:12;16428:19;;16087:366;;;:::o;16459:::-;16601:3;16622:67;16686:2;16681:3;16622:67;:::i;:::-;16615:74;;16698:93;16787:3;16698:93;:::i;:::-;16816:2;16811:3;16807:12;16800:19;;16459:366;;;:::o;16831:::-;16973:3;16994:67;17058:2;17053:3;16994:67;:::i;:::-;16987:74;;17070:93;17159:3;17070:93;:::i;:::-;17188:2;17183:3;17179:12;17172:19;;16831:366;;;:::o;17203:::-;17345:3;17366:67;17430:2;17425:3;17366:67;:::i;:::-;17359:74;;17442:93;17531:3;17442:93;:::i;:::-;17560:2;17555:3;17551:12;17544:19;;17203:366;;;:::o;17575:::-;17717:3;17738:67;17802:2;17797:3;17738:67;:::i;:::-;17731:74;;17814:93;17903:3;17814:93;:::i;:::-;17932:2;17927:3;17923:12;17916:19;;17575:366;;;:::o;17947:::-;18089:3;18110:67;18174:2;18169:3;18110:67;:::i;:::-;18103:74;;18186:93;18275:3;18186:93;:::i;:::-;18304:2;18299:3;18295:12;18288:19;;17947:366;;;:::o;18319:::-;18461:3;18482:67;18546:2;18541:3;18482:67;:::i;:::-;18475:74;;18558:93;18647:3;18558:93;:::i;:::-;18676:2;18671:3;18667:12;18660:19;;18319:366;;;:::o;18691:::-;18833:3;18854:67;18918:2;18913:3;18854:67;:::i;:::-;18847:74;;18930:93;19019:3;18930:93;:::i;:::-;19048:2;19043:3;19039:12;19032:19;;18691:366;;;:::o;19063:::-;19205:3;19226:67;19290:2;19285:3;19226:67;:::i;:::-;19219:74;;19302:93;19391:3;19302:93;:::i;:::-;19420:2;19415:3;19411:12;19404:19;;19063:366;;;:::o;19435:::-;19577:3;19598:67;19662:2;19657:3;19598:67;:::i;:::-;19591:74;;19674:93;19763:3;19674:93;:::i;:::-;19792:2;19787:3;19783:12;19776:19;;19435:366;;;:::o;19807:::-;19949:3;19970:67;20034:2;20029:3;19970:67;:::i;:::-;19963:74;;20046:93;20135:3;20046:93;:::i;:::-;20164:2;20159:3;20155:12;20148:19;;19807:366;;;:::o;20179:::-;20321:3;20342:67;20406:2;20401:3;20342:67;:::i;:::-;20335:74;;20418:93;20507:3;20418:93;:::i;:::-;20536:2;20531:3;20527:12;20520:19;;20179:366;;;:::o;20551:::-;20693:3;20714:67;20778:2;20773:3;20714:67;:::i;:::-;20707:74;;20790:93;20879:3;20790:93;:::i;:::-;20908:2;20903:3;20899:12;20892:19;;20551:366;;;:::o;20923:::-;21065:3;21086:67;21150:2;21145:3;21086:67;:::i;:::-;21079:74;;21162:93;21251:3;21162:93;:::i;:::-;21280:2;21275:3;21271:12;21264:19;;20923:366;;;:::o;21295:::-;21437:3;21458:67;21522:2;21517:3;21458:67;:::i;:::-;21451:74;;21534:93;21623:3;21534:93;:::i;:::-;21652:2;21647:3;21643:12;21636:19;;21295:366;;;:::o;21667:::-;21809:3;21830:67;21894:2;21889:3;21830:67;:::i;:::-;21823:74;;21906:93;21995:3;21906:93;:::i;:::-;22024:2;22019:3;22015:12;22008:19;;21667:366;;;:::o;22039:::-;22181:3;22202:67;22266:2;22261:3;22202:67;:::i;:::-;22195:74;;22278:93;22367:3;22278:93;:::i;:::-;22396:2;22391:3;22387:12;22380:19;;22039:366;;;:::o;22411:::-;22553:3;22574:67;22638:2;22633:3;22574:67;:::i;:::-;22567:74;;22650:93;22739:3;22650:93;:::i;:::-;22768:2;22763:3;22759:12;22752:19;;22411:366;;;:::o;22783:::-;22925:3;22946:67;23010:2;23005:3;22946:67;:::i;:::-;22939:74;;23022:93;23111:3;23022:93;:::i;:::-;23140:2;23135:3;23131:12;23124:19;;22783:366;;;:::o;23155:::-;23297:3;23318:67;23382:2;23377:3;23318:67;:::i;:::-;23311:74;;23394:93;23483:3;23394:93;:::i;:::-;23512:2;23507:3;23503:12;23496:19;;23155:366;;;:::o;23527:::-;23669:3;23690:67;23754:2;23749:3;23690:67;:::i;:::-;23683:74;;23766:93;23855:3;23766:93;:::i;:::-;23884:2;23879:3;23875:12;23868:19;;23527:366;;;:::o;23899:::-;24041:3;24062:67;24126:2;24121:3;24062:67;:::i;:::-;24055:74;;24138:93;24227:3;24138:93;:::i;:::-;24256:2;24251:3;24247:12;24240:19;;23899:366;;;:::o;24271:::-;24413:3;24434:67;24498:2;24493:3;24434:67;:::i;:::-;24427:74;;24510:93;24599:3;24510:93;:::i;:::-;24628:2;24623:3;24619:12;24612:19;;24271:366;;;:::o;24643:::-;24785:3;24806:67;24870:2;24865:3;24806:67;:::i;:::-;24799:74;;24882:93;24971:3;24882:93;:::i;:::-;25000:2;24995:3;24991:12;24984:19;;24643:366;;;:::o;25015:108::-;25092:24;25110:5;25092:24;:::i;:::-;25087:3;25080:37;25015:108;;:::o;25129:118::-;25216:24;25234:5;25216:24;:::i;:::-;25211:3;25204:37;25129:118;;:::o;25253:256::-;25365:3;25380:75;25451:3;25442:6;25380:75;:::i;:::-;25480:2;25475:3;25471:12;25464:19;;25500:3;25493:10;;25253:256;;;;:::o;25515:397::-;25655:3;25670:75;25741:3;25732:6;25670:75;:::i;:::-;25770:2;25765:3;25761:12;25754:19;;25783:75;25854:3;25845:6;25783:75;:::i;:::-;25883:2;25878:3;25874:12;25867:19;;25903:3;25896:10;;25515:397;;;;;:::o;25918:429::-;26095:3;26117:92;26205:3;26196:6;26117:92;:::i;:::-;26110:99;;26226:95;26317:3;26308:6;26226:95;:::i;:::-;26219:102;;26338:3;26331:10;;25918:429;;;;;:::o;26353:222::-;26446:4;26484:2;26473:9;26469:18;26461:26;;26497:71;26565:1;26554:9;26550:17;26541:6;26497:71;:::i;:::-;26353:222;;;;:::o;26581:640::-;26776:4;26814:3;26803:9;26799:19;26791:27;;26828:71;26896:1;26885:9;26881:17;26872:6;26828:71;:::i;:::-;26909:72;26977:2;26966:9;26962:18;26953:6;26909:72;:::i;:::-;26991;27059:2;27048:9;27044:18;27035:6;26991:72;:::i;:::-;27110:9;27104:4;27100:20;27095:2;27084:9;27080:18;27073:48;27138:76;27209:4;27200:6;27138:76;:::i;:::-;27130:84;;26581:640;;;;;;;:::o;27227:373::-;27370:4;27408:2;27397:9;27393:18;27385:26;;27457:9;27451:4;27447:20;27443:1;27432:9;27428:17;27421:47;27485:108;27588:4;27579:6;27485:108;:::i;:::-;27477:116;;27227:373;;;;:::o;27606:210::-;27693:4;27731:2;27720:9;27716:18;27708:26;;27744:65;27806:1;27795:9;27791:17;27782:6;27744:65;:::i;:::-;27606:210;;;;:::o;27822:313::-;27935:4;27973:2;27962:9;27958:18;27950:26;;28022:9;28016:4;28012:20;28008:1;27997:9;27993:17;27986:47;28050:78;28123:4;28114:6;28050:78;:::i;:::-;28042:86;;27822:313;;;;:::o;28141:419::-;28307:4;28345:2;28334:9;28330:18;28322:26;;28394:9;28388:4;28384:20;28380:1;28369:9;28365:17;28358:47;28422:131;28548:4;28422:131;:::i;:::-;28414:139;;28141:419;;;:::o;28566:::-;28732:4;28770:2;28759:9;28755:18;28747:26;;28819:9;28813:4;28809:20;28805:1;28794:9;28790:17;28783:47;28847:131;28973:4;28847:131;:::i;:::-;28839:139;;28566:419;;;:::o;28991:::-;29157:4;29195:2;29184:9;29180:18;29172:26;;29244:9;29238:4;29234:20;29230:1;29219:9;29215:17;29208:47;29272:131;29398:4;29272:131;:::i;:::-;29264:139;;28991:419;;;:::o;29416:::-;29582:4;29620:2;29609:9;29605:18;29597:26;;29669:9;29663:4;29659:20;29655:1;29644:9;29640:17;29633:47;29697:131;29823:4;29697:131;:::i;:::-;29689:139;;29416:419;;;:::o;29841:::-;30007:4;30045:2;30034:9;30030:18;30022:26;;30094:9;30088:4;30084:20;30080:1;30069:9;30065:17;30058:47;30122:131;30248:4;30122:131;:::i;:::-;30114:139;;29841:419;;;:::o;30266:::-;30432:4;30470:2;30459:9;30455:18;30447:26;;30519:9;30513:4;30509:20;30505:1;30494:9;30490:17;30483:47;30547:131;30673:4;30547:131;:::i;:::-;30539:139;;30266:419;;;:::o;30691:::-;30857:4;30895:2;30884:9;30880:18;30872:26;;30944:9;30938:4;30934:20;30930:1;30919:9;30915:17;30908:47;30972:131;31098:4;30972:131;:::i;:::-;30964:139;;30691:419;;;:::o;31116:::-;31282:4;31320:2;31309:9;31305:18;31297:26;;31369:9;31363:4;31359:20;31355:1;31344:9;31340:17;31333:47;31397:131;31523:4;31397:131;:::i;:::-;31389:139;;31116:419;;;:::o;31541:::-;31707:4;31745:2;31734:9;31730:18;31722:26;;31794:9;31788:4;31784:20;31780:1;31769:9;31765:17;31758:47;31822:131;31948:4;31822:131;:::i;:::-;31814:139;;31541:419;;;:::o;31966:::-;32132:4;32170:2;32159:9;32155:18;32147:26;;32219:9;32213:4;32209:20;32205:1;32194:9;32190:17;32183:47;32247:131;32373:4;32247:131;:::i;:::-;32239:139;;31966:419;;;:::o;32391:::-;32557:4;32595:2;32584:9;32580:18;32572:26;;32644:9;32638:4;32634:20;32630:1;32619:9;32615:17;32608:47;32672:131;32798:4;32672:131;:::i;:::-;32664:139;;32391:419;;;:::o;32816:::-;32982:4;33020:2;33009:9;33005:18;32997:26;;33069:9;33063:4;33059:20;33055:1;33044:9;33040:17;33033:47;33097:131;33223:4;33097:131;:::i;:::-;33089:139;;32816:419;;;:::o;33241:::-;33407:4;33445:2;33434:9;33430:18;33422:26;;33494:9;33488:4;33484:20;33480:1;33469:9;33465:17;33458:47;33522:131;33648:4;33522:131;:::i;:::-;33514:139;;33241:419;;;:::o;33666:::-;33832:4;33870:2;33859:9;33855:18;33847:26;;33919:9;33913:4;33909:20;33905:1;33894:9;33890:17;33883:47;33947:131;34073:4;33947:131;:::i;:::-;33939:139;;33666:419;;;:::o;34091:::-;34257:4;34295:2;34284:9;34280:18;34272:26;;34344:9;34338:4;34334:20;34330:1;34319:9;34315:17;34308:47;34372:131;34498:4;34372:131;:::i;:::-;34364:139;;34091:419;;;:::o;34516:::-;34682:4;34720:2;34709:9;34705:18;34697:26;;34769:9;34763:4;34759:20;34755:1;34744:9;34740:17;34733:47;34797:131;34923:4;34797:131;:::i;:::-;34789:139;;34516:419;;;:::o;34941:::-;35107:4;35145:2;35134:9;35130:18;35122:26;;35194:9;35188:4;35184:20;35180:1;35169:9;35165:17;35158:47;35222:131;35348:4;35222:131;:::i;:::-;35214:139;;34941:419;;;:::o;35366:::-;35532:4;35570:2;35559:9;35555:18;35547:26;;35619:9;35613:4;35609:20;35605:1;35594:9;35590:17;35583:47;35647:131;35773:4;35647:131;:::i;:::-;35639:139;;35366:419;;;:::o;35791:::-;35957:4;35995:2;35984:9;35980:18;35972:26;;36044:9;36038:4;36034:20;36030:1;36019:9;36015:17;36008:47;36072:131;36198:4;36072:131;:::i;:::-;36064:139;;35791:419;;;:::o;36216:::-;36382:4;36420:2;36409:9;36405:18;36397:26;;36469:9;36463:4;36459:20;36455:1;36444:9;36440:17;36433:47;36497:131;36623:4;36497:131;:::i;:::-;36489:139;;36216:419;;;:::o;36641:::-;36807:4;36845:2;36834:9;36830:18;36822:26;;36894:9;36888:4;36884:20;36880:1;36869:9;36865:17;36858:47;36922:131;37048:4;36922:131;:::i;:::-;36914:139;;36641:419;;;:::o;37066:::-;37232:4;37270:2;37259:9;37255:18;37247:26;;37319:9;37313:4;37309:20;37305:1;37294:9;37290:17;37283:47;37347:131;37473:4;37347:131;:::i;:::-;37339:139;;37066:419;;;:::o;37491:::-;37657:4;37695:2;37684:9;37680:18;37672:26;;37744:9;37738:4;37734:20;37730:1;37719:9;37715:17;37708:47;37772:131;37898:4;37772:131;:::i;:::-;37764:139;;37491:419;;;:::o;37916:::-;38082:4;38120:2;38109:9;38105:18;38097:26;;38169:9;38163:4;38159:20;38155:1;38144:9;38140:17;38133:47;38197:131;38323:4;38197:131;:::i;:::-;38189:139;;37916:419;;;:::o;38341:::-;38507:4;38545:2;38534:9;38530:18;38522:26;;38594:9;38588:4;38584:20;38580:1;38569:9;38565:17;38558:47;38622:131;38748:4;38622:131;:::i;:::-;38614:139;;38341:419;;;:::o;38766:::-;38932:4;38970:2;38959:9;38955:18;38947:26;;39019:9;39013:4;39009:20;39005:1;38994:9;38990:17;38983:47;39047:131;39173:4;39047:131;:::i;:::-;39039:139;;38766:419;;;:::o;39191:::-;39357:4;39395:2;39384:9;39380:18;39372:26;;39444:9;39438:4;39434:20;39430:1;39419:9;39415:17;39408:47;39472:131;39598:4;39472:131;:::i;:::-;39464:139;;39191:419;;;:::o;39616:::-;39782:4;39820:2;39809:9;39805:18;39797:26;;39869:9;39863:4;39859:20;39855:1;39844:9;39840:17;39833:47;39897:131;40023:4;39897:131;:::i;:::-;39889:139;;39616:419;;;:::o;40041:::-;40207:4;40245:2;40234:9;40230:18;40222:26;;40294:9;40288:4;40284:20;40280:1;40269:9;40265:17;40258:47;40322:131;40448:4;40322:131;:::i;:::-;40314:139;;40041:419;;;:::o;40466:::-;40632:4;40670:2;40659:9;40655:18;40647:26;;40719:9;40713:4;40709:20;40705:1;40694:9;40690:17;40683:47;40747:131;40873:4;40747:131;:::i;:::-;40739:139;;40466:419;;;:::o;40891:::-;41057:4;41095:2;41084:9;41080:18;41072:26;;41144:9;41138:4;41134:20;41130:1;41119:9;41115:17;41108:47;41172:131;41298:4;41172:131;:::i;:::-;41164:139;;40891:419;;;:::o;41316:222::-;41409:4;41447:2;41436:9;41432:18;41424:26;;41460:71;41528:1;41517:9;41513:17;41504:6;41460:71;:::i;:::-;41316:222;;;;:::o;41544:129::-;41578:6;41605:20;;:::i;:::-;41595:30;;41634:33;41662:4;41654:6;41634:33;:::i;:::-;41544:129;;;:::o;41679:75::-;41712:6;41745:2;41739:9;41729:19;;41679:75;:::o;41760:311::-;41837:4;41927:18;41919:6;41916:30;41913:56;;;41949:18;;:::i;:::-;41913:56;41999:4;41991:6;41987:17;41979:25;;42059:4;42053;42049:15;42041:23;;41760:311;;;:::o;42077:307::-;42138:4;42228:18;42220:6;42217:30;42214:56;;;42250:18;;:::i;:::-;42214:56;42288:29;42310:6;42288:29;:::i;:::-;42280:37;;42372:4;42366;42362:15;42354:23;;42077:307;;;:::o;42390:132::-;42457:4;42480:3;42472:11;;42510:4;42505:3;42501:14;42493:22;;42390:132;;;:::o;42528:141::-;42577:4;42600:3;42592:11;;42623:3;42620:1;42613:14;42657:4;42654:1;42644:18;42636:26;;42528:141;;;:::o;42675:114::-;42742:6;42776:5;42770:12;42760:22;;42675:114;;;:::o;42795:98::-;42846:6;42880:5;42874:12;42864:22;;42795:98;;;:::o;42899:99::-;42951:6;42985:5;42979:12;42969:22;;42899:99;;;:::o;43004:113::-;43074:4;43106;43101:3;43097:14;43089:22;;43004:113;;;:::o;43123:184::-;43222:11;43256:6;43251:3;43244:19;43296:4;43291:3;43287:14;43272:29;;43123:184;;;;:::o;43313:168::-;43396:11;43430:6;43425:3;43418:19;43470:4;43465:3;43461:14;43446:29;;43313:168;;;;:::o;43487:169::-;43571:11;43605:6;43600:3;43593:19;43645:4;43640:3;43636:14;43621:29;;43487:169;;;;:::o;43662:148::-;43764:11;43801:3;43786:18;;43662:148;;;;:::o;43816:273::-;43856:3;43875:20;43893:1;43875:20;:::i;:::-;43870:25;;43909:20;43927:1;43909:20;:::i;:::-;43904:25;;44031:1;43995:34;43991:42;43988:1;43985:49;43982:75;;;44037:18;;:::i;:::-;43982:75;44081:1;44078;44074:9;44067:16;;43816:273;;;;:::o;44095:305::-;44135:3;44154:20;44172:1;44154:20;:::i;:::-;44149:25;;44188:20;44206:1;44188:20;:::i;:::-;44183:25;;44342:1;44274:66;44270:74;44267:1;44264:81;44261:107;;;44348:18;;:::i;:::-;44261:107;44392:1;44389;44385:9;44378:16;;44095:305;;;;:::o;44406:185::-;44446:1;44463:20;44481:1;44463:20;:::i;:::-;44458:25;;44497:20;44515:1;44497:20;:::i;:::-;44492:25;;44536:1;44526:35;;44541:18;;:::i;:::-;44526:35;44583:1;44580;44576:9;44571:14;;44406:185;;;;:::o;44597:348::-;44637:7;44660:20;44678:1;44660:20;:::i;:::-;44655:25;;44694:20;44712:1;44694:20;:::i;:::-;44689:25;;44882:1;44814:66;44810:74;44807:1;44804:81;44799:1;44792:9;44785:17;44781:105;44778:131;;;44889:18;;:::i;:::-;44778:131;44937:1;44934;44930:9;44919:20;;44597:348;;;;:::o;44951:191::-;44991:4;45011:20;45029:1;45011:20;:::i;:::-;45006:25;;45045:20;45063:1;45045:20;:::i;:::-;45040:25;;45084:1;45081;45078:8;45075:34;;;45089:18;;:::i;:::-;45075:34;45134:1;45131;45127:9;45119:17;;44951:191;;;;:::o;45148:::-;45188:4;45208:20;45226:1;45208:20;:::i;:::-;45203:25;;45242:20;45260:1;45242:20;:::i;:::-;45237:25;;45281:1;45278;45275:8;45272:34;;;45286:18;;:::i;:::-;45272:34;45331:1;45328;45324:9;45316:17;;45148:191;;;;:::o;45345:96::-;45382:7;45411:24;45429:5;45411:24;:::i;:::-;45400:35;;45345:96;;;:::o;45447:90::-;45481:7;45524:5;45517:13;45510:21;45499:32;;45447:90;;;:::o;45543:77::-;45580:7;45609:5;45598:16;;45543:77;;;:::o;45626:149::-;45662:7;45702:66;45695:5;45691:78;45680:89;;45626:149;;;:::o;45781:118::-;45818:7;45858:34;45851:5;45847:46;45836:57;;45781:118;;;:::o;45905:126::-;45942:7;45982:42;45975:5;45971:54;45960:65;;45905:126;;;:::o;46037:77::-;46074:7;46103:5;46092:16;;46037:77;;;:::o;46120:154::-;46204:6;46199:3;46194;46181:30;46266:1;46257:6;46252:3;46248:16;46241:27;46120:154;;;:::o;46280:307::-;46348:1;46358:113;46372:6;46369:1;46366:13;46358:113;;;46457:1;46452:3;46448:11;46442:18;46438:1;46433:3;46429:11;46422:39;46394:2;46391:1;46387:10;46382:15;;46358:113;;;46489:6;46486:1;46483:13;46480:101;;;46569:1;46560:6;46555:3;46551:16;46544:27;46480:101;46329:258;46280:307;;;:::o;46593:171::-;46632:3;46655:24;46673:5;46655:24;:::i;:::-;46646:33;;46701:4;46694:5;46691:15;46688:41;;;46709:18;;:::i;:::-;46688:41;46756:1;46749:5;46745:13;46738:20;;46593:171;;;:::o;46770:320::-;46814:6;46851:1;46845:4;46841:12;46831:22;;46898:1;46892:4;46888:12;46919:18;46909:81;;46975:4;46967:6;46963:17;46953:27;;46909:81;47037:2;47029:6;47026:14;47006:18;47003:38;47000:84;;;47056:18;;:::i;:::-;47000:84;46821:269;46770:320;;;:::o;47096:281::-;47179:27;47201:4;47179:27;:::i;:::-;47171:6;47167:40;47309:6;47297:10;47294:22;47273:18;47261:10;47258:34;47255:62;47252:88;;;47320:18;;:::i;:::-;47252:88;47360:10;47356:2;47349:22;47139:238;47096:281;;:::o;47383:233::-;47422:3;47445:24;47463:5;47445:24;:::i;:::-;47436:33;;47491:66;47484:5;47481:77;47478:103;;;47561:18;;:::i;:::-;47478:103;47608:1;47601:5;47597:13;47590:20;;47383:233;;;:::o;47622:100::-;47661:7;47690:26;47710:5;47690:26;:::i;:::-;47679:37;;47622:100;;;:::o;47728:79::-;47767:7;47796:5;47785:16;;47728:79;;;:::o;47813:94::-;47852:7;47881:20;47895:5;47881:20;:::i;:::-;47870:31;;47813:94;;;:::o;47913:176::-;47945:1;47962:20;47980:1;47962:20;:::i;:::-;47957:25;;47996:20;48014:1;47996:20;:::i;:::-;47991:25;;48035:1;48025:35;;48040:18;;:::i;:::-;48025:35;48081:1;48078;48074:9;48069:14;;47913:176;;;;:::o;48095:180::-;48143:77;48140:1;48133:88;48240:4;48237:1;48230:15;48264:4;48261:1;48254:15;48281:180;48329:77;48326:1;48319:88;48426:4;48423:1;48416:15;48450:4;48447:1;48440:15;48467:180;48515:77;48512:1;48505:88;48612:4;48609:1;48602:15;48636:4;48633:1;48626:15;48653:180;48701:77;48698:1;48691:88;48798:4;48795:1;48788:15;48822:4;48819:1;48812:15;48839:180;48887:77;48884:1;48877:88;48984:4;48981:1;48974:15;49008:4;49005:1;48998:15;49025:117;49134:1;49131;49124:12;49148:117;49257:1;49254;49247:12;49271:117;49380:1;49377;49370:12;49394:117;49503:1;49500;49493:12;49517:117;49626:1;49623;49616:12;49640:117;49749:1;49746;49739:12;49763:102;49804:6;49855:2;49851:7;49846:2;49839:5;49835:14;49831:28;49821:38;;49763:102;;;:::o;49871:94::-;49904:8;49952:5;49948:2;49944:14;49923:35;;49871:94;;;:::o;49971:221::-;50111:34;50107:1;50099:6;50095:14;50088:58;50180:4;50175:2;50167:6;50163:15;50156:29;49971:221;:::o;50198:167::-;50338:19;50334:1;50326:6;50322:14;50315:43;50198:167;:::o;50371:225::-;50511:34;50507:1;50499:6;50495:14;50488:58;50580:8;50575:2;50567:6;50563:15;50556:33;50371:225;:::o;50602:229::-;50742:34;50738:1;50730:6;50726:14;50719:58;50811:12;50806:2;50798:6;50794:15;50787:37;50602:229;:::o;50837:180::-;50977:32;50973:1;50965:6;50961:14;50954:56;50837:180;:::o;51023:222::-;51163:34;51159:1;51151:6;51147:14;51140:58;51232:5;51227:2;51219:6;51215:15;51208:30;51023:222;:::o;51251:224::-;51391:34;51387:1;51379:6;51375:14;51368:58;51460:7;51455:2;51447:6;51443:15;51436:32;51251:224;:::o;51481:236::-;51621:34;51617:1;51609:6;51605:14;51598:58;51690:19;51685:2;51677:6;51673:15;51666:44;51481:236;:::o;51723:226::-;51863:34;51859:1;51851:6;51847:14;51840:58;51932:9;51927:2;51919:6;51915:15;51908:34;51723:226;:::o;51955:170::-;52095:22;52091:1;52083:6;52079:14;52072:46;51955:170;:::o;52131:174::-;52271:26;52267:1;52259:6;52255:14;52248:50;52131:174;:::o;52311:244::-;52451:34;52447:1;52439:6;52435:14;52428:58;52520:27;52515:2;52507:6;52503:15;52496:52;52311:244;:::o;52561:221::-;52701:34;52697:1;52689:6;52685:14;52678:58;52770:4;52765:2;52757:6;52753:15;52746:29;52561:221;:::o;52788:230::-;52928:34;52924:1;52916:6;52912:14;52905:58;52997:13;52992:2;52984:6;52980:15;52973:38;52788:230;:::o;53024:225::-;53164:34;53160:1;53152:6;53148:14;53141:58;53233:8;53228:2;53220:6;53216:15;53209:33;53024:225;:::o;53255:164::-;53395:16;53391:1;53383:6;53379:14;53372:40;53255:164;:::o;53425:172::-;53565:24;53561:1;53553:6;53549:14;53542:48;53425:172;:::o;53603:182::-;53743:34;53739:1;53731:6;53727:14;53720:58;53603:182;:::o;53791:176::-;53931:28;53927:1;53919:6;53915:14;53908:52;53791:176;:::o;53973:237::-;54113:34;54109:1;54101:6;54097:14;54090:58;54182:20;54177:2;54169:6;54165:15;54158:45;53973:237;:::o;54216:221::-;54356:34;54352:1;54344:6;54340:14;54333:58;54425:4;54420:2;54412:6;54408:15;54401:29;54216:221;:::o;54443:238::-;54583:34;54579:1;54571:6;54567:14;54560:58;54652:21;54647:2;54639:6;54635:15;54628:46;54443:238;:::o;54687:179::-;54827:31;54823:1;54815:6;54811:14;54804:55;54687:179;:::o;54872:220::-;55012:34;55008:1;55000:6;54996:14;54989:58;55081:3;55076:2;55068:6;55064:15;55057:28;54872:220;:::o;55098:177::-;55238:29;55234:1;55226:6;55222:14;55215:53;55098:177;:::o;55281:170::-;55421:22;55417:1;55409:6;55405:14;55398:46;55281:170;:::o;55457:233::-;55597:34;55593:1;55585:6;55581:14;55574:58;55666:16;55661:2;55653:6;55649:15;55642:41;55457:233;:::o;55696:182::-;55836:34;55832:1;55824:6;55820:14;55813:58;55696:182;:::o;55884:234::-;56024:34;56020:1;56012:6;56008:14;56001:58;56093:17;56088:2;56080:6;56076:15;56069:42;55884:234;:::o;56124:232::-;56264:34;56260:1;56252:6;56248:14;56241:58;56333:15;56328:2;56320:6;56316:15;56309:40;56124:232;:::o;56362:221::-;56502:34;56498:1;56490:6;56486:14;56479:58;56571:4;56566:2;56558:6;56554:15;56547:29;56362:221;:::o;56589:122::-;56662:24;56680:5;56662:24;:::i;:::-;56655:5;56652:35;56642:63;;56701:1;56698;56691:12;56642:63;56589:122;:::o;56717:116::-;56787:21;56802:5;56787:21;:::i;:::-;56780:5;56777:32;56767:60;;56823:1;56820;56813:12;56767:60;56717:116;:::o;56839:122::-;56912:24;56930:5;56912:24;:::i;:::-;56905:5;56902:35;56892:63;;56951:1;56948;56941:12;56892:63;56839:122;:::o;56967:120::-;57039:23;57056:5;57039:23;:::i;:::-;57032:5;57029:34;57019:62;;57077:1;57074;57067:12;57019:62;56967:120;:::o;57093:122::-;57166:24;57184:5;57166:24;:::i;:::-;57159:5;57156:35;57146:63;;57205:1;57202;57195:12;57146:63;57093:122;:::o
Swarm Source
ipfs://65a333d2aff92b1ddfe5b8adfaf8dec22d2056fea0dc97fb2febed343dd4f10a
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.