Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
100 POROUS
Holders
23
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 POROUSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Porous
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-21 */ // ... ... ..... ... .. // `"#$t'`^Ij1` .>-:`'.'^;]I. '^f$#''`"]fI .;[;^'.'`,-~` `^($$;`. ',fc,' "]^..`,;{ // )$1 .$$` .{$! {$] :$c r$r l%| :$/. ^$% `, `$, ') // {$1 .$$^ f$x *$( :$c j$\ i$B. }$* ^$& ', .8B+` // {$|..',cc: .$$< [$$. :$*''`">1, M$r ,$$" ^$& ', .+*$%t<^ // {$/'''. .$$~ [$$. :$z.`r@}. z$x ,$$^ ^$8 ', ."-c$&, // {$1 )$u #$} :$c :%&, :$@. {$v `$@ `" ^` '#$. // ($( ~%_ .|%> ;$z .r$f' ,#f. l$}. v$, .]. :#. \z // `"z&z"`. .:?;"`'`"I],. `"j&&:`' ,c&):` "?!,`'`^:]l. ;/\!,",,:" ",,"^``"+>. // . .. .. . // ;;"^``"I;```^:I' ^,<~;^^":". ^' .^:II;^' `,II: '";I;"..^;II```^,I; `"i<~^^":,' // W. ,$# ]! v$? >$t. `B*. .$$^ j?$#` .v. ;$@ 'z. I$@ `%M^ // ` ,$# ` t$? 8$_ 'Ii$n $$' ] `z$? ] ,$@ '. ,$@ {$* // ,$# t$? "$r. > ($| $$' ] ~$W^ ] ,$@ .i ,$@ .M&" // ,$# t$\^+|(,' < v$i $$' ] `*$] ] ,$@^^"1i ,$@`;)/!` // ,$# t$? >@c^ >,````"M$" $$' ] ~$M" ] ,$@ " ,$@ ^*%i // :$# t$? 'z$}. :` `@@` $$' ] `c${{ ,$@ ') ,$@ 1$c' // i$% u$) +$&; "| I$&' .$$^ /' ~$/ ;$$. `#~ ;$$ "M$[' // .`"><<:`' .`,<<<"`. '><i"`,<<,. `:<<i"'^I<<!^' ^I<>"` `> '^i<<;^``^;<<` `^i<<;`' ;<<:^ // // // poro.us // // Miles Peyton 2022 // // SPDX-License-Identifier: UNLICENSED // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: 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 { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: 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); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/porous.sol pragma solidity ^0.8.2; contract Porous is ERC721, ERC721Enumerable, ERC721Burnable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; string public baseURI; uint256 public constant maxSupply = 100; bool public baseURILocked; constructor() ERC721("Porous Trainer", "POROUS") {} function setBaseURI(string memory givenBaseURI) public onlyOwner { require(!baseURILocked, "base uri locked"); baseURI = givenBaseURI; } function lockBaseURI() public onlyOwner { baseURILocked = true; } function _baseURI() internal view override returns (string memory) { return baseURI; } function mintAll() public onlyOwner { uint256 supply = totalSupply(); require(supply < maxSupply, "exceeds maximum supply"); uint256 numToMint = maxSupply - supply; for(uint256 i; i < numToMint; i++){ safeMint(msg.sender); } } function safeMint(address to) public onlyOwner { require (totalSupply() < maxSupply, "exceeds maximum supply"); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"baseURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"lockBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","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":"givenBaseURI","type":"string"}],"name":"setBaseURI","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600e81526020017f506f726f757320547261696e65720000000000000000000000000000000000008152506040518060400160405280600681526020017f504f524f55530000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613d3980620002cb6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063595882b3116100f957806395d89b4111610097578063c87b56dd11610071578063c87b56dd14610480578063d5abeb01146104b0578063e985e9c5146104ce578063f2fde38b146104fe576101a9565b806395d89b411461042a578063a22cb46514610448578063b88d4fde14610464576101a9565b80636c0360eb116100d35780636c0360eb146103b457806370a08231146103d2578063715018a6146104025780638da5cb5b1461040c576101a9565b8063595882b31461035c5780635d148e5c146103665780636352211e14610384576101a9565b80632f745c591161016657806342966c681161014057806342966c68146102ea5780634f6ccce71461030657806353df5c7c1461033657806355f804b314610340576101a9565b80632f745c591461028257806340d097c3146102b257806342842e0e146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c39190612ab7565b61051a565b6040516101d59190612fc1565b60405180910390f35b6101e661052c565b6040516101f39190612fdc565b60405180910390f35b61021660048036038101906102119190612b5a565b6105be565b6040516102239190612f5a565b60405180910390f35b61024660048036038101906102419190612a77565b610643565b005b61025061075b565b60405161025d919061329e565b60405180910390f35b610280600480360381019061027b9190612961565b610768565b005b61029c60048036038101906102979190612a77565b6107c8565b6040516102a9919061329e565b60405180910390f35b6102cc60048036038101906102c791906128f4565b61086d565b005b6102e860048036038101906102e39190612961565b610959565b005b61030460048036038101906102ff9190612b5a565b610979565b005b610320600480360381019061031b9190612b5a565b6109d5565b60405161032d919061329e565b60405180910390f35b61033e610a46565b005b61035a60048036038101906103559190612b11565b610adf565b005b610364610bc5565b005b61036e610ccd565b60405161037b9190612fc1565b60405180910390f35b61039e60048036038101906103999190612b5a565b610ce0565b6040516103ab9190612f5a565b60405180910390f35b6103bc610d92565b6040516103c99190612fdc565b60405180910390f35b6103ec60048036038101906103e791906128f4565b610e20565b6040516103f9919061329e565b60405180910390f35b61040a610ed8565b005b610414610f60565b6040516104219190612f5a565b60405180910390f35b610432610f8a565b60405161043f9190612fdc565b60405180910390f35b610462600480360381019061045d9190612a37565b61101c565b005b61047e600480360381019061047991906129b4565b611032565b005b61049a60048036038101906104959190612b5a565b611094565b6040516104a79190612fdc565b60405180910390f35b6104b861113b565b6040516104c5919061329e565b60405180910390f35b6104e860048036038101906104e39190612921565b611140565b6040516104f59190612fc1565b60405180910390f35b610518600480360381019061051391906128f4565b6111d4565b005b6000610525826112cc565b9050919050565b60606000805461053b906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610567906134f4565b80156105b45780601f10610589576101008083540402835291602001916105b4565b820191906000526020600020905b81548152906001019060200180831161059757829003601f168201915b5050505050905090565b60006105c982611346565b610608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff9061319e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064e82610ce0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b6906131fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106de6113b2565b73ffffffffffffffffffffffffffffffffffffffff16148061070d575061070c816107076113b2565b611140565b5b61074c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107439061311e565b60405180910390fd5b61075683836113ba565b505050565b6000600880549050905090565b6107796107736113b2565b82611473565b6107b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107af9061321e565b60405180910390fd5b6107c3838383611551565b505050565b60006107d383610e20565b8210610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b90612ffe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108756113b2565b73ffffffffffffffffffffffffffffffffffffffff16610893610f60565b73ffffffffffffffffffffffffffffffffffffffff16146108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e0906131be565b60405180910390fd5b60646108f361075b565b10610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a9061325e565b60405180910390fd5b600061093f600b6117b8565b905061094b600b6117c6565b61095582826117dc565b5050565b61097483838360405180602001604052806000815250611032565b505050565b61098a6109846113b2565b82611473565b6109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c09061327e565b60405180910390fd5b6109d2816117fa565b50565b60006109df61075b565b8210610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a179061323e565b60405180910390fd5b60088281548110610a3457610a3361368d565b5b90600052602060002001549050919050565b610a4e6113b2565b73ffffffffffffffffffffffffffffffffffffffff16610a6c610f60565b73ffffffffffffffffffffffffffffffffffffffff1614610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab9906131be565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b610ae76113b2565b73ffffffffffffffffffffffffffffffffffffffff16610b05610f60565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b52906131be565b60405180910390fd5b600d60009054906101000a900460ff1615610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba29061309e565b60405180910390fd5b80600c9080519060200190610bc1929190612708565b5050565b610bcd6113b2565b73ffffffffffffffffffffffffffffffffffffffff16610beb610f60565b73ffffffffffffffffffffffffffffffffffffffff1614610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c38906131be565b60405180910390fd5b6000610c4b61075b565b905060648110610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c879061325e565b60405180910390fd5b6000816064610c9f919061340a565b905060005b81811015610cc857610cb53361086d565b8080610cc090613557565b915050610ca4565b505050565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d809061315e565b60405180910390fd5b80915050919050565b600c8054610d9f906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcb906134f4565b8015610e185780601f10610ded57610100808354040283529160200191610e18565b820191906000526020600020905b815481529060010190602001808311610dfb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e889061313e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ee06113b2565b73ffffffffffffffffffffffffffffffffffffffff16610efe610f60565b73ffffffffffffffffffffffffffffffffffffffff1614610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b906131be565b60405180910390fd5b610f5e6000611917565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f99906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc5906134f4565b80156110125780601f10610fe757610100808354040283529160200191611012565b820191906000526020600020905b815481529060010190602001808311610ff557829003601f168201915b5050505050905090565b61102e6110276113b2565b83836119dd565b5050565b61104361103d6113b2565b83611473565b611082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110799061321e565b60405180910390fd5b61108e84848484611b4a565b50505050565b606061109f82611346565b6110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d5906131de565b60405180910390fd5b60006110e8611ba6565b905060008151116111085760405180602001604052806000815250611133565b8061111284611c38565b604051602001611123929190612f36565b6040516020818303038152906040525b915050919050565b606481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111dc6113b2565b73ffffffffffffffffffffffffffffffffffffffff166111fa610f60565b73ffffffffffffffffffffffffffffffffffffffff1614611250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611247906131be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b79061303e565b60405180910390fd5b6112c981611917565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061133f575061133e82611d99565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661142d83610ce0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061147e82611346565b6114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b4906130fe565b60405180910390fd5b60006114c883610ce0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061153757508373ffffffffffffffffffffffffffffffffffffffff1661151f846105be565b73ffffffffffffffffffffffffffffffffffffffff16145b8061154857506115478185611140565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661157182610ce0565b73ffffffffffffffffffffffffffffffffffffffff16146115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be9061305e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e906130be565b60405180910390fd5b611642838383611e7b565b61164d6000826113ba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169d919061340a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f49190613383565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117b3838383611e8b565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6117f6828260405180602001604052806000815250611e90565b5050565b600061180582610ce0565b905061181381600084611e7b565b61181e6000836113ba565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461186e919061340a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461191381600084611e8b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43906130de565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b3d9190612fc1565b60405180910390a3505050565b611b55848484611551565b611b6184848484611eeb565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b979061301e565b60405180910390fd5b50505050565b6060600c8054611bb5906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611be1906134f4565b8015611c2e5780601f10611c0357610100808354040283529160200191611c2e565b820191906000526020600020905b815481529060010190602001808311611c1157829003601f168201915b5050505050905090565b60606000821415611c80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d94565b600082905060005b60008214611cb2578080611c9b90613557565b915050600a82611cab91906133d9565b9150611c88565b60008167ffffffffffffffff811115611cce57611ccd6136bc565b5b6040519080825280601f01601f191660200182016040528015611d005781602001600182028036833780820191505090505b5090505b60008514611d8d57600182611d19919061340a565b9150600a85611d2891906135a0565b6030611d349190613383565b60f81b818381518110611d4a57611d4961368d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d8691906133d9565b9450611d04565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e6457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e745750611e7382612082565b5b9050919050565b611e868383836120ec565b505050565b505050565b611e9a8383612200565b611ea76000848484611eeb565b611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd9061301e565b60405180910390fd5b505050565b6000611f0c8473ffffffffffffffffffffffffffffffffffffffff166123da565b15612075578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f356113b2565b8786866040518563ffffffff1660e01b8152600401611f579493929190612f75565b602060405180830381600087803b158015611f7157600080fd5b505af1925050508015611fa257506040513d601f19601f82011682018060405250810190611f9f9190612ae4565b60015b612025573d8060008114611fd2576040519150601f19603f3d011682016040523d82523d6000602084013e611fd7565b606091505b5060008151141561201d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120149061301e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061207a565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120f78383836123fd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561213a5761213581612402565b612179565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461217857612177838261244b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121bc576121b7816125b8565b6121fb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121fa576121f98282612689565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122679061317e565b60405180910390fd5b61227981611346565b156122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b09061307e565b60405180910390fd5b6122c560008383611e7b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123159190613383565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123d660008383611e8b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161245884610e20565b612462919061340a565b9050600060076000848152602001908152602001600020549050818114612547576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125cc919061340a565b90506000600960008481526020019081526020016000205490506000600883815481106125fc576125fb61368d565b5b90600052602060002001549050806008838154811061261e5761261d61368d565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061266d5761266c61365e565b5b6001900381819060005260206000200160009055905550505050565b600061269483610e20565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612714906134f4565b90600052602060002090601f016020900481019282612736576000855561277d565b82601f1061274f57805160ff191683800117855561277d565b8280016001018555821561277d579182015b8281111561277c578251825591602001919060010190612761565b5b50905061278a919061278e565b5090565b5b808211156127a757600081600090555060010161278f565b5090565b60006127be6127b9846132de565b6132b9565b9050828152602081018484840111156127da576127d96136f0565b5b6127e58482856134b2565b509392505050565b60006128006127fb8461330f565b6132b9565b90508281526020810184848401111561281c5761281b6136f0565b5b6128278482856134b2565b509392505050565b60008135905061283e81613ca7565b92915050565b60008135905061285381613cbe565b92915050565b60008135905061286881613cd5565b92915050565b60008151905061287d81613cd5565b92915050565b600082601f830112612898576128976136eb565b5b81356128a88482602086016127ab565b91505092915050565b600082601f8301126128c6576128c56136eb565b5b81356128d68482602086016127ed565b91505092915050565b6000813590506128ee81613cec565b92915050565b60006020828403121561290a576129096136fa565b5b60006129188482850161282f565b91505092915050565b60008060408385031215612938576129376136fa565b5b60006129468582860161282f565b92505060206129578582860161282f565b9150509250929050565b60008060006060848603121561297a576129796136fa565b5b60006129888682870161282f565b93505060206129998682870161282f565b92505060406129aa868287016128df565b9150509250925092565b600080600080608085870312156129ce576129cd6136fa565b5b60006129dc8782880161282f565b94505060206129ed8782880161282f565b93505060406129fe878288016128df565b925050606085013567ffffffffffffffff811115612a1f57612a1e6136f5565b5b612a2b87828801612883565b91505092959194509250565b60008060408385031215612a4e57612a4d6136fa565b5b6000612a5c8582860161282f565b9250506020612a6d85828601612844565b9150509250929050565b60008060408385031215612a8e57612a8d6136fa565b5b6000612a9c8582860161282f565b9250506020612aad858286016128df565b9150509250929050565b600060208284031215612acd57612acc6136fa565b5b6000612adb84828501612859565b91505092915050565b600060208284031215612afa57612af96136fa565b5b6000612b088482850161286e565b91505092915050565b600060208284031215612b2757612b266136fa565b5b600082013567ffffffffffffffff811115612b4557612b446136f5565b5b612b51848285016128b1565b91505092915050565b600060208284031215612b7057612b6f6136fa565b5b6000612b7e848285016128df565b91505092915050565b612b908161343e565b82525050565b612b9f81613450565b82525050565b6000612bb082613340565b612bba8185613356565b9350612bca8185602086016134c1565b612bd3816136ff565b840191505092915050565b6000612be98261334b565b612bf38185613367565b9350612c038185602086016134c1565b612c0c816136ff565b840191505092915050565b6000612c228261334b565b612c2c8185613378565b9350612c3c8185602086016134c1565b80840191505092915050565b6000612c55602b83613367565b9150612c6082613710565b604082019050919050565b6000612c78603283613367565b9150612c838261375f565b604082019050919050565b6000612c9b602683613367565b9150612ca6826137ae565b604082019050919050565b6000612cbe602583613367565b9150612cc9826137fd565b604082019050919050565b6000612ce1601c83613367565b9150612cec8261384c565b602082019050919050565b6000612d04600f83613367565b9150612d0f82613875565b602082019050919050565b6000612d27602483613367565b9150612d328261389e565b604082019050919050565b6000612d4a601983613367565b9150612d55826138ed565b602082019050919050565b6000612d6d602c83613367565b9150612d7882613916565b604082019050919050565b6000612d90603883613367565b9150612d9b82613965565b604082019050919050565b6000612db3602a83613367565b9150612dbe826139b4565b604082019050919050565b6000612dd6602983613367565b9150612de182613a03565b604082019050919050565b6000612df9602083613367565b9150612e0482613a52565b602082019050919050565b6000612e1c602c83613367565b9150612e2782613a7b565b604082019050919050565b6000612e3f602083613367565b9150612e4a82613aca565b602082019050919050565b6000612e62602f83613367565b9150612e6d82613af3565b604082019050919050565b6000612e85602183613367565b9150612e9082613b42565b604082019050919050565b6000612ea8603183613367565b9150612eb382613b91565b604082019050919050565b6000612ecb602c83613367565b9150612ed682613be0565b604082019050919050565b6000612eee601683613367565b9150612ef982613c2f565b602082019050919050565b6000612f11603083613367565b9150612f1c82613c58565b604082019050919050565b612f30816134a8565b82525050565b6000612f428285612c17565b9150612f4e8284612c17565b91508190509392505050565b6000602082019050612f6f6000830184612b87565b92915050565b6000608082019050612f8a6000830187612b87565b612f976020830186612b87565b612fa46040830185612f27565b8181036060830152612fb68184612ba5565b905095945050505050565b6000602082019050612fd66000830184612b96565b92915050565b60006020820190508181036000830152612ff68184612bde565b905092915050565b6000602082019050818103600083015261301781612c48565b9050919050565b6000602082019050818103600083015261303781612c6b565b9050919050565b6000602082019050818103600083015261305781612c8e565b9050919050565b6000602082019050818103600083015261307781612cb1565b9050919050565b6000602082019050818103600083015261309781612cd4565b9050919050565b600060208201905081810360008301526130b781612cf7565b9050919050565b600060208201905081810360008301526130d781612d1a565b9050919050565b600060208201905081810360008301526130f781612d3d565b9050919050565b6000602082019050818103600083015261311781612d60565b9050919050565b6000602082019050818103600083015261313781612d83565b9050919050565b6000602082019050818103600083015261315781612da6565b9050919050565b6000602082019050818103600083015261317781612dc9565b9050919050565b6000602082019050818103600083015261319781612dec565b9050919050565b600060208201905081810360008301526131b781612e0f565b9050919050565b600060208201905081810360008301526131d781612e32565b9050919050565b600060208201905081810360008301526131f781612e55565b9050919050565b6000602082019050818103600083015261321781612e78565b9050919050565b6000602082019050818103600083015261323781612e9b565b9050919050565b6000602082019050818103600083015261325781612ebe565b9050919050565b6000602082019050818103600083015261327781612ee1565b9050919050565b6000602082019050818103600083015261329781612f04565b9050919050565b60006020820190506132b36000830184612f27565b92915050565b60006132c36132d4565b90506132cf8282613526565b919050565b6000604051905090565b600067ffffffffffffffff8211156132f9576132f86136bc565b5b613302826136ff565b9050602081019050919050565b600067ffffffffffffffff82111561332a576133296136bc565b5b613333826136ff565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061338e826134a8565b9150613399836134a8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133ce576133cd6135d1565b5b828201905092915050565b60006133e4826134a8565b91506133ef836134a8565b9250826133ff576133fe613600565b5b828204905092915050565b6000613415826134a8565b9150613420836134a8565b925082821015613433576134326135d1565b5b828203905092915050565b600061344982613488565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134df5780820151818401526020810190506134c4565b838111156134ee576000848401525b50505050565b6000600282049050600182168061350c57607f821691505b602082108114156135205761351f61362f565b5b50919050565b61352f826136ff565b810181811067ffffffffffffffff8211171561354e5761354d6136bc565b5b80604052505050565b6000613562826134a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613595576135946135d1565b5b600182019050919050565b60006135ab826134a8565b91506135b6836134a8565b9250826135c6576135c5613600565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6261736520757269206c6f636b65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f65786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b613cb08161343e565b8114613cbb57600080fd5b50565b613cc781613450565b8114613cd257600080fd5b50565b613cde8161345c565b8114613ce957600080fd5b50565b613cf5816134a8565b8114613d0057600080fd5b5056fea26469706673582212200b616ced98d02303ae9fb89650a26ac4329c28de24299706f100bd80c85602b964736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c8063595882b3116100f957806395d89b4111610097578063c87b56dd11610071578063c87b56dd14610480578063d5abeb01146104b0578063e985e9c5146104ce578063f2fde38b146104fe576101a9565b806395d89b411461042a578063a22cb46514610448578063b88d4fde14610464576101a9565b80636c0360eb116100d35780636c0360eb146103b457806370a08231146103d2578063715018a6146104025780638da5cb5b1461040c576101a9565b8063595882b31461035c5780635d148e5c146103665780636352211e14610384576101a9565b80632f745c591161016657806342966c681161014057806342966c68146102ea5780634f6ccce71461030657806353df5c7c1461033657806355f804b314610340576101a9565b80632f745c591461028257806340d097c3146102b257806342842e0e146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c39190612ab7565b61051a565b6040516101d59190612fc1565b60405180910390f35b6101e661052c565b6040516101f39190612fdc565b60405180910390f35b61021660048036038101906102119190612b5a565b6105be565b6040516102239190612f5a565b60405180910390f35b61024660048036038101906102419190612a77565b610643565b005b61025061075b565b60405161025d919061329e565b60405180910390f35b610280600480360381019061027b9190612961565b610768565b005b61029c60048036038101906102979190612a77565b6107c8565b6040516102a9919061329e565b60405180910390f35b6102cc60048036038101906102c791906128f4565b61086d565b005b6102e860048036038101906102e39190612961565b610959565b005b61030460048036038101906102ff9190612b5a565b610979565b005b610320600480360381019061031b9190612b5a565b6109d5565b60405161032d919061329e565b60405180910390f35b61033e610a46565b005b61035a60048036038101906103559190612b11565b610adf565b005b610364610bc5565b005b61036e610ccd565b60405161037b9190612fc1565b60405180910390f35b61039e60048036038101906103999190612b5a565b610ce0565b6040516103ab9190612f5a565b60405180910390f35b6103bc610d92565b6040516103c99190612fdc565b60405180910390f35b6103ec60048036038101906103e791906128f4565b610e20565b6040516103f9919061329e565b60405180910390f35b61040a610ed8565b005b610414610f60565b6040516104219190612f5a565b60405180910390f35b610432610f8a565b60405161043f9190612fdc565b60405180910390f35b610462600480360381019061045d9190612a37565b61101c565b005b61047e600480360381019061047991906129b4565b611032565b005b61049a60048036038101906104959190612b5a565b611094565b6040516104a79190612fdc565b60405180910390f35b6104b861113b565b6040516104c5919061329e565b60405180910390f35b6104e860048036038101906104e39190612921565b611140565b6040516104f59190612fc1565b60405180910390f35b610518600480360381019061051391906128f4565b6111d4565b005b6000610525826112cc565b9050919050565b60606000805461053b906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610567906134f4565b80156105b45780601f10610589576101008083540402835291602001916105b4565b820191906000526020600020905b81548152906001019060200180831161059757829003601f168201915b5050505050905090565b60006105c982611346565b610608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff9061319e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064e82610ce0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b6906131fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106de6113b2565b73ffffffffffffffffffffffffffffffffffffffff16148061070d575061070c816107076113b2565b611140565b5b61074c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107439061311e565b60405180910390fd5b61075683836113ba565b505050565b6000600880549050905090565b6107796107736113b2565b82611473565b6107b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107af9061321e565b60405180910390fd5b6107c3838383611551565b505050565b60006107d383610e20565b8210610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b90612ffe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108756113b2565b73ffffffffffffffffffffffffffffffffffffffff16610893610f60565b73ffffffffffffffffffffffffffffffffffffffff16146108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e0906131be565b60405180910390fd5b60646108f361075b565b10610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a9061325e565b60405180910390fd5b600061093f600b6117b8565b905061094b600b6117c6565b61095582826117dc565b5050565b61097483838360405180602001604052806000815250611032565b505050565b61098a6109846113b2565b82611473565b6109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c09061327e565b60405180910390fd5b6109d2816117fa565b50565b60006109df61075b565b8210610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a179061323e565b60405180910390fd5b60088281548110610a3457610a3361368d565b5b90600052602060002001549050919050565b610a4e6113b2565b73ffffffffffffffffffffffffffffffffffffffff16610a6c610f60565b73ffffffffffffffffffffffffffffffffffffffff1614610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab9906131be565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b610ae76113b2565b73ffffffffffffffffffffffffffffffffffffffff16610b05610f60565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b52906131be565b60405180910390fd5b600d60009054906101000a900460ff1615610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba29061309e565b60405180910390fd5b80600c9080519060200190610bc1929190612708565b5050565b610bcd6113b2565b73ffffffffffffffffffffffffffffffffffffffff16610beb610f60565b73ffffffffffffffffffffffffffffffffffffffff1614610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c38906131be565b60405180910390fd5b6000610c4b61075b565b905060648110610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c879061325e565b60405180910390fd5b6000816064610c9f919061340a565b905060005b81811015610cc857610cb53361086d565b8080610cc090613557565b915050610ca4565b505050565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d809061315e565b60405180910390fd5b80915050919050565b600c8054610d9f906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcb906134f4565b8015610e185780601f10610ded57610100808354040283529160200191610e18565b820191906000526020600020905b815481529060010190602001808311610dfb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e889061313e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ee06113b2565b73ffffffffffffffffffffffffffffffffffffffff16610efe610f60565b73ffffffffffffffffffffffffffffffffffffffff1614610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b906131be565b60405180910390fd5b610f5e6000611917565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f99906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc5906134f4565b80156110125780601f10610fe757610100808354040283529160200191611012565b820191906000526020600020905b815481529060010190602001808311610ff557829003601f168201915b5050505050905090565b61102e6110276113b2565b83836119dd565b5050565b61104361103d6113b2565b83611473565b611082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110799061321e565b60405180910390fd5b61108e84848484611b4a565b50505050565b606061109f82611346565b6110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d5906131de565b60405180910390fd5b60006110e8611ba6565b905060008151116111085760405180602001604052806000815250611133565b8061111284611c38565b604051602001611123929190612f36565b6040516020818303038152906040525b915050919050565b606481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111dc6113b2565b73ffffffffffffffffffffffffffffffffffffffff166111fa610f60565b73ffffffffffffffffffffffffffffffffffffffff1614611250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611247906131be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b79061303e565b60405180910390fd5b6112c981611917565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061133f575061133e82611d99565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661142d83610ce0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061147e82611346565b6114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b4906130fe565b60405180910390fd5b60006114c883610ce0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061153757508373ffffffffffffffffffffffffffffffffffffffff1661151f846105be565b73ffffffffffffffffffffffffffffffffffffffff16145b8061154857506115478185611140565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661157182610ce0565b73ffffffffffffffffffffffffffffffffffffffff16146115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be9061305e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e906130be565b60405180910390fd5b611642838383611e7b565b61164d6000826113ba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169d919061340a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f49190613383565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117b3838383611e8b565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6117f6828260405180602001604052806000815250611e90565b5050565b600061180582610ce0565b905061181381600084611e7b565b61181e6000836113ba565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461186e919061340a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461191381600084611e8b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43906130de565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b3d9190612fc1565b60405180910390a3505050565b611b55848484611551565b611b6184848484611eeb565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b979061301e565b60405180910390fd5b50505050565b6060600c8054611bb5906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611be1906134f4565b8015611c2e5780601f10611c0357610100808354040283529160200191611c2e565b820191906000526020600020905b815481529060010190602001808311611c1157829003601f168201915b5050505050905090565b60606000821415611c80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d94565b600082905060005b60008214611cb2578080611c9b90613557565b915050600a82611cab91906133d9565b9150611c88565b60008167ffffffffffffffff811115611cce57611ccd6136bc565b5b6040519080825280601f01601f191660200182016040528015611d005781602001600182028036833780820191505090505b5090505b60008514611d8d57600182611d19919061340a565b9150600a85611d2891906135a0565b6030611d349190613383565b60f81b818381518110611d4a57611d4961368d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d8691906133d9565b9450611d04565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e6457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e745750611e7382612082565b5b9050919050565b611e868383836120ec565b505050565b505050565b611e9a8383612200565b611ea76000848484611eeb565b611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd9061301e565b60405180910390fd5b505050565b6000611f0c8473ffffffffffffffffffffffffffffffffffffffff166123da565b15612075578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f356113b2565b8786866040518563ffffffff1660e01b8152600401611f579493929190612f75565b602060405180830381600087803b158015611f7157600080fd5b505af1925050508015611fa257506040513d601f19601f82011682018060405250810190611f9f9190612ae4565b60015b612025573d8060008114611fd2576040519150601f19603f3d011682016040523d82523d6000602084013e611fd7565b606091505b5060008151141561201d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120149061301e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061207a565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120f78383836123fd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561213a5761213581612402565b612179565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461217857612177838261244b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121bc576121b7816125b8565b6121fb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121fa576121f98282612689565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122679061317e565b60405180910390fd5b61227981611346565b156122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b09061307e565b60405180910390fd5b6122c560008383611e7b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123159190613383565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123d660008383611e8b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161245884610e20565b612462919061340a565b9050600060076000848152602001908152602001600020549050818114612547576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125cc919061340a565b90506000600960008481526020019081526020016000205490506000600883815481106125fc576125fb61368d565b5b90600052602060002001549050806008838154811061261e5761261d61368d565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061266d5761266c61365e565b5b6001900381819060005260206000200160009055905550505050565b600061269483610e20565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612714906134f4565b90600052602060002090601f016020900481019282612736576000855561277d565b82601f1061274f57805160ff191683800117855561277d565b8280016001018555821561277d579182015b8281111561277c578251825591602001919060010190612761565b5b50905061278a919061278e565b5090565b5b808211156127a757600081600090555060010161278f565b5090565b60006127be6127b9846132de565b6132b9565b9050828152602081018484840111156127da576127d96136f0565b5b6127e58482856134b2565b509392505050565b60006128006127fb8461330f565b6132b9565b90508281526020810184848401111561281c5761281b6136f0565b5b6128278482856134b2565b509392505050565b60008135905061283e81613ca7565b92915050565b60008135905061285381613cbe565b92915050565b60008135905061286881613cd5565b92915050565b60008151905061287d81613cd5565b92915050565b600082601f830112612898576128976136eb565b5b81356128a88482602086016127ab565b91505092915050565b600082601f8301126128c6576128c56136eb565b5b81356128d68482602086016127ed565b91505092915050565b6000813590506128ee81613cec565b92915050565b60006020828403121561290a576129096136fa565b5b60006129188482850161282f565b91505092915050565b60008060408385031215612938576129376136fa565b5b60006129468582860161282f565b92505060206129578582860161282f565b9150509250929050565b60008060006060848603121561297a576129796136fa565b5b60006129888682870161282f565b93505060206129998682870161282f565b92505060406129aa868287016128df565b9150509250925092565b600080600080608085870312156129ce576129cd6136fa565b5b60006129dc8782880161282f565b94505060206129ed8782880161282f565b93505060406129fe878288016128df565b925050606085013567ffffffffffffffff811115612a1f57612a1e6136f5565b5b612a2b87828801612883565b91505092959194509250565b60008060408385031215612a4e57612a4d6136fa565b5b6000612a5c8582860161282f565b9250506020612a6d85828601612844565b9150509250929050565b60008060408385031215612a8e57612a8d6136fa565b5b6000612a9c8582860161282f565b9250506020612aad858286016128df565b9150509250929050565b600060208284031215612acd57612acc6136fa565b5b6000612adb84828501612859565b91505092915050565b600060208284031215612afa57612af96136fa565b5b6000612b088482850161286e565b91505092915050565b600060208284031215612b2757612b266136fa565b5b600082013567ffffffffffffffff811115612b4557612b446136f5565b5b612b51848285016128b1565b91505092915050565b600060208284031215612b7057612b6f6136fa565b5b6000612b7e848285016128df565b91505092915050565b612b908161343e565b82525050565b612b9f81613450565b82525050565b6000612bb082613340565b612bba8185613356565b9350612bca8185602086016134c1565b612bd3816136ff565b840191505092915050565b6000612be98261334b565b612bf38185613367565b9350612c038185602086016134c1565b612c0c816136ff565b840191505092915050565b6000612c228261334b565b612c2c8185613378565b9350612c3c8185602086016134c1565b80840191505092915050565b6000612c55602b83613367565b9150612c6082613710565b604082019050919050565b6000612c78603283613367565b9150612c838261375f565b604082019050919050565b6000612c9b602683613367565b9150612ca6826137ae565b604082019050919050565b6000612cbe602583613367565b9150612cc9826137fd565b604082019050919050565b6000612ce1601c83613367565b9150612cec8261384c565b602082019050919050565b6000612d04600f83613367565b9150612d0f82613875565b602082019050919050565b6000612d27602483613367565b9150612d328261389e565b604082019050919050565b6000612d4a601983613367565b9150612d55826138ed565b602082019050919050565b6000612d6d602c83613367565b9150612d7882613916565b604082019050919050565b6000612d90603883613367565b9150612d9b82613965565b604082019050919050565b6000612db3602a83613367565b9150612dbe826139b4565b604082019050919050565b6000612dd6602983613367565b9150612de182613a03565b604082019050919050565b6000612df9602083613367565b9150612e0482613a52565b602082019050919050565b6000612e1c602c83613367565b9150612e2782613a7b565b604082019050919050565b6000612e3f602083613367565b9150612e4a82613aca565b602082019050919050565b6000612e62602f83613367565b9150612e6d82613af3565b604082019050919050565b6000612e85602183613367565b9150612e9082613b42565b604082019050919050565b6000612ea8603183613367565b9150612eb382613b91565b604082019050919050565b6000612ecb602c83613367565b9150612ed682613be0565b604082019050919050565b6000612eee601683613367565b9150612ef982613c2f565b602082019050919050565b6000612f11603083613367565b9150612f1c82613c58565b604082019050919050565b612f30816134a8565b82525050565b6000612f428285612c17565b9150612f4e8284612c17565b91508190509392505050565b6000602082019050612f6f6000830184612b87565b92915050565b6000608082019050612f8a6000830187612b87565b612f976020830186612b87565b612fa46040830185612f27565b8181036060830152612fb68184612ba5565b905095945050505050565b6000602082019050612fd66000830184612b96565b92915050565b60006020820190508181036000830152612ff68184612bde565b905092915050565b6000602082019050818103600083015261301781612c48565b9050919050565b6000602082019050818103600083015261303781612c6b565b9050919050565b6000602082019050818103600083015261305781612c8e565b9050919050565b6000602082019050818103600083015261307781612cb1565b9050919050565b6000602082019050818103600083015261309781612cd4565b9050919050565b600060208201905081810360008301526130b781612cf7565b9050919050565b600060208201905081810360008301526130d781612d1a565b9050919050565b600060208201905081810360008301526130f781612d3d565b9050919050565b6000602082019050818103600083015261311781612d60565b9050919050565b6000602082019050818103600083015261313781612d83565b9050919050565b6000602082019050818103600083015261315781612da6565b9050919050565b6000602082019050818103600083015261317781612dc9565b9050919050565b6000602082019050818103600083015261319781612dec565b9050919050565b600060208201905081810360008301526131b781612e0f565b9050919050565b600060208201905081810360008301526131d781612e32565b9050919050565b600060208201905081810360008301526131f781612e55565b9050919050565b6000602082019050818103600083015261321781612e78565b9050919050565b6000602082019050818103600083015261323781612e9b565b9050919050565b6000602082019050818103600083015261325781612ebe565b9050919050565b6000602082019050818103600083015261327781612ee1565b9050919050565b6000602082019050818103600083015261329781612f04565b9050919050565b60006020820190506132b36000830184612f27565b92915050565b60006132c36132d4565b90506132cf8282613526565b919050565b6000604051905090565b600067ffffffffffffffff8211156132f9576132f86136bc565b5b613302826136ff565b9050602081019050919050565b600067ffffffffffffffff82111561332a576133296136bc565b5b613333826136ff565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061338e826134a8565b9150613399836134a8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133ce576133cd6135d1565b5b828201905092915050565b60006133e4826134a8565b91506133ef836134a8565b9250826133ff576133fe613600565b5b828204905092915050565b6000613415826134a8565b9150613420836134a8565b925082821015613433576134326135d1565b5b828203905092915050565b600061344982613488565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134df5780820151818401526020810190506134c4565b838111156134ee576000848401525b50505050565b6000600282049050600182168061350c57607f821691505b602082108114156135205761351f61362f565b5b50919050565b61352f826136ff565b810181811067ffffffffffffffff8211171561354e5761354d6136bc565b5b80604052505050565b6000613562826134a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613595576135946135d1565b5b600182019050919050565b60006135ab826134a8565b91506135b6836134a8565b9250826135c6576135c5613600565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6261736520757269206c6f636b65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f65786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b613cb08161343e565b8114613cbb57600080fd5b50565b613cc781613450565b8114613cd257600080fd5b50565b613cde8161345c565b8114613ce957600080fd5b50565b613cf5816134a8565b8114613d0057600080fd5b5056fea26469706673582212200b616ced98d02303ae9fb89650a26ac4329c28de24299706f100bd80c85602b964736f6c63430008070033
Deployed Bytecode Sourcemap
50510:1684:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51979:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30340:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31899:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31422:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44940:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32649:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44608:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51513:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33059:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43041:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45130:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51017:79;;;:::i;:::-;;50850:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51212:293;;;:::i;:::-;;50757:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30034:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50679:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29764:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8954:103;;;:::i;:::-;;8303:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30509:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32192:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33315:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30684:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50709:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32418:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9212:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51979:212;52118:4;52147:36;52171:11;52147:23;:36::i;:::-;52140:43;;51979:212;;;:::o;30340:100::-;30394:13;30427:5;30420:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30340:100;:::o;31899:221::-;31975:7;32003:16;32011:7;32003;:16::i;:::-;31995:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32088:15;:24;32104:7;32088:24;;;;;;;;;;;;;;;;;;;;;32081:31;;31899:221;;;:::o;31422:411::-;31503:13;31519:23;31534:7;31519:14;:23::i;:::-;31503:39;;31567:5;31561:11;;:2;:11;;;;31553:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31661:5;31645:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31670:37;31687:5;31694:12;:10;:12::i;:::-;31670:16;:37::i;:::-;31645:62;31623:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31804:21;31813:2;31817:7;31804:8;:21::i;:::-;31492:341;31422:411;;:::o;44940:113::-;45001:7;45028:10;:17;;;;45021:24;;44940:113;:::o;32649:339::-;32844:41;32863:12;:10;:12::i;:::-;32877:7;32844:18;:41::i;:::-;32836:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32952:28;32962:4;32968:2;32972:7;32952:9;:28::i;:::-;32649:339;;;:::o;44608:256::-;44705:7;44741:23;44758:5;44741:16;:23::i;:::-;44733:5;:31;44725:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44830:12;:19;44843:5;44830:19;;;;;;;;;;;;;;;:26;44850:5;44830:26;;;;;;;;;;;;44823:33;;44608:256;;;;:::o;51513:254::-;8534:12;:10;:12::i;:::-;8523:23;;:7;:5;:7::i;:::-;:23;;;8515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50745:3:::1;51580:13;:11;:13::i;:::-;:25;51571:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51645:15;51663:25;:15;:23;:25::i;:::-;51645:43;;51699:27;:15;:25;:27::i;:::-;51737:22;51747:2;51751:7;51737:9;:22::i;:::-;51560:207;51513:254:::0;:::o;33059:185::-;33197:39;33214:4;33220:2;33224:7;33197:39;;;;;;;;;;;;:16;:39::i;:::-;33059:185;;;:::o;43041:245::-;43159:41;43178:12;:10;:12::i;:::-;43192:7;43159:18;:41::i;:::-;43151:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;43264:14;43270:7;43264:5;:14::i;:::-;43041:245;:::o;45130:233::-;45205:7;45241:30;:28;:30::i;:::-;45233:5;:38;45225:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45338:10;45349:5;45338:17;;;;;;;;:::i;:::-;;;;;;;;;;45331:24;;45130:233;;;:::o;51017:79::-;8534:12;:10;:12::i;:::-;8523:23;;:7;:5;:7::i;:::-;:23;;;8515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51084:4:::1;51068:13;;:20;;;;;;;;;;;;;;;;;;51017:79::o:0;50850:159::-;8534:12;:10;:12::i;:::-;8523:23;;:7;:5;:7::i;:::-;:23;;;8515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50935:13:::1;;;;;;;;;;;50934:14;50926:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;50989:12;50979:7;:22;;;;;;;;;;;;:::i;:::-;;50850:159:::0;:::o;51212:293::-;8534:12;:10;:12::i;:::-;8523:23;;:7;:5;:7::i;:::-;:23;;;8515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51259:14:::1;51276:13;:11;:13::i;:::-;51259:30;;50745:3;51308:6;:18;51300:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51366:17;51398:6;50745:3;51386:18;;;;:::i;:::-;51366:38;;51421:9;51417:81;51436:9;51432:1;:13;51417:81;;;51466:20;51475:10;51466:8;:20::i;:::-;51447:3;;;;;:::i;:::-;;;;51417:81;;;;51248:257;;51212:293::o:0;50757:25::-;;;;;;;;;;;;;:::o;30034:239::-;30106:7;30126:13;30142:7;:16;30150:7;30142:16;;;;;;;;;;;;;;;;;;;;;30126:32;;30194:1;30177:19;;:5;:19;;;;30169:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30260:5;30253:12;;;30034:239;;;:::o;50679:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29764:208::-;29836:7;29881:1;29864:19;;:5;:19;;;;29856:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29948:9;:16;29958:5;29948:16;;;;;;;;;;;;;;;;29941:23;;29764:208;;;:::o;8954:103::-;8534:12;:10;:12::i;:::-;8523:23;;:7;:5;:7::i;:::-;:23;;;8515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9019:30:::1;9046:1;9019:18;:30::i;:::-;8954:103::o:0;8303:87::-;8349:7;8376:6;;;;;;;;;;;8369:13;;8303:87;:::o;30509:104::-;30565:13;30598:7;30591:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30509:104;:::o;32192:155::-;32287:52;32306:12;:10;:12::i;:::-;32320:8;32330;32287:18;:52::i;:::-;32192:155;;:::o;33315:328::-;33490:41;33509:12;:10;:12::i;:::-;33523:7;33490:18;:41::i;:::-;33482:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33596:39;33610:4;33616:2;33620:7;33629:5;33596:13;:39::i;:::-;33315:328;;;;:::o;30684:334::-;30757:13;30791:16;30799:7;30791;:16::i;:::-;30783:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30872:21;30896:10;:8;:10::i;:::-;30872:34;;30948:1;30930:7;30924:21;:25;:86;;;;;;;;;;;;;;;;;30976:7;30985:18;:7;:16;:18::i;:::-;30959:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30924:86;30917:93;;;30684:334;;;:::o;50709:39::-;50745:3;50709:39;:::o;32418:164::-;32515:4;32539:18;:25;32558:5;32539:25;;;;;;;;;;;;;;;:35;32565:8;32539:35;;;;;;;;;;;;;;;;;;;;;;;;;32532:42;;32418:164;;;;:::o;9212:201::-;8534:12;:10;:12::i;:::-;8523:23;;:7;:5;:7::i;:::-;:23;;;8515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9321:1:::1;9301:22;;:8;:22;;;;9293:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9377:28;9396:8;9377:18;:28::i;:::-;9212:201:::0;:::o;44300:224::-;44402:4;44441:35;44426:50;;;:11;:50;;;;:90;;;;44480:36;44504:11;44480:23;:36::i;:::-;44426:90;44419:97;;44300:224;;;:::o;35153:127::-;35218:4;35270:1;35242:30;;:7;:16;35250:7;35242:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35235:37;;35153:127;;;:::o;7029:98::-;7082:7;7109:10;7102:17;;7029:98;:::o;39299:174::-;39401:2;39374:15;:24;39390:7;39374:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39457:7;39453:2;39419:46;;39428:23;39443:7;39428:14;:23::i;:::-;39419:46;;;;;;;;;;;;39299:174;;:::o;35447:348::-;35540:4;35565:16;35573:7;35565;:16::i;:::-;35557:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35641:13;35657:23;35672:7;35657:14;:23::i;:::-;35641:39;;35710:5;35699:16;;:7;:16;;;:51;;;;35743:7;35719:31;;:20;35731:7;35719:11;:20::i;:::-;:31;;;35699:51;:87;;;;35754:32;35771:5;35778:7;35754:16;:32::i;:::-;35699:87;35691:96;;;35447:348;;;;:::o;38556:625::-;38715:4;38688:31;;:23;38703:7;38688:14;:23::i;:::-;:31;;;38680:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38794:1;38780:16;;:2;:16;;;;38772:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38850:39;38871:4;38877:2;38881:7;38850:20;:39::i;:::-;38954:29;38971:1;38975:7;38954:8;:29::i;:::-;39015:1;38996:9;:15;39006:4;38996:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39044:1;39027:9;:13;39037:2;39027:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39075:2;39056:7;:16;39064:7;39056:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39114:7;39110:2;39095:27;;39104:4;39095:27;;;;;;;;;;;;39135:38;39155:4;39161:2;39165:7;39135:19;:38::i;:::-;38556:625;;;:::o;3633:114::-;3698:7;3725;:14;;;3718:21;;3633:114;;;:::o;3755:127::-;3862:1;3844:7;:14;;;:19;;;;;;;;;;;3755:127;:::o;36137:110::-;36213:26;36223:2;36227:7;36213:26;;;;;;;;;;;;:9;:26::i;:::-;36137:110;;:::o;37799:420::-;37859:13;37875:23;37890:7;37875:14;:23::i;:::-;37859:39;;37911:48;37932:5;37947:1;37951:7;37911:20;:48::i;:::-;38000:29;38017:1;38021:7;38000:8;:29::i;:::-;38062:1;38042:9;:16;38052:5;38042:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;38081:7;:16;38089:7;38081:16;;;;;;;;;;;;38074:23;;;;;;;;;;;38143:7;38139:1;38115:36;;38124:5;38115:36;;;;;;;;;;;;38164:47;38184:5;38199:1;38203:7;38164:19;:47::i;:::-;37848:371;37799:420;:::o;9573:191::-;9647:16;9666:6;;;;;;;;;;;9647:25;;9692:8;9683:6;;:17;;;;;;;;;;;;;;;;;;9747:8;9716:40;;9737:8;9716:40;;;;;;;;;;;;9636:128;9573:191;:::o;39615:315::-;39770:8;39761:17;;:5;:17;;;;39753:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39857:8;39819:18;:25;39838:5;39819:25;;;;;;;;;;;;;;;:35;39845:8;39819:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39903:8;39881:41;;39896:5;39881:41;;;39913:8;39881:41;;;;;;:::i;:::-;;;;;;;;39615:315;;;:::o;34525:::-;34682:28;34692:4;34698:2;34702:7;34682:9;:28::i;:::-;34729:48;34752:4;34758:2;34762:7;34771:5;34729:22;:48::i;:::-;34721:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34525:315;;;;:::o;51104:100::-;51156:13;51189:7;51182:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51104:100;:::o;4591:723::-;4647:13;4877:1;4868:5;:10;4864:53;;;4895:10;;;;;;;;;;;;;;;;;;;;;4864:53;4927:12;4942:5;4927:20;;4958:14;4983:78;4998:1;4990:4;:9;4983:78;;5016:8;;;;;:::i;:::-;;;;5047:2;5039:10;;;;;:::i;:::-;;;4983:78;;;5071:19;5103:6;5093:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5071:39;;5121:154;5137:1;5128:5;:10;5121:154;;5165:1;5155:11;;;;;:::i;:::-;;;5232:2;5224:5;:10;;;;:::i;:::-;5211:2;:24;;;;:::i;:::-;5198:39;;5181:6;5188;5181:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5261:2;5252:11;;;;;:::i;:::-;;;5121:154;;;5299:6;5285:21;;;;;4591:723;;;;:::o;29395:305::-;29497:4;29549:25;29534:40;;;:11;:40;;;;:105;;;;29606:33;29591:48;;;:11;:48;;;;29534:105;:158;;;;29656:36;29680:11;29656:23;:36::i;:::-;29534:158;29514:178;;29395:305;;;:::o;51775:196::-;51918:45;51945:4;51951:2;51955:7;51918:26;:45::i;:::-;51775:196;;;:::o;42377:125::-;;;;:::o;36474:321::-;36604:18;36610:2;36614:7;36604:5;:18::i;:::-;36655:54;36686:1;36690:2;36694:7;36703:5;36655:22;:54::i;:::-;36633:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36474:321;;;:::o;40495:799::-;40650:4;40671:15;:2;:13;;;:15::i;:::-;40667:620;;;40723:2;40707:36;;;40744:12;:10;:12::i;:::-;40758:4;40764:7;40773:5;40707:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40703:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40966:1;40949:6;:13;:18;40945:272;;;40992:60;;;;;;;;;;:::i;:::-;;;;;;;;40945:272;41167:6;41161:13;41152:6;41148:2;41144:15;41137:38;40703:529;40840:41;;;40830:51;;;:6;:51;;;;40823:58;;;;;40667:620;41271:4;41264:11;;40495:799;;;;;;;:::o;21087:157::-;21172:4;21211:25;21196:40;;;:11;:40;;;;21189:47;;21087:157;;;:::o;45976:589::-;46120:45;46147:4;46153:2;46157:7;46120:26;:45::i;:::-;46198:1;46182:18;;:4;:18;;;46178:187;;;46217:40;46249:7;46217:31;:40::i;:::-;46178:187;;;46287:2;46279:10;;:4;:10;;;46275:90;;46306:47;46339:4;46345:7;46306:32;:47::i;:::-;46275:90;46178:187;46393:1;46379:16;;:2;:16;;;46375:183;;;46412:45;46449:7;46412:36;:45::i;:::-;46375:183;;;46485:4;46479:10;;:2;:10;;;46475:83;;46506:40;46534:2;46538:7;46506:27;:40::i;:::-;46475:83;46375:183;45976:589;;;:::o;37131:439::-;37225:1;37211:16;;:2;:16;;;;37203:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37284:16;37292:7;37284;:16::i;:::-;37283:17;37275:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37346:45;37375:1;37379:2;37383:7;37346:20;:45::i;:::-;37421:1;37404:9;:13;37414:2;37404:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37452:2;37433:7;:16;37441:7;37433:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37497:7;37493:2;37472:33;;37489:1;37472:33;;;;;;;;;;;;37518:44;37546:1;37550:2;37554:7;37518:19;:44::i;:::-;37131:439;;:::o;11004:326::-;11064:4;11321:1;11299:7;:19;;;:23;11292:30;;11004:326;;;:::o;41866:126::-;;;;:::o;47288:164::-;47392:10;:17;;;;47365:15;:24;47381:7;47365:24;;;;;;;;;;;:44;;;;47420:10;47436:7;47420:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47288:164;:::o;48079:988::-;48345:22;48395:1;48370:22;48387:4;48370:16;:22::i;:::-;:26;;;;:::i;:::-;48345:51;;48407:18;48428:17;:26;48446:7;48428:26;;;;;;;;;;;;48407:47;;48575:14;48561:10;:28;48557:328;;48606:19;48628:12;:18;48641:4;48628:18;;;;;;;;;;;;;;;:34;48647:14;48628:34;;;;;;;;;;;;48606:56;;48712:11;48679:12;:18;48692:4;48679:18;;;;;;;;;;;;;;;:30;48698:10;48679:30;;;;;;;;;;;:44;;;;48829:10;48796:17;:30;48814:11;48796:30;;;;;;;;;;;:43;;;;48591:294;48557:328;48981:17;:26;48999:7;48981:26;;;;;;;;;;;48974:33;;;49025:12;:18;49038:4;49025:18;;;;;;;;;;;;;;;:34;49044:14;49025:34;;;;;;;;;;;49018:41;;;48160:907;;48079:988;;:::o;49362:1079::-;49615:22;49660:1;49640:10;:17;;;;:21;;;;:::i;:::-;49615:46;;49672:18;49693:15;:24;49709:7;49693:24;;;;;;;;;;;;49672:45;;50044:19;50066:10;50077:14;50066:26;;;;;;;;:::i;:::-;;;;;;;;;;50044:48;;50130:11;50105:10;50116;50105:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;50241:10;50210:15;:28;50226:11;50210:28;;;;;;;;;;;:41;;;;50382:15;:24;50398:7;50382:24;;;;;;;;;;;50375:31;;;50417:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49433:1008;;;49362:1079;:::o;46866:221::-;46951:14;46968:20;46985:2;46968:16;:20::i;:::-;46951:37;;47026:7;46999:12;:16;47012:2;46999:16;;;;;;;;;;;;;;;:24;47016:6;46999:24;;;;;;;;;;;:34;;;;47073:6;47044:17;:26;47062:7;47044:26;;;;;;;;;;;:35;;;;46940:147;46866:221;;:::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:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:::-;15726:3;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15823:93;15912:3;15823:93;:::i;:::-;15941:2;15936:3;15932:12;15925:19;;15584:366;;;:::o;15956:::-;16098:3;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16195:93;16284:3;16195:93;:::i;:::-;16313:2;16308:3;16304:12;16297:19;;15956:366;;;:::o;16328:118::-;16415:24;16433:5;16415:24;:::i;:::-;16410:3;16403:37;16328:118;;:::o;16452:435::-;16632:3;16654:95;16745:3;16736:6;16654:95;:::i;:::-;16647:102;;16766:95;16857:3;16848:6;16766:95;:::i;:::-;16759:102;;16878:3;16871:10;;16452:435;;;;;:::o;16893:222::-;16986:4;17024:2;17013:9;17009:18;17001:26;;17037:71;17105:1;17094:9;17090:17;17081:6;17037:71;:::i;:::-;16893:222;;;;:::o;17121:640::-;17316:4;17354:3;17343:9;17339:19;17331:27;;17368:71;17436:1;17425:9;17421:17;17412:6;17368:71;:::i;:::-;17449:72;17517:2;17506:9;17502:18;17493:6;17449:72;:::i;:::-;17531;17599:2;17588:9;17584:18;17575:6;17531:72;:::i;:::-;17650:9;17644:4;17640:20;17635:2;17624:9;17620:18;17613:48;17678:76;17749:4;17740:6;17678:76;:::i;:::-;17670:84;;17121:640;;;;;;;:::o;17767:210::-;17854:4;17892:2;17881:9;17877:18;17869:26;;17905:65;17967:1;17956:9;17952:17;17943:6;17905:65;:::i;:::-;17767:210;;;;:::o;17983:313::-;18096:4;18134:2;18123:9;18119:18;18111:26;;18183:9;18177:4;18173:20;18169:1;18158:9;18154:17;18147:47;18211:78;18284:4;18275:6;18211:78;:::i;:::-;18203:86;;17983:313;;;;:::o;18302:419::-;18468:4;18506:2;18495:9;18491:18;18483:26;;18555:9;18549:4;18545:20;18541:1;18530:9;18526:17;18519:47;18583:131;18709:4;18583:131;:::i;:::-;18575:139;;18302:419;;;:::o;18727:::-;18893:4;18931:2;18920:9;18916:18;18908:26;;18980:9;18974:4;18970:20;18966:1;18955:9;18951:17;18944:47;19008:131;19134:4;19008:131;:::i;:::-;19000:139;;18727:419;;;:::o;19152:::-;19318:4;19356:2;19345:9;19341:18;19333:26;;19405:9;19399:4;19395:20;19391:1;19380:9;19376:17;19369:47;19433:131;19559:4;19433:131;:::i;:::-;19425:139;;19152:419;;;:::o;19577:::-;19743:4;19781:2;19770:9;19766:18;19758:26;;19830:9;19824:4;19820:20;19816:1;19805:9;19801:17;19794:47;19858:131;19984:4;19858:131;:::i;:::-;19850:139;;19577:419;;;:::o;20002:::-;20168:4;20206:2;20195:9;20191:18;20183:26;;20255:9;20249:4;20245:20;20241:1;20230:9;20226:17;20219:47;20283:131;20409:4;20283:131;:::i;:::-;20275:139;;20002:419;;;:::o;20427:::-;20593:4;20631:2;20620:9;20616:18;20608:26;;20680:9;20674:4;20670:20;20666:1;20655:9;20651:17;20644:47;20708:131;20834:4;20708:131;:::i;:::-;20700:139;;20427:419;;;:::o;20852:::-;21018:4;21056:2;21045:9;21041:18;21033:26;;21105:9;21099:4;21095:20;21091:1;21080:9;21076:17;21069:47;21133:131;21259:4;21133:131;:::i;:::-;21125:139;;20852:419;;;:::o;21277:::-;21443:4;21481:2;21470:9;21466:18;21458:26;;21530:9;21524:4;21520:20;21516:1;21505:9;21501:17;21494:47;21558:131;21684:4;21558:131;:::i;:::-;21550:139;;21277:419;;;:::o;21702:::-;21868:4;21906:2;21895:9;21891:18;21883:26;;21955:9;21949:4;21945:20;21941:1;21930:9;21926:17;21919:47;21983:131;22109:4;21983:131;:::i;:::-;21975:139;;21702:419;;;:::o;22127:::-;22293:4;22331:2;22320:9;22316:18;22308:26;;22380:9;22374:4;22370:20;22366:1;22355:9;22351:17;22344:47;22408:131;22534:4;22408:131;:::i;:::-;22400:139;;22127:419;;;:::o;22552:::-;22718:4;22756:2;22745:9;22741:18;22733:26;;22805:9;22799:4;22795:20;22791:1;22780:9;22776:17;22769:47;22833:131;22959:4;22833:131;:::i;:::-;22825:139;;22552:419;;;:::o;22977:::-;23143:4;23181:2;23170:9;23166:18;23158:26;;23230:9;23224:4;23220:20;23216:1;23205:9;23201:17;23194:47;23258:131;23384:4;23258:131;:::i;:::-;23250:139;;22977:419;;;:::o;23402:::-;23568:4;23606:2;23595:9;23591:18;23583:26;;23655:9;23649:4;23645:20;23641:1;23630:9;23626:17;23619:47;23683:131;23809:4;23683:131;:::i;:::-;23675:139;;23402:419;;;:::o;23827:::-;23993:4;24031:2;24020:9;24016:18;24008:26;;24080:9;24074:4;24070:20;24066:1;24055:9;24051:17;24044:47;24108:131;24234:4;24108:131;:::i;:::-;24100:139;;23827:419;;;:::o;24252:::-;24418:4;24456:2;24445:9;24441:18;24433:26;;24505:9;24499:4;24495:20;24491:1;24480:9;24476:17;24469:47;24533:131;24659:4;24533:131;:::i;:::-;24525:139;;24252:419;;;:::o;24677:::-;24843:4;24881:2;24870:9;24866:18;24858:26;;24930:9;24924:4;24920:20;24916:1;24905:9;24901:17;24894:47;24958:131;25084:4;24958:131;:::i;:::-;24950:139;;24677:419;;;:::o;25102:::-;25268:4;25306:2;25295:9;25291:18;25283:26;;25355:9;25349:4;25345:20;25341:1;25330:9;25326:17;25319:47;25383:131;25509:4;25383:131;:::i;:::-;25375:139;;25102:419;;;:::o;25527:::-;25693:4;25731:2;25720:9;25716:18;25708:26;;25780:9;25774:4;25770:20;25766:1;25755:9;25751:17;25744:47;25808:131;25934:4;25808:131;:::i;:::-;25800:139;;25527:419;;;:::o;25952:::-;26118:4;26156:2;26145:9;26141:18;26133:26;;26205:9;26199:4;26195:20;26191:1;26180:9;26176:17;26169:47;26233:131;26359:4;26233:131;:::i;:::-;26225:139;;25952:419;;;:::o;26377:::-;26543:4;26581:2;26570:9;26566:18;26558:26;;26630:9;26624:4;26620:20;26616:1;26605:9;26601:17;26594:47;26658:131;26784:4;26658:131;:::i;:::-;26650:139;;26377:419;;;:::o;26802:::-;26968:4;27006:2;26995:9;26991:18;26983:26;;27055:9;27049:4;27045:20;27041:1;27030:9;27026:17;27019:47;27083:131;27209:4;27083:131;:::i;:::-;27075:139;;26802:419;;;:::o;27227:222::-;27320:4;27358:2;27347:9;27343:18;27335:26;;27371:71;27439:1;27428:9;27424:17;27415:6;27371:71;:::i;:::-;27227:222;;;;:::o;27455:129::-;27489:6;27516:20;;:::i;:::-;27506:30;;27545:33;27573:4;27565:6;27545:33;:::i;:::-;27455:129;;;:::o;27590:75::-;27623:6;27656:2;27650:9;27640:19;;27590:75;:::o;27671:307::-;27732:4;27822:18;27814:6;27811:30;27808:56;;;27844:18;;:::i;:::-;27808:56;27882:29;27904:6;27882:29;:::i;:::-;27874:37;;27966:4;27960;27956:15;27948:23;;27671:307;;;:::o;27984:308::-;28046:4;28136:18;28128:6;28125:30;28122:56;;;28158:18;;:::i;:::-;28122:56;28196:29;28218:6;28196:29;:::i;:::-;28188:37;;28280:4;28274;28270:15;28262:23;;27984:308;;;:::o;28298:98::-;28349:6;28383:5;28377:12;28367:22;;28298:98;;;:::o;28402:99::-;28454:6;28488:5;28482:12;28472:22;;28402:99;;;:::o;28507:168::-;28590:11;28624:6;28619:3;28612:19;28664:4;28659:3;28655:14;28640:29;;28507:168;;;;:::o;28681:169::-;28765:11;28799:6;28794:3;28787:19;28839:4;28834:3;28830:14;28815:29;;28681:169;;;;:::o;28856:148::-;28958:11;28995:3;28980:18;;28856:148;;;;:::o;29010:305::-;29050:3;29069:20;29087:1;29069:20;:::i;:::-;29064:25;;29103:20;29121:1;29103:20;:::i;:::-;29098:25;;29257:1;29189:66;29185:74;29182:1;29179:81;29176:107;;;29263:18;;:::i;:::-;29176:107;29307:1;29304;29300:9;29293:16;;29010:305;;;;:::o;29321:185::-;29361:1;29378:20;29396:1;29378:20;:::i;:::-;29373:25;;29412:20;29430:1;29412:20;:::i;:::-;29407:25;;29451:1;29441:35;;29456:18;;:::i;:::-;29441:35;29498:1;29495;29491:9;29486:14;;29321:185;;;;:::o;29512:191::-;29552:4;29572:20;29590:1;29572:20;:::i;:::-;29567:25;;29606:20;29624:1;29606:20;:::i;:::-;29601:25;;29645:1;29642;29639:8;29636:34;;;29650:18;;:::i;:::-;29636:34;29695:1;29692;29688:9;29680:17;;29512:191;;;;:::o;29709:96::-;29746:7;29775:24;29793:5;29775:24;:::i;:::-;29764:35;;29709:96;;;:::o;29811:90::-;29845:7;29888:5;29881:13;29874:21;29863:32;;29811:90;;;:::o;29907:149::-;29943:7;29983:66;29976:5;29972:78;29961:89;;29907:149;;;:::o;30062:126::-;30099:7;30139:42;30132:5;30128:54;30117:65;;30062:126;;;:::o;30194:77::-;30231:7;30260:5;30249:16;;30194:77;;;:::o;30277:154::-;30361:6;30356:3;30351;30338:30;30423:1;30414:6;30409:3;30405:16;30398:27;30277:154;;;:::o;30437:307::-;30505:1;30515:113;30529:6;30526:1;30523:13;30515:113;;;30614:1;30609:3;30605:11;30599:18;30595:1;30590:3;30586:11;30579:39;30551:2;30548:1;30544:10;30539:15;;30515:113;;;30646:6;30643:1;30640:13;30637:101;;;30726:1;30717:6;30712:3;30708:16;30701:27;30637:101;30486:258;30437:307;;;:::o;30750:320::-;30794:6;30831:1;30825:4;30821:12;30811:22;;30878:1;30872:4;30868:12;30899:18;30889:81;;30955:4;30947:6;30943:17;30933:27;;30889:81;31017:2;31009:6;31006:14;30986:18;30983:38;30980:84;;;31036:18;;:::i;:::-;30980:84;30801:269;30750:320;;;:::o;31076:281::-;31159:27;31181:4;31159:27;:::i;:::-;31151:6;31147:40;31289:6;31277:10;31274:22;31253:18;31241:10;31238:34;31235:62;31232:88;;;31300:18;;:::i;:::-;31232:88;31340:10;31336:2;31329:22;31119:238;31076:281;;:::o;31363:233::-;31402:3;31425:24;31443:5;31425:24;:::i;:::-;31416:33;;31471:66;31464:5;31461:77;31458:103;;;31541:18;;:::i;:::-;31458:103;31588:1;31581:5;31577:13;31570:20;;31363:233;;;:::o;31602:176::-;31634:1;31651:20;31669:1;31651:20;:::i;:::-;31646:25;;31685:20;31703:1;31685:20;:::i;:::-;31680:25;;31724:1;31714:35;;31729:18;;:::i;:::-;31714:35;31770:1;31767;31763:9;31758:14;;31602:176;;;;:::o;31784:180::-;31832:77;31829:1;31822:88;31929:4;31926:1;31919:15;31953:4;31950:1;31943:15;31970:180;32018:77;32015:1;32008:88;32115:4;32112:1;32105:15;32139:4;32136:1;32129:15;32156:180;32204:77;32201:1;32194:88;32301:4;32298:1;32291:15;32325:4;32322:1;32315:15;32342:180;32390:77;32387:1;32380:88;32487:4;32484:1;32477:15;32511:4;32508:1;32501:15;32528:180;32576:77;32573:1;32566:88;32673:4;32670:1;32663:15;32697:4;32694:1;32687:15;32714:180;32762:77;32759:1;32752:88;32859:4;32856:1;32849:15;32883:4;32880:1;32873:15;32900:117;33009:1;33006;32999:12;33023:117;33132:1;33129;33122:12;33146:117;33255:1;33252;33245:12;33269:117;33378:1;33375;33368:12;33392:102;33433:6;33484:2;33480:7;33475:2;33468:5;33464:14;33460:28;33450:38;;33392:102;;;:::o;33500:230::-;33640:34;33636:1;33628:6;33624:14;33617:58;33709:13;33704:2;33696:6;33692:15;33685:38;33500:230;:::o;33736:237::-;33876:34;33872:1;33864:6;33860:14;33853:58;33945:20;33940:2;33932:6;33928:15;33921:45;33736:237;:::o;33979:225::-;34119:34;34115:1;34107:6;34103:14;34096:58;34188:8;34183:2;34175:6;34171:15;34164:33;33979:225;:::o;34210:224::-;34350:34;34346:1;34338:6;34334:14;34327:58;34419:7;34414:2;34406:6;34402:15;34395:32;34210:224;:::o;34440:178::-;34580:30;34576:1;34568:6;34564:14;34557:54;34440:178;:::o;34624:165::-;34764:17;34760:1;34752:6;34748:14;34741:41;34624:165;:::o;34795:223::-;34935:34;34931:1;34923:6;34919:14;34912:58;35004:6;34999:2;34991:6;34987:15;34980:31;34795:223;:::o;35024:175::-;35164:27;35160:1;35152:6;35148:14;35141:51;35024:175;:::o;35205:231::-;35345:34;35341:1;35333:6;35329:14;35322:58;35414:14;35409:2;35401:6;35397:15;35390:39;35205:231;:::o;35442:243::-;35582:34;35578:1;35570:6;35566:14;35559:58;35651:26;35646:2;35638:6;35634:15;35627:51;35442:243;:::o;35691:229::-;35831:34;35827:1;35819:6;35815:14;35808:58;35900:12;35895:2;35887:6;35883:15;35876:37;35691:229;:::o;35926:228::-;36066:34;36062:1;36054:6;36050:14;36043:58;36135:11;36130:2;36122:6;36118:15;36111:36;35926:228;:::o;36160:182::-;36300:34;36296:1;36288:6;36284:14;36277:58;36160:182;:::o;36348:231::-;36488:34;36484:1;36476:6;36472:14;36465:58;36557:14;36552:2;36544:6;36540:15;36533:39;36348:231;:::o;36585:182::-;36725:34;36721:1;36713:6;36709:14;36702:58;36585:182;:::o;36773:234::-;36913:34;36909:1;36901:6;36897:14;36890:58;36982:17;36977:2;36969:6;36965:15;36958:42;36773:234;:::o;37013:220::-;37153:34;37149:1;37141:6;37137:14;37130:58;37222:3;37217:2;37209:6;37205:15;37198:28;37013:220;:::o;37239:236::-;37379:34;37375:1;37367:6;37363:14;37356:58;37448:19;37443:2;37435:6;37431:15;37424:44;37239:236;:::o;37481:231::-;37621:34;37617:1;37609:6;37605:14;37598:58;37690:14;37685:2;37677:6;37673:15;37666:39;37481:231;:::o;37718:172::-;37858:24;37854:1;37846:6;37842:14;37835:48;37718:172;:::o;37896:235::-;38036:34;38032:1;38024:6;38020:14;38013:58;38105:18;38100:2;38092:6;38088:15;38081:43;37896:235;:::o;38137:122::-;38210:24;38228:5;38210:24;:::i;:::-;38203:5;38200:35;38190:63;;38249:1;38246;38239:12;38190:63;38137:122;:::o;38265:116::-;38335:21;38350:5;38335:21;:::i;:::-;38328:5;38325:32;38315:60;;38371:1;38368;38361:12;38315:60;38265:116;:::o;38387:120::-;38459:23;38476:5;38459:23;:::i;:::-;38452:5;38449:34;38439:62;;38497:1;38494;38487:12;38439:62;38387:120;:::o;38513:122::-;38586:24;38604:5;38586:24;:::i;:::-;38579:5;38576:35;38566:63;;38625:1;38622;38615:12;38566:63;38513:122;:::o
Swarm Source
ipfs://0b616ced98d02303ae9fb89650a26ac4329c28de24299706f100bd80c85602b9
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.