ERC-721
Overview
Max Total Supply
222 MCT
Holders
162
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MechaTiger
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-03 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/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/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/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: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File: contracts/WhitelistVerification.sol pragma solidity ^0.8.0; contract WhitelistVerification is EIP712 { string private constant SIGNING_DOMAIN = "MECHA_TIGER_VERIFY"; string private constant SIGNATURE_VERSION = "1"; struct Whitelist { address userAddress; bytes signature; } constructor() EIP712("MECHA_TIGER_VERIFY", "1") {} function getSigner(Whitelist memory whitelist) internal view returns (address) { return _verify(whitelist); } function _hash(Whitelist memory whitelist) internal view returns (bytes32) { return _hashTypedDataV4( keccak256( abi.encode( keccak256("Whitelist(address userAddress)"), whitelist.userAddress ) ) ); } function _verify(Whitelist memory whitelist) // TODO uncommented code internal // public view returns (address) { bytes32 digest = _hash(whitelist); return ECDSA.recover(digest, whitelist.signature); } } // File: contracts/MechaTiger.sol pragma solidity ^0.8.0; /** * @title MechaTiger * MechaTiger - a contract for my non-fungible creatures. */ /* solhint-enable var-name-mixedcase */ contract MechaTiger is ERC721Enumerable, Ownable, WhitelistVerification, Pausable { using Counters for Counters.Counter; using Strings for uint; using ECDSA for bytes32; // Counter for NFT count Counters.Counter private _tokenIdCounter; // NFT metadata basetoken URI string public baseTokenURI; string private baseExtension = ".json"; // string public notRevealedUri; string private nonRevealBaseURI; mapping(address => uint256) public preSaleListAddress; mapping(address => uint256) public publicSaleListAddress; // Sale Price uint256 private PRESALE_PRICE_PER_TOKEN = 0.069 ether; uint256 private PUBLIC_PRICE_COST_PER_TOKEN = 0.069 ether; // Flags for whitelist,mainsale or pausing the contract bool private preSaleLive; bool private publicSaleLive; // Make it private for now! bool public revealed = false; address private _signerAddress; constructor(string memory name, string memory symbol) ERC721(name, symbol) { baseTokenURI = ""; } // Set Whitelist function setPreSaleLive(bool _preSaleLive) public onlyOwner { preSaleLive = _preSaleLive; } function getPreSaleLive() public view onlyOwner returns(bool _preSaleLive) { return preSaleLive; } // Set publicsale function setPublicSaleLive(bool _publicSaleLive) public onlyOwner { publicSaleLive = _publicSaleLive; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return nonRevealBaseURI; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } /** * @dev _baseURI * */ function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function setNonRevealBaseURI(string memory _nonRevealBaseURI) public onlyOwner { nonRevealBaseURI = _nonRevealBaseURI; } function getNonRevealBaseURI() public view onlyOwner returns(string memory) { return nonRevealBaseURI; } function setBaseExtension(string memory _baseExtension) public onlyOwner { baseExtension = _baseExtension; } function getBaseExtension() public view onlyOwner returns(string memory) { return baseExtension; } function preSaleMint(Whitelist memory walletAddress, uint256 tokenQuantity) external payable whenNotPaused { require(preSaleLive, "SALE_CLOSED"); require(getWhitelist(walletAddress), "DIRECT_MINT_DISALLOWED"); // require(walletAddress.userAddress == msg.sender, "INVALID_WHITELIST_USER"); // Validating funds in user's walletAdrress require(tokenQuantity * PRESALE_PRICE_PER_TOKEN <= msg.value,"INSUFFICIENT_FUNDS"); // Validating token count exceeding total presale count require(totalSupply() + tokenQuantity <= 222, "WHITELIST_SALE_LIMIT_EXCEED"); // Validating user's walletAddress token count exceeding require(preSaleListAddress[msg.sender] + tokenQuantity <= 1, "WHITELIST_LIMIT_EXCEEDED"); // PRESALE_MINTED_TOKEN_COUNT += tokenQuantity; preSaleListAddress[msg.sender] += tokenQuantity; for (uint index = 0; index < tokenQuantity; index++) { _safeMint(walletAddress.userAddress, totalSupply() + 1); } } // Vishal .transfer is not good for the transfering all the ETH in contract to some address; function withdrawAll() external onlyOwner { uint balance = address(this).balance; require(balance > 0, "ZERO_BALANCE_CONTRACT"); payable(owner()).transfer(address(this).balance); } function getWhitelist(Whitelist memory whitelist) internal view returns(bool){ return getSigner(whitelist) == _signerAddress; } // Reveal transition function function reveal() public onlyOwner { revealed = true; } function setSignerAddress(address addr) external onlyOwner { _signerAddress = addr; } function getSignerAddress() public view onlyOwner returns(address signerAddress) { return _signerAddress; } function tokensOfOwner(address _owner) public view returns (uint256[] memory){ uint256 count = balanceOf(_owner); uint256[] memory result; for (uint256 index = 0; index < count; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } function ownerMint(uint256 tokenQuantity) external onlyOwner { require(tokenQuantity + totalSupply() <= 222, "Mint limit exceeded"); for (uint256 index = 0; index < tokenQuantity; index++) { _safeMint(msg.sender, totalSupply() + 1); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","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":[],"name":"getBaseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonRevealBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPreSaleLive","outputs":[{"internalType":"bool","name":"_preSaleLive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSignerAddress","outputs":[{"internalType":"address","name":"signerAddress","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":"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":"tokenQuantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleListAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct WhitelistVerification.Whitelist","name":"walletAddress","type":"tuple"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicSaleListAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_baseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_nonRevealBaseURI","type":"string"}],"name":"setNonRevealBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_preSaleLive","type":"bool"}],"name":"setPreSaleLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSaleLive","type":"bool"}],"name":"setPublicSaleLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005292919062000383565b5066f523226980800060115566f52322698080006012556000601360026101000a81548160ff0219169083151502179055503480156200009157600080fd5b506040516200622d3803806200622d8339818101604052810190620000b79190620004a5565b6040518060400160405280601281526020017f4d454348415f54494745525f56455249465900000000000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250838381600090805190602001906200013d92919062000383565b5080600190805190602001906200015692919062000383565b505050620001796200016d6200027960201b60201c565b6200028160201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001e28184846200034760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080610120818152505050505050506000600a60146101000a81548160ff02191690831515021790555060405180602001604052806000815250600c90805190602001906200027092919062000383565b50505062000760565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008383834630604051602001620003649594939291906200054b565b6040516020818303038152906040528051906020012090509392505050565b828054620003919062000685565b90600052602060002090601f016020900481019282620003b5576000855562000401565b82601f10620003d057805160ff191683800117855562000401565b8280016001018555821562000401579182015b8281111562000400578251825591602001919060010190620003e3565b5b50905062000410919062000414565b5090565b5b808211156200042f57600081600090555060010162000415565b5090565b60006200044a6200044484620005d1565b620005a8565b9050828152602081018484840111156200046357600080fd5b620004708482856200064f565b509392505050565b600082601f8301126200048a57600080fd5b81516200049c84826020860162000433565b91505092915050565b60008060408385031215620004b957600080fd5b600083015167ffffffffffffffff811115620004d457600080fd5b620004e28582860162000478565b925050602083015167ffffffffffffffff8111156200050057600080fd5b6200050e8582860162000478565b9150509250929050565b620005238162000607565b82525050565b62000534816200061b565b82525050565b620005458162000645565b82525050565b600060a08201905062000562600083018862000529565b62000571602083018762000529565b62000580604083018662000529565b6200058f60608301856200053a565b6200059e608083018462000518565b9695505050505050565b6000620005b4620005c7565b9050620005c28282620006bb565b919050565b6000604051905090565b600067ffffffffffffffff821115620005ef57620005ee62000720565b5b620005fa826200074f565b9050602081019050919050565b6000620006148262000625565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200066f57808201518184015260208101905062000652565b838111156200067f576000848401525b50505050565b600060028204905060018216806200069e57607f821691505b60208210811415620006b557620006b4620006f1565b5b50919050565b620006c6826200074f565b810181811067ffffffffffffffff82111715620006e857620006e762000720565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60805160a05160c05160601c60e0516101005161012051615a7a620007b36000396000613a6e01526000613ab001526000613a8f015260006139c401526000613a1a01526000613a430152615a7a6000f3fe6080604052600436106102305760003560e01c80635c975abb1161012e578063a475b5dd116100ab578063e338725b1161006f578063e338725b1461083b578063e985e9c514610857578063f19e75d414610894578063f2fde38b146108bd578063f6d56379146108e657610230565b8063a475b5dd1461076a578063b88d4fde14610781578063c87b56dd146107aa578063d547cfb7146107e7578063da3ef23f1461081257610230565b80638462151c116100f25780638462151c14610697578063853828b6146106d45780638da5cb5b146106eb57806395d89b4114610716578063a22cb4651461074157610230565b80635c975abb146105b25780636352211e146105dd57806370a082311461061a578063715018a61461065757806378a485b21461066e57610230565b80631a296e02116101bc5780633ca5d058116101805780633ca5d058146104cd57806340c30f50146104f657806342842e0e146105215780634f6ccce71461054a578063518302271461058757610230565b80631a296e02146103e85780631dcdd99f1461041357806323b872dd1461043e5780632f745c591461046757806330176e13146104a457610230565b806306fdde031161020357806306fdde03146102ef578063081812fc1461031a578063095ea7b3146103575780630f2e0f7e1461038057806318160ddd146103bd57610230565b806301ffc9a7146102355780630225030714610272578063046dc1661461029d57806306b76500146102c6575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906140c3565b610923565b604051610269919061490a565b60405180910390f35b34801561027e57600080fd5b5061028761099d565b60405161029491906149e6565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613ef3565b610aab565b005b3480156102d257600080fd5b506102ed60048036038101906102e8919061409a565b610b6b565b005b3480156102fb57600080fd5b50610304610c04565b60405161031191906149e6565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c91906141aa565b610c96565b60405161034e9190614881565b60405180910390f35b34801561036357600080fd5b5061037e6004803603810190610379919061405e565b610d1b565b005b34801561038c57600080fd5b506103a760048036038101906103a29190613ef3565b610e33565b6040516103b49190614dc8565b60405180910390f35b3480156103c957600080fd5b506103d2610e4b565b6040516103df9190614dc8565b60405180910390f35b3480156103f457600080fd5b506103fd610e58565b60405161040a9190614881565b60405180910390f35b34801561041f57600080fd5b50610428610efe565b60405161043591906149e6565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190613f58565b61100c565b005b34801561047357600080fd5b5061048e6004803603810190610489919061405e565b61106c565b60405161049b9190614dc8565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190614115565b611111565b005b3480156104d957600080fd5b506104f460048036038101906104ef919061409a565b6111a7565b005b34801561050257600080fd5b5061050b611240565b604051610518919061490a565b60405180910390f35b34801561052d57600080fd5b5061054860048036038101906105439190613f58565b6112d3565b005b34801561055657600080fd5b50610571600480360381019061056c91906141aa565b6112f3565b60405161057e9190614dc8565b60405180910390f35b34801561059357600080fd5b5061059c61138a565b6040516105a9919061490a565b60405180910390f35b3480156105be57600080fd5b506105c761139d565b6040516105d4919061490a565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff91906141aa565b6113b4565b6040516106119190614881565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613ef3565b611466565b60405161064e9190614dc8565b60405180910390f35b34801561066357600080fd5b5061066c61151e565b005b34801561067a57600080fd5b5061069560048036038101906106909190614115565b6115a6565b005b3480156106a357600080fd5b506106be60048036038101906106b99190613ef3565b61163c565b6040516106cb91906148e8565b60405180910390f35b3480156106e057600080fd5b506106e96116c5565b005b3480156106f757600080fd5b506107006117da565b60405161070d9190614881565b60405180910390f35b34801561072257600080fd5b5061072b611804565b60405161073891906149e6565b60405180910390f35b34801561074d57600080fd5b5061076860048036038101906107639190614022565b611896565b005b34801561077657600080fd5b5061077f6118ac565b005b34801561078d57600080fd5b506107a860048036038101906107a39190613fa7565b611945565b005b3480156107b657600080fd5b506107d160048036038101906107cc91906141aa565b6119a7565b6040516107de91906149e6565b60405180910390f35b3480156107f357600080fd5b506107fc611b00565b60405161080991906149e6565b60405180910390f35b34801561081e57600080fd5b5061083960048036038101906108349190614115565b611b8e565b005b61085560048036038101906108509190614156565b611c24565b005b34801561086357600080fd5b5061087e60048036038101906108799190613f1c565b611ed1565b60405161088b919061490a565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b691906141aa565b611f65565b005b3480156108c957600080fd5b506108e460048036038101906108df9190613ef3565b612076565b005b3480156108f257600080fd5b5061090d60048036038101906109089190613ef3565b61216e565b60405161091a9190614dc8565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610996575061099582612186565b5b9050919050565b60606109a7612268565b73ffffffffffffffffffffffffffffffffffffffff166109c56117da565b73ffffffffffffffffffffffffffffffffffffffff1614610a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1290614ca8565b60405180910390fd5b600d8054610a28906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a54906150dd565b8015610aa15780601f10610a7657610100808354040283529160200191610aa1565b820191906000526020600020905b815481529060010190602001808311610a8457829003601f168201915b5050505050905090565b610ab3612268565b73ffffffffffffffffffffffffffffffffffffffff16610ad16117da565b73ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90614ca8565b60405180910390fd5b80601360036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b73612268565b73ffffffffffffffffffffffffffffffffffffffff16610b916117da565b73ffffffffffffffffffffffffffffffffffffffff1614610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde90614ca8565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b606060008054610c13906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f906150dd565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050905090565b6000610ca182612270565b610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790614c88565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d26826113b4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90614d08565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db6612268565b73ffffffffffffffffffffffffffffffffffffffff161480610de55750610de481610ddf612268565b611ed1565b5b610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614be8565b60405180910390fd5b610e2e83836122dc565b505050565b60106020528060005260406000206000915090505481565b6000600880549050905090565b6000610e62612268565b73ffffffffffffffffffffffffffffffffffffffff16610e806117da565b73ffffffffffffffffffffffffffffffffffffffff1614610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90614ca8565b60405180910390fd5b601360039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060610f08612268565b73ffffffffffffffffffffffffffffffffffffffff16610f266117da565b73ffffffffffffffffffffffffffffffffffffffff1614610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390614ca8565b60405180910390fd5b600e8054610f89906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb5906150dd565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b5050505050905090565b61101d611017612268565b82612395565b61105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105390614d28565b60405180910390fd5b611067838383612473565b505050565b600061107783611466565b82106110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90614a68565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611119612268565b73ffffffffffffffffffffffffffffffffffffffff166111376117da565b73ffffffffffffffffffffffffffffffffffffffff161461118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490614ca8565b60405180910390fd5b80600c90805190602001906111a3929190613cb3565b5050565b6111af612268565b73ffffffffffffffffffffffffffffffffffffffff166111cd6117da565b73ffffffffffffffffffffffffffffffffffffffff1614611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90614ca8565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b600061124a612268565b73ffffffffffffffffffffffffffffffffffffffff166112686117da565b73ffffffffffffffffffffffffffffffffffffffff16146112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590614ca8565b60405180910390fd5b601360009054906101000a900460ff16905090565b6112ee83838360405180602001604052806000815250611945565b505050565b60006112fd610e4b565b821061133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614d48565b60405180910390fd5b60088281548110611378577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601360029054906101000a900460ff1681565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490614c28565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90614c08565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611526612268565b73ffffffffffffffffffffffffffffffffffffffff166115446117da565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159190614ca8565b60405180910390fd5b6115a460006126da565b565b6115ae612268565b73ffffffffffffffffffffffffffffffffffffffff166115cc6117da565b73ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614ca8565b60405180910390fd5b80600e9080519060200190611638929190613cb3565b5050565b6060600061164983611466565b9050606060005b828110156116ba57611662858261106c565b82828151811061169b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806116b290615140565b915050611650565b508092505050919050565b6116cd612268565b73ffffffffffffffffffffffffffffffffffffffff166116eb6117da565b73ffffffffffffffffffffffffffffffffffffffff1614611741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173890614ca8565b60405180910390fd5b600047905060008111611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178090614d88565b60405180910390fd5b6117916117da565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156117d6573d6000803e3d6000fd5b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611813906150dd565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906150dd565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b6118a86118a1612268565b83836127a0565b5050565b6118b4612268565b73ffffffffffffffffffffffffffffffffffffffff166118d26117da565b73ffffffffffffffffffffffffffffffffffffffff1614611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f90614ca8565b60405180910390fd5b6001601360026101000a81548160ff021916908315150217905550565b611956611950612268565b83612395565b611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90614d28565b60405180910390fd5b6119a18484848461290d565b50505050565b60606119b282612270565b6119f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e890614cc8565b60405180910390fd5b60001515601360029054906101000a900460ff1615151415611a9f57600e8054611a1a906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611a46906150dd565b8015611a935780601f10611a6857610100808354040283529160200191611a93565b820191906000526020600020905b815481529060010190602001808311611a7657829003601f168201915b50505050509050611afb565b6000611aa9612969565b90506000815111611ac95760405180602001604052806000815250611af7565b80611ad3846129fb565b600d604051602001611ae793929190614819565b6040516020818303038152906040525b9150505b919050565b600c8054611b0d906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611b39906150dd565b8015611b865780601f10611b5b57610100808354040283529160200191611b86565b820191906000526020600020905b815481529060010190602001808311611b6957829003601f168201915b505050505081565b611b96612268565b73ffffffffffffffffffffffffffffffffffffffff16611bb46117da565b73ffffffffffffffffffffffffffffffffffffffff1614611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190614ca8565b60405180910390fd5b80600d9080519060200190611c20929190613cb3565b5050565b611c2c61139d565b15611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6390614bc8565b60405180910390fd5b601360009054906101000a900460ff16611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290614b88565b60405180910390fd5b611cc482612ba8565b611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90614a28565b60405180910390fd5b3460115482611d129190614f82565b1115611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90614ae8565b60405180910390fd5b60de81611d5e610e4b565b611d689190614efb565b1115611da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da090614ce8565b60405180910390fd5b600181600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611df69190614efb565b1115611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90614da8565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e869190614efb565b9250508190555060005b81811015611ecc57611eb983600001516001611eaa610e4b565b611eb49190614efb565b612c0a565b8080611ec490615140565b915050611e90565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f6d612268565b73ffffffffffffffffffffffffffffffffffffffff16611f8b6117da565b73ffffffffffffffffffffffffffffffffffffffff1614611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890614ca8565b60405180910390fd5b60de611feb610e4b565b82611ff69190614efb565b1115612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202e90614d68565b60405180910390fd5b60005b818110156120725761205f336001612050610e4b565b61205a9190614efb565b612c0a565b808061206a90615140565b91505061203a565b5050565b61207e612268565b73ffffffffffffffffffffffffffffffffffffffff1661209c6117da565b73ffffffffffffffffffffffffffffffffffffffff16146120f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e990614ca8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215990614aa8565b60405180910390fd5b61216b816126da565b50565b600f6020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061225157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612261575061226082612c28565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661234f836113b4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123a082612270565b6123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690614ba8565b60405180910390fd5b60006123ea836113b4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061245957508373ffffffffffffffffffffffffffffffffffffffff1661244184610c96565b73ffffffffffffffffffffffffffffffffffffffff16145b8061246a57506124698185611ed1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612493826113b4565b73ffffffffffffffffffffffffffffffffffffffff16146124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e090614ac8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255090614b28565b60405180910390fd5b612564838383612c92565b61256f6000826122dc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125bf9190614fdc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126169190614efb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126d5838383612da6565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561280f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280690614b48565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612900919061490a565b60405180910390a3505050565b612918848484612473565b61292484848484612dab565b612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a90614a88565b60405180910390fd5b50505050565b6060600c8054612978906150dd565b80601f01602080910402602001604051908101604052809291908181526020018280546129a4906150dd565b80156129f15780601f106129c6576101008083540402835291602001916129f1565b820191906000526020600020905b8154815290600101906020018083116129d457829003601f168201915b5050505050905090565b60606000821415612a43576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ba3565b600082905060005b60008214612a75578080612a5e90615140565b915050600a82612a6e9190614f51565b9150612a4b565b60008167ffffffffffffffff811115612ab7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ae95781602001600182028036833780820191505090505b5090505b60008514612b9c57600182612b029190614fdc565b9150600a85612b119190615193565b6030612b1d9190614efb565b60f81b818381518110612b59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b959190614f51565b9450612aed565b8093505050505b919050565b6000601360039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612bec83612f42565b73ffffffffffffffffffffffffffffffffffffffff16149050919050565b612c24828260405180602001604052806000815250612f54565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c9d838383612faf565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ce057612cdb81612fb4565b612d1f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d1e57612d1d8382612ffd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6257612d5d8161316a565b612da1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612da057612d9f82826132ad565b5b5b505050565b505050565b6000612dcc8473ffffffffffffffffffffffffffffffffffffffff1661332c565b15612f35578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df5612268565b8786866040518563ffffffff1660e01b8152600401612e17949392919061489c565b602060405180830381600087803b158015612e3157600080fd5b505af1925050508015612e6257506040513d601f19601f82011682018060405250810190612e5f91906140ec565b60015b612ee5573d8060008114612e92576040519150601f19603f3d011682016040523d82523d6000602084013e612e97565b606091505b50600081511415612edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed490614a88565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f3a565b600190505b949350505050565b6000612f4d8261334f565b9050919050565b612f5e8383613373565b612f6b6000848484612dab565b612faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa190614a88565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161300a84611466565b6130149190614fdc565b90506000600760008481526020019081526020016000205490508181146130f9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061317e9190614fdc565b90506000600960008481526020019081526020016000205490506000600883815481106131d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061321c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613291577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006132b883611466565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008061335b8361354d565b905061336b8184602001516135ab565b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133da90614c68565b60405180910390fd5b6133ec81612270565b1561342c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342390614b08565b60405180910390fd5b61343860008383612c92565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134889190614efb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461354960008383612da6565b5050565b60006135a47f9f60d768b01781f0d328e319035df97cacb14e1be531c14ad213cfde785fa68f8360000151604051602001613589929190614925565b604051602081830303815290604052805190602001206135d2565b9050919050565b60008060006135ba85856135ec565b915091506135c78161366f565b819250505092915050565b60006135e56135df6139c0565b83613ada565b9050919050565b60008060418351141561362e5760008060006020860151925060408601519150606086015160001a905061362287828585613b0d565b94509450505050613668565b60408351141561365f576000806020850151915060408501519050613654868383613c1a565b935093505050613668565b60006002915091505b9250929050565b600060048111156136a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156136e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156136ed576139bd565b60016004811115613727577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613760577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156137a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379890614a08565b60405180910390fd5b600260048111156137db577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613814577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384c90614a48565b60405180910390fd5b6003600481111561388f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156138c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390090614b68565b60405180910390fd5b600480811115613942577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561397b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156139bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b390614c48565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015613a3c57507f000000000000000000000000000000000000000000000000000000000000000046145b15613a69577f00000000000000000000000000000000000000000000000000000000000000009050613ad7565b613ad47f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613c79565b90505b90565b60008282604051602001613aef92919061484a565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613b48576000600391509150613c11565b601b8560ff1614158015613b605750601c8560ff1614155b15613b72576000600491509150613c11565b600060018787878760405160008152602001604052604051613b9794939291906149a1565b6020604051602081039080840390855afa158015613bb9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613c0857600060019250925050613c11565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613c5d9190614efb565b9050613c6b87828885613b0d565b935093505050935093915050565b60008383834630604051602001613c9495949392919061494e565b6040516020818303038152906040528051906020012090509392505050565b828054613cbf906150dd565b90600052602060002090601f016020900481019282613ce15760008555613d28565b82601f10613cfa57805160ff1916838001178555613d28565b82800160010185558215613d28579182015b82811115613d27578251825591602001919060010190613d0c565b5b509050613d359190613d39565b5090565b5b80821115613d52576000816000905550600101613d3a565b5090565b6000613d69613d6484614e08565b614de3565b905082815260208101848484011115613d8157600080fd5b613d8c84828561509b565b509392505050565b6000613da7613da284614e39565b614de3565b905082815260208101848484011115613dbf57600080fd5b613dca84828561509b565b509392505050565b600081359050613de1816159e8565b92915050565b600081359050613df6816159ff565b92915050565b600081359050613e0b81615a16565b92915050565b600081519050613e2081615a16565b92915050565b600082601f830112613e3757600080fd5b8135613e47848260208601613d56565b91505092915050565b600082601f830112613e6157600080fd5b8135613e71848260208601613d94565b91505092915050565b600060408284031215613e8c57600080fd5b613e966040614de3565b90506000613ea684828501613dd2565b600083015250602082013567ffffffffffffffff811115613ec657600080fd5b613ed284828501613e26565b60208301525092915050565b600081359050613eed81615a2d565b92915050565b600060208284031215613f0557600080fd5b6000613f1384828501613dd2565b91505092915050565b60008060408385031215613f2f57600080fd5b6000613f3d85828601613dd2565b9250506020613f4e85828601613dd2565b9150509250929050565b600080600060608486031215613f6d57600080fd5b6000613f7b86828701613dd2565b9350506020613f8c86828701613dd2565b9250506040613f9d86828701613ede565b9150509250925092565b60008060008060808587031215613fbd57600080fd5b6000613fcb87828801613dd2565b9450506020613fdc87828801613dd2565b9350506040613fed87828801613ede565b925050606085013567ffffffffffffffff81111561400a57600080fd5b61401687828801613e26565b91505092959194509250565b6000806040838503121561403557600080fd5b600061404385828601613dd2565b925050602061405485828601613de7565b9150509250929050565b6000806040838503121561407157600080fd5b600061407f85828601613dd2565b925050602061409085828601613ede565b9150509250929050565b6000602082840312156140ac57600080fd5b60006140ba84828501613de7565b91505092915050565b6000602082840312156140d557600080fd5b60006140e384828501613dfc565b91505092915050565b6000602082840312156140fe57600080fd5b600061410c84828501613e11565b91505092915050565b60006020828403121561412757600080fd5b600082013567ffffffffffffffff81111561414157600080fd5b61414d84828501613e50565b91505092915050565b6000806040838503121561416957600080fd5b600083013567ffffffffffffffff81111561418357600080fd5b61418f85828601613e7a565b92505060206141a085828601613ede565b9150509250929050565b6000602082840312156141bc57600080fd5b60006141ca84828501613ede565b91505092915050565b60006141df83836147ec565b60208301905092915050565b6141f481615010565b82525050565b600061420582614e8f565b61420f8185614ebd565b935061421a83614e6a565b8060005b8381101561424b57815161423288826141d3565b975061423d83614eb0565b92505060018101905061421e565b5085935050505092915050565b61426181615022565b82525050565b6142708161502e565b82525050565b6142876142828261502e565b615189565b82525050565b600061429882614e9a565b6142a28185614ece565b93506142b28185602086016150aa565b6142bb81615280565b840191505092915050565b60006142d182614ea5565b6142db8185614edf565b93506142eb8185602086016150aa565b6142f481615280565b840191505092915050565b600061430a82614ea5565b6143148185614ef0565b93506143248185602086016150aa565b80840191505092915050565b6000815461433d816150dd565b6143478186614ef0565b945060018216600081146143625760018114614373576143a6565b60ff198316865281860193506143a6565b61437c85614e7a565b60005b8381101561439e5781548189015260018201915060208101905061437f565b838801955050505b50505092915050565b60006143bc601883614edf565b91506143c782615291565b602082019050919050565b60006143df601683614edf565b91506143ea826152ba565b602082019050919050565b6000614402601f83614edf565b915061440d826152e3565b602082019050919050565b6000614425602b83614edf565b91506144308261530c565b604082019050919050565b6000614448603283614edf565b91506144538261535b565b604082019050919050565b600061446b602683614edf565b9150614476826153aa565b604082019050919050565b600061448e602583614edf565b9150614499826153f9565b604082019050919050565b60006144b1601283614edf565b91506144bc82615448565b602082019050919050565b60006144d4601c83614edf565b91506144df82615471565b602082019050919050565b60006144f7600283614ef0565b91506145028261549a565b600282019050919050565b600061451a602483614edf565b9150614525826154c3565b604082019050919050565b600061453d601983614edf565b915061454882615512565b602082019050919050565b6000614560602283614edf565b915061456b8261553b565b604082019050919050565b6000614583600b83614edf565b915061458e8261558a565b602082019050919050565b60006145a6602c83614edf565b91506145b1826155b3565b604082019050919050565b60006145c9601083614edf565b91506145d482615602565b602082019050919050565b60006145ec603883614edf565b91506145f78261562b565b604082019050919050565b600061460f602a83614edf565b915061461a8261567a565b604082019050919050565b6000614632602983614edf565b915061463d826156c9565b604082019050919050565b6000614655602283614edf565b915061466082615718565b604082019050919050565b6000614678602083614edf565b915061468382615767565b602082019050919050565b600061469b602c83614edf565b91506146a682615790565b604082019050919050565b60006146be602083614edf565b91506146c9826157df565b602082019050919050565b60006146e1602f83614edf565b91506146ec82615808565b604082019050919050565b6000614704601b83614edf565b915061470f82615857565b602082019050919050565b6000614727602183614edf565b915061473282615880565b604082019050919050565b600061474a603183614edf565b9150614755826158cf565b604082019050919050565b600061476d602c83614edf565b91506147788261591e565b604082019050919050565b6000614790601383614edf565b915061479b8261596d565b602082019050919050565b60006147b3601583614edf565b91506147be82615996565b602082019050919050565b60006147d6601883614edf565b91506147e1826159bf565b602082019050919050565b6147f581615084565b82525050565b61480481615084565b82525050565b6148138161508e565b82525050565b600061482582866142ff565b915061483182856142ff565b915061483d8284614330565b9150819050949350505050565b6000614855826144ea565b91506148618285614276565b6020820191506148718284614276565b6020820191508190509392505050565b600060208201905061489660008301846141eb565b92915050565b60006080820190506148b160008301876141eb565b6148be60208301866141eb565b6148cb60408301856147fb565b81810360608301526148dd818461428d565b905095945050505050565b6000602082019050818103600083015261490281846141fa565b905092915050565b600060208201905061491f6000830184614258565b92915050565b600060408201905061493a6000830185614267565b61494760208301846141eb565b9392505050565b600060a0820190506149636000830188614267565b6149706020830187614267565b61497d6040830186614267565b61498a60608301856147fb565b61499760808301846141eb565b9695505050505050565b60006080820190506149b66000830187614267565b6149c3602083018661480a565b6149d06040830185614267565b6149dd6060830184614267565b95945050505050565b60006020820190508181036000830152614a0081846142c6565b905092915050565b60006020820190508181036000830152614a21816143af565b9050919050565b60006020820190508181036000830152614a41816143d2565b9050919050565b60006020820190508181036000830152614a61816143f5565b9050919050565b60006020820190508181036000830152614a8181614418565b9050919050565b60006020820190508181036000830152614aa18161443b565b9050919050565b60006020820190508181036000830152614ac18161445e565b9050919050565b60006020820190508181036000830152614ae181614481565b9050919050565b60006020820190508181036000830152614b01816144a4565b9050919050565b60006020820190508181036000830152614b21816144c7565b9050919050565b60006020820190508181036000830152614b418161450d565b9050919050565b60006020820190508181036000830152614b6181614530565b9050919050565b60006020820190508181036000830152614b8181614553565b9050919050565b60006020820190508181036000830152614ba181614576565b9050919050565b60006020820190508181036000830152614bc181614599565b9050919050565b60006020820190508181036000830152614be1816145bc565b9050919050565b60006020820190508181036000830152614c01816145df565b9050919050565b60006020820190508181036000830152614c2181614602565b9050919050565b60006020820190508181036000830152614c4181614625565b9050919050565b60006020820190508181036000830152614c6181614648565b9050919050565b60006020820190508181036000830152614c818161466b565b9050919050565b60006020820190508181036000830152614ca18161468e565b9050919050565b60006020820190508181036000830152614cc1816146b1565b9050919050565b60006020820190508181036000830152614ce1816146d4565b9050919050565b60006020820190508181036000830152614d01816146f7565b9050919050565b60006020820190508181036000830152614d218161471a565b9050919050565b60006020820190508181036000830152614d418161473d565b9050919050565b60006020820190508181036000830152614d6181614760565b9050919050565b60006020820190508181036000830152614d8181614783565b9050919050565b60006020820190508181036000830152614da1816147a6565b9050919050565b60006020820190508181036000830152614dc1816147c9565b9050919050565b6000602082019050614ddd60008301846147fb565b92915050565b6000614ded614dfe565b9050614df9828261510f565b919050565b6000604051905090565b600067ffffffffffffffff821115614e2357614e22615251565b5b614e2c82615280565b9050602081019050919050565b600067ffffffffffffffff821115614e5457614e53615251565b5b614e5d82615280565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f0682615084565b9150614f1183615084565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f4657614f456151c4565b5b828201905092915050565b6000614f5c82615084565b9150614f6783615084565b925082614f7757614f766151f3565b5b828204905092915050565b6000614f8d82615084565b9150614f9883615084565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fd157614fd06151c4565b5b828202905092915050565b6000614fe782615084565b9150614ff283615084565b925082821015615005576150046151c4565b5b828203905092915050565b600061501b82615064565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156150c85780820151818401526020810190506150ad565b838111156150d7576000848401525b50505050565b600060028204905060018216806150f557607f821691505b6020821081141561510957615108615222565b5b50919050565b61511882615280565b810181811067ffffffffffffffff8211171561513757615136615251565b5b80604052505050565b600061514b82615084565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561517e5761517d6151c4565b5b600182019050919050565b6000819050919050565b600061519e82615084565b91506151a983615084565b9250826151b9576151b86151f3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f494e53554646494349454e545f46554e44530000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f57484954454c4953545f53414c455f4c494d49545f4558434545440000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d696e74206c696d697420657863656564656400000000000000000000000000600082015250565b7f5a45524f5f42414c414e43455f434f4e54524143540000000000000000000000600082015250565b7f57484954454c4953545f4c494d49545f45584345454445440000000000000000600082015250565b6159f181615010565b81146159fc57600080fd5b50565b615a0881615022565b8114615a1357600080fd5b50565b615a1f81615038565b8114615a2a57600080fd5b50565b615a3681615084565b8114615a4157600080fd5b5056fea26469706673582212209a68e11e95b206c1a81fb89838064a2bba60cad7502237265c3b28748222365e64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b4d6563686120546967657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d43540000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102305760003560e01c80635c975abb1161012e578063a475b5dd116100ab578063e338725b1161006f578063e338725b1461083b578063e985e9c514610857578063f19e75d414610894578063f2fde38b146108bd578063f6d56379146108e657610230565b8063a475b5dd1461076a578063b88d4fde14610781578063c87b56dd146107aa578063d547cfb7146107e7578063da3ef23f1461081257610230565b80638462151c116100f25780638462151c14610697578063853828b6146106d45780638da5cb5b146106eb57806395d89b4114610716578063a22cb4651461074157610230565b80635c975abb146105b25780636352211e146105dd57806370a082311461061a578063715018a61461065757806378a485b21461066e57610230565b80631a296e02116101bc5780633ca5d058116101805780633ca5d058146104cd57806340c30f50146104f657806342842e0e146105215780634f6ccce71461054a578063518302271461058757610230565b80631a296e02146103e85780631dcdd99f1461041357806323b872dd1461043e5780632f745c591461046757806330176e13146104a457610230565b806306fdde031161020357806306fdde03146102ef578063081812fc1461031a578063095ea7b3146103575780630f2e0f7e1461038057806318160ddd146103bd57610230565b806301ffc9a7146102355780630225030714610272578063046dc1661461029d57806306b76500146102c6575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906140c3565b610923565b604051610269919061490a565b60405180910390f35b34801561027e57600080fd5b5061028761099d565b60405161029491906149e6565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613ef3565b610aab565b005b3480156102d257600080fd5b506102ed60048036038101906102e8919061409a565b610b6b565b005b3480156102fb57600080fd5b50610304610c04565b60405161031191906149e6565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c91906141aa565b610c96565b60405161034e9190614881565b60405180910390f35b34801561036357600080fd5b5061037e6004803603810190610379919061405e565b610d1b565b005b34801561038c57600080fd5b506103a760048036038101906103a29190613ef3565b610e33565b6040516103b49190614dc8565b60405180910390f35b3480156103c957600080fd5b506103d2610e4b565b6040516103df9190614dc8565b60405180910390f35b3480156103f457600080fd5b506103fd610e58565b60405161040a9190614881565b60405180910390f35b34801561041f57600080fd5b50610428610efe565b60405161043591906149e6565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190613f58565b61100c565b005b34801561047357600080fd5b5061048e6004803603810190610489919061405e565b61106c565b60405161049b9190614dc8565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190614115565b611111565b005b3480156104d957600080fd5b506104f460048036038101906104ef919061409a565b6111a7565b005b34801561050257600080fd5b5061050b611240565b604051610518919061490a565b60405180910390f35b34801561052d57600080fd5b5061054860048036038101906105439190613f58565b6112d3565b005b34801561055657600080fd5b50610571600480360381019061056c91906141aa565b6112f3565b60405161057e9190614dc8565b60405180910390f35b34801561059357600080fd5b5061059c61138a565b6040516105a9919061490a565b60405180910390f35b3480156105be57600080fd5b506105c761139d565b6040516105d4919061490a565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff91906141aa565b6113b4565b6040516106119190614881565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613ef3565b611466565b60405161064e9190614dc8565b60405180910390f35b34801561066357600080fd5b5061066c61151e565b005b34801561067a57600080fd5b5061069560048036038101906106909190614115565b6115a6565b005b3480156106a357600080fd5b506106be60048036038101906106b99190613ef3565b61163c565b6040516106cb91906148e8565b60405180910390f35b3480156106e057600080fd5b506106e96116c5565b005b3480156106f757600080fd5b506107006117da565b60405161070d9190614881565b60405180910390f35b34801561072257600080fd5b5061072b611804565b60405161073891906149e6565b60405180910390f35b34801561074d57600080fd5b5061076860048036038101906107639190614022565b611896565b005b34801561077657600080fd5b5061077f6118ac565b005b34801561078d57600080fd5b506107a860048036038101906107a39190613fa7565b611945565b005b3480156107b657600080fd5b506107d160048036038101906107cc91906141aa565b6119a7565b6040516107de91906149e6565b60405180910390f35b3480156107f357600080fd5b506107fc611b00565b60405161080991906149e6565b60405180910390f35b34801561081e57600080fd5b5061083960048036038101906108349190614115565b611b8e565b005b61085560048036038101906108509190614156565b611c24565b005b34801561086357600080fd5b5061087e60048036038101906108799190613f1c565b611ed1565b60405161088b919061490a565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b691906141aa565b611f65565b005b3480156108c957600080fd5b506108e460048036038101906108df9190613ef3565b612076565b005b3480156108f257600080fd5b5061090d60048036038101906109089190613ef3565b61216e565b60405161091a9190614dc8565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610996575061099582612186565b5b9050919050565b60606109a7612268565b73ffffffffffffffffffffffffffffffffffffffff166109c56117da565b73ffffffffffffffffffffffffffffffffffffffff1614610a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1290614ca8565b60405180910390fd5b600d8054610a28906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a54906150dd565b8015610aa15780601f10610a7657610100808354040283529160200191610aa1565b820191906000526020600020905b815481529060010190602001808311610a8457829003601f168201915b5050505050905090565b610ab3612268565b73ffffffffffffffffffffffffffffffffffffffff16610ad16117da565b73ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90614ca8565b60405180910390fd5b80601360036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b73612268565b73ffffffffffffffffffffffffffffffffffffffff16610b916117da565b73ffffffffffffffffffffffffffffffffffffffff1614610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde90614ca8565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b606060008054610c13906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f906150dd565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050905090565b6000610ca182612270565b610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790614c88565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d26826113b4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90614d08565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db6612268565b73ffffffffffffffffffffffffffffffffffffffff161480610de55750610de481610ddf612268565b611ed1565b5b610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614be8565b60405180910390fd5b610e2e83836122dc565b505050565b60106020528060005260406000206000915090505481565b6000600880549050905090565b6000610e62612268565b73ffffffffffffffffffffffffffffffffffffffff16610e806117da565b73ffffffffffffffffffffffffffffffffffffffff1614610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90614ca8565b60405180910390fd5b601360039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060610f08612268565b73ffffffffffffffffffffffffffffffffffffffff16610f266117da565b73ffffffffffffffffffffffffffffffffffffffff1614610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390614ca8565b60405180910390fd5b600e8054610f89906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb5906150dd565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b5050505050905090565b61101d611017612268565b82612395565b61105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105390614d28565b60405180910390fd5b611067838383612473565b505050565b600061107783611466565b82106110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90614a68565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611119612268565b73ffffffffffffffffffffffffffffffffffffffff166111376117da565b73ffffffffffffffffffffffffffffffffffffffff161461118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490614ca8565b60405180910390fd5b80600c90805190602001906111a3929190613cb3565b5050565b6111af612268565b73ffffffffffffffffffffffffffffffffffffffff166111cd6117da565b73ffffffffffffffffffffffffffffffffffffffff1614611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90614ca8565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b600061124a612268565b73ffffffffffffffffffffffffffffffffffffffff166112686117da565b73ffffffffffffffffffffffffffffffffffffffff16146112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590614ca8565b60405180910390fd5b601360009054906101000a900460ff16905090565b6112ee83838360405180602001604052806000815250611945565b505050565b60006112fd610e4b565b821061133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614d48565b60405180910390fd5b60088281548110611378577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601360029054906101000a900460ff1681565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490614c28565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90614c08565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611526612268565b73ffffffffffffffffffffffffffffffffffffffff166115446117da565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159190614ca8565b60405180910390fd5b6115a460006126da565b565b6115ae612268565b73ffffffffffffffffffffffffffffffffffffffff166115cc6117da565b73ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614ca8565b60405180910390fd5b80600e9080519060200190611638929190613cb3565b5050565b6060600061164983611466565b9050606060005b828110156116ba57611662858261106c565b82828151811061169b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806116b290615140565b915050611650565b508092505050919050565b6116cd612268565b73ffffffffffffffffffffffffffffffffffffffff166116eb6117da565b73ffffffffffffffffffffffffffffffffffffffff1614611741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173890614ca8565b60405180910390fd5b600047905060008111611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178090614d88565b60405180910390fd5b6117916117da565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156117d6573d6000803e3d6000fd5b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611813906150dd565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906150dd565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b6118a86118a1612268565b83836127a0565b5050565b6118b4612268565b73ffffffffffffffffffffffffffffffffffffffff166118d26117da565b73ffffffffffffffffffffffffffffffffffffffff1614611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f90614ca8565b60405180910390fd5b6001601360026101000a81548160ff021916908315150217905550565b611956611950612268565b83612395565b611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90614d28565b60405180910390fd5b6119a18484848461290d565b50505050565b60606119b282612270565b6119f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e890614cc8565b60405180910390fd5b60001515601360029054906101000a900460ff1615151415611a9f57600e8054611a1a906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611a46906150dd565b8015611a935780601f10611a6857610100808354040283529160200191611a93565b820191906000526020600020905b815481529060010190602001808311611a7657829003601f168201915b50505050509050611afb565b6000611aa9612969565b90506000815111611ac95760405180602001604052806000815250611af7565b80611ad3846129fb565b600d604051602001611ae793929190614819565b6040516020818303038152906040525b9150505b919050565b600c8054611b0d906150dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611b39906150dd565b8015611b865780601f10611b5b57610100808354040283529160200191611b86565b820191906000526020600020905b815481529060010190602001808311611b6957829003601f168201915b505050505081565b611b96612268565b73ffffffffffffffffffffffffffffffffffffffff16611bb46117da565b73ffffffffffffffffffffffffffffffffffffffff1614611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190614ca8565b60405180910390fd5b80600d9080519060200190611c20929190613cb3565b5050565b611c2c61139d565b15611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6390614bc8565b60405180910390fd5b601360009054906101000a900460ff16611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290614b88565b60405180910390fd5b611cc482612ba8565b611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90614a28565b60405180910390fd5b3460115482611d129190614f82565b1115611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90614ae8565b60405180910390fd5b60de81611d5e610e4b565b611d689190614efb565b1115611da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da090614ce8565b60405180910390fd5b600181600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611df69190614efb565b1115611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90614da8565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e869190614efb565b9250508190555060005b81811015611ecc57611eb983600001516001611eaa610e4b565b611eb49190614efb565b612c0a565b8080611ec490615140565b915050611e90565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f6d612268565b73ffffffffffffffffffffffffffffffffffffffff16611f8b6117da565b73ffffffffffffffffffffffffffffffffffffffff1614611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890614ca8565b60405180910390fd5b60de611feb610e4b565b82611ff69190614efb565b1115612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202e90614d68565b60405180910390fd5b60005b818110156120725761205f336001612050610e4b565b61205a9190614efb565b612c0a565b808061206a90615140565b91505061203a565b5050565b61207e612268565b73ffffffffffffffffffffffffffffffffffffffff1661209c6117da565b73ffffffffffffffffffffffffffffffffffffffff16146120f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e990614ca8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215990614aa8565b60405180910390fd5b61216b816126da565b50565b600f6020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061225157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612261575061226082612c28565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661234f836113b4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123a082612270565b6123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690614ba8565b60405180910390fd5b60006123ea836113b4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061245957508373ffffffffffffffffffffffffffffffffffffffff1661244184610c96565b73ffffffffffffffffffffffffffffffffffffffff16145b8061246a57506124698185611ed1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612493826113b4565b73ffffffffffffffffffffffffffffffffffffffff16146124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e090614ac8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255090614b28565b60405180910390fd5b612564838383612c92565b61256f6000826122dc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125bf9190614fdc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126169190614efb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126d5838383612da6565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561280f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280690614b48565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612900919061490a565b60405180910390a3505050565b612918848484612473565b61292484848484612dab565b612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a90614a88565b60405180910390fd5b50505050565b6060600c8054612978906150dd565b80601f01602080910402602001604051908101604052809291908181526020018280546129a4906150dd565b80156129f15780601f106129c6576101008083540402835291602001916129f1565b820191906000526020600020905b8154815290600101906020018083116129d457829003601f168201915b5050505050905090565b60606000821415612a43576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ba3565b600082905060005b60008214612a75578080612a5e90615140565b915050600a82612a6e9190614f51565b9150612a4b565b60008167ffffffffffffffff811115612ab7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ae95781602001600182028036833780820191505090505b5090505b60008514612b9c57600182612b029190614fdc565b9150600a85612b119190615193565b6030612b1d9190614efb565b60f81b818381518110612b59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b959190614f51565b9450612aed565b8093505050505b919050565b6000601360039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612bec83612f42565b73ffffffffffffffffffffffffffffffffffffffff16149050919050565b612c24828260405180602001604052806000815250612f54565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c9d838383612faf565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ce057612cdb81612fb4565b612d1f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d1e57612d1d8382612ffd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6257612d5d8161316a565b612da1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612da057612d9f82826132ad565b5b5b505050565b505050565b6000612dcc8473ffffffffffffffffffffffffffffffffffffffff1661332c565b15612f35578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df5612268565b8786866040518563ffffffff1660e01b8152600401612e17949392919061489c565b602060405180830381600087803b158015612e3157600080fd5b505af1925050508015612e6257506040513d601f19601f82011682018060405250810190612e5f91906140ec565b60015b612ee5573d8060008114612e92576040519150601f19603f3d011682016040523d82523d6000602084013e612e97565b606091505b50600081511415612edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed490614a88565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f3a565b600190505b949350505050565b6000612f4d8261334f565b9050919050565b612f5e8383613373565b612f6b6000848484612dab565b612faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa190614a88565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161300a84611466565b6130149190614fdc565b90506000600760008481526020019081526020016000205490508181146130f9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061317e9190614fdc565b90506000600960008481526020019081526020016000205490506000600883815481106131d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061321c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613291577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006132b883611466565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008061335b8361354d565b905061336b8184602001516135ab565b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133da90614c68565b60405180910390fd5b6133ec81612270565b1561342c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342390614b08565b60405180910390fd5b61343860008383612c92565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134889190614efb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461354960008383612da6565b5050565b60006135a47f9f60d768b01781f0d328e319035df97cacb14e1be531c14ad213cfde785fa68f8360000151604051602001613589929190614925565b604051602081830303815290604052805190602001206135d2565b9050919050565b60008060006135ba85856135ec565b915091506135c78161366f565b819250505092915050565b60006135e56135df6139c0565b83613ada565b9050919050565b60008060418351141561362e5760008060006020860151925060408601519150606086015160001a905061362287828585613b0d565b94509450505050613668565b60408351141561365f576000806020850151915060408501519050613654868383613c1a565b935093505050613668565b60006002915091505b9250929050565b600060048111156136a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156136e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156136ed576139bd565b60016004811115613727577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613760577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156137a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379890614a08565b60405180910390fd5b600260048111156137db577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613814577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384c90614a48565b60405180910390fd5b6003600481111561388f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156138c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390090614b68565b60405180910390fd5b600480811115613942577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561397b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156139bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b390614c48565b60405180910390fd5b5b50565b60007f000000000000000000000000bbfde5ed399e7f9e70abb681549cff7b3c0bbd3173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015613a3c57507f000000000000000000000000000000000000000000000000000000000000000146145b15613a69577faafb579490c41fcd7e160e861ecf189bbe212937475e7b0402326abb0d1da2f99050613ad7565b613ad47f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f83a9841429900907f21fb59bd2f8ac795c1ae9f4a424cf6d5ee108c040c2f20f7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613c79565b90505b90565b60008282604051602001613aef92919061484a565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613b48576000600391509150613c11565b601b8560ff1614158015613b605750601c8560ff1614155b15613b72576000600491509150613c11565b600060018787878760405160008152602001604052604051613b9794939291906149a1565b6020604051602081039080840390855afa158015613bb9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613c0857600060019250925050613c11565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613c5d9190614efb565b9050613c6b87828885613b0d565b935093505050935093915050565b60008383834630604051602001613c9495949392919061494e565b6040516020818303038152906040528051906020012090509392505050565b828054613cbf906150dd565b90600052602060002090601f016020900481019282613ce15760008555613d28565b82601f10613cfa57805160ff1916838001178555613d28565b82800160010185558215613d28579182015b82811115613d27578251825591602001919060010190613d0c565b5b509050613d359190613d39565b5090565b5b80821115613d52576000816000905550600101613d3a565b5090565b6000613d69613d6484614e08565b614de3565b905082815260208101848484011115613d8157600080fd5b613d8c84828561509b565b509392505050565b6000613da7613da284614e39565b614de3565b905082815260208101848484011115613dbf57600080fd5b613dca84828561509b565b509392505050565b600081359050613de1816159e8565b92915050565b600081359050613df6816159ff565b92915050565b600081359050613e0b81615a16565b92915050565b600081519050613e2081615a16565b92915050565b600082601f830112613e3757600080fd5b8135613e47848260208601613d56565b91505092915050565b600082601f830112613e6157600080fd5b8135613e71848260208601613d94565b91505092915050565b600060408284031215613e8c57600080fd5b613e966040614de3565b90506000613ea684828501613dd2565b600083015250602082013567ffffffffffffffff811115613ec657600080fd5b613ed284828501613e26565b60208301525092915050565b600081359050613eed81615a2d565b92915050565b600060208284031215613f0557600080fd5b6000613f1384828501613dd2565b91505092915050565b60008060408385031215613f2f57600080fd5b6000613f3d85828601613dd2565b9250506020613f4e85828601613dd2565b9150509250929050565b600080600060608486031215613f6d57600080fd5b6000613f7b86828701613dd2565b9350506020613f8c86828701613dd2565b9250506040613f9d86828701613ede565b9150509250925092565b60008060008060808587031215613fbd57600080fd5b6000613fcb87828801613dd2565b9450506020613fdc87828801613dd2565b9350506040613fed87828801613ede565b925050606085013567ffffffffffffffff81111561400a57600080fd5b61401687828801613e26565b91505092959194509250565b6000806040838503121561403557600080fd5b600061404385828601613dd2565b925050602061405485828601613de7565b9150509250929050565b6000806040838503121561407157600080fd5b600061407f85828601613dd2565b925050602061409085828601613ede565b9150509250929050565b6000602082840312156140ac57600080fd5b60006140ba84828501613de7565b91505092915050565b6000602082840312156140d557600080fd5b60006140e384828501613dfc565b91505092915050565b6000602082840312156140fe57600080fd5b600061410c84828501613e11565b91505092915050565b60006020828403121561412757600080fd5b600082013567ffffffffffffffff81111561414157600080fd5b61414d84828501613e50565b91505092915050565b6000806040838503121561416957600080fd5b600083013567ffffffffffffffff81111561418357600080fd5b61418f85828601613e7a565b92505060206141a085828601613ede565b9150509250929050565b6000602082840312156141bc57600080fd5b60006141ca84828501613ede565b91505092915050565b60006141df83836147ec565b60208301905092915050565b6141f481615010565b82525050565b600061420582614e8f565b61420f8185614ebd565b935061421a83614e6a565b8060005b8381101561424b57815161423288826141d3565b975061423d83614eb0565b92505060018101905061421e565b5085935050505092915050565b61426181615022565b82525050565b6142708161502e565b82525050565b6142876142828261502e565b615189565b82525050565b600061429882614e9a565b6142a28185614ece565b93506142b28185602086016150aa565b6142bb81615280565b840191505092915050565b60006142d182614ea5565b6142db8185614edf565b93506142eb8185602086016150aa565b6142f481615280565b840191505092915050565b600061430a82614ea5565b6143148185614ef0565b93506143248185602086016150aa565b80840191505092915050565b6000815461433d816150dd565b6143478186614ef0565b945060018216600081146143625760018114614373576143a6565b60ff198316865281860193506143a6565b61437c85614e7a565b60005b8381101561439e5781548189015260018201915060208101905061437f565b838801955050505b50505092915050565b60006143bc601883614edf565b91506143c782615291565b602082019050919050565b60006143df601683614edf565b91506143ea826152ba565b602082019050919050565b6000614402601f83614edf565b915061440d826152e3565b602082019050919050565b6000614425602b83614edf565b91506144308261530c565b604082019050919050565b6000614448603283614edf565b91506144538261535b565b604082019050919050565b600061446b602683614edf565b9150614476826153aa565b604082019050919050565b600061448e602583614edf565b9150614499826153f9565b604082019050919050565b60006144b1601283614edf565b91506144bc82615448565b602082019050919050565b60006144d4601c83614edf565b91506144df82615471565b602082019050919050565b60006144f7600283614ef0565b91506145028261549a565b600282019050919050565b600061451a602483614edf565b9150614525826154c3565b604082019050919050565b600061453d601983614edf565b915061454882615512565b602082019050919050565b6000614560602283614edf565b915061456b8261553b565b604082019050919050565b6000614583600b83614edf565b915061458e8261558a565b602082019050919050565b60006145a6602c83614edf565b91506145b1826155b3565b604082019050919050565b60006145c9601083614edf565b91506145d482615602565b602082019050919050565b60006145ec603883614edf565b91506145f78261562b565b604082019050919050565b600061460f602a83614edf565b915061461a8261567a565b604082019050919050565b6000614632602983614edf565b915061463d826156c9565b604082019050919050565b6000614655602283614edf565b915061466082615718565b604082019050919050565b6000614678602083614edf565b915061468382615767565b602082019050919050565b600061469b602c83614edf565b91506146a682615790565b604082019050919050565b60006146be602083614edf565b91506146c9826157df565b602082019050919050565b60006146e1602f83614edf565b91506146ec82615808565b604082019050919050565b6000614704601b83614edf565b915061470f82615857565b602082019050919050565b6000614727602183614edf565b915061473282615880565b604082019050919050565b600061474a603183614edf565b9150614755826158cf565b604082019050919050565b600061476d602c83614edf565b91506147788261591e565b604082019050919050565b6000614790601383614edf565b915061479b8261596d565b602082019050919050565b60006147b3601583614edf565b91506147be82615996565b602082019050919050565b60006147d6601883614edf565b91506147e1826159bf565b602082019050919050565b6147f581615084565b82525050565b61480481615084565b82525050565b6148138161508e565b82525050565b600061482582866142ff565b915061483182856142ff565b915061483d8284614330565b9150819050949350505050565b6000614855826144ea565b91506148618285614276565b6020820191506148718284614276565b6020820191508190509392505050565b600060208201905061489660008301846141eb565b92915050565b60006080820190506148b160008301876141eb565b6148be60208301866141eb565b6148cb60408301856147fb565b81810360608301526148dd818461428d565b905095945050505050565b6000602082019050818103600083015261490281846141fa565b905092915050565b600060208201905061491f6000830184614258565b92915050565b600060408201905061493a6000830185614267565b61494760208301846141eb565b9392505050565b600060a0820190506149636000830188614267565b6149706020830187614267565b61497d6040830186614267565b61498a60608301856147fb565b61499760808301846141eb565b9695505050505050565b60006080820190506149b66000830187614267565b6149c3602083018661480a565b6149d06040830185614267565b6149dd6060830184614267565b95945050505050565b60006020820190508181036000830152614a0081846142c6565b905092915050565b60006020820190508181036000830152614a21816143af565b9050919050565b60006020820190508181036000830152614a41816143d2565b9050919050565b60006020820190508181036000830152614a61816143f5565b9050919050565b60006020820190508181036000830152614a8181614418565b9050919050565b60006020820190508181036000830152614aa18161443b565b9050919050565b60006020820190508181036000830152614ac18161445e565b9050919050565b60006020820190508181036000830152614ae181614481565b9050919050565b60006020820190508181036000830152614b01816144a4565b9050919050565b60006020820190508181036000830152614b21816144c7565b9050919050565b60006020820190508181036000830152614b418161450d565b9050919050565b60006020820190508181036000830152614b6181614530565b9050919050565b60006020820190508181036000830152614b8181614553565b9050919050565b60006020820190508181036000830152614ba181614576565b9050919050565b60006020820190508181036000830152614bc181614599565b9050919050565b60006020820190508181036000830152614be1816145bc565b9050919050565b60006020820190508181036000830152614c01816145df565b9050919050565b60006020820190508181036000830152614c2181614602565b9050919050565b60006020820190508181036000830152614c4181614625565b9050919050565b60006020820190508181036000830152614c6181614648565b9050919050565b60006020820190508181036000830152614c818161466b565b9050919050565b60006020820190508181036000830152614ca18161468e565b9050919050565b60006020820190508181036000830152614cc1816146b1565b9050919050565b60006020820190508181036000830152614ce1816146d4565b9050919050565b60006020820190508181036000830152614d01816146f7565b9050919050565b60006020820190508181036000830152614d218161471a565b9050919050565b60006020820190508181036000830152614d418161473d565b9050919050565b60006020820190508181036000830152614d6181614760565b9050919050565b60006020820190508181036000830152614d8181614783565b9050919050565b60006020820190508181036000830152614da1816147a6565b9050919050565b60006020820190508181036000830152614dc1816147c9565b9050919050565b6000602082019050614ddd60008301846147fb565b92915050565b6000614ded614dfe565b9050614df9828261510f565b919050565b6000604051905090565b600067ffffffffffffffff821115614e2357614e22615251565b5b614e2c82615280565b9050602081019050919050565b600067ffffffffffffffff821115614e5457614e53615251565b5b614e5d82615280565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f0682615084565b9150614f1183615084565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f4657614f456151c4565b5b828201905092915050565b6000614f5c82615084565b9150614f6783615084565b925082614f7757614f766151f3565b5b828204905092915050565b6000614f8d82615084565b9150614f9883615084565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fd157614fd06151c4565b5b828202905092915050565b6000614fe782615084565b9150614ff283615084565b925082821015615005576150046151c4565b5b828203905092915050565b600061501b82615064565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156150c85780820151818401526020810190506150ad565b838111156150d7576000848401525b50505050565b600060028204905060018216806150f557607f821691505b6020821081141561510957615108615222565b5b50919050565b61511882615280565b810181811067ffffffffffffffff8211171561513757615136615251565b5b80604052505050565b600061514b82615084565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561517e5761517d6151c4565b5b600182019050919050565b6000819050919050565b600061519e82615084565b91506151a983615084565b9250826151b9576151b86151f3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f494e53554646494349454e545f46554e44530000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f57484954454c4953545f53414c455f4c494d49545f4558434545440000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d696e74206c696d697420657863656564656400000000000000000000000000600082015250565b7f5a45524f5f42414c414e43455f434f4e54524143540000000000000000000000600082015250565b7f57484954454c4953545f4c494d49545f45584345454445440000000000000000600082015250565b6159f181615010565b81146159fc57600080fd5b50565b615a0881615022565b8114615a1357600080fd5b50565b615a1f81615038565b8114615a2a57600080fd5b50565b615a3681615084565b8114615a4157600080fd5b5056fea26469706673582212209a68e11e95b206c1a81fb89838064a2bba60cad7502237265c3b28748222365e64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b4d6563686120546967657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d43540000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Mecha Tiger
Arg [1] : symbol (string): MCT
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [3] : 4d65636861205469676572000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4d43540000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
64838:5374:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43097:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67575:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69361:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65944:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29917:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31476:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30999:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65358:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43737:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69468:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67319:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32226:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43405:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67053:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66204:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66061:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32636:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43927:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65727:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3490:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29611:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29341:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6389:103;;;;;;;;;;;;;:::i;:::-;;67179:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69597:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68878:212;;;;;;;;;;;;;:::i;:::-;;5738:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30086:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31769:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69283:69;;;;;;;;;;;;;:::i;:::-;;32892:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66329:551;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65144:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67445:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67695:1077;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31995:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69928:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6647:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65298:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43097:224;43199:4;43238:35;43223:50;;;:11;:50;;;;:90;;;;43277:36;43301:11;43277:23;:36::i;:::-;43223:90;43216:97;;43097:224;;;:::o;67575:112::-;67633:13;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67666:13:::1;67659:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67575:112:::0;:::o;69361:99::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69448:4:::1;69431:14;;:21;;;;;;;;;;;;;;;;;;69361:99:::0;:::o;65944:105::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66029:12:::1;66015:11;;:26;;;;;;;;;;;;;;;;;;65944:105:::0;:::o;29917:100::-;29971:13;30004:5;29997:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29917:100;:::o;31476:221::-;31552:7;31580:16;31588:7;31580;:16::i;:::-;31572:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31665:15;:24;31681:7;31665:24;;;;;;;;;;;;;;;;;;;;;31658:31;;31476:221;;;:::o;30999:411::-;31080:13;31096:23;31111:7;31096:14;:23::i;:::-;31080:39;;31144:5;31138:11;;:2;:11;;;;31130:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31238:5;31222:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31247:37;31264:5;31271:12;:10;:12::i;:::-;31247:16;:37::i;:::-;31222:62;31200:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31381:21;31390:2;31394:7;31381:8;:21::i;:::-;30999:411;;;:::o;65358:56::-;;;;;;;;;;;;;;;;;:::o;43737:113::-;43798:7;43825:10;:17;;;;43818:24;;43737:113;:::o;69468:121::-;69526:21;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69567:14:::1;;;;;;;;;;;69560:21;;69468:121:::0;:::o;67319:118::-;67380:13;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67413:16:::1;67406:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67319:118:::0;:::o;32226:339::-;32421:41;32440:12;:10;:12::i;:::-;32454:7;32421:18;:41::i;:::-;32413:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32529:28;32539:4;32545:2;32549:7;32529:9;:28::i;:::-;32226:339;;;:::o;43405:256::-;43502:7;43538:23;43555:5;43538:16;:23::i;:::-;43530:5;:31;43522:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43627:12;:19;43640:5;43627:19;;;;;;;;;;;;;;;:26;43647:5;43627:26;;;;;;;;;;;;43620:33;;43405:256;;;;:::o;67053:118::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67150:13:::1;67135:12;:28;;;;;;;;;;;;:::i;:::-;;67053:118:::0;:::o;66204:117::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66298:15:::1;66281:14;;:32;;;;;;;;;;;;;;;;;;66204:117:::0;:::o;66061:112::-;66117:17;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66154:11:::1;;;;;;;;;;;66147:18;;66061:112:::0;:::o;32636:185::-;32774:39;32791:4;32797:2;32801:7;32774:39;;;;;;;;;;;;:16;:39::i;:::-;32636:185;;;:::o;43927:233::-;44002:7;44038:30;:28;:30::i;:::-;44030:5;:38;44022:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44135:10;44146:5;44135:17;;;;;;;;;;;;;;;;;;;;;;;;44128:24;;43927:233;;;:::o;65727:28::-;;;;;;;;;;;;;:::o;3490:86::-;3537:4;3561:7;;;;;;;;;;;3554:14;;3490:86;:::o;29611:239::-;29683:7;29703:13;29719:7;:16;29727:7;29719:16;;;;;;;;;;;;;;;;;;;;;29703:32;;29771:1;29754:19;;:5;:19;;;;29746:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29837:5;29830:12;;;29611:239;;;:::o;29341:208::-;29413:7;29458:1;29441:19;;:5;:19;;;;29433:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29525:9;:16;29535:5;29525:16;;;;;;;;;;;;;;;;29518:23;;29341:208;;;:::o;6389:103::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6454:30:::1;6481:1;6454:18;:30::i;:::-;6389:103::o:0;67179:134::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67288:17:::1;67269:16;:36;;;;;;;;;;;;:::i;:::-;;67179:134:::0;:::o;69597:323::-;69657:16;69685:13;69701:17;69711:6;69701:9;:17::i;:::-;69685:33;;69729:23;69769:13;69764:125;69796:5;69788;:13;69764:125;;;69843:34;69863:6;69871:5;69843:19;:34::i;:::-;69827:6;69834:5;69827:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;69803:7;;;;;:::i;:::-;;;;69764:125;;;;69906:6;69899:13;;;;69597:323;;;:::o;68878:212::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68931:12:::1;68946:21;68931:36;;68996:1;68986:7;:11;68978:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;69042:7;:5;:7::i;:::-;69034:25;;:48;69060:21;69034:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6029:1;68878:212::o:0;5738:87::-;5784:7;5811:6;;;;;;;;;;;5804:13;;5738:87;:::o;30086:104::-;30142:13;30175:7;30168:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30086:104;:::o;31769:155::-;31864:52;31883:12;:10;:12::i;:::-;31897:8;31907;31864:18;:52::i;:::-;31769:155;;:::o;69283:69::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69340:4:::1;69329:8;;:15;;;;;;;;;;;;;;;;;;69283:69::o:0;32892:328::-;33067:41;33086:12;:10;:12::i;:::-;33100:7;33067:18;:41::i;:::-;33059:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33173:39;33187:4;33193:2;33197:7;33206:5;33173:13;:39::i;:::-;32892:328;;;;:::o;66329:551::-;66431:13;66480:16;66488:7;66480;:16::i;:::-;66462:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;66603:5;66591:17;;:8;;;;;;;;;;;:17;;;66588:72;;;66632:16;66625:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66588:72;66672:28;66703:10;:8;:10::i;:::-;66672:41;;66762:1;66737:14;66731:28;:32;:141;;;;;;;;;;;;;;;;;66803:14;66819:18;:7;:16;:18::i;:::-;66839:13;66786:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66731:141;66724:148;;;66329:551;;;;:::o;65144:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67445:122::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67545:14:::1;67529:13;:30;;;;;;;;;;;;:::i;:::-;;67445:122:::0;:::o;67695:1077::-;3816:8;:6;:8::i;:::-;3815:9;3807:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;67853:11:::1;;;;;;;;;;;67845:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;67899:27;67912:13;67899:12;:27::i;:::-;67891:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;68156:9;68129:23;;68113:13;:39;;;;:::i;:::-;:52;;68105:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;68304:3;68287:13;68271;:11;:13::i;:::-;:29;;;;:::i;:::-;:36;;68263:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;68474:1;68457:13;68424:18;:30;68443:10;68424:30;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:51;;68416:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;68606:13;68572:18;:30;68591:10;68572:30;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;68635:10;68630:135;68659:13;68651:5;:21;68630:135;;;68698:55;68708:13;:25;;;68751:1;68735:13;:11;:13::i;:::-;:17;;;;:::i;:::-;68698:9;:55::i;:::-;68674:7;;;;;:::i;:::-;;;;68630:135;;;;67695:1077:::0;;:::o;31995:164::-;32092:4;32116:18;:25;32135:5;32116:25;;;;;;;;;;;;;;;:35;32142:8;32116:35;;;;;;;;;;;;;;;;;;;;;;;;;32109:42;;31995:164;;;;:::o;69928:281::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70041:3:::1;70024:13;:11;:13::i;:::-;70008;:29;;;;:::i;:::-;:36;;70000:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70084:13;70079:123;70111:13;70103:5;:21;70079:123;;;70150:40;70160:10;70188:1;70172:13;:11;:13::i;:::-;:17;;;;:::i;:::-;70150:9;:40::i;:::-;70126:7;;;;;:::i;:::-;;;;70079:123;;;;69928:281:::0;:::o;6647:201::-;5969:12;:10;:12::i;:::-;5958:23;;:7;:5;:7::i;:::-;:23;;;5950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6756:1:::1;6736:22;;:8;:22;;;;6728:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6812:28;6831:8;6812:18;:28::i;:::-;6647:201:::0;:::o;65298:53::-;;;;;;;;;;;;;;;;;:::o;28972:305::-;29074:4;29126:25;29111:40;;;:11;:40;;;;:105;;;;29183:33;29168:48;;;:11;:48;;;;29111:105;:158;;;;29233:36;29257:11;29233:23;:36::i;:::-;29111:158;29091:178;;28972:305;;;:::o;2144:98::-;2197:7;2224:10;2217:17;;2144:98;:::o;34730:127::-;34795:4;34847:1;34819:30;;:7;:16;34827:7;34819:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34812:37;;34730:127;;;:::o;38876:174::-;38978:2;38951:15;:24;38967:7;38951:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39034:7;39030:2;38996:46;;39005:23;39020:7;39005:14;:23::i;:::-;38996:46;;;;;;;;;;;;38876:174;;:::o;35024:348::-;35117:4;35142:16;35150:7;35142;:16::i;:::-;35134:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35218:13;35234:23;35249:7;35234:14;:23::i;:::-;35218:39;;35287:5;35276:16;;:7;:16;;;:51;;;;35320:7;35296:31;;:20;35308:7;35296:11;:20::i;:::-;:31;;;35276:51;:87;;;;35331:32;35348:5;35355:7;35331:16;:32::i;:::-;35276:87;35268:96;;;35024:348;;;;:::o;38133:625::-;38292:4;38265:31;;:23;38280:7;38265:14;:23::i;:::-;:31;;;38257:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38371:1;38357:16;;:2;:16;;;;38349:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38427:39;38448:4;38454:2;38458:7;38427:20;:39::i;:::-;38531:29;38548:1;38552:7;38531:8;:29::i;:::-;38592:1;38573:9;:15;38583:4;38573:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38621:1;38604:9;:13;38614:2;38604:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38652:2;38633:7;:16;38641:7;38633:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38691:7;38687:2;38672:27;;38681:4;38672:27;;;;;;;;;;;;38712:38;38732:4;38738:2;38742:7;38712:19;:38::i;:::-;38133:625;;;:::o;7008:191::-;7082:16;7101:6;;;;;;;;;;;7082:25;;7127:8;7118:6;;:17;;;;;;;;;;;;;;;;;;7182:8;7151:40;;7172:8;7151:40;;;;;;;;;;;;7008:191;;:::o;39192:315::-;39347:8;39338:17;;:5;:17;;;;39330:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39434:8;39396:18;:25;39415:5;39396:25;;;;;;;;;;;;;;;:35;39422:8;39396:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39480:8;39458:41;;39473:5;39458:41;;;39490:8;39458:41;;;;;;:::i;:::-;;;;;;;;39192:315;;;:::o;34102:::-;34259:28;34269:4;34275:2;34279:7;34259:9;:28::i;:::-;34306:48;34329:4;34335:2;34339:7;34348:5;34306:22;:48::i;:::-;34298:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34102:315;;;;:::o;66932:113::-;66992:13;67025:12;67018:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66932:113;:::o;25806:723::-;25862:13;26092:1;26083:5;:10;26079:53;;;26110:10;;;;;;;;;;;;;;;;;;;;;26079:53;26142:12;26157:5;26142:20;;26173:14;26198:78;26213:1;26205:4;:9;26198:78;;26231:8;;;;;:::i;:::-;;;;26262:2;26254:10;;;;;:::i;:::-;;;26198:78;;;26286:19;26318:6;26308:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26286:39;;26336:154;26352:1;26343:5;:10;26336:154;;26380:1;26370:11;;;;;:::i;:::-;;;26447:2;26439:5;:10;;;;:::i;:::-;26426:2;:24;;;;:::i;:::-;26413:39;;26396:6;26403;26396:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;26476:2;26467:11;;;;;:::i;:::-;;;26336:154;;;26514:6;26500:21;;;;;25806:723;;;;:::o;69098:141::-;69170:4;69217:14;;;;;;;;;;;69193:38;;:20;69203:9;69193;:20::i;:::-;:38;;;69186:45;;69098:141;;;:::o;35714:110::-;35790:26;35800:2;35804:7;35790:26;;;;;;;;;;;;:9;:26::i;:::-;35714:110;;:::o;18522:157::-;18607:4;18646:25;18631:40;;;:11;:40;;;;18624:47;;18522:157;;;:::o;44773:589::-;44917:45;44944:4;44950:2;44954:7;44917:26;:45::i;:::-;44995:1;44979:18;;:4;:18;;;44975:187;;;45014:40;45046:7;45014:31;:40::i;:::-;44975:187;;;45084:2;45076:10;;:4;:10;;;45072:90;;45103:47;45136:4;45142:7;45103:32;:47::i;:::-;45072:90;44975:187;45190:1;45176:16;;:2;:16;;;45172:183;;;45209:45;45246:7;45209:36;:45::i;:::-;45172:183;;;45282:4;45276:10;;:2;:10;;;45272:83;;45303:40;45331:2;45335:7;45303:27;:40::i;:::-;45272:83;45172:183;44773:589;;;:::o;41954:125::-;;;;:::o;40072:799::-;40227:4;40248:15;:2;:13;;;:15::i;:::-;40244:620;;;40300:2;40284:36;;;40321:12;:10;:12::i;:::-;40335:4;40341:7;40350:5;40284:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40280:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40543:1;40526:6;:13;:18;40522:272;;;40569:60;;;;;;;;;;:::i;:::-;;;;;;;;40522:272;40744:6;40738:13;40729:6;40725:2;40721:15;40714:38;40280:529;40417:41;;;40407:51;;;:6;:51;;;;40400:58;;;;;40244:620;40848:4;40841:11;;40072:799;;;;;;;:::o;63808:155::-;63905:7;63937:18;63945:9;63937:7;:18::i;:::-;63930:25;;63808:155;;;:::o;36051:321::-;36181:18;36187:2;36191:7;36181:5;:18::i;:::-;36232:54;36263:1;36267:2;36271:7;36280:5;36232:22;:54::i;:::-;36210:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36051:321;;;:::o;41443:126::-;;;;:::o;46085:164::-;46189:10;:17;;;;46162:15;:24;46178:7;46162:24;;;;;;;;;;;:44;;;;46217:10;46233:7;46217:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46085:164;:::o;46876:988::-;47142:22;47192:1;47167:22;47184:4;47167:16;:22::i;:::-;:26;;;;:::i;:::-;47142:51;;47204:18;47225:17;:26;47243:7;47225:26;;;;;;;;;;;;47204:47;;47372:14;47358:10;:28;47354:328;;47403:19;47425:12;:18;47438:4;47425:18;;;;;;;;;;;;;;;:34;47444:14;47425:34;;;;;;;;;;;;47403:56;;47509:11;47476:12;:18;47489:4;47476:18;;;;;;;;;;;;;;;:30;47495:10;47476:30;;;;;;;;;;;:44;;;;47626:10;47593:17;:30;47611:11;47593:30;;;;;;;;;;;:43;;;;47354:328;;47778:17;:26;47796:7;47778:26;;;;;;;;;;;47771:33;;;47822:12;:18;47835:4;47822:18;;;;;;;;;;;;;;;:34;47841:14;47822:34;;;;;;;;;;;47815:41;;;46876:988;;;;:::o;48159:1079::-;48412:22;48457:1;48437:10;:17;;;;:21;;;;:::i;:::-;48412:46;;48469:18;48490:15;:24;48506:7;48490:24;;;;;;;;;;;;48469:45;;48841:19;48863:10;48874:14;48863:26;;;;;;;;;;;;;;;;;;;;;;;;48841:48;;48927:11;48902:10;48913;48902:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;49038:10;49007:15;:28;49023:11;49007:28;;;;;;;;;;;:41;;;;49179:15;:24;49195:7;49179:24;;;;;;;;;;;49172:31;;;49214:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48159:1079;;;;:::o;45663:221::-;45748:14;45765:20;45782:2;45765:16;:20::i;:::-;45748:37;;45823:7;45796:12;:16;45809:2;45796:16;;;;;;;;;;;;;;;:24;45813:6;45796:24;;;;;;;;;;;:34;;;;45870:6;45841:17;:26;45859:7;45841:26;;;;;;;;;;;:35;;;;45663:221;;;:::o;8439:326::-;8499:4;8756:1;8734:7;:19;;;:23;8727:30;;8439:326;;;:::o;64345:276::-;64495:7;64520:14;64537:16;64543:9;64537:5;:16::i;:::-;64520:33;;64571:42;64585:6;64593:9;:19;;;64571:13;:42::i;:::-;64564:49;;;64345:276;;;:::o;36708:439::-;36802:1;36788:16;;:2;:16;;;;36780:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36861:16;36869:7;36861;:16::i;:::-;36860:17;36852:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36923:45;36952:1;36956:2;36960:7;36923:20;:45::i;:::-;36998:1;36981:9;:13;36991:2;36981:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37029:2;37010:7;:16;37018:7;37010:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37074:7;37070:2;37049:33;;37066:1;37049:33;;;;;;;;;;;;37095:44;37123:1;37127:2;37131:7;37095:19;:44::i;:::-;36708:439;;:::o;63971:366::-;64037:7;64077:252;64181:43;64251:9;:21;;;64144:151;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64112:202;;;;;;64077:16;:252::i;:::-;64057:272;;63971:366;;;:::o;53662:231::-;53740:7;53761:17;53780:18;53802:27;53813:4;53819:9;53802:10;:27::i;:::-;53760:69;;;;53840:18;53852:5;53840:11;:18::i;:::-;53876:9;53869:16;;;;53662:231;;;;:::o;63236:167::-;63313:7;63340:55;63362:20;:18;:20::i;:::-;63384:10;63340:21;:55::i;:::-;63333:62;;63236:167;;;:::o;51552:1308::-;51633:7;51642:12;51887:2;51867:9;:16;:22;51863:990;;;51906:9;51930;51954:7;52163:4;52152:9;52148:20;52142:27;52137:32;;52213:4;52202:9;52198:20;52192:27;52187:32;;52271:4;52260:9;52256:20;52250:27;52247:1;52242:36;52237:41;;52314:25;52325:4;52331:1;52334;52337;52314:10;:25::i;:::-;52307:32;;;;;;;;;51863:990;52381:2;52361:9;:16;:22;52357:496;;;52400:9;52424:10;52636:4;52625:9;52621:20;52615:27;52610:32;;52687:4;52676:9;52672:20;52666:27;52660:33;;52729:23;52740:4;52746:1;52749:2;52729:10;:23::i;:::-;52722:30;;;;;;;;52357:496;52801:1;52805:35;52785:56;;;;51552:1308;;;;;;:::o;49823:643::-;49901:20;49892:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;49888:571;;;49938:7;;49888:571;49999:29;49990:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;49986:473;;;50045:34;;;;;;;;;;:::i;:::-;;;;;;;;49986:473;50110:35;50101:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;50097:362;;;50162:41;;;;;;;;;;:::i;:::-;;;;;;;;50097:362;50234:30;50225:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;50221:238;;;50281:44;;;;;;;;;;:::i;:::-;;;;;;;;50221:238;50356:30;50347:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;50343:116;;;50403:44;;;;;;;;;;:::i;:::-;;;;;;;;50343:116;49823:643;;:::o;62009:314::-;62062:7;62103:12;62086:29;;62094:4;62086:29;;;:66;;;;;62136:16;62119:13;:33;62086:66;62082:234;;;62176:24;62169:31;;;;62082:234;62240:64;62262:10;62274:12;62288:15;62240:21;:64::i;:::-;62233:71;;62009:314;;:::o;58576:196::-;58669:7;58735:15;58752:10;58706:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58696:68;;;;;;58689:75;;58576:196;;;;:::o;55114:1632::-;55245:7;55254:12;56179:66;56174:1;56166:10;;:79;56162:163;;;56278:1;56282:30;56262:51;;;;;;56162:163;56344:2;56339:1;:7;;;;:18;;;;;56355:2;56350:1;:7;;;;56339:18;56335:102;;;56390:1;56394:30;56374:51;;;;;;56335:102;56534:14;56551:24;56561:4;56567:1;56570;56573;56551:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56534:41;;56608:1;56590:20;;:6;:20;;;56586:103;;;56643:1;56647:29;56627:50;;;;;;;56586:103;56709:6;56717:20;56701:37;;;;;55114:1632;;;;;;;;:::o;54156:344::-;54270:7;54279:12;54304:9;54329:66;54321:75;;54316:2;:80;54304:92;;54407:7;54446:2;54439:3;54432:2;54424:11;;:18;;54423:25;;;;:::i;:::-;54407:42;;54467:25;54478:4;54484:1;54487;54490;54467:10;:25::i;:::-;54460:32;;;;;;54156:344;;;;;;:::o;62331:263::-;62475:7;62523:8;62533;62543:11;62556:13;62579:4;62512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62502:84;;;;;;62495:91;;62331:263;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1910:623::-;1986:5;2030:4;2018:9;2013:3;2009:19;2005:30;2002:2;;;2048:1;2045;2038:12;2002:2;2070:21;2086:4;2070:21;:::i;:::-;2061:30;;2157:1;2197:49;2242:3;2233:6;2222:9;2218:22;2197:49;:::i;:::-;2190:4;2183:5;2179:16;2172:75;2101:157;2350:2;2339:9;2335:18;2322:32;2381:18;2373:6;2370:30;2367:2;;;2413:1;2410;2403:12;2367:2;2456:58;2510:3;2501:6;2490:9;2486:22;2456:58;:::i;:::-;2449:4;2442:5;2438:16;2431:84;2268:258;1992:541;;;;:::o;2539:139::-;2585:5;2623:6;2610:20;2601:29;;2639:33;2666:5;2639:33;:::i;:::-;2591:87;;;;:::o;2684:262::-;2743:6;2792:2;2780:9;2771:7;2767:23;2763:32;2760:2;;;2808:1;2805;2798:12;2760:2;2851:1;2876:53;2921:7;2912:6;2901:9;2897:22;2876:53;:::i;:::-;2866:63;;2822:117;2750:196;;;;:::o;2952:407::-;3020:6;3028;3077:2;3065:9;3056:7;3052:23;3048:32;3045:2;;;3093:1;3090;3083:12;3045:2;3136:1;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3107:117;3263:2;3289:53;3334:7;3325:6;3314:9;3310:22;3289:53;:::i;:::-;3279:63;;3234:118;3035:324;;;;;:::o;3365:552::-;3442:6;3450;3458;3507:2;3495:9;3486:7;3482:23;3478:32;3475:2;;;3523:1;3520;3513:12;3475:2;3566:1;3591:53;3636:7;3627:6;3616:9;3612:22;3591:53;:::i;:::-;3581:63;;3537:117;3693:2;3719:53;3764:7;3755:6;3744:9;3740:22;3719:53;:::i;:::-;3709:63;;3664:118;3821:2;3847:53;3892:7;3883:6;3872:9;3868:22;3847:53;:::i;:::-;3837:63;;3792:118;3465:452;;;;;:::o;3923:809::-;4018:6;4026;4034;4042;4091:3;4079:9;4070:7;4066:23;4062:33;4059:2;;;4108:1;4105;4098:12;4059:2;4151:1;4176:53;4221:7;4212:6;4201:9;4197:22;4176:53;:::i;:::-;4166:63;;4122:117;4278:2;4304:53;4349:7;4340:6;4329:9;4325:22;4304:53;:::i;:::-;4294:63;;4249:118;4406:2;4432:53;4477:7;4468:6;4457:9;4453:22;4432:53;:::i;:::-;4422:63;;4377:118;4562:2;4551:9;4547:18;4534:32;4593:18;4585:6;4582:30;4579:2;;;4625:1;4622;4615:12;4579:2;4653:62;4707:7;4698:6;4687:9;4683:22;4653:62;:::i;:::-;4643:72;;4505:220;4049:683;;;;;;;:::o;4738:401::-;4803:6;4811;4860:2;4848:9;4839:7;4835:23;4831:32;4828:2;;;4876:1;4873;4866:12;4828:2;4919:1;4944:53;4989:7;4980:6;4969:9;4965:22;4944:53;:::i;:::-;4934:63;;4890:117;5046:2;5072:50;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;:::-;5062:60;;5017:115;4818:321;;;;;:::o;5145:407::-;5213:6;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:2;;;5286:1;5283;5276:12;5238:2;5329:1;5354:53;5399:7;5390:6;5379:9;5375:22;5354:53;:::i;:::-;5344:63;;5300:117;5456:2;5482:53;5527:7;5518:6;5507:9;5503:22;5482:53;:::i;:::-;5472:63;;5427:118;5228:324;;;;;:::o;5558:256::-;5614:6;5663:2;5651:9;5642:7;5638:23;5634:32;5631:2;;;5679:1;5676;5669:12;5631:2;5722:1;5747:50;5789:7;5780:6;5769:9;5765:22;5747:50;:::i;:::-;5737:60;;5693:114;5621:193;;;;:::o;5820:260::-;5878:6;5927:2;5915:9;5906:7;5902:23;5898:32;5895:2;;;5943:1;5940;5933:12;5895:2;5986:1;6011:52;6055:7;6046:6;6035:9;6031:22;6011:52;:::i;:::-;6001:62;;5957:116;5885:195;;;;:::o;6086:282::-;6155:6;6204:2;6192:9;6183:7;6179:23;6175:32;6172:2;;;6220:1;6217;6210:12;6172:2;6263:1;6288:63;6343:7;6334:6;6323:9;6319:22;6288:63;:::i;:::-;6278:73;;6234:127;6162:206;;;;:::o;6374:375::-;6443:6;6492:2;6480:9;6471:7;6467:23;6463:32;6460:2;;;6508:1;6505;6498:12;6460:2;6579:1;6568:9;6564:17;6551:31;6609:18;6601:6;6598:30;6595:2;;;6641:1;6638;6631:12;6595:2;6669:63;6724:7;6715:6;6704:9;6700:22;6669:63;:::i;:::-;6659:73;;6522:220;6450:299;;;;:::o;6755:554::-;6850:6;6858;6907:2;6895:9;6886:7;6882:23;6878:32;6875:2;;;6923:1;6920;6913:12;6875:2;6994:1;6983:9;6979:17;6966:31;7024:18;7016:6;7013:30;7010:2;;;7056:1;7053;7046:12;7010:2;7084:80;7156:7;7147:6;7136:9;7132:22;7084:80;:::i;:::-;7074:90;;6937:237;7213:2;7239:53;7284:7;7275:6;7264:9;7260:22;7239:53;:::i;:::-;7229:63;;7184:118;6865:444;;;;;:::o;7315:262::-;7374:6;7423:2;7411:9;7402:7;7398:23;7394:32;7391:2;;;7439:1;7436;7429:12;7391:2;7482:1;7507:53;7552:7;7543:6;7532:9;7528:22;7507:53;:::i;:::-;7497:63;;7453:117;7381:196;;;;:::o;7583:179::-;7652:10;7673:46;7715:3;7707:6;7673:46;:::i;:::-;7751:4;7746:3;7742:14;7728:28;;7663:99;;;;:::o;7768:118::-;7855:24;7873:5;7855:24;:::i;:::-;7850:3;7843:37;7833:53;;:::o;7922:732::-;8041:3;8070:54;8118:5;8070:54;:::i;:::-;8140:86;8219:6;8214:3;8140:86;:::i;:::-;8133:93;;8250:56;8300:5;8250:56;:::i;:::-;8329:7;8360:1;8345:284;8370:6;8367:1;8364:13;8345:284;;;8446:6;8440:13;8473:63;8532:3;8517:13;8473:63;:::i;:::-;8466:70;;8559:60;8612:6;8559:60;:::i;:::-;8549:70;;8405:224;8392:1;8389;8385:9;8380:14;;8345:284;;;8349:14;8645:3;8638:10;;8046:608;;;;;;;:::o;8660:109::-;8741:21;8756:5;8741:21;:::i;:::-;8736:3;8729:34;8719:50;;:::o;8775:118::-;8862:24;8880:5;8862:24;:::i;:::-;8857:3;8850:37;8840:53;;:::o;8899:157::-;9004:45;9024:24;9042:5;9024:24;:::i;:::-;9004:45;:::i;:::-;8999:3;8992:58;8982:74;;:::o;9062:360::-;9148:3;9176:38;9208:5;9176:38;:::i;:::-;9230:70;9293:6;9288:3;9230:70;:::i;:::-;9223:77;;9309:52;9354:6;9349:3;9342:4;9335:5;9331:16;9309:52;:::i;:::-;9386:29;9408:6;9386:29;:::i;:::-;9381:3;9377:39;9370:46;;9152:270;;;;;:::o;9428:364::-;9516:3;9544:39;9577:5;9544:39;:::i;:::-;9599:71;9663:6;9658:3;9599:71;:::i;:::-;9592:78;;9679:52;9724:6;9719:3;9712:4;9705:5;9701:16;9679:52;:::i;:::-;9756:29;9778:6;9756:29;:::i;:::-;9751:3;9747:39;9740:46;;9520:272;;;;;:::o;9798:377::-;9904:3;9932:39;9965:5;9932:39;:::i;:::-;9987:89;10069:6;10064:3;9987:89;:::i;:::-;9980:96;;10085:52;10130:6;10125:3;10118:4;10111:5;10107:16;10085:52;:::i;:::-;10162:6;10157:3;10153:16;10146:23;;9908:267;;;;;:::o;10205:845::-;10308:3;10345:5;10339:12;10374:36;10400:9;10374:36;:::i;:::-;10426:89;10508:6;10503:3;10426:89;:::i;:::-;10419:96;;10546:1;10535:9;10531:17;10562:1;10557:137;;;;10708:1;10703:341;;;;10524:520;;10557:137;10641:4;10637:9;10626;10622:25;10617:3;10610:38;10677:6;10672:3;10668:16;10661:23;;10557:137;;10703:341;10770:38;10802:5;10770:38;:::i;:::-;10830:1;10844:154;10858:6;10855:1;10852:13;10844:154;;;10932:7;10926:14;10922:1;10917:3;10913:11;10906:35;10982:1;10973:7;10969:15;10958:26;;10880:4;10877:1;10873:12;10868:17;;10844:154;;;11027:6;11022:3;11018:16;11011:23;;10710:334;;10524:520;;10312:738;;;;;;:::o;11056:366::-;11198:3;11219:67;11283:2;11278:3;11219:67;:::i;:::-;11212:74;;11295:93;11384:3;11295:93;:::i;:::-;11413:2;11408:3;11404:12;11397:19;;11202:220;;;:::o;11428:366::-;11570:3;11591:67;11655:2;11650:3;11591:67;:::i;:::-;11584:74;;11667:93;11756:3;11667:93;:::i;:::-;11785:2;11780:3;11776:12;11769:19;;11574:220;;;:::o;11800:366::-;11942:3;11963:67;12027:2;12022:3;11963:67;:::i;:::-;11956:74;;12039:93;12128:3;12039:93;:::i;:::-;12157:2;12152:3;12148:12;12141:19;;11946:220;;;:::o;12172:366::-;12314:3;12335:67;12399:2;12394:3;12335:67;:::i;:::-;12328:74;;12411:93;12500:3;12411:93;:::i;:::-;12529:2;12524:3;12520:12;12513:19;;12318:220;;;:::o;12544:366::-;12686:3;12707:67;12771:2;12766:3;12707:67;:::i;:::-;12700:74;;12783:93;12872:3;12783:93;:::i;:::-;12901:2;12896:3;12892:12;12885:19;;12690:220;;;:::o;12916:366::-;13058:3;13079:67;13143:2;13138:3;13079:67;:::i;:::-;13072:74;;13155:93;13244:3;13155:93;:::i;:::-;13273:2;13268:3;13264:12;13257:19;;13062:220;;;:::o;13288:366::-;13430:3;13451:67;13515:2;13510:3;13451:67;:::i;:::-;13444:74;;13527:93;13616:3;13527:93;:::i;:::-;13645:2;13640:3;13636:12;13629:19;;13434:220;;;:::o;13660:366::-;13802:3;13823:67;13887:2;13882:3;13823:67;:::i;:::-;13816:74;;13899:93;13988:3;13899:93;:::i;:::-;14017:2;14012:3;14008:12;14001:19;;13806:220;;;:::o;14032:366::-;14174:3;14195:67;14259:2;14254:3;14195:67;:::i;:::-;14188:74;;14271:93;14360:3;14271:93;:::i;:::-;14389:2;14384:3;14380:12;14373:19;;14178:220;;;:::o;14404:400::-;14564:3;14585:84;14667:1;14662:3;14585:84;:::i;:::-;14578:91;;14678:93;14767:3;14678:93;:::i;:::-;14796:1;14791:3;14787:11;14780:18;;14568:236;;;:::o;14810:366::-;14952:3;14973:67;15037:2;15032:3;14973:67;:::i;:::-;14966:74;;15049:93;15138:3;15049:93;:::i;:::-;15167:2;15162:3;15158:12;15151:19;;14956:220;;;:::o;15182:366::-;15324:3;15345:67;15409:2;15404:3;15345:67;:::i;:::-;15338:74;;15421:93;15510:3;15421:93;:::i;:::-;15539:2;15534:3;15530:12;15523:19;;15328:220;;;:::o;15554:366::-;15696:3;15717:67;15781:2;15776:3;15717:67;:::i;:::-;15710:74;;15793:93;15882:3;15793:93;:::i;:::-;15911:2;15906:3;15902:12;15895:19;;15700:220;;;:::o;15926:366::-;16068:3;16089:67;16153:2;16148:3;16089:67;:::i;:::-;16082:74;;16165:93;16254:3;16165:93;:::i;:::-;16283:2;16278:3;16274:12;16267:19;;16072:220;;;:::o;16298:366::-;16440:3;16461:67;16525:2;16520:3;16461:67;:::i;:::-;16454:74;;16537:93;16626:3;16537:93;:::i;:::-;16655:2;16650:3;16646:12;16639:19;;16444:220;;;:::o;16670:366::-;16812:3;16833:67;16897:2;16892:3;16833:67;:::i;:::-;16826:74;;16909:93;16998:3;16909:93;:::i;:::-;17027:2;17022:3;17018:12;17011:19;;16816:220;;;:::o;17042:366::-;17184:3;17205:67;17269:2;17264:3;17205:67;:::i;:::-;17198:74;;17281:93;17370:3;17281:93;:::i;:::-;17399:2;17394:3;17390:12;17383:19;;17188:220;;;:::o;17414:366::-;17556:3;17577:67;17641:2;17636:3;17577:67;:::i;:::-;17570:74;;17653:93;17742:3;17653:93;:::i;:::-;17771:2;17766:3;17762:12;17755:19;;17560:220;;;:::o;17786:366::-;17928:3;17949:67;18013:2;18008:3;17949:67;:::i;:::-;17942:74;;18025:93;18114:3;18025:93;:::i;:::-;18143:2;18138:3;18134:12;18127:19;;17932:220;;;:::o;18158:366::-;18300:3;18321:67;18385:2;18380:3;18321:67;:::i;:::-;18314:74;;18397:93;18486:3;18397:93;:::i;:::-;18515:2;18510:3;18506:12;18499:19;;18304:220;;;:::o;18530:366::-;18672:3;18693:67;18757:2;18752:3;18693:67;:::i;:::-;18686:74;;18769:93;18858:3;18769:93;:::i;:::-;18887:2;18882:3;18878:12;18871:19;;18676:220;;;:::o;18902:366::-;19044:3;19065:67;19129:2;19124:3;19065:67;:::i;:::-;19058:74;;19141:93;19230:3;19141:93;:::i;:::-;19259:2;19254:3;19250:12;19243:19;;19048:220;;;:::o;19274:366::-;19416:3;19437:67;19501:2;19496:3;19437:67;:::i;:::-;19430:74;;19513:93;19602:3;19513:93;:::i;:::-;19631:2;19626:3;19622:12;19615:19;;19420:220;;;:::o;19646:366::-;19788:3;19809:67;19873:2;19868:3;19809:67;:::i;:::-;19802:74;;19885:93;19974:3;19885:93;:::i;:::-;20003:2;19998:3;19994:12;19987:19;;19792:220;;;:::o;20018:366::-;20160:3;20181:67;20245:2;20240:3;20181:67;:::i;:::-;20174:74;;20257:93;20346:3;20257:93;:::i;:::-;20375:2;20370:3;20366:12;20359:19;;20164:220;;;:::o;20390:366::-;20532:3;20553:67;20617:2;20612:3;20553:67;:::i;:::-;20546:74;;20629:93;20718:3;20629:93;:::i;:::-;20747:2;20742:3;20738:12;20731:19;;20536:220;;;:::o;20762:366::-;20904:3;20925:67;20989:2;20984:3;20925:67;:::i;:::-;20918:74;;21001:93;21090:3;21001:93;:::i;:::-;21119:2;21114:3;21110:12;21103:19;;20908:220;;;:::o;21134:366::-;21276:3;21297:67;21361:2;21356:3;21297:67;:::i;:::-;21290:74;;21373:93;21462:3;21373:93;:::i;:::-;21491:2;21486:3;21482:12;21475:19;;21280:220;;;:::o;21506:366::-;21648:3;21669:67;21733:2;21728:3;21669:67;:::i;:::-;21662:74;;21745:93;21834:3;21745:93;:::i;:::-;21863:2;21858:3;21854:12;21847:19;;21652:220;;;:::o;21878:366::-;22020:3;22041:67;22105:2;22100:3;22041:67;:::i;:::-;22034:74;;22117:93;22206:3;22117:93;:::i;:::-;22235:2;22230:3;22226:12;22219:19;;22024:220;;;:::o;22250:366::-;22392:3;22413:67;22477:2;22472:3;22413:67;:::i;:::-;22406:74;;22489:93;22578:3;22489:93;:::i;:::-;22607:2;22602:3;22598:12;22591:19;;22396:220;;;:::o;22622:108::-;22699:24;22717:5;22699:24;:::i;:::-;22694:3;22687:37;22677:53;;:::o;22736:118::-;22823:24;22841:5;22823:24;:::i;:::-;22818:3;22811:37;22801:53;;:::o;22860:112::-;22943:22;22959:5;22943:22;:::i;:::-;22938:3;22931:35;22921:51;;:::o;22978:589::-;23203:3;23225:95;23316:3;23307:6;23225:95;:::i;:::-;23218:102;;23337:95;23428:3;23419:6;23337:95;:::i;:::-;23330:102;;23449:92;23537:3;23528:6;23449:92;:::i;:::-;23442:99;;23558:3;23551:10;;23207:360;;;;;;:::o;23573:663::-;23814:3;23836:148;23980:3;23836:148;:::i;:::-;23829:155;;23994:75;24065:3;24056:6;23994:75;:::i;:::-;24094:2;24089:3;24085:12;24078:19;;24107:75;24178:3;24169:6;24107:75;:::i;:::-;24207:2;24202:3;24198:12;24191:19;;24227:3;24220:10;;23818:418;;;;;:::o;24242:222::-;24335:4;24373:2;24362:9;24358:18;24350:26;;24386:71;24454:1;24443:9;24439:17;24430:6;24386:71;:::i;:::-;24340:124;;;;:::o;24470:640::-;24665:4;24703:3;24692:9;24688:19;24680:27;;24717:71;24785:1;24774:9;24770:17;24761:6;24717:71;:::i;:::-;24798:72;24866:2;24855:9;24851:18;24842:6;24798:72;:::i;:::-;24880;24948:2;24937:9;24933:18;24924:6;24880:72;:::i;:::-;24999:9;24993:4;24989:20;24984:2;24973:9;24969:18;24962:48;25027:76;25098:4;25089:6;25027:76;:::i;:::-;25019:84;;24670:440;;;;;;;:::o;25116:373::-;25259:4;25297:2;25286:9;25282:18;25274:26;;25346:9;25340:4;25336:20;25332:1;25321:9;25317:17;25310:47;25374:108;25477:4;25468:6;25374:108;:::i;:::-;25366:116;;25264:225;;;;:::o;25495:210::-;25582:4;25620:2;25609:9;25605:18;25597:26;;25633:65;25695:1;25684:9;25680:17;25671:6;25633:65;:::i;:::-;25587:118;;;;:::o;25711:332::-;25832:4;25870:2;25859:9;25855:18;25847:26;;25883:71;25951:1;25940:9;25936:17;25927:6;25883:71;:::i;:::-;25964:72;26032:2;26021:9;26017:18;26008:6;25964:72;:::i;:::-;25837:206;;;;;:::o;26049:664::-;26254:4;26292:3;26281:9;26277:19;26269:27;;26306:71;26374:1;26363:9;26359:17;26350:6;26306:71;:::i;:::-;26387:72;26455:2;26444:9;26440:18;26431:6;26387:72;:::i;:::-;26469;26537:2;26526:9;26522:18;26513:6;26469:72;:::i;:::-;26551;26619:2;26608:9;26604:18;26595:6;26551:72;:::i;:::-;26633:73;26701:3;26690:9;26686:19;26677:6;26633:73;:::i;:::-;26259:454;;;;;;;;:::o;26719:545::-;26892:4;26930:3;26919:9;26915:19;26907:27;;26944:71;27012:1;27001:9;26997:17;26988:6;26944:71;:::i;:::-;27025:68;27089:2;27078:9;27074:18;27065:6;27025:68;:::i;:::-;27103:72;27171:2;27160:9;27156:18;27147:6;27103:72;:::i;:::-;27185;27253:2;27242:9;27238:18;27229:6;27185:72;:::i;:::-;26897:367;;;;;;;:::o;27270:313::-;27383:4;27421:2;27410:9;27406:18;27398:26;;27470:9;27464:4;27460:20;27456:1;27445:9;27441:17;27434:47;27498:78;27571:4;27562:6;27498:78;:::i;:::-;27490:86;;27388:195;;;;:::o;27589:419::-;27755:4;27793:2;27782:9;27778:18;27770:26;;27842:9;27836:4;27832:20;27828:1;27817:9;27813:17;27806:47;27870:131;27996:4;27870:131;:::i;:::-;27862:139;;27760:248;;;:::o;28014:419::-;28180:4;28218:2;28207:9;28203:18;28195:26;;28267:9;28261:4;28257:20;28253:1;28242:9;28238:17;28231:47;28295:131;28421:4;28295:131;:::i;:::-;28287:139;;28185:248;;;:::o;28439:419::-;28605:4;28643:2;28632:9;28628:18;28620:26;;28692:9;28686:4;28682:20;28678:1;28667:9;28663:17;28656:47;28720:131;28846:4;28720:131;:::i;:::-;28712:139;;28610:248;;;:::o;28864:419::-;29030:4;29068:2;29057:9;29053:18;29045:26;;29117:9;29111:4;29107:20;29103:1;29092:9;29088:17;29081:47;29145:131;29271:4;29145:131;:::i;:::-;29137:139;;29035:248;;;:::o;29289:419::-;29455:4;29493:2;29482:9;29478:18;29470:26;;29542:9;29536:4;29532:20;29528:1;29517:9;29513:17;29506:47;29570:131;29696:4;29570:131;:::i;:::-;29562:139;;29460:248;;;:::o;29714:419::-;29880:4;29918:2;29907:9;29903:18;29895:26;;29967:9;29961:4;29957:20;29953:1;29942:9;29938:17;29931:47;29995:131;30121:4;29995:131;:::i;:::-;29987:139;;29885:248;;;:::o;30139:419::-;30305:4;30343:2;30332:9;30328:18;30320:26;;30392:9;30386:4;30382:20;30378:1;30367:9;30363:17;30356:47;30420:131;30546:4;30420:131;:::i;:::-;30412:139;;30310:248;;;:::o;30564:419::-;30730:4;30768:2;30757:9;30753:18;30745:26;;30817:9;30811:4;30807:20;30803:1;30792:9;30788:17;30781:47;30845:131;30971:4;30845:131;:::i;:::-;30837:139;;30735:248;;;:::o;30989:419::-;31155:4;31193:2;31182:9;31178:18;31170:26;;31242:9;31236:4;31232:20;31228:1;31217:9;31213:17;31206:47;31270:131;31396:4;31270:131;:::i;:::-;31262:139;;31160:248;;;:::o;31414:419::-;31580:4;31618:2;31607:9;31603:18;31595:26;;31667:9;31661:4;31657:20;31653:1;31642:9;31638:17;31631:47;31695:131;31821:4;31695:131;:::i;:::-;31687:139;;31585:248;;;:::o;31839:419::-;32005:4;32043:2;32032:9;32028:18;32020:26;;32092:9;32086:4;32082:20;32078:1;32067:9;32063:17;32056:47;32120:131;32246:4;32120:131;:::i;:::-;32112:139;;32010:248;;;:::o;32264:419::-;32430:4;32468:2;32457:9;32453:18;32445:26;;32517:9;32511:4;32507:20;32503:1;32492:9;32488:17;32481:47;32545:131;32671:4;32545:131;:::i;:::-;32537:139;;32435:248;;;:::o;32689:419::-;32855:4;32893:2;32882:9;32878:18;32870:26;;32942:9;32936:4;32932:20;32928:1;32917:9;32913:17;32906:47;32970:131;33096:4;32970:131;:::i;:::-;32962:139;;32860:248;;;:::o;33114:419::-;33280:4;33318:2;33307:9;33303:18;33295:26;;33367:9;33361:4;33357:20;33353:1;33342:9;33338:17;33331:47;33395:131;33521:4;33395:131;:::i;:::-;33387:139;;33285:248;;;:::o;33539:419::-;33705:4;33743:2;33732:9;33728:18;33720:26;;33792:9;33786:4;33782:20;33778:1;33767:9;33763:17;33756:47;33820:131;33946:4;33820:131;:::i;:::-;33812:139;;33710:248;;;:::o;33964:419::-;34130:4;34168:2;34157:9;34153:18;34145:26;;34217:9;34211:4;34207:20;34203:1;34192:9;34188:17;34181:47;34245:131;34371:4;34245:131;:::i;:::-;34237:139;;34135:248;;;:::o;34389:419::-;34555:4;34593:2;34582:9;34578:18;34570:26;;34642:9;34636:4;34632:20;34628:1;34617:9;34613:17;34606:47;34670:131;34796:4;34670:131;:::i;:::-;34662:139;;34560:248;;;:::o;34814:419::-;34980:4;35018:2;35007:9;35003:18;34995:26;;35067:9;35061:4;35057:20;35053:1;35042:9;35038:17;35031:47;35095:131;35221:4;35095:131;:::i;:::-;35087:139;;34985:248;;;:::o;35239:419::-;35405:4;35443:2;35432:9;35428:18;35420:26;;35492:9;35486:4;35482:20;35478:1;35467:9;35463:17;35456:47;35520:131;35646:4;35520:131;:::i;:::-;35512:139;;35410:248;;;:::o;35664:419::-;35830:4;35868:2;35857:9;35853:18;35845:26;;35917:9;35911:4;35907:20;35903:1;35892:9;35888:17;35881:47;35945:131;36071:4;35945:131;:::i;:::-;35937:139;;35835:248;;;:::o;36089:419::-;36255:4;36293:2;36282:9;36278:18;36270:26;;36342:9;36336:4;36332:20;36328:1;36317:9;36313:17;36306:47;36370:131;36496:4;36370:131;:::i;:::-;36362:139;;36260:248;;;:::o;36514:419::-;36680:4;36718:2;36707:9;36703:18;36695:26;;36767:9;36761:4;36757:20;36753:1;36742:9;36738:17;36731:47;36795:131;36921:4;36795:131;:::i;:::-;36787:139;;36685:248;;;:::o;36939:419::-;37105:4;37143:2;37132:9;37128:18;37120:26;;37192:9;37186:4;37182:20;37178:1;37167:9;37163:17;37156:47;37220:131;37346:4;37220:131;:::i;:::-;37212:139;;37110:248;;;:::o;37364:419::-;37530:4;37568:2;37557:9;37553:18;37545:26;;37617:9;37611:4;37607:20;37603:1;37592:9;37588:17;37581:47;37645:131;37771:4;37645:131;:::i;:::-;37637:139;;37535:248;;;:::o;37789:419::-;37955:4;37993:2;37982:9;37978:18;37970:26;;38042:9;38036:4;38032:20;38028:1;38017:9;38013:17;38006:47;38070:131;38196:4;38070:131;:::i;:::-;38062:139;;37960:248;;;:::o;38214:419::-;38380:4;38418:2;38407:9;38403:18;38395:26;;38467:9;38461:4;38457:20;38453:1;38442:9;38438:17;38431:47;38495:131;38621:4;38495:131;:::i;:::-;38487:139;;38385:248;;;:::o;38639:419::-;38805:4;38843:2;38832:9;38828:18;38820:26;;38892:9;38886:4;38882:20;38878:1;38867:9;38863:17;38856:47;38920:131;39046:4;38920:131;:::i;:::-;38912:139;;38810:248;;;:::o;39064:419::-;39230:4;39268:2;39257:9;39253:18;39245:26;;39317:9;39311:4;39307:20;39303:1;39292:9;39288:17;39281:47;39345:131;39471:4;39345:131;:::i;:::-;39337:139;;39235:248;;;:::o;39489:419::-;39655:4;39693:2;39682:9;39678:18;39670:26;;39742:9;39736:4;39732:20;39728:1;39717:9;39713:17;39706:47;39770:131;39896:4;39770:131;:::i;:::-;39762:139;;39660:248;;;:::o;39914:419::-;40080:4;40118:2;40107:9;40103:18;40095:26;;40167:9;40161:4;40157:20;40153:1;40142:9;40138:17;40131:47;40195:131;40321:4;40195:131;:::i;:::-;40187:139;;40085:248;;;:::o;40339:222::-;40432:4;40470:2;40459:9;40455:18;40447:26;;40483:71;40551:1;40540:9;40536:17;40527:6;40483:71;:::i;:::-;40437:124;;;;:::o;40567:129::-;40601:6;40628:20;;:::i;:::-;40618:30;;40657:33;40685:4;40677:6;40657:33;:::i;:::-;40608:88;;;:::o;40702:75::-;40735:6;40768:2;40762:9;40752:19;;40742:35;:::o;40783:307::-;40844:4;40934:18;40926:6;40923:30;40920:2;;;40956:18;;:::i;:::-;40920:2;40994:29;41016:6;40994:29;:::i;:::-;40986:37;;41078:4;41072;41068:15;41060:23;;40849:241;;;:::o;41096:308::-;41158:4;41248:18;41240:6;41237:30;41234:2;;;41270:18;;:::i;:::-;41234:2;41308:29;41330:6;41308:29;:::i;:::-;41300:37;;41392:4;41386;41382:15;41374:23;;41163:241;;;:::o;41410:132::-;41477:4;41500:3;41492:11;;41530:4;41525:3;41521:14;41513:22;;41482:60;;;:::o;41548:141::-;41597:4;41620:3;41612:11;;41643:3;41640:1;41633:14;41677:4;41674:1;41664:18;41656:26;;41602:87;;;:::o;41695:114::-;41762:6;41796:5;41790:12;41780:22;;41769:40;;;:::o;41815:98::-;41866:6;41900:5;41894:12;41884:22;;41873:40;;;:::o;41919:99::-;41971:6;42005:5;41999:12;41989:22;;41978:40;;;:::o;42024:113::-;42094:4;42126;42121:3;42117:14;42109:22;;42099:38;;;:::o;42143:184::-;42242:11;42276:6;42271:3;42264:19;42316:4;42311:3;42307:14;42292:29;;42254:73;;;;:::o;42333:168::-;42416:11;42450:6;42445:3;42438:19;42490:4;42485:3;42481:14;42466:29;;42428:73;;;;:::o;42507:169::-;42591:11;42625:6;42620:3;42613:19;42665:4;42660:3;42656:14;42641:29;;42603:73;;;;:::o;42682:148::-;42784:11;42821:3;42806:18;;42796:34;;;;:::o;42836:305::-;42876:3;42895:20;42913:1;42895:20;:::i;:::-;42890:25;;42929:20;42947:1;42929:20;:::i;:::-;42924:25;;43083:1;43015:66;43011:74;43008:1;43005:81;43002:2;;;43089:18;;:::i;:::-;43002:2;43133:1;43130;43126:9;43119:16;;42880:261;;;;:::o;43147:185::-;43187:1;43204:20;43222:1;43204:20;:::i;:::-;43199:25;;43238:20;43256:1;43238:20;:::i;:::-;43233:25;;43277:1;43267:2;;43282:18;;:::i;:::-;43267:2;43324:1;43321;43317:9;43312:14;;43189:143;;;;:::o;43338:348::-;43378:7;43401:20;43419:1;43401:20;:::i;:::-;43396:25;;43435:20;43453:1;43435:20;:::i;:::-;43430:25;;43623:1;43555:66;43551:74;43548:1;43545:81;43540:1;43533:9;43526:17;43522:105;43519:2;;;43630:18;;:::i;:::-;43519:2;43678:1;43675;43671:9;43660:20;;43386:300;;;;:::o;43692:191::-;43732:4;43752:20;43770:1;43752:20;:::i;:::-;43747:25;;43786:20;43804:1;43786:20;:::i;:::-;43781:25;;43825:1;43822;43819:8;43816:2;;;43830:18;;:::i;:::-;43816:2;43875:1;43872;43868:9;43860:17;;43737:146;;;;:::o;43889:96::-;43926:7;43955:24;43973:5;43955:24;:::i;:::-;43944:35;;43934:51;;;:::o;43991:90::-;44025:7;44068:5;44061:13;44054:21;44043:32;;44033:48;;;:::o;44087:77::-;44124:7;44153:5;44142:16;;44132:32;;;:::o;44170:149::-;44206:7;44246:66;44239:5;44235:78;44224:89;;44214:105;;;:::o;44325:126::-;44362:7;44402:42;44395:5;44391:54;44380:65;;44370:81;;;:::o;44457:77::-;44494:7;44523:5;44512:16;;44502:32;;;:::o;44540:86::-;44575:7;44615:4;44608:5;44604:16;44593:27;;44583:43;;;:::o;44632:154::-;44716:6;44711:3;44706;44693:30;44778:1;44769:6;44764:3;44760:16;44753:27;44683:103;;;:::o;44792:307::-;44860:1;44870:113;44884:6;44881:1;44878:13;44870:113;;;44969:1;44964:3;44960:11;44954:18;44950:1;44945:3;44941:11;44934:39;44906:2;44903:1;44899:10;44894:15;;44870:113;;;45001:6;44998:1;44995:13;44992:2;;;45081:1;45072:6;45067:3;45063:16;45056:27;44992:2;44841:258;;;;:::o;45105:320::-;45149:6;45186:1;45180:4;45176:12;45166:22;;45233:1;45227:4;45223:12;45254:18;45244:2;;45310:4;45302:6;45298:17;45288:27;;45244:2;45372;45364:6;45361:14;45341:18;45338:38;45335:2;;;45391:18;;:::i;:::-;45335:2;45156:269;;;;:::o;45431:281::-;45514:27;45536:4;45514:27;:::i;:::-;45506:6;45502:40;45644:6;45632:10;45629:22;45608:18;45596:10;45593:34;45590:62;45587:2;;;45655:18;;:::i;:::-;45587:2;45695:10;45691:2;45684:22;45474:238;;;:::o;45718:233::-;45757:3;45780:24;45798:5;45780:24;:::i;:::-;45771:33;;45826:66;45819:5;45816:77;45813:2;;;45896:18;;:::i;:::-;45813:2;45943:1;45936:5;45932:13;45925:20;;45761:190;;;:::o;45957:79::-;45996:7;46025:5;46014:16;;46004:32;;;:::o;46042:176::-;46074:1;46091:20;46109:1;46091:20;:::i;:::-;46086:25;;46125:20;46143:1;46125:20;:::i;:::-;46120:25;;46164:1;46154:2;;46169:18;;:::i;:::-;46154:2;46210:1;46207;46203:9;46198:14;;46076:142;;;;:::o;46224:180::-;46272:77;46269:1;46262:88;46369:4;46366:1;46359:15;46393:4;46390:1;46383:15;46410:180;46458:77;46455:1;46448:88;46555:4;46552:1;46545:15;46579:4;46576:1;46569:15;46596:180;46644:77;46641:1;46634:88;46741:4;46738:1;46731:15;46765:4;46762:1;46755:15;46782:180;46830:77;46827:1;46820:88;46927:4;46924:1;46917:15;46951:4;46948:1;46941:15;46968:102;47009:6;47060:2;47056:7;47051:2;47044:5;47040:14;47036:28;47026:38;;47016:54;;;:::o;47076:174::-;47216:26;47212:1;47204:6;47200:14;47193:50;47182:68;:::o;47256:172::-;47396:24;47392:1;47384:6;47380:14;47373:48;47362:66;:::o;47434:181::-;47574:33;47570:1;47562:6;47558:14;47551:57;47540:75;:::o;47621:230::-;47761:34;47757:1;47749:6;47745:14;47738:58;47830:13;47825:2;47817:6;47813:15;47806:38;47727:124;:::o;47857:237::-;47997:34;47993:1;47985:6;47981:14;47974:58;48066:20;48061:2;48053:6;48049:15;48042:45;47963:131;:::o;48100:225::-;48240:34;48236:1;48228:6;48224:14;48217:58;48309:8;48304:2;48296:6;48292:15;48285:33;48206:119;:::o;48331:224::-;48471:34;48467:1;48459:6;48455:14;48448:58;48540:7;48535:2;48527:6;48523:15;48516:32;48437:118;:::o;48561:168::-;48701:20;48697:1;48689:6;48685:14;48678:44;48667:62;:::o;48735:178::-;48875:30;48871:1;48863:6;48859:14;48852:54;48841:72;:::o;48919:214::-;49059:66;49055:1;49047:6;49043:14;49036:90;49025:108;:::o;49139:223::-;49279:34;49275:1;49267:6;49263:14;49256:58;49348:6;49343:2;49335:6;49331:15;49324:31;49245:117;:::o;49368:175::-;49508:27;49504:1;49496:6;49492:14;49485:51;49474:69;:::o;49549:221::-;49689:34;49685:1;49677:6;49673:14;49666:58;49758:4;49753:2;49745:6;49741:15;49734:29;49655:115;:::o;49776:161::-;49916:13;49912:1;49904:6;49900:14;49893:37;49882:55;:::o;49943:231::-;50083:34;50079:1;50071:6;50067:14;50060:58;50152:14;50147:2;50139:6;50135:15;50128:39;50049:125;:::o;50180:166::-;50320:18;50316:1;50308:6;50304:14;50297:42;50286:60;:::o;50352:243::-;50492:34;50488:1;50480:6;50476:14;50469:58;50561:26;50556:2;50548:6;50544:15;50537:51;50458:137;:::o;50601:229::-;50741:34;50737:1;50729:6;50725:14;50718:58;50810:12;50805:2;50797:6;50793:15;50786:37;50707:123;:::o;50836:228::-;50976:34;50972:1;50964:6;50960:14;50953:58;51045:11;51040:2;51032:6;51028:15;51021:36;50942:122;:::o;51070:221::-;51210:34;51206:1;51198:6;51194:14;51187:58;51279:4;51274:2;51266:6;51262:15;51255:29;51176:115;:::o;51297:182::-;51437:34;51433:1;51425:6;51421:14;51414:58;51403:76;:::o;51485:231::-;51625:34;51621:1;51613:6;51609:14;51602:58;51694:14;51689:2;51681:6;51677:15;51670:39;51591:125;:::o;51722:182::-;51862:34;51858:1;51850:6;51846:14;51839:58;51828:76;:::o;51910:234::-;52050:34;52046:1;52038:6;52034:14;52027:58;52119:17;52114:2;52106:6;52102:15;52095:42;52016:128;:::o;52150:177::-;52290:29;52286:1;52278:6;52274:14;52267:53;52256:71;:::o;52333:220::-;52473:34;52469:1;52461:6;52457:14;52450:58;52542:3;52537:2;52529:6;52525:15;52518:28;52439:114;:::o;52559:236::-;52699:34;52695:1;52687:6;52683:14;52676:58;52768:19;52763:2;52755:6;52751:15;52744:44;52665:130;:::o;52801:231::-;52941:34;52937:1;52929:6;52925:14;52918:58;53010:14;53005:2;52997:6;52993:15;52986:39;52907:125;:::o;53038:169::-;53178:21;53174:1;53166:6;53162:14;53155:45;53144:63;:::o;53213:171::-;53353:23;53349:1;53341:6;53337:14;53330:47;53319:65;:::o;53390:174::-;53530:26;53526:1;53518:6;53514:14;53507:50;53496:68;:::o;53570:122::-;53643:24;53661:5;53643:24;:::i;:::-;53636:5;53633:35;53623:2;;53682:1;53679;53672:12;53623:2;53613:79;:::o;53698:116::-;53768:21;53783:5;53768:21;:::i;:::-;53761:5;53758:32;53748:2;;53804:1;53801;53794:12;53748:2;53738:76;:::o;53820:120::-;53892:23;53909:5;53892:23;:::i;:::-;53885:5;53882:34;53872:2;;53930:1;53927;53920:12;53872:2;53862:78;:::o;53946:122::-;54019:24;54037:5;54019:24;:::i;:::-;54012:5;54009:35;53999:2;;54058:1;54055;54048:12;53999:2;53989:79;:::o
Swarm Source
ipfs://9a68e11e95b206c1a81fb89838064a2bba60cad7502237265c3b28748222365e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.