ERC-721
Overview
Max Total Supply
124 MTGR
Holders
58
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MTGRLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Tigers
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-21 */ // SPDX-License-Identifier: MIT 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); } /** * @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; } /** * @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); } } /** * @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; } } /** * @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); } /** * @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); } /** * @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); } } } } /** * @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; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: 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 virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @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); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /* leggi poi qui https://docs.opensea.io/docs/1-structuring-your-smart-contract **/ contract Tigers is ERC721Enumerable, Ownable { using SafeMath for uint256; uint256 public cost = 0.03 ether; string public baseURI; // da capire uint256 public constant maxSupply = 8888; uint256 public maxMintAmount = 20; bool public paused = false; // se qualcosa va storto almeno possiamo fermarlo uint256 private _currentTokenId = 0; constructor() ERC721("Meta Tigers", "MTGR") { setBaseURI("https://tigers0x.s3.eu-west-1.amazonaws.com/"); // mint(msg.sender, 20); } /** questa la overridiamo perchè vogliamo ritornarei l nostro baseURI in modo da essere in grado di cambiarlo ( metti che cmabiamo server ..) **/ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function mint(address _to, uint256 _mintAmount) public payable { require(_mintAmount > 0); require(_mintAmount <= maxMintAmount); require(_currentTokenId + _mintAmount <= maxSupply); /* se sono io invece non pago */ if(msg.sender != owner()) { require(!paused); require(msg.value >= cost * _mintAmount); // payable(owner()).transfer(cost * _mintAmount); se per caso volessi prenderli subito sul mio wallet, ma cosi si pagano un sacco di fee } for(uint256 i = 1; i <= _mintAmount; i++) { uint256 newTokenId = _getNextTokenId(); _safeMint(_to, newTokenId); _incrementTokenId(); } } /** Ritorna un array con gli nft che possiede l'address */ /* vedi https://docs.openzeppelin.com/contracts/4.x/api/token/erc721#IERC721Enumerable-tokenOfOwnerByIndex-address-uint256-*/ function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); // Returns the number of tokens in owner's account. uint256[] memory tokenIds = new uint256[](ownerTokenCount); // dichiaro nuovo array della lunghezza del numero di token che ha cosi non spreco spazio nella blockchain for(uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); // 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. } return tokenIds; } /** Qui un po' di funzioni che che solo l'owner puo' chiamare **/ function setCost(uint256 _newCost) public onlyOwner() { cost = _newCost; } function setmaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner() { maxMintAmount = _newMaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner() { baseURI = _newBaseURI; } function pause(bool _state) public onlyOwner() { paused = _state; } function withdraw() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); // riporto a me sti soldini } /** * @dev calculates the next token ID based on value of _currentTokenId * @return uint256 for the next token ID */ function _getNextTokenId() private view returns (uint256) { return _currentTokenId.add(1); } /** * @dev increments the value of _currentTokenId */ function _incrementTokenId() private { _currentTokenId++; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052666a94d74f430000600b556014600d556000600e60006101000a81548160ff0219169083151502179055506000600f553480156200004157600080fd5b506040518060400160405280600b81526020017f4d657461205469676572730000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d544752000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c6929190620002d5565b508060019080519060200190620000df929190620002d5565b50505062000102620000f66200013260201b60201c565b6200013a60201b60201c565b6200012c6040518060600160405280602c815260200162004380602c91396200020060201b60201c565b6200046d565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002106200013260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000236620002ab60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200028f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028690620003ac565b60405180910390fd5b80600c9080519060200190620002a7929190620002d5565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002e390620003df565b90600052602060002090601f01602090048101928262000307576000855562000353565b82601f106200032257805160ff191683800117855562000353565b8280016001018555821562000353579182015b828111156200035257825182559160200191906001019062000335565b5b50905062000362919062000366565b5090565b5b808211156200038157600081600090555060010162000367565b5090565b600062000394602083620003ce565b9150620003a18262000444565b602082019050919050565b60006020820190508181036000830152620003c78162000385565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620003f857607f821691505b602082108114156200040f576200040e62000415565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613f03806200047d6000396000f3fe6080604052600436106101d85760003560e01c80634f6ccce7116101025780638da5cb5b11610095578063c87b56dd11610064578063c87b56dd1461068e578063d5abeb01146106cb578063e985e9c5146106f6578063f2fde38b14610733576101d8565b80638da5cb5b146105e657806395d89b4114610611578063a22cb4651461063c578063b88d4fde14610665576101d8565b80636c0360eb116100d15780636c0360eb1461053e57806370a0823114610569578063715018a6146105a65780637f00c7a6146105bd576101d8565b80634f6ccce71461047057806355f804b3146104ad5780635c975abb146104d65780636352211e14610501576101d8565b8063239c70ae1161017a57806340c10f191161014957806340c10f19146103c557806342842e0e146103e1578063438b63001461040a57806344a0d68a14610447576101d8565b8063239c70ae1461032a57806323b872dd146103555780632f745c591461037e5780633ccfd60b146103bb576101d8565b8063081812fc116101b6578063081812fc1461026e578063095ea7b3146102ab57806313faede6146102d457806318160ddd146102ff576101d8565b806301ffc9a7146101dd57806302329a291461021a57806306fdde0314610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612cb1565b61075c565b60405161021191906131f9565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190612c84565b6107d6565b005b34801561024f57600080fd5b5061025861086f565b6040516102659190613214565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612d54565b610901565b6040516102a29190613170565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190612c44565b610986565b005b3480156102e057600080fd5b506102e9610a9e565b6040516102f69190613476565b60405180910390f35b34801561030b57600080fd5b50610314610aa4565b6040516103219190613476565b60405180910390f35b34801561033657600080fd5b5061033f610ab1565b60405161034c9190613476565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190612b2e565b610ab7565b005b34801561038a57600080fd5b506103a560048036038101906103a09190612c44565b610b17565b6040516103b29190613476565b60405180910390f35b6103c3610bbc565b005b6103df60048036038101906103da9190612c44565b610c78565b005b3480156103ed57600080fd5b5061040860048036038101906104039190612b2e565b610d64565b005b34801561041657600080fd5b50610431600480360381019061042c9190612ac1565b610d84565b60405161043e91906131d7565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190612d54565b610e32565b005b34801561047c57600080fd5b5061049760048036038101906104929190612d54565b610eb8565b6040516104a49190613476565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190612d0b565b610f29565b005b3480156104e257600080fd5b506104eb610fbf565b6040516104f891906131f9565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190612d54565b610fd2565b6040516105359190613170565b60405180910390f35b34801561054a57600080fd5b50610553611084565b6040516105609190613214565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190612ac1565b611112565b60405161059d9190613476565b60405180910390f35b3480156105b257600080fd5b506105bb6111ca565b005b3480156105c957600080fd5b506105e460048036038101906105df9190612d54565b611252565b005b3480156105f257600080fd5b506105fb6112d8565b6040516106089190613170565b60405180910390f35b34801561061d57600080fd5b50610626611302565b6040516106339190613214565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e9190612c04565b611394565b005b34801561067157600080fd5b5061068c60048036038101906106879190612b81565b611515565b005b34801561069a57600080fd5b506106b560048036038101906106b09190612d54565b611577565b6040516106c29190613214565b60405180910390f35b3480156106d757600080fd5b506106e061161e565b6040516106ed9190613476565b60405180910390f35b34801561070257600080fd5b5061071d60048036038101906107189190612aee565b611624565b60405161072a91906131f9565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190612ac1565b6116b8565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cf57506107ce826117b0565b5b9050919050565b6107de611892565b73ffffffffffffffffffffffffffffffffffffffff166107fc6112d8565b73ffffffffffffffffffffffffffffffffffffffff1614610852576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610849906133b6565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b60606000805461087e9061375f565b80601f01602080910402602001604051908101604052809291908181526020018280546108aa9061375f565b80156108f75780601f106108cc576101008083540402835291602001916108f7565b820191906000526020600020905b8154815290600101906020018083116108da57829003601f168201915b5050505050905090565b600061090c8261189a565b61094b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094290613396565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099182610fd2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613416565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a21611892565b73ffffffffffffffffffffffffffffffffffffffff161480610a505750610a4f81610a4a611892565b611624565b5b610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613316565b60405180910390fd5b610a998383611906565b505050565b600b5481565b6000600880549050905090565b600d5481565b610ac8610ac2611892565b826119bf565b610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe90613436565b60405180910390fd5b610b12838383611a9d565b505050565b6000610b2283611112565b8210610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a90613236565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bc4611892565b73ffffffffffffffffffffffffffffffffffffffff16610be26112d8565b73ffffffffffffffffffffffffffffffffffffffff1614610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f906133b6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c7657600080fd5b565b60008111610c8557600080fd5b600d54811115610c9457600080fd5b6122b881600f54610ca59190613594565b1115610cb057600080fd5b610cb86112d8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d1f57600e60009054906101000a900460ff1615610d0457600080fd5b80600b54610d12919061361b565b341015610d1e57600080fd5b5b6000600190505b818111610d5f576000610d37611cf9565b9050610d438482611d16565b610d4b611d34565b508080610d57906137c2565b915050610d26565b505050565b610d7f83838360405180602001604052806000815250611515565b505050565b60606000610d9183611112565b905060008167ffffffffffffffff811115610daf57610dae613927565b5b604051908082528060200260200182016040528015610ddd5781602001602082028036833780820191505090505b50905060005b82811015610e2757610df58582610b17565b828281518110610e0857610e076138f8565b5b6020026020010181815250508080610e1f906137c2565b915050610de3565b508092505050919050565b610e3a611892565b73ffffffffffffffffffffffffffffffffffffffff16610e586112d8565b73ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906133b6565b60405180910390fd5b80600b8190555050565b6000610ec2610aa4565b8210610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90613456565b60405180910390fd5b60088281548110610f1757610f166138f8565b5b90600052602060002001549050919050565b610f31611892565b73ffffffffffffffffffffffffffffffffffffffff16610f4f6112d8565b73ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c906133b6565b60405180910390fd5b80600c9080519060200190610fbb9291906128d5565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290613356565b60405180910390fd5b80915050919050565b600c80546110919061375f565b80601f01602080910402602001604051908101604052809291908181526020018280546110bd9061375f565b801561110a5780601f106110df5761010080835404028352916020019161110a565b820191906000526020600020905b8154815290600101906020018083116110ed57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a90613336565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111d2611892565b73ffffffffffffffffffffffffffffffffffffffff166111f06112d8565b73ffffffffffffffffffffffffffffffffffffffff1614611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d906133b6565b60405180910390fd5b6112506000611d4e565b565b61125a611892565b73ffffffffffffffffffffffffffffffffffffffff166112786112d8565b73ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c5906133b6565b60405180910390fd5b80600d8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113119061375f565b80601f016020809104026020016040519081016040528092919081815260200182805461133d9061375f565b801561138a5780601f1061135f5761010080835404028352916020019161138a565b820191906000526020600020905b81548152906001019060200180831161136d57829003601f168201915b5050505050905090565b61139c611892565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611401906132d6565b60405180910390fd5b8060056000611417611892565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114c4611892565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161150991906131f9565b60405180910390a35050565b611526611520611892565b836119bf565b611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c90613436565b60405180910390fd5b61157184848484611e14565b50505050565b60606115828261189a565b6115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b8906133f6565b60405180910390fd5b60006115cb611e70565b905060008151116115eb5760405180602001604052806000815250611616565b806115f584611f02565b60405160200161160692919061314c565b6040516020818303038152906040525b915050919050565b6122b881565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116c0611892565b73ffffffffffffffffffffffffffffffffffffffff166116de6112d8565b73ffffffffffffffffffffffffffffffffffffffff1614611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b906133b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90613276565b60405180910390fd5b6117ad81611d4e565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061187b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061188b575061188a82612063565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661197983610fd2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119ca8261189a565b611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a00906132f6565b60405180910390fd5b6000611a1483610fd2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a8357508373ffffffffffffffffffffffffffffffffffffffff16611a6b84610901565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a945750611a938185611624565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611abd82610fd2565b73ffffffffffffffffffffffffffffffffffffffff1614611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a906133d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906132b6565b60405180910390fd5b611b8e8383836120cd565b611b99600082611906565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611be99190613675565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c409190613594565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611d116001600f546121e190919063ffffffff16565b905090565b611d308282604051806020016040528060008152506121f7565b5050565b600f6000815480929190611d47906137c2565b9190505550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e1f848484611a9d565b611e2b84848484612252565b611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190613256565b60405180910390fd5b50505050565b6060600c8054611e7f9061375f565b80601f0160208091040260200160405190810160405280929190818152602001828054611eab9061375f565b8015611ef85780601f10611ecd57610100808354040283529160200191611ef8565b820191906000526020600020905b815481529060010190602001808311611edb57829003601f168201915b5050505050905090565b60606000821415611f4a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061205e565b600082905060005b60008214611f7c578080611f65906137c2565b915050600a82611f7591906135ea565b9150611f52565b60008167ffffffffffffffff811115611f9857611f97613927565b5b6040519080825280601f01601f191660200182016040528015611fca5781602001600182028036833780820191505090505b5090505b6000851461205757600182611fe39190613675565b9150600a85611ff2919061380b565b6030611ffe9190613594565b60f81b818381518110612014576120136138f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561205091906135ea565b9450611fce565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120d88383836123e9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561211b57612116816123ee565b61215a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612159576121588382612437565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561219d57612198816125a4565b6121dc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121db576121da8282612675565b5b5b505050565b600081836121ef9190613594565b905092915050565b61220183836126f4565b61220e6000848484612252565b61224d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224490613256565b60405180910390fd5b505050565b60006122738473ffffffffffffffffffffffffffffffffffffffff166128c2565b156123dc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261229c611892565b8786866040518563ffffffff1660e01b81526004016122be949392919061318b565b602060405180830381600087803b1580156122d857600080fd5b505af192505050801561230957506040513d601f19601f820116820180604052508101906123069190612cde565b60015b61238c573d8060008114612339576040519150601f19603f3d011682016040523d82523d6000602084013e61233e565b606091505b50600081511415612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b90613256565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123e1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161244484611112565b61244e9190613675565b9050600060076000848152602001908152602001600020549050818114612533576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125b89190613675565b90506000600960008481526020019081526020016000205490506000600883815481106125e8576125e76138f8565b5b90600052602060002001549050806008838154811061260a576126096138f8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612659576126586138c9565b5b6001900381819060005260206000200160009055905550505050565b600061268083611112565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613376565b60405180910390fd5b61276d8161189a565b156127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490613296565b60405180910390fd5b6127b9600083836120cd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128099190613594565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546128e19061375f565b90600052602060002090601f016020900481019282612903576000855561294a565b82601f1061291c57805160ff191683800117855561294a565b8280016001018555821561294a579182015b8281111561294957825182559160200191906001019061292e565b5b509050612957919061295b565b5090565b5b8082111561297457600081600090555060010161295c565b5090565b600061298b612986846134b6565b613491565b9050828152602081018484840111156129a7576129a661395b565b5b6129b284828561371d565b509392505050565b60006129cd6129c8846134e7565b613491565b9050828152602081018484840111156129e9576129e861395b565b5b6129f484828561371d565b509392505050565b600081359050612a0b81613e71565b92915050565b600081359050612a2081613e88565b92915050565b600081359050612a3581613e9f565b92915050565b600081519050612a4a81613e9f565b92915050565b600082601f830112612a6557612a64613956565b5b8135612a75848260208601612978565b91505092915050565b600082601f830112612a9357612a92613956565b5b8135612aa38482602086016129ba565b91505092915050565b600081359050612abb81613eb6565b92915050565b600060208284031215612ad757612ad6613965565b5b6000612ae5848285016129fc565b91505092915050565b60008060408385031215612b0557612b04613965565b5b6000612b13858286016129fc565b9250506020612b24858286016129fc565b9150509250929050565b600080600060608486031215612b4757612b46613965565b5b6000612b55868287016129fc565b9350506020612b66868287016129fc565b9250506040612b7786828701612aac565b9150509250925092565b60008060008060808587031215612b9b57612b9a613965565b5b6000612ba9878288016129fc565b9450506020612bba878288016129fc565b9350506040612bcb87828801612aac565b925050606085013567ffffffffffffffff811115612bec57612beb613960565b5b612bf887828801612a50565b91505092959194509250565b60008060408385031215612c1b57612c1a613965565b5b6000612c29858286016129fc565b9250506020612c3a85828601612a11565b9150509250929050565b60008060408385031215612c5b57612c5a613965565b5b6000612c69858286016129fc565b9250506020612c7a85828601612aac565b9150509250929050565b600060208284031215612c9a57612c99613965565b5b6000612ca884828501612a11565b91505092915050565b600060208284031215612cc757612cc6613965565b5b6000612cd584828501612a26565b91505092915050565b600060208284031215612cf457612cf3613965565b5b6000612d0284828501612a3b565b91505092915050565b600060208284031215612d2157612d20613965565b5b600082013567ffffffffffffffff811115612d3f57612d3e613960565b5b612d4b84828501612a7e565b91505092915050565b600060208284031215612d6a57612d69613965565b5b6000612d7884828501612aac565b91505092915050565b6000612d8d838361312e565b60208301905092915050565b612da2816136a9565b82525050565b6000612db382613528565b612dbd8185613556565b9350612dc883613518565b8060005b83811015612df9578151612de08882612d81565b9750612deb83613549565b925050600181019050612dcc565b5085935050505092915050565b612e0f816136bb565b82525050565b6000612e2082613533565b612e2a8185613567565b9350612e3a81856020860161372c565b612e438161396a565b840191505092915050565b6000612e598261353e565b612e638185613578565b9350612e7381856020860161372c565b612e7c8161396a565b840191505092915050565b6000612e928261353e565b612e9c8185613589565b9350612eac81856020860161372c565b80840191505092915050565b6000612ec5602b83613578565b9150612ed08261397b565b604082019050919050565b6000612ee8603283613578565b9150612ef3826139ca565b604082019050919050565b6000612f0b602683613578565b9150612f1682613a19565b604082019050919050565b6000612f2e601c83613578565b9150612f3982613a68565b602082019050919050565b6000612f51602483613578565b9150612f5c82613a91565b604082019050919050565b6000612f74601983613578565b9150612f7f82613ae0565b602082019050919050565b6000612f97602c83613578565b9150612fa282613b09565b604082019050919050565b6000612fba603883613578565b9150612fc582613b58565b604082019050919050565b6000612fdd602a83613578565b9150612fe882613ba7565b604082019050919050565b6000613000602983613578565b915061300b82613bf6565b604082019050919050565b6000613023602083613578565b915061302e82613c45565b602082019050919050565b6000613046602c83613578565b915061305182613c6e565b604082019050919050565b6000613069602083613578565b915061307482613cbd565b602082019050919050565b600061308c602983613578565b915061309782613ce6565b604082019050919050565b60006130af602f83613578565b91506130ba82613d35565b604082019050919050565b60006130d2602183613578565b91506130dd82613d84565b604082019050919050565b60006130f5603183613578565b915061310082613dd3565b604082019050919050565b6000613118602c83613578565b915061312382613e22565b604082019050919050565b61313781613713565b82525050565b61314681613713565b82525050565b60006131588285612e87565b91506131648284612e87565b91508190509392505050565b60006020820190506131856000830184612d99565b92915050565b60006080820190506131a06000830187612d99565b6131ad6020830186612d99565b6131ba604083018561313d565b81810360608301526131cc8184612e15565b905095945050505050565b600060208201905081810360008301526131f18184612da8565b905092915050565b600060208201905061320e6000830184612e06565b92915050565b6000602082019050818103600083015261322e8184612e4e565b905092915050565b6000602082019050818103600083015261324f81612eb8565b9050919050565b6000602082019050818103600083015261326f81612edb565b9050919050565b6000602082019050818103600083015261328f81612efe565b9050919050565b600060208201905081810360008301526132af81612f21565b9050919050565b600060208201905081810360008301526132cf81612f44565b9050919050565b600060208201905081810360008301526132ef81612f67565b9050919050565b6000602082019050818103600083015261330f81612f8a565b9050919050565b6000602082019050818103600083015261332f81612fad565b9050919050565b6000602082019050818103600083015261334f81612fd0565b9050919050565b6000602082019050818103600083015261336f81612ff3565b9050919050565b6000602082019050818103600083015261338f81613016565b9050919050565b600060208201905081810360008301526133af81613039565b9050919050565b600060208201905081810360008301526133cf8161305c565b9050919050565b600060208201905081810360008301526133ef8161307f565b9050919050565b6000602082019050818103600083015261340f816130a2565b9050919050565b6000602082019050818103600083015261342f816130c5565b9050919050565b6000602082019050818103600083015261344f816130e8565b9050919050565b6000602082019050818103600083015261346f8161310b565b9050919050565b600060208201905061348b600083018461313d565b92915050565b600061349b6134ac565b90506134a78282613791565b919050565b6000604051905090565b600067ffffffffffffffff8211156134d1576134d0613927565b5b6134da8261396a565b9050602081019050919050565b600067ffffffffffffffff82111561350257613501613927565b5b61350b8261396a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061359f82613713565b91506135aa83613713565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135df576135de61383c565b5b828201905092915050565b60006135f582613713565b915061360083613713565b9250826136105761360f61386b565b5b828204905092915050565b600061362682613713565b915061363183613713565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561366a5761366961383c565b5b828202905092915050565b600061368082613713565b915061368b83613713565b92508282101561369e5761369d61383c565b5b828203905092915050565b60006136b4826136f3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561374a57808201518184015260208101905061372f565b83811115613759576000848401525b50505050565b6000600282049050600182168061377757607f821691505b6020821081141561378b5761378a61389a565b5b50919050565b61379a8261396a565b810181811067ffffffffffffffff821117156137b9576137b8613927565b5b80604052505050565b60006137cd82613713565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613800576137ff61383c565b5b600182019050919050565b600061381682613713565b915061382183613713565b9250826138315761383061386b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613e7a816136a9565b8114613e8557600080fd5b50565b613e91816136bb565b8114613e9c57600080fd5b50565b613ea8816136c7565b8114613eb357600080fd5b50565b613ebf81613713565b8114613eca57600080fd5b5056fea2646970667358221220047f7bee3377e385afa73f82ad13543ebf3ad053adb85dbc44e66138209acca264736f6c6343000807003368747470733a2f2f74696765727330782e73332e65752d776573742d312e616d617a6f6e6177732e636f6d2f
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80634f6ccce7116101025780638da5cb5b11610095578063c87b56dd11610064578063c87b56dd1461068e578063d5abeb01146106cb578063e985e9c5146106f6578063f2fde38b14610733576101d8565b80638da5cb5b146105e657806395d89b4114610611578063a22cb4651461063c578063b88d4fde14610665576101d8565b80636c0360eb116100d15780636c0360eb1461053e57806370a0823114610569578063715018a6146105a65780637f00c7a6146105bd576101d8565b80634f6ccce71461047057806355f804b3146104ad5780635c975abb146104d65780636352211e14610501576101d8565b8063239c70ae1161017a57806340c10f191161014957806340c10f19146103c557806342842e0e146103e1578063438b63001461040a57806344a0d68a14610447576101d8565b8063239c70ae1461032a57806323b872dd146103555780632f745c591461037e5780633ccfd60b146103bb576101d8565b8063081812fc116101b6578063081812fc1461026e578063095ea7b3146102ab57806313faede6146102d457806318160ddd146102ff576101d8565b806301ffc9a7146101dd57806302329a291461021a57806306fdde0314610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612cb1565b61075c565b60405161021191906131f9565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190612c84565b6107d6565b005b34801561024f57600080fd5b5061025861086f565b6040516102659190613214565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612d54565b610901565b6040516102a29190613170565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190612c44565b610986565b005b3480156102e057600080fd5b506102e9610a9e565b6040516102f69190613476565b60405180910390f35b34801561030b57600080fd5b50610314610aa4565b6040516103219190613476565b60405180910390f35b34801561033657600080fd5b5061033f610ab1565b60405161034c9190613476565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190612b2e565b610ab7565b005b34801561038a57600080fd5b506103a560048036038101906103a09190612c44565b610b17565b6040516103b29190613476565b60405180910390f35b6103c3610bbc565b005b6103df60048036038101906103da9190612c44565b610c78565b005b3480156103ed57600080fd5b5061040860048036038101906104039190612b2e565b610d64565b005b34801561041657600080fd5b50610431600480360381019061042c9190612ac1565b610d84565b60405161043e91906131d7565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190612d54565b610e32565b005b34801561047c57600080fd5b5061049760048036038101906104929190612d54565b610eb8565b6040516104a49190613476565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190612d0b565b610f29565b005b3480156104e257600080fd5b506104eb610fbf565b6040516104f891906131f9565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190612d54565b610fd2565b6040516105359190613170565b60405180910390f35b34801561054a57600080fd5b50610553611084565b6040516105609190613214565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190612ac1565b611112565b60405161059d9190613476565b60405180910390f35b3480156105b257600080fd5b506105bb6111ca565b005b3480156105c957600080fd5b506105e460048036038101906105df9190612d54565b611252565b005b3480156105f257600080fd5b506105fb6112d8565b6040516106089190613170565b60405180910390f35b34801561061d57600080fd5b50610626611302565b6040516106339190613214565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e9190612c04565b611394565b005b34801561067157600080fd5b5061068c60048036038101906106879190612b81565b611515565b005b34801561069a57600080fd5b506106b560048036038101906106b09190612d54565b611577565b6040516106c29190613214565b60405180910390f35b3480156106d757600080fd5b506106e061161e565b6040516106ed9190613476565b60405180910390f35b34801561070257600080fd5b5061071d60048036038101906107189190612aee565b611624565b60405161072a91906131f9565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190612ac1565b6116b8565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cf57506107ce826117b0565b5b9050919050565b6107de611892565b73ffffffffffffffffffffffffffffffffffffffff166107fc6112d8565b73ffffffffffffffffffffffffffffffffffffffff1614610852576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610849906133b6565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b60606000805461087e9061375f565b80601f01602080910402602001604051908101604052809291908181526020018280546108aa9061375f565b80156108f75780601f106108cc576101008083540402835291602001916108f7565b820191906000526020600020905b8154815290600101906020018083116108da57829003601f168201915b5050505050905090565b600061090c8261189a565b61094b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094290613396565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099182610fd2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613416565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a21611892565b73ffffffffffffffffffffffffffffffffffffffff161480610a505750610a4f81610a4a611892565b611624565b5b610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613316565b60405180910390fd5b610a998383611906565b505050565b600b5481565b6000600880549050905090565b600d5481565b610ac8610ac2611892565b826119bf565b610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe90613436565b60405180910390fd5b610b12838383611a9d565b505050565b6000610b2283611112565b8210610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a90613236565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bc4611892565b73ffffffffffffffffffffffffffffffffffffffff16610be26112d8565b73ffffffffffffffffffffffffffffffffffffffff1614610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f906133b6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c7657600080fd5b565b60008111610c8557600080fd5b600d54811115610c9457600080fd5b6122b881600f54610ca59190613594565b1115610cb057600080fd5b610cb86112d8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d1f57600e60009054906101000a900460ff1615610d0457600080fd5b80600b54610d12919061361b565b341015610d1e57600080fd5b5b6000600190505b818111610d5f576000610d37611cf9565b9050610d438482611d16565b610d4b611d34565b508080610d57906137c2565b915050610d26565b505050565b610d7f83838360405180602001604052806000815250611515565b505050565b60606000610d9183611112565b905060008167ffffffffffffffff811115610daf57610dae613927565b5b604051908082528060200260200182016040528015610ddd5781602001602082028036833780820191505090505b50905060005b82811015610e2757610df58582610b17565b828281518110610e0857610e076138f8565b5b6020026020010181815250508080610e1f906137c2565b915050610de3565b508092505050919050565b610e3a611892565b73ffffffffffffffffffffffffffffffffffffffff16610e586112d8565b73ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906133b6565b60405180910390fd5b80600b8190555050565b6000610ec2610aa4565b8210610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90613456565b60405180910390fd5b60088281548110610f1757610f166138f8565b5b90600052602060002001549050919050565b610f31611892565b73ffffffffffffffffffffffffffffffffffffffff16610f4f6112d8565b73ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c906133b6565b60405180910390fd5b80600c9080519060200190610fbb9291906128d5565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290613356565b60405180910390fd5b80915050919050565b600c80546110919061375f565b80601f01602080910402602001604051908101604052809291908181526020018280546110bd9061375f565b801561110a5780601f106110df5761010080835404028352916020019161110a565b820191906000526020600020905b8154815290600101906020018083116110ed57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a90613336565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111d2611892565b73ffffffffffffffffffffffffffffffffffffffff166111f06112d8565b73ffffffffffffffffffffffffffffffffffffffff1614611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d906133b6565b60405180910390fd5b6112506000611d4e565b565b61125a611892565b73ffffffffffffffffffffffffffffffffffffffff166112786112d8565b73ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c5906133b6565b60405180910390fd5b80600d8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113119061375f565b80601f016020809104026020016040519081016040528092919081815260200182805461133d9061375f565b801561138a5780601f1061135f5761010080835404028352916020019161138a565b820191906000526020600020905b81548152906001019060200180831161136d57829003601f168201915b5050505050905090565b61139c611892565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611401906132d6565b60405180910390fd5b8060056000611417611892565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114c4611892565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161150991906131f9565b60405180910390a35050565b611526611520611892565b836119bf565b611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c90613436565b60405180910390fd5b61157184848484611e14565b50505050565b60606115828261189a565b6115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b8906133f6565b60405180910390fd5b60006115cb611e70565b905060008151116115eb5760405180602001604052806000815250611616565b806115f584611f02565b60405160200161160692919061314c565b6040516020818303038152906040525b915050919050565b6122b881565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116c0611892565b73ffffffffffffffffffffffffffffffffffffffff166116de6112d8565b73ffffffffffffffffffffffffffffffffffffffff1614611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b906133b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90613276565b60405180910390fd5b6117ad81611d4e565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061187b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061188b575061188a82612063565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661197983610fd2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119ca8261189a565b611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a00906132f6565b60405180910390fd5b6000611a1483610fd2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a8357508373ffffffffffffffffffffffffffffffffffffffff16611a6b84610901565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a945750611a938185611624565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611abd82610fd2565b73ffffffffffffffffffffffffffffffffffffffff1614611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a906133d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906132b6565b60405180910390fd5b611b8e8383836120cd565b611b99600082611906565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611be99190613675565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c409190613594565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611d116001600f546121e190919063ffffffff16565b905090565b611d308282604051806020016040528060008152506121f7565b5050565b600f6000815480929190611d47906137c2565b9190505550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e1f848484611a9d565b611e2b84848484612252565b611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190613256565b60405180910390fd5b50505050565b6060600c8054611e7f9061375f565b80601f0160208091040260200160405190810160405280929190818152602001828054611eab9061375f565b8015611ef85780601f10611ecd57610100808354040283529160200191611ef8565b820191906000526020600020905b815481529060010190602001808311611edb57829003601f168201915b5050505050905090565b60606000821415611f4a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061205e565b600082905060005b60008214611f7c578080611f65906137c2565b915050600a82611f7591906135ea565b9150611f52565b60008167ffffffffffffffff811115611f9857611f97613927565b5b6040519080825280601f01601f191660200182016040528015611fca5781602001600182028036833780820191505090505b5090505b6000851461205757600182611fe39190613675565b9150600a85611ff2919061380b565b6030611ffe9190613594565b60f81b818381518110612014576120136138f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561205091906135ea565b9450611fce565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120d88383836123e9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561211b57612116816123ee565b61215a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612159576121588382612437565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561219d57612198816125a4565b6121dc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121db576121da8282612675565b5b5b505050565b600081836121ef9190613594565b905092915050565b61220183836126f4565b61220e6000848484612252565b61224d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224490613256565b60405180910390fd5b505050565b60006122738473ffffffffffffffffffffffffffffffffffffffff166128c2565b156123dc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261229c611892565b8786866040518563ffffffff1660e01b81526004016122be949392919061318b565b602060405180830381600087803b1580156122d857600080fd5b505af192505050801561230957506040513d601f19601f820116820180604052508101906123069190612cde565b60015b61238c573d8060008114612339576040519150601f19603f3d011682016040523d82523d6000602084013e61233e565b606091505b50600081511415612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b90613256565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123e1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161244484611112565b61244e9190613675565b9050600060076000848152602001908152602001600020549050818114612533576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125b89190613675565b90506000600960008481526020019081526020016000205490506000600883815481106125e8576125e76138f8565b5b90600052602060002001549050806008838154811061260a576126096138f8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612659576126586138c9565b5b6001900381819060005260206000200160009055905550505050565b600061268083611112565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613376565b60405180910390fd5b61276d8161189a565b156127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490613296565b60405180910390fd5b6127b9600083836120cd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128099190613594565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546128e19061375f565b90600052602060002090601f016020900481019282612903576000855561294a565b82601f1061291c57805160ff191683800117855561294a565b8280016001018555821561294a579182015b8281111561294957825182559160200191906001019061292e565b5b509050612957919061295b565b5090565b5b8082111561297457600081600090555060010161295c565b5090565b600061298b612986846134b6565b613491565b9050828152602081018484840111156129a7576129a661395b565b5b6129b284828561371d565b509392505050565b60006129cd6129c8846134e7565b613491565b9050828152602081018484840111156129e9576129e861395b565b5b6129f484828561371d565b509392505050565b600081359050612a0b81613e71565b92915050565b600081359050612a2081613e88565b92915050565b600081359050612a3581613e9f565b92915050565b600081519050612a4a81613e9f565b92915050565b600082601f830112612a6557612a64613956565b5b8135612a75848260208601612978565b91505092915050565b600082601f830112612a9357612a92613956565b5b8135612aa38482602086016129ba565b91505092915050565b600081359050612abb81613eb6565b92915050565b600060208284031215612ad757612ad6613965565b5b6000612ae5848285016129fc565b91505092915050565b60008060408385031215612b0557612b04613965565b5b6000612b13858286016129fc565b9250506020612b24858286016129fc565b9150509250929050565b600080600060608486031215612b4757612b46613965565b5b6000612b55868287016129fc565b9350506020612b66868287016129fc565b9250506040612b7786828701612aac565b9150509250925092565b60008060008060808587031215612b9b57612b9a613965565b5b6000612ba9878288016129fc565b9450506020612bba878288016129fc565b9350506040612bcb87828801612aac565b925050606085013567ffffffffffffffff811115612bec57612beb613960565b5b612bf887828801612a50565b91505092959194509250565b60008060408385031215612c1b57612c1a613965565b5b6000612c29858286016129fc565b9250506020612c3a85828601612a11565b9150509250929050565b60008060408385031215612c5b57612c5a613965565b5b6000612c69858286016129fc565b9250506020612c7a85828601612aac565b9150509250929050565b600060208284031215612c9a57612c99613965565b5b6000612ca884828501612a11565b91505092915050565b600060208284031215612cc757612cc6613965565b5b6000612cd584828501612a26565b91505092915050565b600060208284031215612cf457612cf3613965565b5b6000612d0284828501612a3b565b91505092915050565b600060208284031215612d2157612d20613965565b5b600082013567ffffffffffffffff811115612d3f57612d3e613960565b5b612d4b84828501612a7e565b91505092915050565b600060208284031215612d6a57612d69613965565b5b6000612d7884828501612aac565b91505092915050565b6000612d8d838361312e565b60208301905092915050565b612da2816136a9565b82525050565b6000612db382613528565b612dbd8185613556565b9350612dc883613518565b8060005b83811015612df9578151612de08882612d81565b9750612deb83613549565b925050600181019050612dcc565b5085935050505092915050565b612e0f816136bb565b82525050565b6000612e2082613533565b612e2a8185613567565b9350612e3a81856020860161372c565b612e438161396a565b840191505092915050565b6000612e598261353e565b612e638185613578565b9350612e7381856020860161372c565b612e7c8161396a565b840191505092915050565b6000612e928261353e565b612e9c8185613589565b9350612eac81856020860161372c565b80840191505092915050565b6000612ec5602b83613578565b9150612ed08261397b565b604082019050919050565b6000612ee8603283613578565b9150612ef3826139ca565b604082019050919050565b6000612f0b602683613578565b9150612f1682613a19565b604082019050919050565b6000612f2e601c83613578565b9150612f3982613a68565b602082019050919050565b6000612f51602483613578565b9150612f5c82613a91565b604082019050919050565b6000612f74601983613578565b9150612f7f82613ae0565b602082019050919050565b6000612f97602c83613578565b9150612fa282613b09565b604082019050919050565b6000612fba603883613578565b9150612fc582613b58565b604082019050919050565b6000612fdd602a83613578565b9150612fe882613ba7565b604082019050919050565b6000613000602983613578565b915061300b82613bf6565b604082019050919050565b6000613023602083613578565b915061302e82613c45565b602082019050919050565b6000613046602c83613578565b915061305182613c6e565b604082019050919050565b6000613069602083613578565b915061307482613cbd565b602082019050919050565b600061308c602983613578565b915061309782613ce6565b604082019050919050565b60006130af602f83613578565b91506130ba82613d35565b604082019050919050565b60006130d2602183613578565b91506130dd82613d84565b604082019050919050565b60006130f5603183613578565b915061310082613dd3565b604082019050919050565b6000613118602c83613578565b915061312382613e22565b604082019050919050565b61313781613713565b82525050565b61314681613713565b82525050565b60006131588285612e87565b91506131648284612e87565b91508190509392505050565b60006020820190506131856000830184612d99565b92915050565b60006080820190506131a06000830187612d99565b6131ad6020830186612d99565b6131ba604083018561313d565b81810360608301526131cc8184612e15565b905095945050505050565b600060208201905081810360008301526131f18184612da8565b905092915050565b600060208201905061320e6000830184612e06565b92915050565b6000602082019050818103600083015261322e8184612e4e565b905092915050565b6000602082019050818103600083015261324f81612eb8565b9050919050565b6000602082019050818103600083015261326f81612edb565b9050919050565b6000602082019050818103600083015261328f81612efe565b9050919050565b600060208201905081810360008301526132af81612f21565b9050919050565b600060208201905081810360008301526132cf81612f44565b9050919050565b600060208201905081810360008301526132ef81612f67565b9050919050565b6000602082019050818103600083015261330f81612f8a565b9050919050565b6000602082019050818103600083015261332f81612fad565b9050919050565b6000602082019050818103600083015261334f81612fd0565b9050919050565b6000602082019050818103600083015261336f81612ff3565b9050919050565b6000602082019050818103600083015261338f81613016565b9050919050565b600060208201905081810360008301526133af81613039565b9050919050565b600060208201905081810360008301526133cf8161305c565b9050919050565b600060208201905081810360008301526133ef8161307f565b9050919050565b6000602082019050818103600083015261340f816130a2565b9050919050565b6000602082019050818103600083015261342f816130c5565b9050919050565b6000602082019050818103600083015261344f816130e8565b9050919050565b6000602082019050818103600083015261346f8161310b565b9050919050565b600060208201905061348b600083018461313d565b92915050565b600061349b6134ac565b90506134a78282613791565b919050565b6000604051905090565b600067ffffffffffffffff8211156134d1576134d0613927565b5b6134da8261396a565b9050602081019050919050565b600067ffffffffffffffff82111561350257613501613927565b5b61350b8261396a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061359f82613713565b91506135aa83613713565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135df576135de61383c565b5b828201905092915050565b60006135f582613713565b915061360083613713565b9250826136105761360f61386b565b5b828204905092915050565b600061362682613713565b915061363183613713565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561366a5761366961383c565b5b828202905092915050565b600061368082613713565b915061368b83613713565b92508282101561369e5761369d61383c565b5b828203905092915050565b60006136b4826136f3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561374a57808201518184015260208101905061372f565b83811115613759576000848401525b50505050565b6000600282049050600182168061377757607f821691505b6020821081141561378b5761378a61389a565b5b50919050565b61379a8261396a565b810181811067ffffffffffffffff821117156137b9576137b8613927565b5b80604052505050565b60006137cd82613713565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613800576137ff61383c565b5b600182019050919050565b600061381682613713565b915061382183613713565b9250826138315761383061386b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613e7a816136a9565b8114613e8557600080fd5b50565b613e91816136bb565b8114613e9c57600080fd5b50565b613ea8816136c7565b8114613eb357600080fd5b50565b613ebf81613713565b8114613eca57600080fd5b5056fea2646970667358221220047f7bee3377e385afa73f82ad13543ebf3ad053adb85dbc44e66138209acca264736f6c63430008070033
Deployed Bytecode Sourcemap
49071:3284:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33760:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51749:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20878:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22437:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21960:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49154:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34400:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49277:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23327:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34068:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51830:144;;;:::i;:::-;;49851:671;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23737:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50717:637;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51431:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34590:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51643:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49317:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20572:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49191:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20302:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41481:94;;;;;;;;;;;;;:::i;:::-;;51519:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40830:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21047:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22730:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23993:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21222:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49232:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23096:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41730:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33760:224;33862:4;33901:35;33886:50;;;:11;:50;;;;:90;;;;33940:36;33964:11;33940:23;:36::i;:::-;33886:90;33879:97;;33760:224;;;:::o;51749:75::-;41061:12;:10;:12::i;:::-;41050:23;;:7;:5;:7::i;:::-;:23;;;41042:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51812:6:::1;51803;;:15;;;;;;;;;;;;;;;;;;51749:75:::0;:::o;20878:100::-;20932:13;20965:5;20958:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20878:100;:::o;22437:221::-;22513:7;22541:16;22549:7;22541;:16::i;:::-;22533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22626:15;:24;22642:7;22626:24;;;;;;;;;;;;;;;;;;;;;22619:31;;22437:221;;;:::o;21960:411::-;22041:13;22057:23;22072:7;22057:14;:23::i;:::-;22041:39;;22105:5;22099:11;;:2;:11;;;;22091:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22199:5;22183:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22208:37;22225:5;22232:12;:10;:12::i;:::-;22208:16;:37::i;:::-;22183:62;22161:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22342:21;22351:2;22355:7;22342:8;:21::i;:::-;22030:341;21960:411;;:::o;49154:32::-;;;;:::o;34400:113::-;34461:7;34488:10;:17;;;;34481:24;;34400:113;:::o;49277:33::-;;;;:::o;23327:339::-;23522:41;23541:12;:10;:12::i;:::-;23555:7;23522:18;:41::i;:::-;23514:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23630:28;23640:4;23646:2;23650:7;23630:9;:28::i;:::-;23327:339;;;:::o;34068:256::-;34165:7;34201:23;34218:5;34201:16;:23::i;:::-;34193:5;:31;34185:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34290:12;:19;34303:5;34290:19;;;;;;;;;;;;;;;:26;34310:5;34290:26;;;;;;;;;;;;34283:33;;34068:256;;;;:::o;51830:144::-;41061:12;:10;:12::i;:::-;41050:23;;:7;:5;:7::i;:::-;:23;;;41042:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51898:10:::1;51890:24;;:47;51915:21;51890:47;;;;;;;;;;;;;;;;;;;;;;;51882:56;;;::::0;::::1;;51830:144::o:0;49851:671::-;49943:1;49929:11;:15;49921:24;;;;;;49975:13;;49960:11;:28;;49952:37;;;;;;49268:4;50022:11;50004:15;;:29;;;;:::i;:::-;:42;;49996:51;;;;;;50111:7;:5;:7::i;:::-;50097:21;;:10;:21;;;50094:251;;50138:6;;;;;;;;;;;50137:7;50129:16;;;;;;50182:11;50175:4;;:18;;;;:::i;:::-;50162:9;:31;;50154:40;;;;;;50094:251;50357:9;50369:1;50357:13;;50353:162;50377:11;50372:1;:16;50353:162;;50406:18;50427:17;:15;:17::i;:::-;50406:38;;50453:26;50463:3;50468:10;50453:9;:26::i;:::-;50488:19;:17;:19::i;:::-;50395:120;50390:3;;;;;:::i;:::-;;;;50353:162;;;;49851:671;;:::o;23737:185::-;23875:39;23892:4;23898:2;23902:7;23875:39;;;;;;;;;;;;:16;:39::i;:::-;23737:185;;;:::o;50717:637::-;50777:16;50805:23;50831:17;50841:6;50831:9;:17::i;:::-;50805:43;;50907:25;50949:15;50935:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50907:58;;51085:9;51081:246;51100:15;51096:1;:19;51081:246;;;51145:30;51165:6;51173:1;51145:19;:30::i;:::-;51131:8;51140:1;51131:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;51117:3;;;;;:::i;:::-;;;;51081:246;;;;51340:8;51333:15;;;;50717:637;;;:::o;51431:82::-;41061:12;:10;:12::i;:::-;41050:23;;:7;:5;:7::i;:::-;:23;;;41042:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51499:8:::1;51492:4;:15;;;;51431:82:::0;:::o;34590:233::-;34665:7;34701:30;:28;:30::i;:::-;34693:5;:38;34685:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34798:10;34809:5;34798:17;;;;;;;;:::i;:::-;;;;;;;;;;34791:24;;34590:233;;;:::o;51643:100::-;41061:12;:10;:12::i;:::-;41050:23;;:7;:5;:7::i;:::-;:23;;;41042:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51726:11:::1;51716:7;:21;;;;;;;;;;;;:::i;:::-;;51643:100:::0;:::o;49317:26::-;;;;;;;;;;;;;:::o;20572:239::-;20644:7;20664:13;20680:7;:16;20688:7;20680:16;;;;;;;;;;;;;;;;;;;;;20664:32;;20732:1;20715:19;;:5;:19;;;;20707:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20798:5;20791:12;;;20572:239;;;:::o;49191:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20302:208::-;20374:7;20419:1;20402:19;;:5;:19;;;;20394:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20486:9;:16;20496:5;20486:16;;;;;;;;;;;;;;;;20479:23;;20302:208;;;:::o;41481:94::-;41061:12;:10;:12::i;:::-;41050:23;;:7;:5;:7::i;:::-;:23;;;41042:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41546:21:::1;41564:1;41546:9;:21::i;:::-;41481:94::o:0;51519:118::-;41061:12;:10;:12::i;:::-;41050:23;;:7;:5;:7::i;:::-;:23;;;41042:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51614:17:::1;51598:13;:33;;;;51519:118:::0;:::o;40830:87::-;40876:7;40903:6;;;;;;;;;;;40896:13;;40830:87;:::o;21047:104::-;21103:13;21136:7;21129:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21047:104;:::o;22730:295::-;22845:12;:10;:12::i;:::-;22833:24;;:8;:24;;;;22825:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22945:8;22900:18;:32;22919:12;:10;:12::i;:::-;22900:32;;;;;;;;;;;;;;;:42;22933:8;22900:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22998:8;22969:48;;22984:12;:10;:12::i;:::-;22969:48;;;23008:8;22969:48;;;;;;:::i;:::-;;;;;;;;22730:295;;:::o;23993:328::-;24168:41;24187:12;:10;:12::i;:::-;24201:7;24168:18;:41::i;:::-;24160:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24274:39;24288:4;24294:2;24298:7;24307:5;24274:13;:39::i;:::-;23993:328;;;;:::o;21222:334::-;21295:13;21329:16;21337:7;21329;:16::i;:::-;21321:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21410:21;21434:10;:8;:10::i;:::-;21410:34;;21486:1;21468:7;21462:21;:25;:86;;;;;;;;;;;;;;;;;21514:7;21523:18;:7;:16;:18::i;:::-;21497:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21462:86;21455:93;;;21222:334;;;:::o;49232:40::-;49268:4;49232:40;:::o;23096:164::-;23193:4;23217:18;:25;23236:5;23217:25;;;;;;;;;;;;;;;:35;23243:8;23217:35;;;;;;;;;;;;;;;;;;;;;;;;;23210:42;;23096:164;;;;:::o;41730:192::-;41061:12;:10;:12::i;:::-;41050:23;;:7;:5;:7::i;:::-;:23;;;41042:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41839:1:::1;41819:22;;:8;:22;;;;41811:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41895:19;41905:8;41895:9;:19::i;:::-;41730:192:::0;:::o;19933:305::-;20035:4;20087:25;20072:40;;;:11;:40;;;;:105;;;;20144:33;20129:48;;;:11;:48;;;;20072:105;:158;;;;20194:36;20218:11;20194:23;:36::i;:::-;20072:158;20052:178;;19933:305;;;:::o;8066:98::-;8119:7;8146:10;8139:17;;8066:98;:::o;25831:127::-;25896:4;25948:1;25920:30;;:7;:16;25928:7;25920:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25913:37;;25831:127;;;:::o;29813:174::-;29915:2;29888:15;:24;29904:7;29888:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29971:7;29967:2;29933:46;;29942:23;29957:7;29942:14;:23::i;:::-;29933:46;;;;;;;;;;;;29813:174;;:::o;26125:348::-;26218:4;26243:16;26251:7;26243;:16::i;:::-;26235:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26319:13;26335:23;26350:7;26335:14;:23::i;:::-;26319:39;;26388:5;26377:16;;:7;:16;;;:51;;;;26421:7;26397:31;;:20;26409:7;26397:11;:20::i;:::-;:31;;;26377:51;:87;;;;26432:32;26449:5;26456:7;26432:16;:32::i;:::-;26377:87;26369:96;;;26125:348;;;;:::o;29117:578::-;29276:4;29249:31;;:23;29264:7;29249:14;:23::i;:::-;:31;;;29241:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29359:1;29345:16;;:2;:16;;;;29337:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29415:39;29436:4;29442:2;29446:7;29415:20;:39::i;:::-;29519:29;29536:1;29540:7;29519:8;:29::i;:::-;29580:1;29561:9;:15;29571:4;29561:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29609:1;29592:9;:13;29602:2;29592:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29640:2;29621:7;:16;29629:7;29621:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29679:7;29675:2;29660:27;;29669:4;29660:27;;;;;;;;;;;;29117:578;;;:::o;52112:100::-;52161:7;52184:22;52204:1;52184:15;;:19;;:22;;;;:::i;:::-;52177:29;;52112:100;:::o;26815:110::-;26891:26;26901:2;26905:7;26891:26;;;;;;;;;;;;:9;:26::i;:::-;26815:110;;:::o;52283:67::-;52327:15;;:17;;;;;;;;;:::i;:::-;;;;;;52283:67::o;41930:173::-;41986:16;42005:6;;;;;;;;;;;41986:25;;42031:8;42022:6;;:17;;;;;;;;;;;;;;;;;;42086:8;42055:40;;42076:8;42055:40;;;;;;;;;;;;41975:128;41930:173;:::o;25203:315::-;25360:28;25370:4;25376:2;25380:7;25360:9;:28::i;:::-;25407:48;25430:4;25436:2;25440:7;25449:5;25407:22;:48::i;:::-;25399:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25203:315;;;;:::o;49743:102::-;49803:13;49832:7;49825:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49743:102;:::o;5761:723::-;5817:13;6047:1;6038:5;:10;6034:53;;;6065:10;;;;;;;;;;;;;;;;;;;;;6034:53;6097:12;6112:5;6097:20;;6128:14;6153:78;6168:1;6160:4;:9;6153:78;;6186:8;;;;;:::i;:::-;;;;6217:2;6209:10;;;;;:::i;:::-;;;6153:78;;;6241:19;6273:6;6263:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6241:39;;6291:154;6307:1;6298:5;:10;6291:154;;6335:1;6325:11;;;;;:::i;:::-;;;6402:2;6394:5;:10;;;;:::i;:::-;6381:2;:24;;;;:::i;:::-;6368:39;;6351:6;6358;6351:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6431:2;6422:11;;;;;:::i;:::-;;;6291:154;;;6469:6;6455:21;;;;;5761:723;;;;:::o;18540:157::-;18625:4;18664:25;18649:40;;;:11;:40;;;;18642:47;;18540:157;;;:::o;35436:589::-;35580:45;35607:4;35613:2;35617:7;35580:26;:45::i;:::-;35658:1;35642:18;;:4;:18;;;35638:187;;;35677:40;35709:7;35677:31;:40::i;:::-;35638:187;;;35747:2;35739:10;;:4;:10;;;35735:90;;35766:47;35799:4;35805:7;35766:32;:47::i;:::-;35735:90;35638:187;35853:1;35839:16;;:2;:16;;;35835:183;;;35872:45;35909:7;35872:36;:45::i;:::-;35835:183;;;35945:4;35939:10;;:2;:10;;;35935:83;;35966:40;35994:2;35998:7;35966:27;:40::i;:::-;35935:83;35835:183;35436:589;;;:::o;44819:98::-;44877:7;44908:1;44904;:5;;;;:::i;:::-;44897:12;;44819:98;;;;:::o;27152:321::-;27282:18;27288:2;27292:7;27282:5;:18::i;:::-;27333:54;27364:1;27368:2;27372:7;27381:5;27333:22;:54::i;:::-;27311:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27152:321;;;:::o;30552:799::-;30707:4;30728:15;:2;:13;;;:15::i;:::-;30724:620;;;30780:2;30764:36;;;30801:12;:10;:12::i;:::-;30815:4;30821:7;30830:5;30764:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30760:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31023:1;31006:6;:13;:18;31002:272;;;31049:60;;;;;;;;;;:::i;:::-;;;;;;;;31002:272;31224:6;31218:13;31209:6;31205:2;31201:15;31194:38;30760:529;30897:41;;;30887:51;;;:6;:51;;;;30880:58;;;;;30724:620;31328:4;31321:11;;30552:799;;;;;;;:::o;31923:126::-;;;;:::o;36748:164::-;36852:10;:17;;;;36825:15;:24;36841:7;36825:24;;;;;;;;;;;:44;;;;36880:10;36896:7;36880:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36748:164;:::o;37539:988::-;37805:22;37855:1;37830:22;37847:4;37830:16;:22::i;:::-;:26;;;;:::i;:::-;37805:51;;37867:18;37888:17;:26;37906:7;37888:26;;;;;;;;;;;;37867:47;;38035:14;38021:10;:28;38017:328;;38066:19;38088:12;:18;38101:4;38088:18;;;;;;;;;;;;;;;:34;38107:14;38088:34;;;;;;;;;;;;38066:56;;38172:11;38139:12;:18;38152:4;38139:18;;;;;;;;;;;;;;;:30;38158:10;38139:30;;;;;;;;;;;:44;;;;38289:10;38256:17;:30;38274:11;38256:30;;;;;;;;;;;:43;;;;38051:294;38017:328;38441:17;:26;38459:7;38441:26;;;;;;;;;;;38434:33;;;38485:12;:18;38498:4;38485:18;;;;;;;;;;;;;;;:34;38504:14;38485:34;;;;;;;;;;;38478:41;;;37620:907;;37539:988;;:::o;38822:1079::-;39075:22;39120:1;39100:10;:17;;;;:21;;;;:::i;:::-;39075:46;;39132:18;39153:15;:24;39169:7;39153:24;;;;;;;;;;;;39132:45;;39504:19;39526:10;39537:14;39526:26;;;;;;;;:::i;:::-;;;;;;;;;;39504:48;;39590:11;39565:10;39576;39565:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39701:10;39670:15;:28;39686:11;39670:28;;;;;;;;;;;:41;;;;39842:15;:24;39858:7;39842:24;;;;;;;;;;;39835:31;;;39877:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38893:1008;;;38822:1079;:::o;36326:221::-;36411:14;36428:20;36445:2;36428:16;:20::i;:::-;36411:37;;36486:7;36459:12;:16;36472:2;36459:16;;;;;;;;;;;;;;;:24;36476:6;36459:24;;;;;;;;;;;:34;;;;36533:6;36504:17;:26;36522:7;36504:26;;;;;;;;;;;:35;;;;36400:147;36326:221;;:::o;27809:382::-;27903:1;27889:16;;:2;:16;;;;27881:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27962:16;27970:7;27962;:16::i;:::-;27961:17;27953:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28024:45;28053:1;28057:2;28061:7;28024:20;:45::i;:::-;28099:1;28082:9;:13;28092:2;28082:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28130:2;28111:7;:16;28119:7;28111:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28175:7;28171:2;28150:33;;28167:1;28150:33;;;;;;;;;;;;27809:382;;:::o;10495:387::-;10555:4;10763:12;10830:7;10818:20;10810:28;;10873:1;10866:4;:8;10859:15;;;10495:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:179::-;7556:10;7577:46;7619:3;7611:6;7577:46;:::i;:::-;7655:4;7650:3;7646:14;7632:28;;7487:179;;;;:::o;7672:118::-;7759:24;7777:5;7759:24;:::i;:::-;7754:3;7747:37;7672:118;;:::o;7826:732::-;7945:3;7974:54;8022:5;7974:54;:::i;:::-;8044:86;8123:6;8118:3;8044:86;:::i;:::-;8037:93;;8154:56;8204:5;8154:56;:::i;:::-;8233:7;8264:1;8249:284;8274:6;8271:1;8268:13;8249:284;;;8350:6;8344:13;8377:63;8436:3;8421:13;8377:63;:::i;:::-;8370:70;;8463:60;8516:6;8463:60;:::i;:::-;8453:70;;8309:224;8296:1;8293;8289:9;8284:14;;8249:284;;;8253:14;8549:3;8542:10;;7950:608;;;7826:732;;;;:::o;8564:109::-;8645:21;8660:5;8645:21;:::i;:::-;8640:3;8633:34;8564:109;;:::o;8679:360::-;8765:3;8793:38;8825:5;8793:38;:::i;:::-;8847:70;8910:6;8905:3;8847:70;:::i;:::-;8840:77;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:29;9025:6;9003:29;:::i;:::-;8998:3;8994:39;8987:46;;8769:270;8679:360;;;;:::o;9045:364::-;9133:3;9161:39;9194:5;9161:39;:::i;:::-;9216:71;9280:6;9275:3;9216:71;:::i;:::-;9209:78;;9296:52;9341:6;9336:3;9329:4;9322:5;9318:16;9296:52;:::i;:::-;9373:29;9395:6;9373:29;:::i;:::-;9368:3;9364:39;9357:46;;9137:272;9045:364;;;;:::o;9415:377::-;9521:3;9549:39;9582:5;9549:39;:::i;:::-;9604:89;9686:6;9681:3;9604:89;:::i;:::-;9597:96;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:6;9774:3;9770:16;9763:23;;9525:267;9415:377;;;;:::o;9798:366::-;9940:3;9961:67;10025:2;10020:3;9961:67;:::i;:::-;9954:74;;10037:93;10126:3;10037:93;:::i;:::-;10155:2;10150:3;10146:12;10139:19;;9798:366;;;:::o;10170:::-;10312:3;10333:67;10397:2;10392:3;10333:67;:::i;:::-;10326:74;;10409:93;10498:3;10409:93;:::i;:::-;10527:2;10522:3;10518:12;10511:19;;10170:366;;;:::o;10542:::-;10684:3;10705:67;10769:2;10764:3;10705:67;:::i;:::-;10698:74;;10781:93;10870:3;10781:93;:::i;:::-;10899:2;10894:3;10890:12;10883:19;;10542:366;;;:::o;10914:::-;11056:3;11077:67;11141:2;11136:3;11077:67;:::i;:::-;11070:74;;11153:93;11242:3;11153:93;:::i;:::-;11271:2;11266:3;11262:12;11255:19;;10914:366;;;:::o;11286:::-;11428:3;11449:67;11513:2;11508:3;11449:67;:::i;:::-;11442:74;;11525:93;11614:3;11525:93;:::i;:::-;11643:2;11638:3;11634:12;11627:19;;11286:366;;;:::o;11658:::-;11800:3;11821:67;11885:2;11880:3;11821:67;:::i;:::-;11814:74;;11897:93;11986:3;11897:93;:::i;:::-;12015:2;12010:3;12006:12;11999:19;;11658:366;;;:::o;12030:::-;12172:3;12193:67;12257:2;12252:3;12193:67;:::i;:::-;12186:74;;12269:93;12358:3;12269:93;:::i;:::-;12387:2;12382:3;12378:12;12371:19;;12030:366;;;:::o;12402:::-;12544:3;12565:67;12629:2;12624:3;12565:67;:::i;:::-;12558:74;;12641:93;12730:3;12641:93;:::i;:::-;12759:2;12754:3;12750:12;12743:19;;12402:366;;;:::o;12774:::-;12916:3;12937:67;13001:2;12996:3;12937:67;:::i;:::-;12930:74;;13013:93;13102:3;13013:93;:::i;:::-;13131:2;13126:3;13122:12;13115:19;;12774:366;;;:::o;13146:::-;13288:3;13309:67;13373:2;13368:3;13309:67;:::i;:::-;13302:74;;13385:93;13474:3;13385:93;:::i;:::-;13503:2;13498:3;13494:12;13487:19;;13146:366;;;:::o;13518:::-;13660:3;13681:67;13745:2;13740:3;13681:67;:::i;:::-;13674:74;;13757:93;13846:3;13757:93;:::i;:::-;13875:2;13870:3;13866:12;13859:19;;13518:366;;;:::o;13890:::-;14032:3;14053:67;14117:2;14112:3;14053:67;:::i;:::-;14046:74;;14129:93;14218:3;14129:93;:::i;:::-;14247:2;14242:3;14238:12;14231:19;;13890:366;;;:::o;14262:::-;14404:3;14425:67;14489:2;14484:3;14425:67;:::i;:::-;14418:74;;14501:93;14590:3;14501:93;:::i;:::-;14619:2;14614:3;14610:12;14603:19;;14262:366;;;:::o;14634:::-;14776:3;14797:67;14861:2;14856:3;14797:67;:::i;:::-;14790:74;;14873:93;14962:3;14873:93;:::i;:::-;14991:2;14986:3;14982:12;14975:19;;14634:366;;;:::o;15006:::-;15148:3;15169:67;15233:2;15228:3;15169:67;:::i;:::-;15162:74;;15245:93;15334:3;15245:93;:::i;:::-;15363:2;15358:3;15354:12;15347:19;;15006:366;;;:::o;15378:::-;15520:3;15541:67;15605:2;15600:3;15541:67;:::i;:::-;15534:74;;15617:93;15706:3;15617:93;:::i;:::-;15735:2;15730:3;15726:12;15719:19;;15378:366;;;:::o;15750:::-;15892:3;15913:67;15977:2;15972:3;15913:67;:::i;:::-;15906:74;;15989:93;16078:3;15989:93;:::i;:::-;16107:2;16102:3;16098:12;16091:19;;15750:366;;;:::o;16122:::-;16264:3;16285:67;16349:2;16344:3;16285:67;:::i;:::-;16278:74;;16361:93;16450:3;16361:93;:::i;:::-;16479:2;16474:3;16470:12;16463:19;;16122:366;;;:::o;16494:108::-;16571:24;16589:5;16571:24;:::i;:::-;16566:3;16559:37;16494:108;;:::o;16608:118::-;16695:24;16713:5;16695:24;:::i;:::-;16690:3;16683:37;16608:118;;:::o;16732:435::-;16912:3;16934:95;17025:3;17016:6;16934:95;:::i;:::-;16927:102;;17046:95;17137:3;17128:6;17046:95;:::i;:::-;17039:102;;17158:3;17151:10;;16732:435;;;;;:::o;17173:222::-;17266:4;17304:2;17293:9;17289:18;17281:26;;17317:71;17385:1;17374:9;17370:17;17361:6;17317:71;:::i;:::-;17173:222;;;;:::o;17401:640::-;17596:4;17634:3;17623:9;17619:19;17611:27;;17648:71;17716:1;17705:9;17701:17;17692:6;17648:71;:::i;:::-;17729:72;17797:2;17786:9;17782:18;17773:6;17729:72;:::i;:::-;17811;17879:2;17868:9;17864:18;17855:6;17811:72;:::i;:::-;17930:9;17924:4;17920:20;17915:2;17904:9;17900:18;17893:48;17958:76;18029:4;18020:6;17958:76;:::i;:::-;17950:84;;17401:640;;;;;;;:::o;18047:373::-;18190:4;18228:2;18217:9;18213:18;18205:26;;18277:9;18271:4;18267:20;18263:1;18252:9;18248:17;18241:47;18305:108;18408:4;18399:6;18305:108;:::i;:::-;18297:116;;18047:373;;;;:::o;18426:210::-;18513:4;18551:2;18540:9;18536:18;18528:26;;18564:65;18626:1;18615:9;18611:17;18602:6;18564:65;:::i;:::-;18426:210;;;;:::o;18642:313::-;18755:4;18793:2;18782:9;18778:18;18770:26;;18842:9;18836:4;18832:20;18828:1;18817:9;18813:17;18806:47;18870:78;18943:4;18934:6;18870:78;:::i;:::-;18862:86;;18642:313;;;;:::o;18961:419::-;19127:4;19165:2;19154:9;19150:18;19142:26;;19214:9;19208:4;19204:20;19200:1;19189:9;19185:17;19178:47;19242:131;19368:4;19242:131;:::i;:::-;19234:139;;18961:419;;;:::o;19386:::-;19552:4;19590:2;19579:9;19575:18;19567:26;;19639:9;19633:4;19629:20;19625:1;19614:9;19610:17;19603:47;19667:131;19793:4;19667:131;:::i;:::-;19659:139;;19386:419;;;:::o;19811:::-;19977:4;20015:2;20004:9;20000:18;19992:26;;20064:9;20058:4;20054:20;20050:1;20039:9;20035:17;20028:47;20092:131;20218:4;20092:131;:::i;:::-;20084:139;;19811:419;;;:::o;20236:::-;20402:4;20440:2;20429:9;20425:18;20417:26;;20489:9;20483:4;20479:20;20475:1;20464:9;20460:17;20453:47;20517:131;20643:4;20517:131;:::i;:::-;20509:139;;20236:419;;;:::o;20661:::-;20827:4;20865:2;20854:9;20850:18;20842:26;;20914:9;20908:4;20904:20;20900:1;20889:9;20885:17;20878:47;20942:131;21068:4;20942:131;:::i;:::-;20934:139;;20661:419;;;:::o;21086:::-;21252:4;21290:2;21279:9;21275:18;21267:26;;21339:9;21333:4;21329:20;21325:1;21314:9;21310:17;21303:47;21367:131;21493:4;21367:131;:::i;:::-;21359:139;;21086:419;;;:::o;21511:::-;21677:4;21715:2;21704:9;21700:18;21692:26;;21764:9;21758:4;21754:20;21750:1;21739:9;21735:17;21728:47;21792:131;21918:4;21792:131;:::i;:::-;21784:139;;21511:419;;;:::o;21936:::-;22102:4;22140:2;22129:9;22125:18;22117:26;;22189:9;22183:4;22179:20;22175:1;22164:9;22160:17;22153:47;22217:131;22343:4;22217:131;:::i;:::-;22209:139;;21936:419;;;:::o;22361:::-;22527:4;22565:2;22554:9;22550:18;22542:26;;22614:9;22608:4;22604:20;22600:1;22589:9;22585:17;22578:47;22642:131;22768:4;22642:131;:::i;:::-;22634:139;;22361:419;;;:::o;22786:::-;22952:4;22990:2;22979:9;22975:18;22967:26;;23039:9;23033:4;23029:20;23025:1;23014:9;23010:17;23003:47;23067:131;23193:4;23067:131;:::i;:::-;23059:139;;22786:419;;;:::o;23211:::-;23377:4;23415:2;23404:9;23400:18;23392:26;;23464:9;23458:4;23454:20;23450:1;23439:9;23435:17;23428:47;23492:131;23618:4;23492:131;:::i;:::-;23484:139;;23211:419;;;:::o;23636:::-;23802:4;23840:2;23829:9;23825:18;23817:26;;23889:9;23883:4;23879:20;23875:1;23864:9;23860:17;23853:47;23917:131;24043:4;23917:131;:::i;:::-;23909:139;;23636:419;;;:::o;24061:::-;24227:4;24265:2;24254:9;24250:18;24242:26;;24314:9;24308:4;24304:20;24300:1;24289:9;24285:17;24278:47;24342:131;24468:4;24342:131;:::i;:::-;24334:139;;24061:419;;;:::o;24486:::-;24652:4;24690:2;24679:9;24675:18;24667:26;;24739:9;24733:4;24729:20;24725:1;24714:9;24710:17;24703:47;24767:131;24893:4;24767:131;:::i;:::-;24759:139;;24486:419;;;:::o;24911:::-;25077:4;25115:2;25104:9;25100:18;25092:26;;25164:9;25158:4;25154:20;25150:1;25139:9;25135:17;25128:47;25192:131;25318:4;25192:131;:::i;:::-;25184:139;;24911:419;;;:::o;25336:::-;25502:4;25540:2;25529:9;25525:18;25517:26;;25589:9;25583:4;25579:20;25575:1;25564:9;25560:17;25553:47;25617:131;25743:4;25617:131;:::i;:::-;25609:139;;25336:419;;;:::o;25761:::-;25927:4;25965:2;25954:9;25950:18;25942:26;;26014:9;26008:4;26004:20;26000:1;25989:9;25985:17;25978:47;26042:131;26168:4;26042:131;:::i;:::-;26034:139;;25761:419;;;:::o;26186:::-;26352:4;26390:2;26379:9;26375:18;26367:26;;26439:9;26433:4;26429:20;26425:1;26414:9;26410:17;26403:47;26467:131;26593:4;26467:131;:::i;:::-;26459:139;;26186:419;;;:::o;26611:222::-;26704:4;26742:2;26731:9;26727:18;26719:26;;26755:71;26823:1;26812:9;26808:17;26799:6;26755:71;:::i;:::-;26611:222;;;;:::o;26839:129::-;26873:6;26900:20;;:::i;:::-;26890:30;;26929:33;26957:4;26949:6;26929:33;:::i;:::-;26839:129;;;:::o;26974:75::-;27007:6;27040:2;27034:9;27024:19;;26974:75;:::o;27055:307::-;27116:4;27206:18;27198:6;27195:30;27192:56;;;27228:18;;:::i;:::-;27192:56;27266:29;27288:6;27266:29;:::i;:::-;27258:37;;27350:4;27344;27340:15;27332:23;;27055:307;;;:::o;27368:308::-;27430:4;27520:18;27512:6;27509:30;27506:56;;;27542:18;;:::i;:::-;27506:56;27580:29;27602:6;27580:29;:::i;:::-;27572:37;;27664:4;27658;27654:15;27646:23;;27368:308;;;:::o;27682:132::-;27749:4;27772:3;27764:11;;27802:4;27797:3;27793:14;27785:22;;27682:132;;;:::o;27820:114::-;27887:6;27921:5;27915:12;27905:22;;27820:114;;;:::o;27940:98::-;27991:6;28025:5;28019:12;28009:22;;27940:98;;;:::o;28044:99::-;28096:6;28130:5;28124:12;28114:22;;28044:99;;;:::o;28149:113::-;28219:4;28251;28246:3;28242:14;28234:22;;28149:113;;;:::o;28268:184::-;28367:11;28401:6;28396:3;28389:19;28441:4;28436:3;28432:14;28417:29;;28268:184;;;;:::o;28458:168::-;28541:11;28575:6;28570:3;28563:19;28615:4;28610:3;28606:14;28591:29;;28458:168;;;;:::o;28632:169::-;28716:11;28750:6;28745:3;28738:19;28790:4;28785:3;28781:14;28766:29;;28632:169;;;;:::o;28807:148::-;28909:11;28946:3;28931:18;;28807:148;;;;:::o;28961:305::-;29001:3;29020:20;29038:1;29020:20;:::i;:::-;29015:25;;29054:20;29072:1;29054:20;:::i;:::-;29049:25;;29208:1;29140:66;29136:74;29133:1;29130:81;29127:107;;;29214:18;;:::i;:::-;29127:107;29258:1;29255;29251:9;29244:16;;28961:305;;;;:::o;29272:185::-;29312:1;29329:20;29347:1;29329:20;:::i;:::-;29324:25;;29363:20;29381:1;29363:20;:::i;:::-;29358:25;;29402:1;29392:35;;29407:18;;:::i;:::-;29392:35;29449:1;29446;29442:9;29437:14;;29272:185;;;;:::o;29463:348::-;29503:7;29526:20;29544:1;29526:20;:::i;:::-;29521:25;;29560:20;29578:1;29560:20;:::i;:::-;29555:25;;29748:1;29680:66;29676:74;29673:1;29670:81;29665:1;29658:9;29651:17;29647:105;29644:131;;;29755:18;;:::i;:::-;29644:131;29803:1;29800;29796:9;29785:20;;29463:348;;;;:::o;29817:191::-;29857:4;29877:20;29895:1;29877:20;:::i;:::-;29872:25;;29911:20;29929:1;29911:20;:::i;:::-;29906:25;;29950:1;29947;29944:8;29941:34;;;29955:18;;:::i;:::-;29941:34;30000:1;29997;29993:9;29985:17;;29817:191;;;;:::o;30014:96::-;30051:7;30080:24;30098:5;30080:24;:::i;:::-;30069:35;;30014:96;;;:::o;30116:90::-;30150:7;30193:5;30186:13;30179:21;30168:32;;30116:90;;;:::o;30212:149::-;30248:7;30288:66;30281:5;30277:78;30266:89;;30212:149;;;:::o;30367:126::-;30404:7;30444:42;30437:5;30433:54;30422:65;;30367:126;;;:::o;30499:77::-;30536:7;30565:5;30554:16;;30499:77;;;:::o;30582:154::-;30666:6;30661:3;30656;30643:30;30728:1;30719:6;30714:3;30710:16;30703:27;30582:154;;;:::o;30742:307::-;30810:1;30820:113;30834:6;30831:1;30828:13;30820:113;;;30919:1;30914:3;30910:11;30904:18;30900:1;30895:3;30891:11;30884:39;30856:2;30853:1;30849:10;30844:15;;30820:113;;;30951:6;30948:1;30945:13;30942:101;;;31031:1;31022:6;31017:3;31013:16;31006:27;30942:101;30791:258;30742:307;;;:::o;31055:320::-;31099:6;31136:1;31130:4;31126:12;31116:22;;31183:1;31177:4;31173:12;31204:18;31194:81;;31260:4;31252:6;31248:17;31238:27;;31194:81;31322:2;31314:6;31311:14;31291:18;31288:38;31285:84;;;31341:18;;:::i;:::-;31285:84;31106:269;31055:320;;;:::o;31381:281::-;31464:27;31486:4;31464:27;:::i;:::-;31456:6;31452:40;31594:6;31582:10;31579:22;31558:18;31546:10;31543:34;31540:62;31537:88;;;31605:18;;:::i;:::-;31537:88;31645:10;31641:2;31634:22;31424:238;31381:281;;:::o;31668:233::-;31707:3;31730:24;31748:5;31730:24;:::i;:::-;31721:33;;31776:66;31769:5;31766:77;31763:103;;;31846:18;;:::i;:::-;31763:103;31893:1;31886:5;31882:13;31875:20;;31668:233;;;:::o;31907:176::-;31939:1;31956:20;31974:1;31956:20;:::i;:::-;31951:25;;31990:20;32008:1;31990:20;:::i;:::-;31985:25;;32029:1;32019:35;;32034:18;;:::i;:::-;32019:35;32075:1;32072;32068:9;32063:14;;31907:176;;;;:::o;32089:180::-;32137:77;32134:1;32127:88;32234:4;32231:1;32224:15;32258:4;32255:1;32248:15;32275:180;32323:77;32320:1;32313:88;32420:4;32417:1;32410:15;32444:4;32441:1;32434:15;32461:180;32509:77;32506:1;32499:88;32606:4;32603:1;32596:15;32630:4;32627:1;32620:15;32647:180;32695:77;32692:1;32685:88;32792:4;32789:1;32782:15;32816:4;32813:1;32806:15;32833:180;32881:77;32878:1;32871:88;32978:4;32975:1;32968:15;33002:4;32999:1;32992:15;33019:180;33067:77;33064:1;33057:88;33164:4;33161:1;33154:15;33188:4;33185:1;33178:15;33205:117;33314:1;33311;33304:12;33328:117;33437:1;33434;33427:12;33451:117;33560:1;33557;33550:12;33574:117;33683:1;33680;33673:12;33697:102;33738:6;33789:2;33785:7;33780:2;33773:5;33769:14;33765:28;33755:38;;33697:102;;;:::o;33805:230::-;33945:34;33941:1;33933:6;33929:14;33922:58;34014:13;34009:2;34001:6;33997:15;33990:38;33805:230;:::o;34041:237::-;34181:34;34177:1;34169:6;34165:14;34158:58;34250:20;34245:2;34237:6;34233:15;34226:45;34041:237;:::o;34284:225::-;34424:34;34420:1;34412:6;34408:14;34401:58;34493:8;34488:2;34480:6;34476:15;34469:33;34284:225;:::o;34515:178::-;34655:30;34651:1;34643:6;34639:14;34632:54;34515:178;:::o;34699:223::-;34839:34;34835:1;34827:6;34823:14;34816:58;34908:6;34903:2;34895:6;34891:15;34884:31;34699:223;:::o;34928:175::-;35068:27;35064:1;35056:6;35052:14;35045:51;34928:175;:::o;35109:231::-;35249:34;35245:1;35237:6;35233:14;35226:58;35318:14;35313:2;35305:6;35301:15;35294:39;35109:231;:::o;35346:243::-;35486:34;35482:1;35474:6;35470:14;35463:58;35555:26;35550:2;35542:6;35538:15;35531:51;35346:243;:::o;35595:229::-;35735:34;35731:1;35723:6;35719:14;35712:58;35804:12;35799:2;35791:6;35787:15;35780:37;35595:229;:::o;35830:228::-;35970:34;35966:1;35958:6;35954:14;35947:58;36039:11;36034:2;36026:6;36022:15;36015:36;35830:228;:::o;36064:182::-;36204:34;36200:1;36192:6;36188:14;36181:58;36064:182;:::o;36252:231::-;36392:34;36388:1;36380:6;36376:14;36369:58;36461:14;36456:2;36448:6;36444:15;36437:39;36252:231;:::o;36489:182::-;36629:34;36625:1;36617:6;36613:14;36606:58;36489:182;:::o;36677:228::-;36817:34;36813:1;36805:6;36801:14;36794:58;36886:11;36881:2;36873:6;36869:15;36862:36;36677:228;:::o;36911:234::-;37051:34;37047:1;37039:6;37035:14;37028:58;37120:17;37115:2;37107:6;37103:15;37096:42;36911:234;:::o;37151:220::-;37291:34;37287:1;37279:6;37275:14;37268:58;37360:3;37355:2;37347:6;37343:15;37336:28;37151:220;:::o;37377:236::-;37517:34;37513:1;37505:6;37501:14;37494:58;37586:19;37581:2;37573:6;37569:15;37562:44;37377:236;:::o;37619:231::-;37759:34;37755:1;37747:6;37743:14;37736:58;37828:14;37823:2;37815:6;37811:15;37804:39;37619:231;:::o;37856:122::-;37929:24;37947:5;37929:24;:::i;:::-;37922:5;37919:35;37909:63;;37968:1;37965;37958:12;37909:63;37856:122;:::o;37984:116::-;38054:21;38069:5;38054:21;:::i;:::-;38047:5;38044:32;38034:60;;38090:1;38087;38080:12;38034:60;37984:116;:::o;38106:120::-;38178:23;38195:5;38178:23;:::i;:::-;38171:5;38168:34;38158:62;;38216:1;38213;38206:12;38158:62;38106:120;:::o;38232:122::-;38305:24;38323:5;38305:24;:::i;:::-;38298:5;38295:35;38285:63;;38344:1;38341;38334:12;38285:63;38232:122;:::o
Swarm Source
ipfs://047f7bee3377e385afa73f82ad13543ebf3ad053adb85dbc44e66138209acca2
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.