Token CrognomideGen2
Overview CRC721
Total Supply:
410 CNMDV2
Holders:
141 addresses
Contract:
Balance
2 CNMDV2
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CrognomideGen2
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-08-08 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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.7.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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly 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/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/3_Ballot.sol pragma solidity 0.8.9; contract CrognomideGen2 is ERC721Enumerable, Ownable { using Strings for uint256; string baseURI; string public baseExtension = ".json"; uint256 public maxSupply = 1000; bool public paused = false; address public constant adminAddress = 0x110c2cee3d2E9108e42bA8BF7d7140b5f49B0D31; address public utiliContract; modifier onlyUtil() { require(msg.sender == utiliContract, "Only util contract"); _; } constructor( string memory _initBaseURI ) ERC721("CrognomideGen2", "CNMDV2") { setBaseURI(_initBaseURI); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function mintTo(address _to) external onlyUtil returns(uint256) { uint256 supply = totalSupply(); _safeMint(_to, supply+1); return supply+1; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdrawAll() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "Insufficent balance"); _withdraw(adminAddress, balance); } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{ value: _amount }(""); require(success, "Failed to withdraw Ether"); } function setUtilAddress(address _utilAddress) external onlyOwner { utiliContract = _utilAddress; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"adminAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_utilAddress","type":"address"}],"name":"setUtilAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"utiliContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000333565b506103e8600d556000600e60006101000a81548160ff0219169083151502179055503480156200008057600080fd5b5060405162004327380380620043278339818101604052810190620000a6919062000580565b6040518060400160405280600e81526020017f43726f676e6f6d69646547656e320000000000000000000000000000000000008152506040518060400160405280600681526020017f434e4d445632000000000000000000000000000000000000000000000000000081525081600090805190602001906200012a92919062000333565b5080600190805190602001906200014392919062000333565b505050620001666200015a6200017e60201b60201c565b6200018660201b60201c565b62000177816200024c60201b60201c565b50620006b9565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200025c6200027860201b60201c565b80600b90805190602001906200027492919062000333565b5050565b620002886200017e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ae6200030960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000307576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fe9062000632565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003419062000683565b90600052602060002090601f016020900481019282620003655760008555620003b1565b82601f106200038057805160ff1916838001178555620003b1565b82800160010185558215620003b1579182015b82811115620003b057825182559160200191906001019062000393565b5b509050620003c09190620003c4565b5090565b5b80821115620003df576000816000905550600101620003c5565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200044c8262000401565b810181811067ffffffffffffffff821117156200046e576200046d62000412565b5b80604052505050565b600062000483620003e3565b905062000491828262000441565b919050565b600067ffffffffffffffff821115620004b457620004b362000412565b5b620004bf8262000401565b9050602081019050919050565b60005b83811015620004ec578082015181840152602081019050620004cf565b83811115620004fc576000848401525b50505050565b600062000519620005138462000496565b62000477565b905082815260208101848484011115620005385762000537620003fc565b5b62000545848285620004cc565b509392505050565b600082601f830112620005655762000564620003f7565b5b81516200057784826020860162000502565b91505092915050565b600060208284031215620005995762000598620003ed565b5b600082015167ffffffffffffffff811115620005ba57620005b9620003f2565b5b620005c8848285016200054d565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200061a602083620005d1565b91506200062782620005e2565b602082019050919050565b600060208201905081810360008301526200064d816200060b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200069c57607f821691505b60208210811415620006b357620006b262000654565b5b50919050565b613c5e80620006c96000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b88d4fde116100a2578063da3ef23f11610071578063da3ef23f1461057e578063e985e9c51461059a578063f2fde38b146105ca578063fc6f9468146105e6576101e5565b8063b88d4fde146104f6578063c668286214610512578063c87b56dd14610530578063d5abeb0114610560576101e5565b8063853828b6116100de578063853828b6146104945780638da5cb5b1461049e57806395d89b41146104bc578063a22cb465146104da576101e5565b806370a082311461040e578063715018a61461043e578063755edd17146104485780638431f1a914610478576101e5565b806328ed61fb116101875780634f6ccce7116101565780634f6ccce71461037457806355f804b3146103a45780635c975abb146103c05780636352211e146103de576101e5565b806328ed61fb146102da5780632f745c59146102f857806342842e0e14610328578063438b630014610344576101e5565b8063081812fc116101c3578063081812fc14610254578063095ea7b31461028457806318160ddd146102a057806323b872dd146102be576101e5565b806301ffc9a7146101ea57806302329a291461021a57806306fdde0314610236575b600080fd5b61020460048036038101906101ff91906126b8565b610604565b6040516102119190612700565b60405180910390f35b610234600480360381019061022f9190612747565b61067e565b005b61023e6106a3565b60405161024b919061280d565b60405180910390f35b61026e60048036038101906102699190612865565b610735565b60405161027b91906128d3565b60405180910390f35b61029e6004803603810190610299919061291a565b61077b565b005b6102a8610893565b6040516102b59190612969565b60405180910390f35b6102d860048036038101906102d39190612984565b6108a0565b005b6102e2610900565b6040516102ef91906128d3565b60405180910390f35b610312600480360381019061030d919061291a565b610926565b60405161031f9190612969565b60405180910390f35b610342600480360381019061033d9190612984565b6109cb565b005b61035e600480360381019061035991906129d7565b6109eb565b60405161036b9190612ac2565b60405180910390f35b61038e60048036038101906103899190612865565b610a99565b60405161039b9190612969565b60405180910390f35b6103be60048036038101906103b99190612c19565b610b0a565b005b6103c8610b2c565b6040516103d59190612700565b60405180910390f35b6103f860048036038101906103f39190612865565b610b3f565b60405161040591906128d3565b60405180910390f35b610428600480360381019061042391906129d7565b610bf1565b6040516104359190612969565b60405180910390f35b610446610ca9565b005b610462600480360381019061045d91906129d7565b610cbd565b60405161046f9190612969565b60405180910390f35b610492600480360381019061048d91906129d7565b610d86565b005b61049c610dd2565b005b6104a6610e43565b6040516104b391906128d3565b60405180910390f35b6104c4610e6d565b6040516104d1919061280d565b60405180910390f35b6104f460048036038101906104ef9190612c62565b610eff565b005b610510600480360381019061050b9190612d43565b610f15565b005b61051a610f77565b604051610527919061280d565b60405180910390f35b61054a60048036038101906105459190612865565b611005565b604051610557919061280d565b60405180910390f35b6105686110af565b6040516105759190612969565b60405180910390f35b61059860048036038101906105939190612c19565b6110b5565b005b6105b460048036038101906105af9190612dc6565b6110d7565b6040516105c19190612700565b60405180910390f35b6105e460048036038101906105df91906129d7565b61116b565b005b6105ee6111ef565b6040516105fb91906128d3565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610677575061067682611207565b5b9050919050565b6106866112e9565b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546106b290612e35565b80601f01602080910402602001604051908101604052809291908181526020018280546106de90612e35565b801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b5050505050905090565b600061074082611367565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078682610b3f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ee90612ed9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108166113b2565b73ffffffffffffffffffffffffffffffffffffffff16148061084557506108448161083f6113b2565b6110d7565b5b610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b90612f6b565b60405180910390fd5b61088e83836113ba565b505050565b6000600880549050905090565b6108b16108ab6113b2565b82611473565b6108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790612ffd565b60405180910390fd5b6108fb838383611508565b505050565b600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061093183610bf1565b8210610972576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109699061308f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109e683838360405180602001604052806000815250610f15565b505050565b606060006109f883610bf1565b905060008167ffffffffffffffff811115610a1657610a15612aee565b5b604051908082528060200260200182016040528015610a445781602001602082028036833780820191505090505b50905060005b82811015610a8e57610a5c8582610926565b828281518110610a6f57610a6e6130af565b5b6020026020010181815250508080610a869061310d565b915050610a4a565b508092505050919050565b6000610aa3610893565b8210610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb906131c8565b60405180910390fd5b60088281548110610af857610af76130af565b5b90600052602060002001549050919050565b610b126112e9565b80600b9080519060200190610b289291906125a9565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613234565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c59906132c6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cb16112e9565b610cbb600061176f565b565b6000600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690613332565b60405180910390fd5b6000610d59610893565b9050610d7183600183610d6c9190613352565b611835565b600181610d7e9190613352565b915050919050565b610d8e6112e9565b80600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610dda6112e9565b600047905060008111610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e19906133f4565b60405180910390fd5b610e4073110c2cee3d2e9108e42ba8bf7d7140b5f49b0d3182611853565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e7c90612e35565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea890612e35565b8015610ef55780601f10610eca57610100808354040283529160200191610ef5565b820191906000526020600020905b815481529060010190602001808311610ed857829003601f168201915b5050505050905090565b610f11610f0a6113b2565b8383611904565b5050565b610f26610f206113b2565b83611473565b610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612ffd565b60405180910390fd5b610f7184848484611a71565b50505050565b600c8054610f8490612e35565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb090612e35565b8015610ffd5780601f10610fd257610100808354040283529160200191610ffd565b820191906000526020600020905b815481529060010190602001808311610fe057829003601f168201915b505050505081565b606061101082611acd565b61104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690613486565b60405180910390fd5b6000611059611b39565b9050600081511161107957604051806020016040528060008152506110a7565b8061108384611bcb565b600c60405160200161109793929190613576565b6040516020818303038152906040525b915050919050565b600d5481565b6110bd6112e9565b80600c90805190602001906110d39291906125a9565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111736112e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da90613619565b60405180910390fd5b6111ec8161176f565b50565b73110c2cee3d2e9108e42ba8bf7d7140b5f49b0d3181565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806112e257506112e182611d2c565b5b9050919050565b6112f16113b2565b73ffffffffffffffffffffffffffffffffffffffff1661130f610e43565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613685565b60405180910390fd5b565b61137081611acd565b6113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690613234565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661142d83610b3f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061147f83610b3f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114c157506114c081856110d7565b5b806114ff57508373ffffffffffffffffffffffffffffffffffffffff166114e784610735565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661152882610b3f565b73ffffffffffffffffffffffffffffffffffffffff161461157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613717565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906137a9565b60405180910390fd5b6115f9838383611d96565b6116046000826113ba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461165491906137c9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116ab9190613352565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461176a838383611eaa565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61184f828260405180602001604052806000815250611eaf565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516118799061382e565b60006040518083038185875af1925050503d80600081146118b6576040519150601f19603f3d011682016040523d82523d6000602084013e6118bb565b606091505b50509050806118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f69061388f565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a906138fb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a649190612700565b60405180910390a3505050565b611a7c848484611508565b611a8884848484611f0a565b611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe9061398d565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054611b4890612e35565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7490612e35565b8015611bc15780601f10611b9657610100808354040283529160200191611bc1565b820191906000526020600020905b815481529060010190602001808311611ba457829003601f168201915b5050505050905090565b60606000821415611c13576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d27565b600082905060005b60008214611c45578080611c2e9061310d565b915050600a82611c3e91906139dc565b9150611c1b565b60008167ffffffffffffffff811115611c6157611c60612aee565b5b6040519080825280601f01601f191660200182016040528015611c935781602001600182028036833780820191505090505b5090505b60008514611d2057600182611cac91906137c9565b9150600a85611cbb9190613a0d565b6030611cc79190613352565b60f81b818381518110611cdd57611cdc6130af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d1991906139dc565b9450611c97565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611da18383836120a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611de457611ddf816120a6565b611e23565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e2257611e2183826120ef565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e6657611e618161225c565b611ea5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611ea457611ea3828261232d565b5b5b505050565b505050565b611eb983836123ac565b611ec66000848484611f0a565b611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc9061398d565b60405180910390fd5b505050565b6000611f2b8473ffffffffffffffffffffffffffffffffffffffff16612586565b15612094578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f546113b2565b8786866040518563ffffffff1660e01b8152600401611f769493929190613a93565b602060405180830381600087803b158015611f9057600080fd5b505af1925050508015611fc157506040513d601f19601f82011682018060405250810190611fbe9190613af4565b60015b612044573d8060008114611ff1576040519150601f19603f3d011682016040523d82523d6000602084013e611ff6565b606091505b5060008151141561203c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120339061398d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612099565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016120fc84610bf1565b61210691906137c9565b90506000600760008481526020019081526020016000205490508181146121eb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061227091906137c9565b90506000600960008481526020019081526020016000205490506000600883815481106122a05761229f6130af565b5b9060005260206000200154905080600883815481106122c2576122c16130af565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061231157612310613b21565b5b6001900381819060005260206000200160009055905550505050565b600061233883610bf1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390613b9c565b60405180910390fd5b61242581611acd565b15612465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245c90613c08565b60405180910390fd5b61247160008383611d96565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c19190613352565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461258260008383611eaa565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546125b590612e35565b90600052602060002090601f0160209004810192826125d7576000855561261e565b82601f106125f057805160ff191683800117855561261e565b8280016001018555821561261e579182015b8281111561261d578251825591602001919060010190612602565b5b50905061262b919061262f565b5090565b5b80821115612648576000816000905550600101612630565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61269581612660565b81146126a057600080fd5b50565b6000813590506126b28161268c565b92915050565b6000602082840312156126ce576126cd612656565b5b60006126dc848285016126a3565b91505092915050565b60008115159050919050565b6126fa816126e5565b82525050565b600060208201905061271560008301846126f1565b92915050565b612724816126e5565b811461272f57600080fd5b50565b6000813590506127418161271b565b92915050565b60006020828403121561275d5761275c612656565b5b600061276b84828501612732565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127ae578082015181840152602081019050612793565b838111156127bd576000848401525b50505050565b6000601f19601f8301169050919050565b60006127df82612774565b6127e9818561277f565b93506127f9818560208601612790565b612802816127c3565b840191505092915050565b6000602082019050818103600083015261282781846127d4565b905092915050565b6000819050919050565b6128428161282f565b811461284d57600080fd5b50565b60008135905061285f81612839565b92915050565b60006020828403121561287b5761287a612656565b5b600061288984828501612850565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128bd82612892565b9050919050565b6128cd816128b2565b82525050565b60006020820190506128e860008301846128c4565b92915050565b6128f7816128b2565b811461290257600080fd5b50565b600081359050612914816128ee565b92915050565b6000806040838503121561293157612930612656565b5b600061293f85828601612905565b925050602061295085828601612850565b9150509250929050565b6129638161282f565b82525050565b600060208201905061297e600083018461295a565b92915050565b60008060006060848603121561299d5761299c612656565b5b60006129ab86828701612905565b93505060206129bc86828701612905565b92505060406129cd86828701612850565b9150509250925092565b6000602082840312156129ed576129ec612656565b5b60006129fb84828501612905565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612a398161282f565b82525050565b6000612a4b8383612a30565b60208301905092915050565b6000602082019050919050565b6000612a6f82612a04565b612a798185612a0f565b9350612a8483612a20565b8060005b83811015612ab5578151612a9c8882612a3f565b9750612aa783612a57565b925050600181019050612a88565b5085935050505092915050565b60006020820190508181036000830152612adc8184612a64565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b26826127c3565b810181811067ffffffffffffffff82111715612b4557612b44612aee565b5b80604052505050565b6000612b5861264c565b9050612b648282612b1d565b919050565b600067ffffffffffffffff821115612b8457612b83612aee565b5b612b8d826127c3565b9050602081019050919050565b82818337600083830152505050565b6000612bbc612bb784612b69565b612b4e565b905082815260208101848484011115612bd857612bd7612ae9565b5b612be3848285612b9a565b509392505050565b600082601f830112612c0057612bff612ae4565b5b8135612c10848260208601612ba9565b91505092915050565b600060208284031215612c2f57612c2e612656565b5b600082013567ffffffffffffffff811115612c4d57612c4c61265b565b5b612c5984828501612beb565b91505092915050565b60008060408385031215612c7957612c78612656565b5b6000612c8785828601612905565b9250506020612c9885828601612732565b9150509250929050565b600067ffffffffffffffff821115612cbd57612cbc612aee565b5b612cc6826127c3565b9050602081019050919050565b6000612ce6612ce184612ca2565b612b4e565b905082815260208101848484011115612d0257612d01612ae9565b5b612d0d848285612b9a565b509392505050565b600082601f830112612d2a57612d29612ae4565b5b8135612d3a848260208601612cd3565b91505092915050565b60008060008060808587031215612d5d57612d5c612656565b5b6000612d6b87828801612905565b9450506020612d7c87828801612905565b9350506040612d8d87828801612850565b925050606085013567ffffffffffffffff811115612dae57612dad61265b565b5b612dba87828801612d15565b91505092959194509250565b60008060408385031215612ddd57612ddc612656565b5b6000612deb85828601612905565b9250506020612dfc85828601612905565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e4d57607f821691505b60208210811415612e6157612e60612e06565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ec360218361277f565b9150612ece82612e67565b604082019050919050565b60006020820190508181036000830152612ef281612eb6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612f55603e8361277f565b9150612f6082612ef9565b604082019050919050565b60006020820190508181036000830152612f8481612f48565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612fe7602e8361277f565b9150612ff282612f8b565b604082019050919050565b6000602082019050818103600083015261301681612fda565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613079602b8361277f565b91506130848261301d565b604082019050919050565b600060208201905081810360008301526130a88161306c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131188261282f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561314b5761314a6130de565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006131b2602c8361277f565b91506131bd82613156565b604082019050919050565b600060208201905081810360008301526131e1816131a5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061321e60188361277f565b9150613229826131e8565b602082019050919050565b6000602082019050818103600083015261324d81613211565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006132b060298361277f565b91506132bb82613254565b604082019050919050565b600060208201905081810360008301526132df816132a3565b9050919050565b7f4f6e6c79207574696c20636f6e74726163740000000000000000000000000000600082015250565b600061331c60128361277f565b9150613327826132e6565b602082019050919050565b6000602082019050818103600083015261334b8161330f565b9050919050565b600061335d8261282f565b91506133688361282f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561339d5761339c6130de565b5b828201905092915050565b7f496e737566666963656e742062616c616e636500000000000000000000000000600082015250565b60006133de60138361277f565b91506133e9826133a8565b602082019050919050565b6000602082019050818103600083015261340d816133d1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613470602f8361277f565b915061347b82613414565b604082019050919050565b6000602082019050818103600083015261349f81613463565b9050919050565b600081905092915050565b60006134bc82612774565b6134c681856134a6565b93506134d6818560208601612790565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461350481612e35565b61350e81866134a6565b94506001821660008114613529576001811461353a5761356d565b60ff1983168652818601935061356d565b613543856134e2565b60005b8381101561356557815481890152600182019150602081019050613546565b838801955050505b50505092915050565b600061358282866134b1565b915061358e82856134b1565b915061359a82846134f7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061360360268361277f565b915061360e826135a7565b604082019050919050565b60006020820190508181036000830152613632816135f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061366f60208361277f565b915061367a82613639565b602082019050919050565b6000602082019050818103600083015261369e81613662565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061370160258361277f565b915061370c826136a5565b604082019050919050565b60006020820190508181036000830152613730816136f4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061379360248361277f565b915061379e82613737565b604082019050919050565b600060208201905081810360008301526137c281613786565b9050919050565b60006137d48261282f565b91506137df8361282f565b9250828210156137f2576137f16130de565b5b828203905092915050565b600081905092915050565b50565b60006138186000836137fd565b915061382382613808565b600082019050919050565b60006138398261380b565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b600061387960188361277f565b915061388482613843565b602082019050919050565b600060208201905081810360008301526138a88161386c565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006138e560198361277f565b91506138f0826138af565b602082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061397760328361277f565b91506139828261391b565b604082019050919050565b600060208201905081810360008301526139a68161396a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006139e78261282f565b91506139f28361282f565b925082613a0257613a016139ad565b5b828204905092915050565b6000613a188261282f565b9150613a238361282f565b925082613a3357613a326139ad565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613a6582613a3e565b613a6f8185613a49565b9350613a7f818560208601612790565b613a88816127c3565b840191505092915050565b6000608082019050613aa860008301876128c4565b613ab560208301866128c4565b613ac2604083018561295a565b8181036060830152613ad48184613a5a565b905095945050505050565b600081519050613aee8161268c565b92915050565b600060208284031215613b0a57613b09612656565b5b6000613b1884828501613adf565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613b8660208361277f565b9150613b9182613b50565b602082019050919050565b60006020820190508181036000830152613bb581613b79565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613bf2601c8361277f565b9150613bfd82613bbc565b602082019050919050565b60006020820190508181036000830152613c2181613be5565b905091905056fea2646970667358221220940c2aee302a9367ef2053e453e30c4aa04a8362a5ad8992bf0df730230b8fef64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b88d4fde116100a2578063da3ef23f11610071578063da3ef23f1461057e578063e985e9c51461059a578063f2fde38b146105ca578063fc6f9468146105e6576101e5565b8063b88d4fde146104f6578063c668286214610512578063c87b56dd14610530578063d5abeb0114610560576101e5565b8063853828b6116100de578063853828b6146104945780638da5cb5b1461049e57806395d89b41146104bc578063a22cb465146104da576101e5565b806370a082311461040e578063715018a61461043e578063755edd17146104485780638431f1a914610478576101e5565b806328ed61fb116101875780634f6ccce7116101565780634f6ccce71461037457806355f804b3146103a45780635c975abb146103c05780636352211e146103de576101e5565b806328ed61fb146102da5780632f745c59146102f857806342842e0e14610328578063438b630014610344576101e5565b8063081812fc116101c3578063081812fc14610254578063095ea7b31461028457806318160ddd146102a057806323b872dd146102be576101e5565b806301ffc9a7146101ea57806302329a291461021a57806306fdde0314610236575b600080fd5b61020460048036038101906101ff91906126b8565b610604565b6040516102119190612700565b60405180910390f35b610234600480360381019061022f9190612747565b61067e565b005b61023e6106a3565b60405161024b919061280d565b60405180910390f35b61026e60048036038101906102699190612865565b610735565b60405161027b91906128d3565b60405180910390f35b61029e6004803603810190610299919061291a565b61077b565b005b6102a8610893565b6040516102b59190612969565b60405180910390f35b6102d860048036038101906102d39190612984565b6108a0565b005b6102e2610900565b6040516102ef91906128d3565b60405180910390f35b610312600480360381019061030d919061291a565b610926565b60405161031f9190612969565b60405180910390f35b610342600480360381019061033d9190612984565b6109cb565b005b61035e600480360381019061035991906129d7565b6109eb565b60405161036b9190612ac2565b60405180910390f35b61038e60048036038101906103899190612865565b610a99565b60405161039b9190612969565b60405180910390f35b6103be60048036038101906103b99190612c19565b610b0a565b005b6103c8610b2c565b6040516103d59190612700565b60405180910390f35b6103f860048036038101906103f39190612865565b610b3f565b60405161040591906128d3565b60405180910390f35b610428600480360381019061042391906129d7565b610bf1565b6040516104359190612969565b60405180910390f35b610446610ca9565b005b610462600480360381019061045d91906129d7565b610cbd565b60405161046f9190612969565b60405180910390f35b610492600480360381019061048d91906129d7565b610d86565b005b61049c610dd2565b005b6104a6610e43565b6040516104b391906128d3565b60405180910390f35b6104c4610e6d565b6040516104d1919061280d565b60405180910390f35b6104f460048036038101906104ef9190612c62565b610eff565b005b610510600480360381019061050b9190612d43565b610f15565b005b61051a610f77565b604051610527919061280d565b60405180910390f35b61054a60048036038101906105459190612865565b611005565b604051610557919061280d565b60405180910390f35b6105686110af565b6040516105759190612969565b60405180910390f35b61059860048036038101906105939190612c19565b6110b5565b005b6105b460048036038101906105af9190612dc6565b6110d7565b6040516105c19190612700565b60405180910390f35b6105e460048036038101906105df91906129d7565b61116b565b005b6105ee6111ef565b6040516105fb91906128d3565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610677575061067682611207565b5b9050919050565b6106866112e9565b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546106b290612e35565b80601f01602080910402602001604051908101604052809291908181526020018280546106de90612e35565b801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b5050505050905090565b600061074082611367565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078682610b3f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ee90612ed9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108166113b2565b73ffffffffffffffffffffffffffffffffffffffff16148061084557506108448161083f6113b2565b6110d7565b5b610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b90612f6b565b60405180910390fd5b61088e83836113ba565b505050565b6000600880549050905090565b6108b16108ab6113b2565b82611473565b6108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790612ffd565b60405180910390fd5b6108fb838383611508565b505050565b600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061093183610bf1565b8210610972576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109699061308f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109e683838360405180602001604052806000815250610f15565b505050565b606060006109f883610bf1565b905060008167ffffffffffffffff811115610a1657610a15612aee565b5b604051908082528060200260200182016040528015610a445781602001602082028036833780820191505090505b50905060005b82811015610a8e57610a5c8582610926565b828281518110610a6f57610a6e6130af565b5b6020026020010181815250508080610a869061310d565b915050610a4a565b508092505050919050565b6000610aa3610893565b8210610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb906131c8565b60405180910390fd5b60088281548110610af857610af76130af565b5b90600052602060002001549050919050565b610b126112e9565b80600b9080519060200190610b289291906125a9565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613234565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c59906132c6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cb16112e9565b610cbb600061176f565b565b6000600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690613332565b60405180910390fd5b6000610d59610893565b9050610d7183600183610d6c9190613352565b611835565b600181610d7e9190613352565b915050919050565b610d8e6112e9565b80600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610dda6112e9565b600047905060008111610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e19906133f4565b60405180910390fd5b610e4073110c2cee3d2e9108e42ba8bf7d7140b5f49b0d3182611853565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e7c90612e35565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea890612e35565b8015610ef55780601f10610eca57610100808354040283529160200191610ef5565b820191906000526020600020905b815481529060010190602001808311610ed857829003601f168201915b5050505050905090565b610f11610f0a6113b2565b8383611904565b5050565b610f26610f206113b2565b83611473565b610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612ffd565b60405180910390fd5b610f7184848484611a71565b50505050565b600c8054610f8490612e35565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb090612e35565b8015610ffd5780601f10610fd257610100808354040283529160200191610ffd565b820191906000526020600020905b815481529060010190602001808311610fe057829003601f168201915b505050505081565b606061101082611acd565b61104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690613486565b60405180910390fd5b6000611059611b39565b9050600081511161107957604051806020016040528060008152506110a7565b8061108384611bcb565b600c60405160200161109793929190613576565b6040516020818303038152906040525b915050919050565b600d5481565b6110bd6112e9565b80600c90805190602001906110d39291906125a9565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111736112e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da90613619565b60405180910390fd5b6111ec8161176f565b50565b73110c2cee3d2e9108e42ba8bf7d7140b5f49b0d3181565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806112e257506112e182611d2c565b5b9050919050565b6112f16113b2565b73ffffffffffffffffffffffffffffffffffffffff1661130f610e43565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613685565b60405180910390fd5b565b61137081611acd565b6113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690613234565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661142d83610b3f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061147f83610b3f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114c157506114c081856110d7565b5b806114ff57508373ffffffffffffffffffffffffffffffffffffffff166114e784610735565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661152882610b3f565b73ffffffffffffffffffffffffffffffffffffffff161461157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613717565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906137a9565b60405180910390fd5b6115f9838383611d96565b6116046000826113ba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461165491906137c9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116ab9190613352565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461176a838383611eaa565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61184f828260405180602001604052806000815250611eaf565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516118799061382e565b60006040518083038185875af1925050503d80600081146118b6576040519150601f19603f3d011682016040523d82523d6000602084013e6118bb565b606091505b50509050806118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f69061388f565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a906138fb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a649190612700565b60405180910390a3505050565b611a7c848484611508565b611a8884848484611f0a565b611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe9061398d565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054611b4890612e35565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7490612e35565b8015611bc15780601f10611b9657610100808354040283529160200191611bc1565b820191906000526020600020905b815481529060010190602001808311611ba457829003601f168201915b5050505050905090565b60606000821415611c13576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d27565b600082905060005b60008214611c45578080611c2e9061310d565b915050600a82611c3e91906139dc565b9150611c1b565b60008167ffffffffffffffff811115611c6157611c60612aee565b5b6040519080825280601f01601f191660200182016040528015611c935781602001600182028036833780820191505090505b5090505b60008514611d2057600182611cac91906137c9565b9150600a85611cbb9190613a0d565b6030611cc79190613352565b60f81b818381518110611cdd57611cdc6130af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d1991906139dc565b9450611c97565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611da18383836120a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611de457611ddf816120a6565b611e23565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e2257611e2183826120ef565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e6657611e618161225c565b611ea5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611ea457611ea3828261232d565b5b5b505050565b505050565b611eb983836123ac565b611ec66000848484611f0a565b611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc9061398d565b60405180910390fd5b505050565b6000611f2b8473ffffffffffffffffffffffffffffffffffffffff16612586565b15612094578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f546113b2565b8786866040518563ffffffff1660e01b8152600401611f769493929190613a93565b602060405180830381600087803b158015611f9057600080fd5b505af1925050508015611fc157506040513d601f19601f82011682018060405250810190611fbe9190613af4565b60015b612044573d8060008114611ff1576040519150601f19603f3d011682016040523d82523d6000602084013e611ff6565b606091505b5060008151141561203c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120339061398d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612099565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016120fc84610bf1565b61210691906137c9565b90506000600760008481526020019081526020016000205490508181146121eb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061227091906137c9565b90506000600960008481526020019081526020016000205490506000600883815481106122a05761229f6130af565b5b9060005260206000200154905080600883815481106122c2576122c16130af565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061231157612310613b21565b5b6001900381819060005260206000200160009055905550505050565b600061233883610bf1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390613b9c565b60405180910390fd5b61242581611acd565b15612465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245c90613c08565b60405180910390fd5b61247160008383611d96565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c19190613352565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461258260008383611eaa565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546125b590612e35565b90600052602060002090601f0160209004810192826125d7576000855561261e565b82601f106125f057805160ff191683800117855561261e565b8280016001018555821561261e579182015b8281111561261d578251825591602001919060010190612602565b5b50905061262b919061262f565b5090565b5b80821115612648576000816000905550600101612630565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61269581612660565b81146126a057600080fd5b50565b6000813590506126b28161268c565b92915050565b6000602082840312156126ce576126cd612656565b5b60006126dc848285016126a3565b91505092915050565b60008115159050919050565b6126fa816126e5565b82525050565b600060208201905061271560008301846126f1565b92915050565b612724816126e5565b811461272f57600080fd5b50565b6000813590506127418161271b565b92915050565b60006020828403121561275d5761275c612656565b5b600061276b84828501612732565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127ae578082015181840152602081019050612793565b838111156127bd576000848401525b50505050565b6000601f19601f8301169050919050565b60006127df82612774565b6127e9818561277f565b93506127f9818560208601612790565b612802816127c3565b840191505092915050565b6000602082019050818103600083015261282781846127d4565b905092915050565b6000819050919050565b6128428161282f565b811461284d57600080fd5b50565b60008135905061285f81612839565b92915050565b60006020828403121561287b5761287a612656565b5b600061288984828501612850565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128bd82612892565b9050919050565b6128cd816128b2565b82525050565b60006020820190506128e860008301846128c4565b92915050565b6128f7816128b2565b811461290257600080fd5b50565b600081359050612914816128ee565b92915050565b6000806040838503121561293157612930612656565b5b600061293f85828601612905565b925050602061295085828601612850565b9150509250929050565b6129638161282f565b82525050565b600060208201905061297e600083018461295a565b92915050565b60008060006060848603121561299d5761299c612656565b5b60006129ab86828701612905565b93505060206129bc86828701612905565b92505060406129cd86828701612850565b9150509250925092565b6000602082840312156129ed576129ec612656565b5b60006129fb84828501612905565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612a398161282f565b82525050565b6000612a4b8383612a30565b60208301905092915050565b6000602082019050919050565b6000612a6f82612a04565b612a798185612a0f565b9350612a8483612a20565b8060005b83811015612ab5578151612a9c8882612a3f565b9750612aa783612a57565b925050600181019050612a88565b5085935050505092915050565b60006020820190508181036000830152612adc8184612a64565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b26826127c3565b810181811067ffffffffffffffff82111715612b4557612b44612aee565b5b80604052505050565b6000612b5861264c565b9050612b648282612b1d565b919050565b600067ffffffffffffffff821115612b8457612b83612aee565b5b612b8d826127c3565b9050602081019050919050565b82818337600083830152505050565b6000612bbc612bb784612b69565b612b4e565b905082815260208101848484011115612bd857612bd7612ae9565b5b612be3848285612b9a565b509392505050565b600082601f830112612c0057612bff612ae4565b5b8135612c10848260208601612ba9565b91505092915050565b600060208284031215612c2f57612c2e612656565b5b600082013567ffffffffffffffff811115612c4d57612c4c61265b565b5b612c5984828501612beb565b91505092915050565b60008060408385031215612c7957612c78612656565b5b6000612c8785828601612905565b9250506020612c9885828601612732565b9150509250929050565b600067ffffffffffffffff821115612cbd57612cbc612aee565b5b612cc6826127c3565b9050602081019050919050565b6000612ce6612ce184612ca2565b612b4e565b905082815260208101848484011115612d0257612d01612ae9565b5b612d0d848285612b9a565b509392505050565b600082601f830112612d2a57612d29612ae4565b5b8135612d3a848260208601612cd3565b91505092915050565b60008060008060808587031215612d5d57612d5c612656565b5b6000612d6b87828801612905565b9450506020612d7c87828801612905565b9350506040612d8d87828801612850565b925050606085013567ffffffffffffffff811115612dae57612dad61265b565b5b612dba87828801612d15565b91505092959194509250565b60008060408385031215612ddd57612ddc612656565b5b6000612deb85828601612905565b9250506020612dfc85828601612905565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e4d57607f821691505b60208210811415612e6157612e60612e06565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ec360218361277f565b9150612ece82612e67565b604082019050919050565b60006020820190508181036000830152612ef281612eb6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612f55603e8361277f565b9150612f6082612ef9565b604082019050919050565b60006020820190508181036000830152612f8481612f48565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612fe7602e8361277f565b9150612ff282612f8b565b604082019050919050565b6000602082019050818103600083015261301681612fda565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613079602b8361277f565b91506130848261301d565b604082019050919050565b600060208201905081810360008301526130a88161306c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131188261282f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561314b5761314a6130de565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006131b2602c8361277f565b91506131bd82613156565b604082019050919050565b600060208201905081810360008301526131e1816131a5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061321e60188361277f565b9150613229826131e8565b602082019050919050565b6000602082019050818103600083015261324d81613211565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006132b060298361277f565b91506132bb82613254565b604082019050919050565b600060208201905081810360008301526132df816132a3565b9050919050565b7f4f6e6c79207574696c20636f6e74726163740000000000000000000000000000600082015250565b600061331c60128361277f565b9150613327826132e6565b602082019050919050565b6000602082019050818103600083015261334b8161330f565b9050919050565b600061335d8261282f565b91506133688361282f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561339d5761339c6130de565b5b828201905092915050565b7f496e737566666963656e742062616c616e636500000000000000000000000000600082015250565b60006133de60138361277f565b91506133e9826133a8565b602082019050919050565b6000602082019050818103600083015261340d816133d1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613470602f8361277f565b915061347b82613414565b604082019050919050565b6000602082019050818103600083015261349f81613463565b9050919050565b600081905092915050565b60006134bc82612774565b6134c681856134a6565b93506134d6818560208601612790565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461350481612e35565b61350e81866134a6565b94506001821660008114613529576001811461353a5761356d565b60ff1983168652818601935061356d565b613543856134e2565b60005b8381101561356557815481890152600182019150602081019050613546565b838801955050505b50505092915050565b600061358282866134b1565b915061358e82856134b1565b915061359a82846134f7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061360360268361277f565b915061360e826135a7565b604082019050919050565b60006020820190508181036000830152613632816135f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061366f60208361277f565b915061367a82613639565b602082019050919050565b6000602082019050818103600083015261369e81613662565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061370160258361277f565b915061370c826136a5565b604082019050919050565b60006020820190508181036000830152613730816136f4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061379360248361277f565b915061379e82613737565b604082019050919050565b600060208201905081810360008301526137c281613786565b9050919050565b60006137d48261282f565b91506137df8361282f565b9250828210156137f2576137f16130de565b5b828203905092915050565b600081905092915050565b50565b60006138186000836137fd565b915061382382613808565b600082019050919050565b60006138398261380b565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b600061387960188361277f565b915061388482613843565b602082019050919050565b600060208201905081810360008301526138a88161386c565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006138e560198361277f565b91506138f0826138af565b602082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061397760328361277f565b91506139828261391b565b604082019050919050565b600060208201905081810360008301526139a68161396a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006139e78261282f565b91506139f28361282f565b925082613a0257613a016139ad565b5b828204905092915050565b6000613a188261282f565b9150613a238361282f565b925082613a3357613a326139ad565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613a6582613a3e565b613a6f8185613a49565b9350613a7f818560208601612790565b613a88816127c3565b840191505092915050565b6000608082019050613aa860008301876128c4565b613ab560208301866128c4565b613ac2604083018561295a565b8181036060830152613ad48184613a5a565b905095945050505050565b600081519050613aee8161268c565b92915050565b600060208284031215613b0a57613b09612656565b5b6000613b1884828501613adf565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613b8660208361277f565b9150613b9182613b50565b602082019050919050565b60006020820190508181036000830152613bb581613b79565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613bf2601c8361277f565b9150613bfd82613bbc565b602082019050919050565b60006020820190508181036000830152613c2181613be5565b905091905056fea2646970667358221220940c2aee302a9367ef2053e453e30c4aa04a8362a5ad8992bf0df730230b8fef64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
46227:2456:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40010:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48111:73;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26744:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28257:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27774:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40650:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28957:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46535:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40318:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29364:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47092:348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40840:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47879:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46414:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26455:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26186:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;:::i;:::-;;46926:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48575:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48191:187;;;:::i;:::-;;4625:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26913:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28500:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29620:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46336:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47446:427;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46378:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47983:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28726:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5531:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46447:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40010:224;40112:4;40151:35;40136:50;;;:11;:50;;;;:90;;;;40190:36;40214:11;40190:23;:36::i;:::-;40136:90;40129:97;;40010:224;;;:::o;48111:73::-;4511:13;:11;:13::i;:::-;48172:6:::1;48163;;:15;;;;;;;;;;;;;;;;;;48111:73:::0;:::o;26744:100::-;26798:13;26831:5;26824:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26744:100;:::o;28257:171::-;28333:7;28353:23;28368:7;28353:14;:23::i;:::-;28396:15;:24;28412:7;28396:24;;;;;;;;;;;;;;;;;;;;;28389:31;;28257:171;;;:::o;27774:417::-;27855:13;27871:23;27886:7;27871:14;:23::i;:::-;27855:39;;27919:5;27913:11;;:2;:11;;;;27905:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28013:5;27997:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28022:37;28039:5;28046:12;:10;:12::i;:::-;28022:16;:37::i;:::-;27997:62;27975:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28162:21;28171:2;28175:7;28162:8;:21::i;:::-;27844:347;27774:417;;:::o;40650:113::-;40711:7;40738:10;:17;;;;40731:24;;40650:113;:::o;28957:336::-;29152:41;29171:12;:10;:12::i;:::-;29185:7;29152:18;:41::i;:::-;29144:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29257:28;29267:4;29273:2;29277:7;29257:9;:28::i;:::-;28957:336;;;:::o;46535:28::-;;;;;;;;;;;;;:::o;40318:256::-;40415:7;40451:23;40468:5;40451:16;:23::i;:::-;40443:5;:31;40435:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40540:12;:19;40553:5;40540:19;;;;;;;;;;;;;;;:26;40560:5;40540:26;;;;;;;;;;;;40533:33;;40318:256;;;;:::o;29364:185::-;29502:39;29519:4;29525:2;29529:7;29502:39;;;;;;;;;;;;:16;:39::i;:::-;29364:185;;;:::o;47092:348::-;47167:16;47195:23;47221:17;47231:6;47221:9;:17::i;:::-;47195:43;;47245:25;47287:15;47273:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47245:58;;47315:9;47310:103;47330:15;47326:1;:19;47310:103;;;47375:30;47395:6;47403:1;47375:19;:30::i;:::-;47361:8;47370:1;47361:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;47347:3;;;;;:::i;:::-;;;;47310:103;;;;47426:8;47419:15;;;;47092:348;;;:::o;40840:233::-;40915:7;40951:30;:28;:30::i;:::-;40943:5;:38;40935:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41048:10;41059:5;41048:17;;;;;;;;:::i;:::-;;;;;;;;;;41041:24;;40840:233;;;:::o;47879:98::-;4511:13;:11;:13::i;:::-;47960:11:::1;47950:7;:21;;;;;;;;;;;;:::i;:::-;;47879:98:::0;:::o;46414:26::-;;;;;;;;;;;;;:::o;26455:222::-;26527:7;26547:13;26563:7;:16;26571:7;26563:16;;;;;;;;;;;;;;;;;;;;;26547:32;;26615:1;26598:19;;:5;:19;;;;26590:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26664:5;26657:12;;;26455:222;;;:::o;26186:207::-;26258:7;26303:1;26286:19;;:5;:19;;;;26278:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:9;:16;26379:5;26369:16;;;;;;;;;;;;;;;;26362:23;;26186:207;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;46926:160::-;46981:7;46619:13;;;;;;;;;;;46605:27;;:10;:27;;;46597:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46997:14:::1;47014:13;:11;:13::i;:::-;46997:30;;47034:24;47044:3;47056:1;47049:6;:8;;;;:::i;:::-;47034:9;:24::i;:::-;47079:1;47072:6;:8;;;;:::i;:::-;47065:15;;;46926:160:::0;;;:::o;48575:103::-;4511:13;:11;:13::i;:::-;48661:12:::1;48645:13;;:28;;;;;;;;;;;;;;;;;;48575:103:::0;:::o;48191:187::-;4511:13;:11;:13::i;:::-;48238:15:::1;48256:21;48238:39;;48302:1;48292:7;:11;48284:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;48334:32;46486:42;48358:7;48334:9;:32::i;:::-;48231:147;48191:187::o:0;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;26913:104::-;26969:13;27002:7;26995:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26913:104;:::o;28500:155::-;28595:52;28614:12;:10;:12::i;:::-;28628:8;28638;28595:18;:52::i;:::-;28500:155;;:::o;29620:323::-;29794:41;29813:12;:10;:12::i;:::-;29827:7;29794:18;:41::i;:::-;29786:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29897:38;29911:4;29917:2;29921:7;29930:4;29897:13;:38::i;:::-;29620:323;;;;:::o;46336:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47446:427::-;47544:13;47585:16;47593:7;47585;:16::i;:::-;47569:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;47679:28;47710:10;:8;:10::i;:::-;47679:41;;47765:1;47740:14;47734:28;:32;:133;;;;;;;;;;;;;;;;;47802:14;47818:18;:7;:16;:18::i;:::-;47838:13;47785:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47734:133;47727:140;;;47446:427;;;:::o;46378:31::-;;;;:::o;47983:122::-;4511:13;:11;:13::i;:::-;48082:17:::1;48066:13;:33;;;;;;;;;;;;:::i;:::-;;47983:122:::0;:::o;28726:164::-;28823:4;28847:18;:25;28866:5;28847:25;;;;;;;;;;;;;;;:35;28873:8;28847:35;;;;;;;;;;;;;;;;;;;;;;;;;28840:42;;28726:164;;;;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;;;5612:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;46447:81::-;46486:42;46447:81;:::o;25817:305::-;25919:4;25971:25;25956:40;;;:11;:40;;;;:105;;;;26028:33;26013:48;;;:11;:48;;;;25956:105;:158;;;;26078:36;26102:11;26078:23;:36::i;:::-;25956:158;25936:178;;25817:305;;;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;36232:135::-;36314:16;36322:7;36314;:16::i;:::-;36306:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36232:135;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;35511:174::-;35613:2;35586:15;:24;35602:7;35586:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35669:7;35665:2;35631:46;;35640:23;35655:7;35640:14;:23::i;:::-;35631:46;;;;;;;;;;;;35511:174;;:::o;31744:264::-;31837:4;31854:13;31870:23;31885:7;31870:14;:23::i;:::-;31854:39;;31923:5;31912:16;;:7;:16;;;:52;;;;31932:32;31949:5;31956:7;31932:16;:32::i;:::-;31912:52;:87;;;;31992:7;31968:31;;:20;31980:7;31968:11;:20::i;:::-;:31;;;31912:87;31904:96;;;31744:264;;;;:::o;34767:625::-;34926:4;34899:31;;:23;34914:7;34899:14;:23::i;:::-;:31;;;34891:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35005:1;34991:16;;:2;:16;;;;34983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35061:39;35082:4;35088:2;35092:7;35061:20;:39::i;:::-;35165:29;35182:1;35186:7;35165:8;:29::i;:::-;35226:1;35207:9;:15;35217:4;35207:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35255:1;35238:9;:13;35248:2;35238:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35286:2;35267:7;:16;35275:7;35267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35325:7;35321:2;35306:27;;35315:4;35306:27;;;;;;;;;;;;35346:38;35366:4;35372:2;35376:7;35346:19;:38::i;:::-;34767:625;;;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;32350:110::-;32426:26;32436:2;32440:7;32426:26;;;;;;;;;;;;:9;:26::i;:::-;32350:110;;:::o;48384:186::-;48454:12;48472:8;:13;;48494:7;48472:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48453:54;;;48522:7;48514:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;48446:124;48384:186;;:::o;35828:315::-;35983:8;35974:17;;:5;:17;;;;35966:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36070:8;36032:18;:25;36051:5;36032:25;;;;;;;;;;;;;;;:35;36058:8;36032:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36116:8;36094:41;;36109:5;36094:41;;;36126:8;36094:41;;;;;;:::i;:::-;;;;;;;;35828:315;;;:::o;30824:313::-;30980:28;30990:4;30996:2;31000:7;30980:9;:28::i;:::-;31027:47;31050:4;31056:2;31060:7;31069:4;31027:22;:47::i;:::-;31019:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30824:313;;;;:::o;31450:127::-;31515:4;31567:1;31539:30;;:7;:16;31547:7;31539:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31532:37;;31450:127;;;:::o;46818:102::-;46878:13;46907:7;46900:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46818:102;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;17479:157::-;17564:4;17603:25;17588:40;;;:11;:40;;;;17581:47;;17479:157;;;:::o;41686:589::-;41830:45;41857:4;41863:2;41867:7;41830:26;:45::i;:::-;41908:1;41892:18;;:4;:18;;;41888:187;;;41927:40;41959:7;41927:31;:40::i;:::-;41888:187;;;41997:2;41989:10;;:4;:10;;;41985:90;;42016:47;42049:4;42055:7;42016:32;:47::i;:::-;41985:90;41888:187;42103:1;42089:16;;:2;:16;;;42085:183;;;42122:45;42159:7;42122:36;:45::i;:::-;42085:183;;;42195:4;42189:10;;:2;:10;;;42185:83;;42216:40;42244:2;42248:7;42216:27;:40::i;:::-;42185:83;42085:183;41686:589;;;:::o;38867:125::-;;;;:::o;32687:319::-;32816:18;32822:2;32826:7;32816:5;:18::i;:::-;32867:53;32898:1;32902:2;32906:7;32915:4;32867:22;:53::i;:::-;32845:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;32687:319;;;:::o;36931:853::-;37085:4;37106:15;:2;:13;;;:15::i;:::-;37102:675;;;37158:2;37142:36;;;37179:12;:10;:12::i;:::-;37193:4;37199:7;37208:4;37142:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37138:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37400:1;37383:6;:13;:18;37379:328;;;37426:60;;;;;;;;;;:::i;:::-;;;;;;;;37379:328;37657:6;37651:13;37642:6;37638:2;37634:15;37627:38;37138:584;37274:41;;;37264:51;;;:6;:51;;;;37257:58;;;;;37102:675;37761:4;37754:11;;36931:853;;;;;;;:::o;38356:126::-;;;;:::o;42998:164::-;43102:10;:17;;;;43075:15;:24;43091:7;43075:24;;;;;;;;;;;:44;;;;43130:10;43146:7;43130:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42998:164;:::o;43789:988::-;44055:22;44105:1;44080:22;44097:4;44080:16;:22::i;:::-;:26;;;;:::i;:::-;44055:51;;44117:18;44138:17;:26;44156:7;44138:26;;;;;;;;;;;;44117:47;;44285:14;44271:10;:28;44267:328;;44316:19;44338:12;:18;44351:4;44338:18;;;;;;;;;;;;;;;:34;44357:14;44338:34;;;;;;;;;;;;44316:56;;44422:11;44389:12;:18;44402:4;44389:18;;;;;;;;;;;;;;;:30;44408:10;44389:30;;;;;;;;;;;:44;;;;44539:10;44506:17;:30;44524:11;44506:30;;;;;;;;;;;:43;;;;44301:294;44267:328;44691:17;:26;44709:7;44691:26;;;;;;;;;;;44684:33;;;44735:12;:18;44748:4;44735:18;;;;;;;;;;;;;;;:34;44754:14;44735:34;;;;;;;;;;;44728:41;;;43870:907;;43789:988;;:::o;45072:1079::-;45325:22;45370:1;45350:10;:17;;;;:21;;;;:::i;:::-;45325:46;;45382:18;45403:15;:24;45419:7;45403:24;;;;;;;;;;;;45382:45;;45754:19;45776:10;45787:14;45776:26;;;;;;;;:::i;:::-;;;;;;;;;;45754:48;;45840:11;45815:10;45826;45815:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45951:10;45920:15;:28;45936:11;45920:28;;;;;;;;;;;:41;;;;46092:15;:24;46108:7;46092:24;;;;;;;;;;;46085:31;;;46127:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45143:1008;;;45072:1079;:::o;42576:221::-;42661:14;42678:20;42695:2;42678:16;:20::i;:::-;42661:37;;42736:7;42709:12;:16;42722:2;42709:16;;;;;;;;;;;;;;;:24;42726:6;42709:24;;;;;;;;;;;:34;;;;42783:6;42754:17;:26;42772:7;42754:26;;;;;;;;;;;:35;;;;42650:147;42576:221;;:::o;33342:439::-;33436:1;33422:16;;:2;:16;;;;33414:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33495:16;33503:7;33495;:16::i;:::-;33494:17;33486:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33557:45;33586:1;33590:2;33594:7;33557:20;:45::i;:::-;33632:1;33615:9;:13;33625:2;33615:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33663:2;33644:7;:16;33652:7;33644:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33708:7;33704:2;33683:33;;33700:1;33683:33;;;;;;;;;;;;33729:44;33757:1;33761:2;33765:7;33729:19;:44::i;:::-;33342:439;;:::o;7323:326::-;7383:4;7640:1;7618:7;:19;;;:23;7611:30;;7323:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:114::-;6907:6;6941:5;6935:12;6925:22;;6840:114;;;:::o;6960:184::-;7059:11;7093:6;7088:3;7081:19;7133:4;7128:3;7124:14;7109:29;;6960:184;;;;:::o;7150:132::-;7217:4;7240:3;7232:11;;7270:4;7265:3;7261:14;7253:22;;7150:132;;;:::o;7288:108::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7288:108;;:::o;7402:179::-;7471:10;7492:46;7534:3;7526:6;7492:46;:::i;:::-;7570:4;7565:3;7561:14;7547:28;;7402:179;;;;:::o;7587:113::-;7657:4;7689;7684:3;7680:14;7672:22;;7587:113;;;:::o;7736:732::-;7855:3;7884:54;7932:5;7884:54;:::i;:::-;7954:86;8033:6;8028:3;7954:86;:::i;:::-;7947:93;;8064:56;8114:5;8064:56;:::i;:::-;8143:7;8174:1;8159:284;8184:6;8181:1;8178:13;8159:284;;;8260:6;8254:13;8287:63;8346:3;8331:13;8287:63;:::i;:::-;8280:70;;8373:60;8426:6;8373:60;:::i;:::-;8363:70;;8219:224;8206:1;8203;8199:9;8194:14;;8159:284;;;8163:14;8459:3;8452:10;;7860:608;;;7736:732;;;;:::o;8474:373::-;8617:4;8655:2;8644:9;8640:18;8632:26;;8704:9;8698:4;8694:20;8690:1;8679:9;8675:17;8668:47;8732:108;8835:4;8826:6;8732:108;:::i;:::-;8724:116;;8474:373;;;;:::o;8853:117::-;8962:1;8959;8952:12;8976:117;9085:1;9082;9075:12;9099:180;9147:77;9144:1;9137:88;9244:4;9241:1;9234:15;9268:4;9265:1;9258:15;9285:281;9368:27;9390:4;9368:27;:::i;:::-;9360:6;9356:40;9498:6;9486:10;9483:22;9462:18;9450:10;9447:34;9444:62;9441:88;;;9509:18;;:::i;:::-;9441:88;9549:10;9545:2;9538:22;9328:238;9285:281;;:::o;9572:129::-;9606:6;9633:20;;:::i;:::-;9623:30;;9662:33;9690:4;9682:6;9662:33;:::i;:::-;9572:129;;;:::o;9707:308::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9707:308;;;:::o;10021:154::-;10105:6;10100:3;10095;10082:30;10167:1;10158:6;10153:3;10149:16;10142:27;10021:154;;;:::o;10181:412::-;10259:5;10284:66;10300:49;10342:6;10300:49;:::i;:::-;10284:66;:::i;:::-;10275:75;;10373:6;10366:5;10359:21;10411:4;10404:5;10400:16;10449:3;10440:6;10435:3;10431:16;10428:25;10425:112;;;10456:79;;:::i;:::-;10425:112;10546:41;10580:6;10575:3;10570;10546:41;:::i;:::-;10265:328;10181:412;;;;;:::o;10613:340::-;10669:5;10718:3;10711:4;10703:6;10699:17;10695:27;10685:122;;10726:79;;:::i;:::-;10685:122;10843:6;10830:20;10868:79;10943:3;10935:6;10928:4;10920:6;10916:17;10868:79;:::i;:::-;10859:88;;10675:278;10613:340;;;;:::o;10959:509::-;11028:6;11077:2;11065:9;11056:7;11052:23;11048:32;11045:119;;;11083:79;;:::i;:::-;11045:119;11231:1;11220:9;11216:17;11203:31;11261:18;11253:6;11250:30;11247:117;;;11283:79;;:::i;:::-;11247:117;11388:63;11443:7;11434:6;11423:9;11419:22;11388:63;:::i;:::-;11378:73;;11174:287;10959:509;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:180::-;14511:77;14508:1;14501:88;14608:4;14605:1;14598:15;14632:4;14629:1;14622:15;14649:320;14693:6;14730:1;14724:4;14720:12;14710:22;;14777:1;14771:4;14767:12;14798:18;14788:81;;14854:4;14846:6;14842:17;14832:27;;14788:81;14916:2;14908:6;14905:14;14885:18;14882:38;14879:84;;;14935:18;;:::i;:::-;14879:84;14700:269;14649:320;;;:::o;14975:220::-;15115:34;15111:1;15103:6;15099:14;15092:58;15184:3;15179:2;15171:6;15167:15;15160:28;14975:220;:::o;15201:366::-;15343:3;15364:67;15428:2;15423:3;15364:67;:::i;:::-;15357:74;;15440:93;15529:3;15440:93;:::i;:::-;15558:2;15553:3;15549:12;15542:19;;15201:366;;;:::o;15573:419::-;15739:4;15777:2;15766:9;15762:18;15754:26;;15826:9;15820:4;15816:20;15812:1;15801:9;15797:17;15790:47;15854:131;15980:4;15854:131;:::i;:::-;15846:139;;15573:419;;;:::o;15998:249::-;16138:34;16134:1;16126:6;16122:14;16115:58;16207:32;16202:2;16194:6;16190:15;16183:57;15998:249;:::o;16253:366::-;16395:3;16416:67;16480:2;16475:3;16416:67;:::i;:::-;16409:74;;16492:93;16581:3;16492:93;:::i;:::-;16610:2;16605:3;16601:12;16594:19;;16253:366;;;:::o;16625:419::-;16791:4;16829:2;16818:9;16814:18;16806:26;;16878:9;16872:4;16868:20;16864:1;16853:9;16849:17;16842:47;16906:131;17032:4;16906:131;:::i;:::-;16898:139;;16625:419;;;:::o;17050:233::-;17190:34;17186:1;17178:6;17174:14;17167:58;17259:16;17254:2;17246:6;17242:15;17235:41;17050:233;:::o;17289:366::-;17431:3;17452:67;17516:2;17511:3;17452:67;:::i;:::-;17445:74;;17528:93;17617:3;17528:93;:::i;:::-;17646:2;17641:3;17637:12;17630:19;;17289:366;;;:::o;17661:419::-;17827:4;17865:2;17854:9;17850:18;17842:26;;17914:9;17908:4;17904:20;17900:1;17889:9;17885:17;17878:47;17942:131;18068:4;17942:131;:::i;:::-;17934:139;;17661:419;;;:::o;18086:230::-;18226:34;18222:1;18214:6;18210:14;18203:58;18295:13;18290:2;18282:6;18278:15;18271:38;18086:230;:::o;18322:366::-;18464:3;18485:67;18549:2;18544:3;18485:67;:::i;:::-;18478:74;;18561:93;18650:3;18561:93;:::i;:::-;18679:2;18674:3;18670:12;18663:19;;18322:366;;;:::o;18694:419::-;18860:4;18898:2;18887:9;18883:18;18875:26;;18947:9;18941:4;18937:20;18933:1;18922:9;18918:17;18911:47;18975:131;19101:4;18975:131;:::i;:::-;18967:139;;18694:419;;;:::o;19119:180::-;19167:77;19164:1;19157:88;19264:4;19261:1;19254:15;19288:4;19285:1;19278:15;19305:180;19353:77;19350:1;19343:88;19450:4;19447:1;19440:15;19474:4;19471:1;19464:15;19491:233;19530:3;19553:24;19571:5;19553:24;:::i;:::-;19544:33;;19599:66;19592:5;19589:77;19586:103;;;19669:18;;:::i;:::-;19586:103;19716:1;19709:5;19705:13;19698:20;;19491:233;;;:::o;19730:231::-;19870:34;19866:1;19858:6;19854:14;19847:58;19939:14;19934:2;19926:6;19922:15;19915:39;19730:231;:::o;19967:366::-;20109:3;20130:67;20194:2;20189:3;20130:67;:::i;:::-;20123:74;;20206:93;20295:3;20206:93;:::i;:::-;20324:2;20319:3;20315:12;20308:19;;19967:366;;;:::o;20339:419::-;20505:4;20543:2;20532:9;20528:18;20520:26;;20592:9;20586:4;20582:20;20578:1;20567:9;20563:17;20556:47;20620:131;20746:4;20620:131;:::i;:::-;20612:139;;20339:419;;;:::o;20764:174::-;20904:26;20900:1;20892:6;20888:14;20881:50;20764:174;:::o;20944:366::-;21086:3;21107:67;21171:2;21166:3;21107:67;:::i;:::-;21100:74;;21183:93;21272:3;21183:93;:::i;:::-;21301:2;21296:3;21292:12;21285:19;;20944:366;;;:::o;21316:419::-;21482:4;21520:2;21509:9;21505:18;21497:26;;21569:9;21563:4;21559:20;21555:1;21544:9;21540:17;21533:47;21597:131;21723:4;21597:131;:::i;:::-;21589:139;;21316:419;;;:::o;21741:228::-;21881:34;21877:1;21869:6;21865:14;21858:58;21950:11;21945:2;21937:6;21933:15;21926:36;21741:228;:::o;21975:366::-;22117:3;22138:67;22202:2;22197:3;22138:67;:::i;:::-;22131:74;;22214:93;22303:3;22214:93;:::i;:::-;22332:2;22327:3;22323:12;22316:19;;21975:366;;;:::o;22347:419::-;22513:4;22551:2;22540:9;22536:18;22528:26;;22600:9;22594:4;22590:20;22586:1;22575:9;22571:17;22564:47;22628:131;22754:4;22628:131;:::i;:::-;22620:139;;22347:419;;;:::o;22772:168::-;22912:20;22908:1;22900:6;22896:14;22889:44;22772:168;:::o;22946:366::-;23088:3;23109:67;23173:2;23168:3;23109:67;:::i;:::-;23102:74;;23185:93;23274:3;23185:93;:::i;:::-;23303:2;23298:3;23294:12;23287:19;;22946:366;;;:::o;23318:419::-;23484:4;23522:2;23511:9;23507:18;23499:26;;23571:9;23565:4;23561:20;23557:1;23546:9;23542:17;23535:47;23599:131;23725:4;23599:131;:::i;:::-;23591:139;;23318:419;;;:::o;23743:305::-;23783:3;23802:20;23820:1;23802:20;:::i;:::-;23797:25;;23836:20;23854:1;23836:20;:::i;:::-;23831:25;;23990:1;23922:66;23918:74;23915:1;23912:81;23909:107;;;23996:18;;:::i;:::-;23909:107;24040:1;24037;24033:9;24026:16;;23743:305;;;;:::o;24054:169::-;24194:21;24190:1;24182:6;24178:14;24171:45;24054:169;:::o;24229:366::-;24371:3;24392:67;24456:2;24451:3;24392:67;:::i;:::-;24385:74;;24468:93;24557:3;24468:93;:::i;:::-;24586:2;24581:3;24577:12;24570:19;;24229:366;;;:::o;24601:419::-;24767:4;24805:2;24794:9;24790:18;24782:26;;24854:9;24848:4;24844:20;24840:1;24829:9;24825:17;24818:47;24882:131;25008:4;24882:131;:::i;:::-;24874:139;;24601:419;;;:::o;25026:234::-;25166:34;25162:1;25154:6;25150:14;25143:58;25235:17;25230:2;25222:6;25218:15;25211:42;25026:234;:::o;25266:366::-;25408:3;25429:67;25493:2;25488:3;25429:67;:::i;:::-;25422:74;;25505:93;25594:3;25505:93;:::i;:::-;25623:2;25618:3;25614:12;25607:19;;25266:366;;;:::o;25638:419::-;25804:4;25842:2;25831:9;25827:18;25819:26;;25891:9;25885:4;25881:20;25877:1;25866:9;25862:17;25855:47;25919:131;26045:4;25919:131;:::i;:::-;25911:139;;25638:419;;;:::o;26063:148::-;26165:11;26202:3;26187:18;;26063:148;;;;:::o;26217:377::-;26323:3;26351:39;26384:5;26351:39;:::i;:::-;26406:89;26488:6;26483:3;26406:89;:::i;:::-;26399:96;;26504:52;26549:6;26544:3;26537:4;26530:5;26526:16;26504:52;:::i;:::-;26581:6;26576:3;26572:16;26565:23;;26327:267;26217:377;;;;:::o;26600:141::-;26649:4;26672:3;26664:11;;26695:3;26692:1;26685:14;26729:4;26726:1;26716:18;26708:26;;26600:141;;;:::o;26771:845::-;26874:3;26911:5;26905:12;26940:36;26966:9;26940:36;:::i;:::-;26992:89;27074:6;27069:3;26992:89;:::i;:::-;26985:96;;27112:1;27101:9;27097:17;27128:1;27123:137;;;;27274:1;27269:341;;;;27090:520;;27123:137;27207:4;27203:9;27192;27188:25;27183:3;27176:38;27243:6;27238:3;27234:16;27227:23;;27123:137;;27269:341;27336:38;27368:5;27336:38;:::i;:::-;27396:1;27410:154;27424:6;27421:1;27418:13;27410:154;;;27498:7;27492:14;27488:1;27483:3;27479:11;27472:35;27548:1;27539:7;27535:15;27524:26;;27446:4;27443:1;27439:12;27434:17;;27410:154;;;27593:6;27588:3;27584:16;27577:23;;27276:334;;27090:520;;26878:738;;26771:845;;;;:::o;27622:589::-;27847:3;27869:95;27960:3;27951:6;27869:95;:::i;:::-;27862:102;;27981:95;28072:3;28063:6;27981:95;:::i;:::-;27974:102;;28093:92;28181:3;28172:6;28093:92;:::i;:::-;28086:99;;28202:3;28195:10;;27622:589;;;;;;:::o;28217:225::-;28357:34;28353:1;28345:6;28341:14;28334:58;28426:8;28421:2;28413:6;28409:15;28402:33;28217:225;:::o;28448:366::-;28590:3;28611:67;28675:2;28670:3;28611:67;:::i;:::-;28604:74;;28687:93;28776:3;28687:93;:::i;:::-;28805:2;28800:3;28796:12;28789:19;;28448:366;;;:::o;28820:419::-;28986:4;29024:2;29013:9;29009:18;29001:26;;29073:9;29067:4;29063:20;29059:1;29048:9;29044:17;29037:47;29101:131;29227:4;29101:131;:::i;:::-;29093:139;;28820:419;;;:::o;29245:182::-;29385:34;29381:1;29373:6;29369:14;29362:58;29245:182;:::o;29433:366::-;29575:3;29596:67;29660:2;29655:3;29596:67;:::i;:::-;29589:74;;29672:93;29761:3;29672:93;:::i;:::-;29790:2;29785:3;29781:12;29774:19;;29433:366;;;:::o;29805:419::-;29971:4;30009:2;29998:9;29994:18;29986:26;;30058:9;30052:4;30048:20;30044:1;30033:9;30029:17;30022:47;30086:131;30212:4;30086:131;:::i;:::-;30078:139;;29805:419;;;:::o;30230:224::-;30370:34;30366:1;30358:6;30354:14;30347:58;30439:7;30434:2;30426:6;30422:15;30415:32;30230:224;:::o;30460:366::-;30602:3;30623:67;30687:2;30682:3;30623:67;:::i;:::-;30616:74;;30699:93;30788:3;30699:93;:::i;:::-;30817:2;30812:3;30808:12;30801:19;;30460:366;;;:::o;30832:419::-;30998:4;31036:2;31025:9;31021:18;31013:26;;31085:9;31079:4;31075:20;31071:1;31060:9;31056:17;31049:47;31113:131;31239:4;31113:131;:::i;:::-;31105:139;;30832:419;;;:::o;31257:223::-;31397:34;31393:1;31385:6;31381:14;31374:58;31466:6;31461:2;31453:6;31449:15;31442:31;31257:223;:::o;31486:366::-;31628:3;31649:67;31713:2;31708:3;31649:67;:::i;:::-;31642:74;;31725:93;31814:3;31725:93;:::i;:::-;31843:2;31838:3;31834:12;31827:19;;31486:366;;;:::o;31858:419::-;32024:4;32062:2;32051:9;32047:18;32039:26;;32111:9;32105:4;32101:20;32097:1;32086:9;32082:17;32075:47;32139:131;32265:4;32139:131;:::i;:::-;32131:139;;31858:419;;;:::o;32283:191::-;32323:4;32343:20;32361:1;32343:20;:::i;:::-;32338:25;;32377:20;32395:1;32377:20;:::i;:::-;32372:25;;32416:1;32413;32410:8;32407:34;;;32421:18;;:::i;:::-;32407:34;32466:1;32463;32459:9;32451:17;;32283:191;;;;:::o;32480:147::-;32581:11;32618:3;32603:18;;32480:147;;;;:::o;32633:114::-;;:::o;32753:398::-;32912:3;32933:83;33014:1;33009:3;32933:83;:::i;:::-;32926:90;;33025:93;33114:3;33025:93;:::i;:::-;33143:1;33138:3;33134:11;33127:18;;32753:398;;;:::o;33157:379::-;33341:3;33363:147;33506:3;33363:147;:::i;:::-;33356:154;;33527:3;33520:10;;33157:379;;;:::o;33542:174::-;33682:26;33678:1;33670:6;33666:14;33659:50;33542:174;:::o;33722:366::-;33864:3;33885:67;33949:2;33944:3;33885:67;:::i;:::-;33878:74;;33961:93;34050:3;33961:93;:::i;:::-;34079:2;34074:3;34070:12;34063:19;;33722:366;;;:::o;34094:419::-;34260:4;34298:2;34287:9;34283:18;34275:26;;34347:9;34341:4;34337:20;34333:1;34322:9;34318:17;34311:47;34375:131;34501:4;34375:131;:::i;:::-;34367:139;;34094:419;;;:::o;34519:175::-;34659:27;34655:1;34647:6;34643:14;34636:51;34519:175;:::o;34700:366::-;34842:3;34863:67;34927:2;34922:3;34863:67;:::i;:::-;34856:74;;34939:93;35028:3;34939:93;:::i;:::-;35057:2;35052:3;35048:12;35041:19;;34700:366;;;:::o;35072:419::-;35238:4;35276:2;35265:9;35261:18;35253:26;;35325:9;35319:4;35315:20;35311:1;35300:9;35296:17;35289:47;35353:131;35479:4;35353:131;:::i;:::-;35345:139;;35072:419;;;:::o;35497:237::-;35637:34;35633:1;35625:6;35621:14;35614:58;35706:20;35701:2;35693:6;35689:15;35682:45;35497:237;:::o;35740:366::-;35882:3;35903:67;35967:2;35962:3;35903:67;:::i;:::-;35896:74;;35979:93;36068:3;35979:93;:::i;:::-;36097:2;36092:3;36088:12;36081:19;;35740:366;;;:::o;36112:419::-;36278:4;36316:2;36305:9;36301:18;36293:26;;36365:9;36359:4;36355:20;36351:1;36340:9;36336:17;36329:47;36393:131;36519:4;36393:131;:::i;:::-;36385:139;;36112:419;;;:::o;36537:180::-;36585:77;36582:1;36575:88;36682:4;36679:1;36672:15;36706:4;36703:1;36696:15;36723:185;36763:1;36780:20;36798:1;36780:20;:::i;:::-;36775:25;;36814:20;36832:1;36814:20;:::i;:::-;36809:25;;36853:1;36843:35;;36858:18;;:::i;:::-;36843:35;36900:1;36897;36893:9;36888:14;;36723:185;;;;:::o;36914:176::-;36946:1;36963:20;36981:1;36963:20;:::i;:::-;36958:25;;36997:20;37015:1;36997:20;:::i;:::-;36992:25;;37036:1;37026:35;;37041:18;;:::i;:::-;37026:35;37082:1;37079;37075:9;37070:14;;36914:176;;;;:::o;37096:98::-;37147:6;37181:5;37175:12;37165:22;;37096:98;;;:::o;37200:168::-;37283:11;37317:6;37312:3;37305:19;37357:4;37352:3;37348:14;37333:29;;37200:168;;;;:::o;37374:360::-;37460:3;37488:38;37520:5;37488:38;:::i;:::-;37542:70;37605:6;37600:3;37542:70;:::i;:::-;37535:77;;37621:52;37666:6;37661:3;37654:4;37647:5;37643:16;37621:52;:::i;:::-;37698:29;37720:6;37698:29;:::i;:::-;37693:3;37689:39;37682:46;;37464:270;37374:360;;;;:::o;37740:640::-;37935:4;37973:3;37962:9;37958:19;37950:27;;37987:71;38055:1;38044:9;38040:17;38031:6;37987:71;:::i;:::-;38068:72;38136:2;38125:9;38121:18;38112:6;38068:72;:::i;:::-;38150;38218:2;38207:9;38203:18;38194:6;38150:72;:::i;:::-;38269:9;38263:4;38259:20;38254:2;38243:9;38239:18;38232:48;38297:76;38368:4;38359:6;38297:76;:::i;:::-;38289:84;;37740:640;;;;;;;:::o;38386:141::-;38442:5;38473:6;38467:13;38458:22;;38489:32;38515:5;38489:32;:::i;:::-;38386:141;;;;:::o;38533:349::-;38602:6;38651:2;38639:9;38630:7;38626:23;38622:32;38619:119;;;38657:79;;:::i;:::-;38619:119;38777:1;38802:63;38857:7;38848:6;38837:9;38833:22;38802:63;:::i;:::-;38792:73;;38748:127;38533:349;;;;:::o;38888:180::-;38936:77;38933:1;38926:88;39033:4;39030:1;39023:15;39057:4;39054:1;39047:15;39074:182;39214:34;39210:1;39202:6;39198:14;39191:58;39074:182;:::o;39262:366::-;39404:3;39425:67;39489:2;39484:3;39425:67;:::i;:::-;39418:74;;39501:93;39590:3;39501:93;:::i;:::-;39619:2;39614:3;39610:12;39603:19;;39262:366;;;:::o;39634:419::-;39800:4;39838:2;39827:9;39823:18;39815:26;;39887:9;39881:4;39877:20;39873:1;39862:9;39858:17;39851:47;39915:131;40041:4;39915:131;:::i;:::-;39907:139;;39634:419;;;:::o;40059:178::-;40199:30;40195:1;40187:6;40183:14;40176:54;40059:178;:::o;40243:366::-;40385:3;40406:67;40470:2;40465:3;40406:67;:::i;:::-;40399:74;;40482:93;40571:3;40482:93;:::i;:::-;40600:2;40595:3;40591:12;40584:19;;40243:366;;;:::o;40615:419::-;40781:4;40819:2;40808:9;40804:18;40796:26;;40868:9;40862:4;40858:20;40854:1;40843:9;40839:17;40832:47;40896:131;41022:4;40896:131;:::i;:::-;40888:139;;40615:419;;;:::o
Swarm Source
ipfs://940c2aee302a9367ef2053e453e30c4aa04a8362a5ad8992bf0df730230b8fef