ERC-721
Overview
Max Total Supply
627 KAZI
Holders
128
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 KAZILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KaziContract
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-14 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits 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: contracts/KaziV2.sol pragma solidity >=0.7.0 <0.9.0; contract KaziContract is ERC721, Ownable { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private supply; bytes32 public root = 0x6584ca7f18181ef50fe9120f31f5e42b7ae02c44893c217fe0f7407e8bcc8ae1; mapping(address => bool) public whitelistClaimed; string public uriPrefix = ""; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 private cost = 0.0025 ether; uint256 public maxSupply = 3000; uint256 public maxMintAmount = 2; bool public paused = true; bool public revealed = false; bool public whitelistMintEnabled = true; constructor() ERC721("KaziNFT", "KAZI") { setHiddenMetadataUri("ipfs://QmRcZ3tqvQ9gBfiTQgaqFNEDBMEP4112Q8HYR964WuTQRT/hidden.json"); } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 && _mintAmount <= maxMintAmount, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= cost * _mintAmount, 'Insufficient funds!'); _; } function totalSupply() public view returns (uint256) { return supply.current(); } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(!paused, "The contract is paused!"); require(msg.value >= cost * _mintAmount, "Insufficient funds!"); _mintLoop(msg.sender, _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _mintLoop(_receiver, _mintAmount); } function walletOfOwner(address _owner) private view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost) private onlyOwner { cost = _cost; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function withdraw() public onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function _mintLoop(address _receiver, uint256 _mintAmount) internal { for (uint256 i = 0; i < _mintAmount; i++) { supply.increment(); _safeMint(_receiver, supply.current()); } } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setWhitelistMintEnabled(bool _state) public onlyOwner { whitelistMintEnabled = _state; } function checkValidity(bytes32[] calldata _merkleProof) public view returns (bool){ bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, root, leaf), "IGNORE THIS ERROR: Correct proof given"); return true; // Or you can mint tokens here } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"checkValidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040527f6584ca7f18181ef50fe9120f31f5e42b7ae02c44893c217fe0f7407e8bcc8ae160001b60085560405180602001604052806000815250600a908051906020019062000052929190620003a9565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000a0929190620003a9565b506608e1bc9bf04000600d55610bb8600e556002600f556001601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506001601060026101000a81548160ff0219169083151502179055503480156200011557600080fd5b506040518060400160405280600781526020017f4b617a694e4654000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4b415a490000000000000000000000000000000000000000000000000000000081525081600090805190602001906200019a929190620003a9565b508060019080519060200190620001b3929190620003a9565b505050620001d6620001ca6200020660201b60201c565b6200020e60201b60201c565b620002006040518060800160405280604181526020016200495e60419139620002d460201b60201c565b62000541565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e46200020660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200030a6200037f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000363576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035a90620004ba565b60405180910390fd5b80600c90805190602001906200037b929190620003a9565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003b7906200050b565b90600052602060002090601f016020900481019282620003db576000855562000427565b82601f10620003f657805160ff191683800117855562000427565b8280016001018555821562000427579182015b828111156200042657825182559160200191906001019062000409565b5b5090506200043691906200043a565b5090565b5b80821115620004555760008160009055506001016200043b565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620004a260208362000459565b9150620004af826200046a565b602082019050919050565b60006020820190508181036000830152620004d58162000493565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052457607f821691505b602082108114156200053b576200053a620004dc565b5b50919050565b61440d80620005516000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063b767a098116100ab578063e0a808531161006f578063e0a80853146107e6578063e985e9c51461080f578063ebf0c7171461084c578063efbd73f414610877578063f2fde38b146108a057610225565b8063b767a098146106ef578063b88d4fde14610718578063c87b56dd14610741578063d5abeb011461077e578063db4bec44146107a957610225565b8063954d90d0116100f2578063954d90d01461061757806395d89b4114610654578063a0712d681461067f578063a22cb4651461069b578063a45ba8e7146106c457610225565b8063715018a6146105835780637ec4a6591461059a5780637f00c7a6146105c35780638da5cb5b146105ec57610225565b80633ccfd60b116101b15780635c975abb116101755780635c975abb1461048857806362b99ad4146104b35780636352211e146104de5780636caede3d1461051b57806370a082311461054657610225565b80633ccfd60b146103c957806342842e0e146103e05780634fdd43cb1461040957806351830227146104325780635503a0e81461045d57610225565b806316ba10e0116101f857806316ba10e0146102f857806316c38b3c1461032157806318160ddd1461034a578063239c70ae1461037557806323b872dd146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612c74565b6108c9565b60405161025e9190612cbc565b60405180910390f35b34801561027357600080fd5b5061027c6109ab565b6040516102899190612d70565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612dc8565b610a3d565b6040516102c69190612e36565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e7d565b610ac2565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612ff2565b610bda565b005b34801561032d57600080fd5b5061034860048036038101906103439190613067565b610c70565b005b34801561035657600080fd5b5061035f610d09565b60405161036c91906130a3565b60405180910390f35b34801561038157600080fd5b5061038a610d1a565b60405161039791906130a3565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c291906130be565b610d20565b005b3480156103d557600080fd5b506103de610d80565b005b3480156103ec57600080fd5b50610407600480360381019061040291906130be565b610e7c565b005b34801561041557600080fd5b50610430600480360381019061042b9190612ff2565b610e9c565b005b34801561043e57600080fd5b50610447610f32565b6040516104549190612cbc565b60405180910390f35b34801561046957600080fd5b50610472610f45565b60405161047f9190612d70565b60405180910390f35b34801561049457600080fd5b5061049d610fd3565b6040516104aa9190612cbc565b60405180910390f35b3480156104bf57600080fd5b506104c8610fe6565b6040516104d59190612d70565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190612dc8565b611074565b6040516105129190612e36565b60405180910390f35b34801561052757600080fd5b50610530611126565b60405161053d9190612cbc565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190613111565b611139565b60405161057a91906130a3565b60405180910390f35b34801561058f57600080fd5b506105986111f1565b005b3480156105a657600080fd5b506105c160048036038101906105bc9190612ff2565b611279565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190612dc8565b61130f565b005b3480156105f857600080fd5b50610601611395565b60405161060e9190612e36565b60405180910390f35b34801561062357600080fd5b5061063e6004803603810190610639919061319e565b6113bf565b60405161064b9190612cbc565b60405180910390f35b34801561066057600080fd5b50610669611483565b6040516106769190612d70565b60405180910390f35b61069960048036038101906106949190612dc8565b611515565b005b3480156106a757600080fd5b506106c260048036038101906106bd91906131eb565b61166c565b005b3480156106d057600080fd5b506106d9611682565b6040516106e69190612d70565b60405180910390f35b3480156106fb57600080fd5b5061071660048036038101906107119190613067565b611710565b005b34801561072457600080fd5b5061073f600480360381019061073a91906132cc565b6117a9565b005b34801561074d57600080fd5b5061076860048036038101906107639190612dc8565b61180b565b6040516107759190612d70565b60405180910390f35b34801561078a57600080fd5b50610793611964565b6040516107a091906130a3565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613111565b61196a565b6040516107dd9190612cbc565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613067565b61198a565b005b34801561081b57600080fd5b506108366004803603810190610831919061334f565b611a23565b6040516108439190612cbc565b60405180910390f35b34801561085857600080fd5b50610861611ab7565b60405161086e91906133a8565b60405180910390f35b34801561088357600080fd5b5061089e600480360381019061089991906133c3565b611abd565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613111565b611bf1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a457506109a382611ce9565b5b9050919050565b6060600080546109ba90613432565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613432565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b6000610a4882611d53565b610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e906134d6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610acd82611074565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590613568565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5d611dbf565b73ffffffffffffffffffffffffffffffffffffffff161480610b8c5750610b8b81610b86611dbf565b611a23565b5b610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc2906135fa565b60405180910390fd5b610bd58383611dc7565b505050565b610be2611dbf565b73ffffffffffffffffffffffffffffffffffffffff16610c00611395565b73ffffffffffffffffffffffffffffffffffffffff1614610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90613666565b60405180910390fd5b80600b9080519060200190610c6c929190612b65565b5050565b610c78611dbf565b73ffffffffffffffffffffffffffffffffffffffff16610c96611395565b73ffffffffffffffffffffffffffffffffffffffff1614610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390613666565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000610d156007611e80565b905090565b600f5481565b610d31610d2b611dbf565b82611e8e565b610d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d67906136f8565b60405180910390fd5b610d7b838383611f6c565b505050565b610d88611dbf565b73ffffffffffffffffffffffffffffffffffffffff16610da6611395565b73ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390613666565b60405180910390fd5b6000610e06611395565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e2990613749565b60006040518083038185875af1925050503d8060008114610e66576040519150601f19603f3d011682016040523d82523d6000602084013e610e6b565b606091505b5050905080610e7957600080fd5b50565b610e97838383604051806020016040528060008152506117a9565b505050565b610ea4611dbf565b73ffffffffffffffffffffffffffffffffffffffff16610ec2611395565b73ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90613666565b60405180910390fd5b80600c9080519060200190610f2e929190612b65565b5050565b601060019054906101000a900460ff1681565b600b8054610f5290613432565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7e90613432565b8015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081565b601060009054906101000a900460ff1681565b600a8054610ff390613432565b80601f016020809104026020016040519081016040528092919081815260200182805461101f90613432565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561111d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611114906137d0565b60405180910390fd5b80915050919050565b601060029054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190613862565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111f9611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611217611395565b73ffffffffffffffffffffffffffffffffffffffff161461126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126490613666565b60405180910390fd5b61127760006121d3565b565b611281611dbf565b73ffffffffffffffffffffffffffffffffffffffff1661129f611395565b73ffffffffffffffffffffffffffffffffffffffff16146112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90613666565b60405180910390fd5b80600a908051906020019061130b929190612b65565b5050565b611317611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611335611395565b73ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290613666565b60405180910390fd5b80600f8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080336040516020016113d391906138ca565b604051602081830303815290604052805190602001209050611439848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060085483612299565b611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f90613957565b60405180910390fd5b600191505092915050565b60606001805461149290613432565b80601f01602080910402602001604051908101604052809291908181526020018280546114be90613432565b801561150b5780601f106114e05761010080835404028352916020019161150b565b820191906000526020600020905b8154815290600101906020018083116114ee57829003601f168201915b5050505050905090565b806000811180156115285750600f548111155b611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155e906139c3565b60405180910390fd5b600e5481611573610d09565b61157d9190613a12565b11156115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590613ab4565b60405180910390fd5b601060009054906101000a900460ff161561160e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160590613b20565b60405180910390fd5b81600d5461161c9190613b40565b34101561165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590613be6565b60405180910390fd5b61166833836122b0565b5050565b61167e611677611dbf565b83836122f0565b5050565b600c805461168f90613432565b80601f01602080910402602001604051908101604052809291908181526020018280546116bb90613432565b80156117085780601f106116dd57610100808354040283529160200191611708565b820191906000526020600020905b8154815290600101906020018083116116eb57829003601f168201915b505050505081565b611718611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611736611395565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390613666565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b6117ba6117b4611dbf565b83611e8e565b6117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f0906136f8565b60405180910390fd5b6118058484848461245d565b50505050565b606061181682611d53565b611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613c78565b60405180910390fd5b60001515601060019054906101000a900460ff161515141561190357600c805461187e90613432565b80601f01602080910402602001604051908101604052809291908181526020018280546118aa90613432565b80156118f75780601f106118cc576101008083540402835291602001916118f7565b820191906000526020600020905b8154815290600101906020018083116118da57829003601f168201915b5050505050905061195f565b600061190d6124b9565b9050600081511161192d576040518060200160405280600081525061195b565b806119378461254b565b600b60405160200161194b93929190613d68565b6040516020818303038152906040525b9150505b919050565b600e5481565b60096020528060005260406000206000915054906101000a900460ff1681565b611992611dbf565b73ffffffffffffffffffffffffffffffffffffffff166119b0611395565b73ffffffffffffffffffffffffffffffffffffffff1614611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613666565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60085481565b81600081118015611ad05750600f548111155b611b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b06906139c3565b60405180910390fd5b600e5481611b1b610d09565b611b259190613a12565b1115611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613ab4565b60405180910390fd5b611b6e611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611b8c611395565b73ffffffffffffffffffffffffffffffffffffffff1614611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613666565b60405180910390fd5b611bec82846122b0565b505050565b611bf9611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611c17611395565b73ffffffffffffffffffffffffffffffffffffffff1614611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613666565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490613e0b565b60405180910390fd5b611ce6816121d3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e3a83611074565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611e9982611d53565b611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf90613e9d565b60405180910390fd5b6000611ee383611074565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f255750611f248185611a23565b5b80611f6357508373ffffffffffffffffffffffffffffffffffffffff16611f4b84610a3d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f8c82611074565b73ffffffffffffffffffffffffffffffffffffffff1614611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990613f2f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613fc1565b60405180910390fd5b61205d8383836126ac565b612068600082611dc7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b89190613fe1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461210f9190613a12565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121ce8383836126b1565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826122a685846126b6565b1490509392505050565b60005b818110156122eb576122c5600761272b565b6122d8836122d36007611e80565b612741565b80806122e390614015565b9150506122b3565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561235f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612356906140aa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124509190612cbc565b60405180910390a3505050565b612468848484611f6c565b6124748484848461275f565b6124b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124aa9061413c565b60405180910390fd5b50505050565b6060600a80546124c890613432565b80601f01602080910402602001604051908101604052809291908181526020018280546124f490613432565b80156125415780601f1061251657610100808354040283529160200191612541565b820191906000526020600020905b81548152906001019060200180831161252457829003601f168201915b5050505050905090565b60606000821415612593576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126a7565b600082905060005b600082146125c55780806125ae90614015565b915050600a826125be919061418b565b915061259b565b60008167ffffffffffffffff8111156125e1576125e0612ec7565b5b6040519080825280601f01601f1916602001820160405280156126135781602001600182028036833780820191505090505b5090505b600085146126a05760018261262c9190613fe1565b9150600a8561263b91906141bc565b60306126479190613a12565b60f81b81838151811061265d5761265c6141ed565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612699919061418b565b9450612617565b8093505050505b919050565b505050565b505050565b60008082905060005b84518110156127205760008582815181106126dd576126dc6141ed565b5b602002602001015190508083116126ff576126f883826128f6565b925061270c565b61270981846128f6565b92505b50808061271890614015565b9150506126bf565b508091505092915050565b6001816000016000828254019250508190555050565b61275b82826040518060200160405280600081525061290d565b5050565b60006127808473ffffffffffffffffffffffffffffffffffffffff16612968565b156128e9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127a9611dbf565b8786866040518563ffffffff1660e01b81526004016127cb9493929190614271565b602060405180830381600087803b1580156127e557600080fd5b505af192505050801561281657506040513d601f19601f8201168201806040525081019061281391906142d2565b60015b612899573d8060008114612846576040519150601f19603f3d011682016040523d82523d6000602084013e61284b565b606091505b50600081511415612891576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128889061413c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128ee565b600190505b949350505050565b600082600052816020526040600020905092915050565b612917838361298b565b612924600084848461275f565b612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a9061413c565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f29061434b565b60405180910390fd5b612a0481611d53565b15612a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3b906143b7565b60405180910390fd5b612a50600083836126ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aa09190613a12565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b61600083836126b1565b5050565b828054612b7190613432565b90600052602060002090601f016020900481019282612b935760008555612bda565b82601f10612bac57805160ff1916838001178555612bda565b82800160010185558215612bda579182015b82811115612bd9578251825591602001919060010190612bbe565b5b509050612be79190612beb565b5090565b5b80821115612c04576000816000905550600101612bec565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c5181612c1c565b8114612c5c57600080fd5b50565b600081359050612c6e81612c48565b92915050565b600060208284031215612c8a57612c89612c12565b5b6000612c9884828501612c5f565b91505092915050565b60008115159050919050565b612cb681612ca1565b82525050565b6000602082019050612cd16000830184612cad565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d11578082015181840152602081019050612cf6565b83811115612d20576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d4282612cd7565b612d4c8185612ce2565b9350612d5c818560208601612cf3565b612d6581612d26565b840191505092915050565b60006020820190508181036000830152612d8a8184612d37565b905092915050565b6000819050919050565b612da581612d92565b8114612db057600080fd5b50565b600081359050612dc281612d9c565b92915050565b600060208284031215612dde57612ddd612c12565b5b6000612dec84828501612db3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e2082612df5565b9050919050565b612e3081612e15565b82525050565b6000602082019050612e4b6000830184612e27565b92915050565b612e5a81612e15565b8114612e6557600080fd5b50565b600081359050612e7781612e51565b92915050565b60008060408385031215612e9457612e93612c12565b5b6000612ea285828601612e68565b9250506020612eb385828601612db3565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612eff82612d26565b810181811067ffffffffffffffff82111715612f1e57612f1d612ec7565b5b80604052505050565b6000612f31612c08565b9050612f3d8282612ef6565b919050565b600067ffffffffffffffff821115612f5d57612f5c612ec7565b5b612f6682612d26565b9050602081019050919050565b82818337600083830152505050565b6000612f95612f9084612f42565b612f27565b905082815260208101848484011115612fb157612fb0612ec2565b5b612fbc848285612f73565b509392505050565b600082601f830112612fd957612fd8612ebd565b5b8135612fe9848260208601612f82565b91505092915050565b60006020828403121561300857613007612c12565b5b600082013567ffffffffffffffff81111561302657613025612c17565b5b61303284828501612fc4565b91505092915050565b61304481612ca1565b811461304f57600080fd5b50565b6000813590506130618161303b565b92915050565b60006020828403121561307d5761307c612c12565b5b600061308b84828501613052565b91505092915050565b61309d81612d92565b82525050565b60006020820190506130b86000830184613094565b92915050565b6000806000606084860312156130d7576130d6612c12565b5b60006130e586828701612e68565b93505060206130f686828701612e68565b925050604061310786828701612db3565b9150509250925092565b60006020828403121561312757613126612c12565b5b600061313584828501612e68565b91505092915050565b600080fd5b600080fd5b60008083601f84011261315e5761315d612ebd565b5b8235905067ffffffffffffffff81111561317b5761317a61313e565b5b60208301915083602082028301111561319757613196613143565b5b9250929050565b600080602083850312156131b5576131b4612c12565b5b600083013567ffffffffffffffff8111156131d3576131d2612c17565b5b6131df85828601613148565b92509250509250929050565b6000806040838503121561320257613201612c12565b5b600061321085828601612e68565b925050602061322185828601613052565b9150509250929050565b600067ffffffffffffffff82111561324657613245612ec7565b5b61324f82612d26565b9050602081019050919050565b600061326f61326a8461322b565b612f27565b90508281526020810184848401111561328b5761328a612ec2565b5b613296848285612f73565b509392505050565b600082601f8301126132b3576132b2612ebd565b5b81356132c384826020860161325c565b91505092915050565b600080600080608085870312156132e6576132e5612c12565b5b60006132f487828801612e68565b945050602061330587828801612e68565b935050604061331687828801612db3565b925050606085013567ffffffffffffffff81111561333757613336612c17565b5b6133438782880161329e565b91505092959194509250565b6000806040838503121561336657613365612c12565b5b600061337485828601612e68565b925050602061338585828601612e68565b9150509250929050565b6000819050919050565b6133a28161338f565b82525050565b60006020820190506133bd6000830184613399565b92915050565b600080604083850312156133da576133d9612c12565b5b60006133e885828601612db3565b92505060206133f985828601612e68565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061344a57607f821691505b6020821081141561345e5761345d613403565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006134c0602c83612ce2565b91506134cb82613464565b604082019050919050565b600060208201905081810360008301526134ef816134b3565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613552602183612ce2565b915061355d826134f6565b604082019050919050565b6000602082019050818103600083015261358181613545565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006135e4603883612ce2565b91506135ef82613588565b604082019050919050565b60006020820190508181036000830152613613816135d7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613650602083612ce2565b915061365b8261361a565b602082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006136e2603183612ce2565b91506136ed82613686565b604082019050919050565b60006020820190508181036000830152613711816136d5565b9050919050565b600081905092915050565b50565b6000613733600083613718565b915061373e82613723565b600082019050919050565b600061375482613726565b9150819050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006137ba602983612ce2565b91506137c58261375e565b604082019050919050565b600060208201905081810360008301526137e9816137ad565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061384c602a83612ce2565b9150613857826137f0565b604082019050919050565b6000602082019050818103600083015261387b8161383f565b9050919050565b60008160601b9050919050565b600061389a82613882565b9050919050565b60006138ac8261388f565b9050919050565b6138c46138bf82612e15565b6138a1565b82525050565b60006138d682846138b3565b60148201915081905092915050565b7f49474e4f52452054484953204552524f523a20436f72726563742070726f6f6660008201527f20676976656e0000000000000000000000000000000000000000000000000000602082015250565b6000613941602683612ce2565b915061394c826138e5565b604082019050919050565b6000602082019050818103600083015261397081613934565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006139ad601483612ce2565b91506139b882613977565b602082019050919050565b600060208201905081810360008301526139dc816139a0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1d82612d92565b9150613a2883612d92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5d57613a5c6139e3565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613a9e601483612ce2565b9150613aa982613a68565b602082019050919050565b60006020820190508181036000830152613acd81613a91565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613b0a601783612ce2565b9150613b1582613ad4565b602082019050919050565b60006020820190508181036000830152613b3981613afd565b9050919050565b6000613b4b82612d92565b9150613b5683612d92565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b8f57613b8e6139e3565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613bd0601383612ce2565b9150613bdb82613b9a565b602082019050919050565b60006020820190508181036000830152613bff81613bc3565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c62602f83612ce2565b9150613c6d82613c06565b604082019050919050565b60006020820190508181036000830152613c9181613c55565b9050919050565b600081905092915050565b6000613cae82612cd7565b613cb88185613c98565b9350613cc8818560208601612cf3565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613cf681613432565b613d008186613c98565b94506001821660008114613d1b5760018114613d2c57613d5f565b60ff19831686528186019350613d5f565b613d3585613cd4565b60005b83811015613d5757815481890152600182019150602081019050613d38565b838801955050505b50505092915050565b6000613d748286613ca3565b9150613d808285613ca3565b9150613d8c8284613ce9565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613df5602683612ce2565b9150613e0082613d99565b604082019050919050565b60006020820190508181036000830152613e2481613de8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e87602c83612ce2565b9150613e9282613e2b565b604082019050919050565b60006020820190508181036000830152613eb681613e7a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613f19602583612ce2565b9150613f2482613ebd565b604082019050919050565b60006020820190508181036000830152613f4881613f0c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613fab602483612ce2565b9150613fb682613f4f565b604082019050919050565b60006020820190508181036000830152613fda81613f9e565b9050919050565b6000613fec82612d92565b9150613ff783612d92565b92508282101561400a576140096139e3565b5b828203905092915050565b600061402082612d92565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614053576140526139e3565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614094601983612ce2565b915061409f8261405e565b602082019050919050565b600060208201905081810360008301526140c381614087565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614126603283612ce2565b9150614131826140ca565b604082019050919050565b6000602082019050818103600083015261415581614119565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061419682612d92565b91506141a183612d92565b9250826141b1576141b061415c565b5b828204905092915050565b60006141c782612d92565b91506141d283612d92565b9250826141e2576141e161415c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006142438261421c565b61424d8185614227565b935061425d818560208601612cf3565b61426681612d26565b840191505092915050565b60006080820190506142866000830187612e27565b6142936020830186612e27565b6142a06040830185613094565b81810360608301526142b28184614238565b905095945050505050565b6000815190506142cc81612c48565b92915050565b6000602082840312156142e8576142e7612c12565b5b60006142f6848285016142bd565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614335602083612ce2565b9150614340826142ff565b602082019050919050565b6000602082019050818103600083015261436481614328565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006143a1601c83612ce2565b91506143ac8261436b565b602082019050919050565b600060208201905081810360008301526143d081614394565b905091905056fea26469706673582212205c08f9f9d7722c924719c58405905a035a4736be7afe41750ec66b2ab72355cc64736f6c63430008090033697066733a2f2f516d52635a337471765139674266695451676171464e4544424d45503431313251384859523936345775545152542f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102255760003560e01c8063715018a611610123578063b767a098116100ab578063e0a808531161006f578063e0a80853146107e6578063e985e9c51461080f578063ebf0c7171461084c578063efbd73f414610877578063f2fde38b146108a057610225565b8063b767a098146106ef578063b88d4fde14610718578063c87b56dd14610741578063d5abeb011461077e578063db4bec44146107a957610225565b8063954d90d0116100f2578063954d90d01461061757806395d89b4114610654578063a0712d681461067f578063a22cb4651461069b578063a45ba8e7146106c457610225565b8063715018a6146105835780637ec4a6591461059a5780637f00c7a6146105c35780638da5cb5b146105ec57610225565b80633ccfd60b116101b15780635c975abb116101755780635c975abb1461048857806362b99ad4146104b35780636352211e146104de5780636caede3d1461051b57806370a082311461054657610225565b80633ccfd60b146103c957806342842e0e146103e05780634fdd43cb1461040957806351830227146104325780635503a0e81461045d57610225565b806316ba10e0116101f857806316ba10e0146102f857806316c38b3c1461032157806318160ddd1461034a578063239c70ae1461037557806323b872dd146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612c74565b6108c9565b60405161025e9190612cbc565b60405180910390f35b34801561027357600080fd5b5061027c6109ab565b6040516102899190612d70565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612dc8565b610a3d565b6040516102c69190612e36565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e7d565b610ac2565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612ff2565b610bda565b005b34801561032d57600080fd5b5061034860048036038101906103439190613067565b610c70565b005b34801561035657600080fd5b5061035f610d09565b60405161036c91906130a3565b60405180910390f35b34801561038157600080fd5b5061038a610d1a565b60405161039791906130a3565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c291906130be565b610d20565b005b3480156103d557600080fd5b506103de610d80565b005b3480156103ec57600080fd5b50610407600480360381019061040291906130be565b610e7c565b005b34801561041557600080fd5b50610430600480360381019061042b9190612ff2565b610e9c565b005b34801561043e57600080fd5b50610447610f32565b6040516104549190612cbc565b60405180910390f35b34801561046957600080fd5b50610472610f45565b60405161047f9190612d70565b60405180910390f35b34801561049457600080fd5b5061049d610fd3565b6040516104aa9190612cbc565b60405180910390f35b3480156104bf57600080fd5b506104c8610fe6565b6040516104d59190612d70565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190612dc8565b611074565b6040516105129190612e36565b60405180910390f35b34801561052757600080fd5b50610530611126565b60405161053d9190612cbc565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190613111565b611139565b60405161057a91906130a3565b60405180910390f35b34801561058f57600080fd5b506105986111f1565b005b3480156105a657600080fd5b506105c160048036038101906105bc9190612ff2565b611279565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190612dc8565b61130f565b005b3480156105f857600080fd5b50610601611395565b60405161060e9190612e36565b60405180910390f35b34801561062357600080fd5b5061063e6004803603810190610639919061319e565b6113bf565b60405161064b9190612cbc565b60405180910390f35b34801561066057600080fd5b50610669611483565b6040516106769190612d70565b60405180910390f35b61069960048036038101906106949190612dc8565b611515565b005b3480156106a757600080fd5b506106c260048036038101906106bd91906131eb565b61166c565b005b3480156106d057600080fd5b506106d9611682565b6040516106e69190612d70565b60405180910390f35b3480156106fb57600080fd5b5061071660048036038101906107119190613067565b611710565b005b34801561072457600080fd5b5061073f600480360381019061073a91906132cc565b6117a9565b005b34801561074d57600080fd5b5061076860048036038101906107639190612dc8565b61180b565b6040516107759190612d70565b60405180910390f35b34801561078a57600080fd5b50610793611964565b6040516107a091906130a3565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613111565b61196a565b6040516107dd9190612cbc565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613067565b61198a565b005b34801561081b57600080fd5b506108366004803603810190610831919061334f565b611a23565b6040516108439190612cbc565b60405180910390f35b34801561085857600080fd5b50610861611ab7565b60405161086e91906133a8565b60405180910390f35b34801561088357600080fd5b5061089e600480360381019061089991906133c3565b611abd565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613111565b611bf1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a457506109a382611ce9565b5b9050919050565b6060600080546109ba90613432565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613432565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b6000610a4882611d53565b610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e906134d6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610acd82611074565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590613568565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5d611dbf565b73ffffffffffffffffffffffffffffffffffffffff161480610b8c5750610b8b81610b86611dbf565b611a23565b5b610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc2906135fa565b60405180910390fd5b610bd58383611dc7565b505050565b610be2611dbf565b73ffffffffffffffffffffffffffffffffffffffff16610c00611395565b73ffffffffffffffffffffffffffffffffffffffff1614610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90613666565b60405180910390fd5b80600b9080519060200190610c6c929190612b65565b5050565b610c78611dbf565b73ffffffffffffffffffffffffffffffffffffffff16610c96611395565b73ffffffffffffffffffffffffffffffffffffffff1614610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390613666565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000610d156007611e80565b905090565b600f5481565b610d31610d2b611dbf565b82611e8e565b610d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d67906136f8565b60405180910390fd5b610d7b838383611f6c565b505050565b610d88611dbf565b73ffffffffffffffffffffffffffffffffffffffff16610da6611395565b73ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390613666565b60405180910390fd5b6000610e06611395565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e2990613749565b60006040518083038185875af1925050503d8060008114610e66576040519150601f19603f3d011682016040523d82523d6000602084013e610e6b565b606091505b5050905080610e7957600080fd5b50565b610e97838383604051806020016040528060008152506117a9565b505050565b610ea4611dbf565b73ffffffffffffffffffffffffffffffffffffffff16610ec2611395565b73ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90613666565b60405180910390fd5b80600c9080519060200190610f2e929190612b65565b5050565b601060019054906101000a900460ff1681565b600b8054610f5290613432565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7e90613432565b8015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081565b601060009054906101000a900460ff1681565b600a8054610ff390613432565b80601f016020809104026020016040519081016040528092919081815260200182805461101f90613432565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561111d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611114906137d0565b60405180910390fd5b80915050919050565b601060029054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190613862565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111f9611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611217611395565b73ffffffffffffffffffffffffffffffffffffffff161461126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126490613666565b60405180910390fd5b61127760006121d3565b565b611281611dbf565b73ffffffffffffffffffffffffffffffffffffffff1661129f611395565b73ffffffffffffffffffffffffffffffffffffffff16146112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90613666565b60405180910390fd5b80600a908051906020019061130b929190612b65565b5050565b611317611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611335611395565b73ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290613666565b60405180910390fd5b80600f8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080336040516020016113d391906138ca565b604051602081830303815290604052805190602001209050611439848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060085483612299565b611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f90613957565b60405180910390fd5b600191505092915050565b60606001805461149290613432565b80601f01602080910402602001604051908101604052809291908181526020018280546114be90613432565b801561150b5780601f106114e05761010080835404028352916020019161150b565b820191906000526020600020905b8154815290600101906020018083116114ee57829003601f168201915b5050505050905090565b806000811180156115285750600f548111155b611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155e906139c3565b60405180910390fd5b600e5481611573610d09565b61157d9190613a12565b11156115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590613ab4565b60405180910390fd5b601060009054906101000a900460ff161561160e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160590613b20565b60405180910390fd5b81600d5461161c9190613b40565b34101561165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590613be6565b60405180910390fd5b61166833836122b0565b5050565b61167e611677611dbf565b83836122f0565b5050565b600c805461168f90613432565b80601f01602080910402602001604051908101604052809291908181526020018280546116bb90613432565b80156117085780601f106116dd57610100808354040283529160200191611708565b820191906000526020600020905b8154815290600101906020018083116116eb57829003601f168201915b505050505081565b611718611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611736611395565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390613666565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b6117ba6117b4611dbf565b83611e8e565b6117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f0906136f8565b60405180910390fd5b6118058484848461245d565b50505050565b606061181682611d53565b611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613c78565b60405180910390fd5b60001515601060019054906101000a900460ff161515141561190357600c805461187e90613432565b80601f01602080910402602001604051908101604052809291908181526020018280546118aa90613432565b80156118f75780601f106118cc576101008083540402835291602001916118f7565b820191906000526020600020905b8154815290600101906020018083116118da57829003601f168201915b5050505050905061195f565b600061190d6124b9565b9050600081511161192d576040518060200160405280600081525061195b565b806119378461254b565b600b60405160200161194b93929190613d68565b6040516020818303038152906040525b9150505b919050565b600e5481565b60096020528060005260406000206000915054906101000a900460ff1681565b611992611dbf565b73ffffffffffffffffffffffffffffffffffffffff166119b0611395565b73ffffffffffffffffffffffffffffffffffffffff1614611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613666565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60085481565b81600081118015611ad05750600f548111155b611b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b06906139c3565b60405180910390fd5b600e5481611b1b610d09565b611b259190613a12565b1115611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613ab4565b60405180910390fd5b611b6e611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611b8c611395565b73ffffffffffffffffffffffffffffffffffffffff1614611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613666565b60405180910390fd5b611bec82846122b0565b505050565b611bf9611dbf565b73ffffffffffffffffffffffffffffffffffffffff16611c17611395565b73ffffffffffffffffffffffffffffffffffffffff1614611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613666565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490613e0b565b60405180910390fd5b611ce6816121d3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e3a83611074565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611e9982611d53565b611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf90613e9d565b60405180910390fd5b6000611ee383611074565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f255750611f248185611a23565b5b80611f6357508373ffffffffffffffffffffffffffffffffffffffff16611f4b84610a3d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f8c82611074565b73ffffffffffffffffffffffffffffffffffffffff1614611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990613f2f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613fc1565b60405180910390fd5b61205d8383836126ac565b612068600082611dc7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b89190613fe1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461210f9190613a12565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121ce8383836126b1565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826122a685846126b6565b1490509392505050565b60005b818110156122eb576122c5600761272b565b6122d8836122d36007611e80565b612741565b80806122e390614015565b9150506122b3565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561235f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612356906140aa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124509190612cbc565b60405180910390a3505050565b612468848484611f6c565b6124748484848461275f565b6124b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124aa9061413c565b60405180910390fd5b50505050565b6060600a80546124c890613432565b80601f01602080910402602001604051908101604052809291908181526020018280546124f490613432565b80156125415780601f1061251657610100808354040283529160200191612541565b820191906000526020600020905b81548152906001019060200180831161252457829003601f168201915b5050505050905090565b60606000821415612593576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126a7565b600082905060005b600082146125c55780806125ae90614015565b915050600a826125be919061418b565b915061259b565b60008167ffffffffffffffff8111156125e1576125e0612ec7565b5b6040519080825280601f01601f1916602001820160405280156126135781602001600182028036833780820191505090505b5090505b600085146126a05760018261262c9190613fe1565b9150600a8561263b91906141bc565b60306126479190613a12565b60f81b81838151811061265d5761265c6141ed565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612699919061418b565b9450612617565b8093505050505b919050565b505050565b505050565b60008082905060005b84518110156127205760008582815181106126dd576126dc6141ed565b5b602002602001015190508083116126ff576126f883826128f6565b925061270c565b61270981846128f6565b92505b50808061271890614015565b9150506126bf565b508091505092915050565b6001816000016000828254019250508190555050565b61275b82826040518060200160405280600081525061290d565b5050565b60006127808473ffffffffffffffffffffffffffffffffffffffff16612968565b156128e9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127a9611dbf565b8786866040518563ffffffff1660e01b81526004016127cb9493929190614271565b602060405180830381600087803b1580156127e557600080fd5b505af192505050801561281657506040513d601f19601f8201168201806040525081019061281391906142d2565b60015b612899573d8060008114612846576040519150601f19603f3d011682016040523d82523d6000602084013e61284b565b606091505b50600081511415612891576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128889061413c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128ee565b600190505b949350505050565b600082600052816020526040600020905092915050565b612917838361298b565b612924600084848461275f565b612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a9061413c565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f29061434b565b60405180910390fd5b612a0481611d53565b15612a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3b906143b7565b60405180910390fd5b612a50600083836126ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aa09190613a12565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b61600083836126b1565b5050565b828054612b7190613432565b90600052602060002090601f016020900481019282612b935760008555612bda565b82601f10612bac57805160ff1916838001178555612bda565b82800160010185558215612bda579182015b82811115612bd9578251825591602001919060010190612bbe565b5b509050612be79190612beb565b5090565b5b80821115612c04576000816000905550600101612bec565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c5181612c1c565b8114612c5c57600080fd5b50565b600081359050612c6e81612c48565b92915050565b600060208284031215612c8a57612c89612c12565b5b6000612c9884828501612c5f565b91505092915050565b60008115159050919050565b612cb681612ca1565b82525050565b6000602082019050612cd16000830184612cad565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d11578082015181840152602081019050612cf6565b83811115612d20576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d4282612cd7565b612d4c8185612ce2565b9350612d5c818560208601612cf3565b612d6581612d26565b840191505092915050565b60006020820190508181036000830152612d8a8184612d37565b905092915050565b6000819050919050565b612da581612d92565b8114612db057600080fd5b50565b600081359050612dc281612d9c565b92915050565b600060208284031215612dde57612ddd612c12565b5b6000612dec84828501612db3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e2082612df5565b9050919050565b612e3081612e15565b82525050565b6000602082019050612e4b6000830184612e27565b92915050565b612e5a81612e15565b8114612e6557600080fd5b50565b600081359050612e7781612e51565b92915050565b60008060408385031215612e9457612e93612c12565b5b6000612ea285828601612e68565b9250506020612eb385828601612db3565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612eff82612d26565b810181811067ffffffffffffffff82111715612f1e57612f1d612ec7565b5b80604052505050565b6000612f31612c08565b9050612f3d8282612ef6565b919050565b600067ffffffffffffffff821115612f5d57612f5c612ec7565b5b612f6682612d26565b9050602081019050919050565b82818337600083830152505050565b6000612f95612f9084612f42565b612f27565b905082815260208101848484011115612fb157612fb0612ec2565b5b612fbc848285612f73565b509392505050565b600082601f830112612fd957612fd8612ebd565b5b8135612fe9848260208601612f82565b91505092915050565b60006020828403121561300857613007612c12565b5b600082013567ffffffffffffffff81111561302657613025612c17565b5b61303284828501612fc4565b91505092915050565b61304481612ca1565b811461304f57600080fd5b50565b6000813590506130618161303b565b92915050565b60006020828403121561307d5761307c612c12565b5b600061308b84828501613052565b91505092915050565b61309d81612d92565b82525050565b60006020820190506130b86000830184613094565b92915050565b6000806000606084860312156130d7576130d6612c12565b5b60006130e586828701612e68565b93505060206130f686828701612e68565b925050604061310786828701612db3565b9150509250925092565b60006020828403121561312757613126612c12565b5b600061313584828501612e68565b91505092915050565b600080fd5b600080fd5b60008083601f84011261315e5761315d612ebd565b5b8235905067ffffffffffffffff81111561317b5761317a61313e565b5b60208301915083602082028301111561319757613196613143565b5b9250929050565b600080602083850312156131b5576131b4612c12565b5b600083013567ffffffffffffffff8111156131d3576131d2612c17565b5b6131df85828601613148565b92509250509250929050565b6000806040838503121561320257613201612c12565b5b600061321085828601612e68565b925050602061322185828601613052565b9150509250929050565b600067ffffffffffffffff82111561324657613245612ec7565b5b61324f82612d26565b9050602081019050919050565b600061326f61326a8461322b565b612f27565b90508281526020810184848401111561328b5761328a612ec2565b5b613296848285612f73565b509392505050565b600082601f8301126132b3576132b2612ebd565b5b81356132c384826020860161325c565b91505092915050565b600080600080608085870312156132e6576132e5612c12565b5b60006132f487828801612e68565b945050602061330587828801612e68565b935050604061331687828801612db3565b925050606085013567ffffffffffffffff81111561333757613336612c17565b5b6133438782880161329e565b91505092959194509250565b6000806040838503121561336657613365612c12565b5b600061337485828601612e68565b925050602061338585828601612e68565b9150509250929050565b6000819050919050565b6133a28161338f565b82525050565b60006020820190506133bd6000830184613399565b92915050565b600080604083850312156133da576133d9612c12565b5b60006133e885828601612db3565b92505060206133f985828601612e68565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061344a57607f821691505b6020821081141561345e5761345d613403565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006134c0602c83612ce2565b91506134cb82613464565b604082019050919050565b600060208201905081810360008301526134ef816134b3565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613552602183612ce2565b915061355d826134f6565b604082019050919050565b6000602082019050818103600083015261358181613545565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006135e4603883612ce2565b91506135ef82613588565b604082019050919050565b60006020820190508181036000830152613613816135d7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613650602083612ce2565b915061365b8261361a565b602082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006136e2603183612ce2565b91506136ed82613686565b604082019050919050565b60006020820190508181036000830152613711816136d5565b9050919050565b600081905092915050565b50565b6000613733600083613718565b915061373e82613723565b600082019050919050565b600061375482613726565b9150819050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006137ba602983612ce2565b91506137c58261375e565b604082019050919050565b600060208201905081810360008301526137e9816137ad565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061384c602a83612ce2565b9150613857826137f0565b604082019050919050565b6000602082019050818103600083015261387b8161383f565b9050919050565b60008160601b9050919050565b600061389a82613882565b9050919050565b60006138ac8261388f565b9050919050565b6138c46138bf82612e15565b6138a1565b82525050565b60006138d682846138b3565b60148201915081905092915050565b7f49474e4f52452054484953204552524f523a20436f72726563742070726f6f6660008201527f20676976656e0000000000000000000000000000000000000000000000000000602082015250565b6000613941602683612ce2565b915061394c826138e5565b604082019050919050565b6000602082019050818103600083015261397081613934565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006139ad601483612ce2565b91506139b882613977565b602082019050919050565b600060208201905081810360008301526139dc816139a0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1d82612d92565b9150613a2883612d92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5d57613a5c6139e3565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613a9e601483612ce2565b9150613aa982613a68565b602082019050919050565b60006020820190508181036000830152613acd81613a91565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613b0a601783612ce2565b9150613b1582613ad4565b602082019050919050565b60006020820190508181036000830152613b3981613afd565b9050919050565b6000613b4b82612d92565b9150613b5683612d92565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b8f57613b8e6139e3565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613bd0601383612ce2565b9150613bdb82613b9a565b602082019050919050565b60006020820190508181036000830152613bff81613bc3565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c62602f83612ce2565b9150613c6d82613c06565b604082019050919050565b60006020820190508181036000830152613c9181613c55565b9050919050565b600081905092915050565b6000613cae82612cd7565b613cb88185613c98565b9350613cc8818560208601612cf3565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613cf681613432565b613d008186613c98565b94506001821660008114613d1b5760018114613d2c57613d5f565b60ff19831686528186019350613d5f565b613d3585613cd4565b60005b83811015613d5757815481890152600182019150602081019050613d38565b838801955050505b50505092915050565b6000613d748286613ca3565b9150613d808285613ca3565b9150613d8c8284613ce9565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613df5602683612ce2565b9150613e0082613d99565b604082019050919050565b60006020820190508181036000830152613e2481613de8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e87602c83612ce2565b9150613e9282613e2b565b604082019050919050565b60006020820190508181036000830152613eb681613e7a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613f19602583612ce2565b9150613f2482613ebd565b604082019050919050565b60006020820190508181036000830152613f4881613f0c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613fab602483612ce2565b9150613fb682613f4f565b604082019050919050565b60006020820190508181036000830152613fda81613f9e565b9050919050565b6000613fec82612d92565b9150613ff783612d92565b92508282101561400a576140096139e3565b5b828203905092915050565b600061402082612d92565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614053576140526139e3565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614094601983612ce2565b915061409f8261405e565b602082019050919050565b600060208201905081810360008301526140c381614087565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614126603283612ce2565b9150614131826140ca565b604082019050919050565b6000602082019050818103600083015261415581614119565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061419682612d92565b91506141a183612d92565b9250826141b1576141b061415c565b5b828204905092915050565b60006141c782612d92565b91506141d283612d92565b9250826141e2576141e161415c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006142438261421c565b61424d8185614227565b935061425d818560208601612cf3565b61426681612d26565b840191505092915050565b60006080820190506142866000830187612e27565b6142936020830186612e27565b6142a06040830185613094565b81810360608301526142b28184614238565b905095945050505050565b6000815190506142cc81612c48565b92915050565b6000602082840312156142e8576142e7612c12565b5b60006142f6848285016142bd565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614335602083612ce2565b9150614340826142ff565b602082019050919050565b6000602082019050818103600083015261436481614328565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006143a1601c83612ce2565b91506143ac8261436b565b602082019050919050565b600060208201905081810360008301526143d081614394565b905091905056fea26469706673582212205c08f9f9d7722c924719c58405905a035a4736be7afe41750ec66b2ab72355cc64736f6c63430008090033
Deployed Bytecode Sourcemap
41525:4428:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28330:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29275:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30835:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30358:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44751:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44857:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42686:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42018:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31585:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44940:137;;;;;;;;;;;;;:::i;:::-;;31995:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44507:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42087:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41864:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42057:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41831:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28969:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42120:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28699:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8913:103;;;;;;;;;;;;;:::i;:::-;;44645:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45403:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8262:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45636:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29444:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42781:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31128:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41902:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45525:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32251:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43839:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41982:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41776:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44339:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31354:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41681:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43036:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9171:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28330:305;28432:4;28484:25;28469:40;;;:11;:40;;;;:105;;;;28541:33;28526:48;;;:11;:48;;;;28469:105;:158;;;;28591:36;28615:11;28591:23;:36::i;:::-;28469:158;28449:178;;28330:305;;;:::o;29275:100::-;29329:13;29362:5;29355:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29275:100;:::o;30835:221::-;30911:7;30939:16;30947:7;30939;:16::i;:::-;30931:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31024:15;:24;31040:7;31024:24;;;;;;;;;;;;;;;;;;;;;31017:31;;30835:221;;;:::o;30358:411::-;30439:13;30455:23;30470:7;30455:14;:23::i;:::-;30439:39;;30503:5;30497:11;;:2;:11;;;;30489:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30597:5;30581:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30606:37;30623:5;30630:12;:10;:12::i;:::-;30606:16;:37::i;:::-;30581:62;30559:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30740:21;30749:2;30753:7;30740:8;:21::i;:::-;30428:341;30358:411;;:::o;44751:100::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44835:10:::1;44823:9;:22;;;;;;;;;;;;:::i;:::-;;44751:100:::0;:::o;44857:77::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44922:6:::1;44913;;:15;;;;;;;;;;;;;;;;;;44857:77:::0;:::o;42686:89::-;42730:7;42753:16;:6;:14;:16::i;:::-;42746:23;;42686:89;:::o;42018:32::-;;;;:::o;31585:339::-;31780:41;31799:12;:10;:12::i;:::-;31813:7;31780:18;:41::i;:::-;31772:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31888:28;31898:4;31904:2;31908:7;31888:9;:28::i;:::-;31585:339;;;:::o;44940:137::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44985:7:::1;45006;:5;:7::i;:::-;44998:21;;45027;44998:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44984:69;;;45068:2;45060:11;;;::::0;::::1;;44977:100;44940:137::o:0;31995:185::-;32133:39;32150:4;32156:2;32160:7;32133:39;;;;;;;;;;;;:16;:39::i;:::-;31995:185;;;:::o;44507:132::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44615:18:::1;44595:17;:38;;;;;;;;;;;;:::i;:::-;;44507:132:::0;:::o;42087:28::-;;;;;;;;;;;;;:::o;41864:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42057:25::-;;;;;;;;;;;;;:::o;41831:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28969:239::-;29041:7;29061:13;29077:7;:16;29085:7;29077:16;;;;;;;;;;;;;;;;;;;;;29061:32;;29129:1;29112:19;;:5;:19;;;;29104:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29195:5;29188:12;;;28969:239;;;:::o;42120:39::-;;;;;;;;;;;;;:::o;28699:208::-;28771:7;28816:1;28799:19;;:5;:19;;;;28791:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28883:9;:16;28893:5;28883:16;;;;;;;;;;;;;;;;28876:23;;28699:208;;;:::o;8913:103::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8978:30:::1;9005:1;8978:18;:30::i;:::-;8913:103::o:0;44645:100::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44729:10:::1;44717:9;:22;;;;;;;;;;;;:::i;:::-;;44645:100:::0;:::o;45403:116::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45496:17:::1;45480:13;:33;;;;45403:116:::0;:::o;8262:87::-;8308:7;8335:6;;;;;;;;;;;8328:13;;8262:87;:::o;45636:314::-;45713:4;45729:12;45771:10;45754:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;45744:39;;;;;;45729:54;;45802:44;45821:12;;45802:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45835:4;;45841;45802:18;:44::i;:::-;45794:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45907:4;45900:11;;;45636:314;;;;:::o;29444:104::-;29500:13;29533:7;29526:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29444:104;:::o;42781:247::-;42846:11;42388:1;42374:11;:15;:47;;;;;42408:13;;42393:11;:28;;42374:47;42366:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;42492:9;;42477:11;42461:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;42453:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42875:6:::1;;;;;;;;;;;42874:7;42866:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;42944:11;42937:4;;:18;;;;:::i;:::-;42924:9;:31;;42916:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;42988:34;42998:10;43010:11;42988:9;:34::i;:::-;42781:247:::0;;:::o;31128:155::-;31223:52;31242:12;:10;:12::i;:::-;31256:8;31266;31223:18;:52::i;:::-;31128:155;;:::o;41902:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45525:105::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45618:6:::1;45595:20;;:29;;;;;;;;;;;;;;;;;;45525:105:::0;:::o;32251:328::-;32426:41;32445:12;:10;:12::i;:::-;32459:7;32426:18;:41::i;:::-;32418:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32532:39;32546:4;32552:2;32556:7;32565:5;32532:13;:39::i;:::-;32251:328;;;;:::o;43839:494::-;43938:13;43979:17;43987:8;43979:7;:17::i;:::-;43963:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;44086:5;44074:17;;:8;;;;;;;;;;;:17;;;44070:64;;;44109:17;44102:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44070:64;44142:28;44173:10;:8;:10::i;:::-;44142:41;;44228:1;44203:14;44197:28;:32;:130;;;;;;;;;;;;;;;;;44265:14;44281:19;:8;:17;:19::i;:::-;44302:9;44248:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44197:130;44190:137;;;43839:494;;;;:::o;41982:31::-;;;;:::o;41776:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;44339:81::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44408:6:::1;44397:8;;:17;;;;;;;;;;;;;;;;;;44339:81:::0;:::o;31354:164::-;31451:4;31475:18;:25;31494:5;31475:25;;;;;;;;;;;;;;;:35;31501:8;31475:35;;;;;;;;;;;;;;;;;;;;;;;;;31468:42;;31354:164;;;;:::o;41681:88::-;;;;:::o;43036:155::-;43122:11;42388:1;42374:11;:15;:47;;;;;42408:13;;42393:11;:28;;42374:47;42366:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;42492:9;;42477:11;42461:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;42453:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8493:12:::1;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43152:33:::2;43162:9;43173:11;43152:9;:33::i;:::-;43036:155:::0;;;:::o;9171:201::-;8493:12;:10;:12::i;:::-;8482:23;;:7;:5;:7::i;:::-;:23;;;8474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9280:1:::1;9260:22;;:8;:22;;;;9252:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9336:28;9355:8;9336:18;:28::i;:::-;9171:201:::0;:::o;21069:157::-;21154:4;21193:25;21178:40;;;:11;:40;;;;21171:47;;21069:157;;;:::o;34089:127::-;34154:4;34206:1;34178:30;;:7;:16;34186:7;34178:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34171:37;;34089:127;;;:::o;6986:98::-;7039:7;7066:10;7059:17;;6986:98;:::o;38235:174::-;38337:2;38310:15;:24;38326:7;38310:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38393:7;38389:2;38355:46;;38364:23;38379:7;38364:14;:23::i;:::-;38355:46;;;;;;;;;;;;38235:174;;:::o;3590:114::-;3655:7;3682;:14;;;3675:21;;3590:114;;;:::o;34383:348::-;34476:4;34501:16;34509:7;34501;:16::i;:::-;34493:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34577:13;34593:23;34608:7;34593:14;:23::i;:::-;34577:39;;34646:5;34635:16;;:7;:16;;;:52;;;;34655:32;34672:5;34679:7;34655:16;:32::i;:::-;34635:52;:87;;;;34715:7;34691:31;;:20;34703:7;34691:11;:20::i;:::-;:31;;;34635:87;34627:96;;;34383:348;;;;:::o;37492:625::-;37651:4;37624:31;;:23;37639:7;37624:14;:23::i;:::-;:31;;;37616:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37730:1;37716:16;;:2;:16;;;;37708:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37786:39;37807:4;37813:2;37817:7;37786:20;:39::i;:::-;37890:29;37907:1;37911:7;37890:8;:29::i;:::-;37951:1;37932:9;:15;37942:4;37932:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37980:1;37963:9;:13;37973:2;37963:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38011:2;37992:7;:16;38000:7;37992:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38050:7;38046:2;38031:27;;38040:4;38031:27;;;;;;;;;;;;38071:38;38091:4;38097:2;38101:7;38071:19;:38::i;:::-;37492:625;;;:::o;9532:191::-;9606:16;9625:6;;;;;;;;;;;9606:25;;9651:8;9642:6;;:17;;;;;;;;;;;;;;;;;;9706:8;9675:40;;9696:8;9675:40;;;;;;;;;;;;9595:128;9532:191;:::o;1253:190::-;1378:4;1431;1402:25;1415:5;1422:4;1402:12;:25::i;:::-;:33;1395:40;;1253:190;;;;;:::o;45083:204::-;45163:9;45158:124;45182:11;45178:1;:15;45158:124;;;45209:18;:6;:16;:18::i;:::-;45236:38;45246:9;45257:16;:6;:14;:16::i;:::-;45236:9;:38::i;:::-;45195:3;;;;;:::i;:::-;;;;45158:124;;;;45083:204;;:::o;38551:315::-;38706:8;38697:17;;:5;:17;;;;38689:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38793:8;38755:18;:25;38774:5;38755:25;;;;;;;;;;;;;;;:35;38781:8;38755:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38839:8;38817:41;;38832:5;38817:41;;;38849:8;38817:41;;;;;;:::i;:::-;;;;;;;;38551:315;;;:::o;33461:::-;33618:28;33628:4;33634:2;33638:7;33618:9;:28::i;:::-;33665:48;33688:4;33694:2;33698:7;33707:5;33665:22;:48::i;:::-;33657:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33461:315;;;;:::o;45293:104::-;45353:13;45382:9;45375:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45293:104;:::o;4548:723::-;4604:13;4834:1;4825:5;:10;4821:53;;;4852:10;;;;;;;;;;;;;;;;;;;;;4821:53;4884:12;4899:5;4884:20;;4915:14;4940:78;4955:1;4947:4;:9;4940:78;;4973:8;;;;;:::i;:::-;;;;5004:2;4996:10;;;;;:::i;:::-;;;4940:78;;;5028:19;5060:6;5050:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5028:39;;5078:154;5094:1;5085:5;:10;5078:154;;5122:1;5112:11;;;;;:::i;:::-;;;5189:2;5181:5;:10;;;;:::i;:::-;5168:2;:24;;;;:::i;:::-;5155:39;;5138:6;5145;5138:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5218:2;5209:11;;;;;:::i;:::-;;;5078:154;;;5256:6;5242:21;;;;;4548:723;;;;:::o;40802:126::-;;;;:::o;41313:125::-;;;;:::o;1804:675::-;1887:7;1907:20;1930:4;1907:27;;1950:9;1945:497;1969:5;:12;1965:1;:16;1945:497;;;2003:20;2026:5;2032:1;2026:8;;;;;;;;:::i;:::-;;;;;;;;2003:31;;2069:12;2053;:28;2049:382;;2196:42;2211:12;2225;2196:14;:42::i;:::-;2181:57;;2049:382;;;2373:42;2388:12;2402;2373:14;:42::i;:::-;2358:57;;2049:382;1988:454;1983:3;;;;;:::i;:::-;;;;1945:497;;;;2459:12;2452:19;;;1804:675;;;;:::o;3712:127::-;3819:1;3801:7;:14;;;:19;;;;;;;;;;;3712:127;:::o;35073:110::-;35149:26;35159:2;35163:7;35149:26;;;;;;;;;;;;:9;:26::i;:::-;35073:110;;:::o;39431:799::-;39586:4;39607:15;:2;:13;;;:15::i;:::-;39603:620;;;39659:2;39643:36;;;39680:12;:10;:12::i;:::-;39694:4;39700:7;39709:5;39643:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39639:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39902:1;39885:6;:13;:18;39881:272;;;39928:60;;;;;;;;;;:::i;:::-;;;;;;;;39881:272;40103:6;40097:13;40088:6;40084:2;40080:15;40073:38;39639:529;39776:41;;;39766:51;;;:6;:51;;;;39759:58;;;;;39603:620;40207:4;40200:11;;39431:799;;;;;;;:::o;2487:224::-;2555:13;2618:1;2612:4;2605:15;2647:1;2641:4;2634:15;2688:4;2682;2672:21;2663:30;;2487:224;;;;:::o;35410:321::-;35540:18;35546:2;35550:7;35540:5;:18::i;:::-;35591:54;35622:1;35626:2;35630:7;35639:5;35591:22;:54::i;:::-;35569:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35410:321;;;:::o;10963:326::-;11023:4;11280:1;11258:7;:19;;;:23;11251:30;;10963:326;;;:::o;36067:439::-;36161:1;36147:16;;:2;:16;;;;36139:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36220:16;36228:7;36220;:16::i;:::-;36219:17;36211:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36282:45;36311:1;36315:2;36319:7;36282:20;:45::i;:::-;36357:1;36340:9;:13;36350:2;36340:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36388:2;36369:7;:16;36377:7;36369:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36433:7;36429:2;36408:33;;36425:1;36408:33;;;;;;;;;;;;36454:44;36482:1;36486:2;36490:7;36454:19;:44::i;:::-;36067:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:116::-;7629:21;7644:5;7629:21;:::i;:::-;7622:5;7619:32;7609:60;;7665:1;7662;7655:12;7609:60;7559:116;:::o;7681:133::-;7724:5;7762:6;7749:20;7740:29;;7778:30;7802:5;7778:30;:::i;:::-;7681:133;;;;:::o;7820:323::-;7876:6;7925:2;7913:9;7904:7;7900:23;7896:32;7893:119;;;7931:79;;:::i;:::-;7893:119;8051:1;8076:50;8118:7;8109:6;8098:9;8094:22;8076:50;:::i;:::-;8066:60;;8022:114;7820:323;;;;:::o;8149:118::-;8236:24;8254:5;8236:24;:::i;:::-;8231:3;8224:37;8149:118;;:::o;8273:222::-;8366:4;8404:2;8393:9;8389:18;8381:26;;8417:71;8485:1;8474:9;8470:17;8461:6;8417:71;:::i;:::-;8273:222;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:329::-;9185:6;9234:2;9222:9;9213:7;9209:23;9205:32;9202:119;;;9240:79;;:::i;:::-;9202:119;9360:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9331:117;9126:329;;;;:::o;9461:117::-;9570:1;9567;9560:12;9584:117;9693:1;9690;9683:12;9724:568;9797:8;9807:6;9857:3;9850:4;9842:6;9838:17;9834:27;9824:122;;9865:79;;:::i;:::-;9824:122;9978:6;9965:20;9955:30;;10008:18;10000:6;9997:30;9994:117;;;10030:79;;:::i;:::-;9994:117;10144:4;10136:6;10132:17;10120:29;;10198:3;10190:4;10182:6;10178:17;10168:8;10164:32;10161:41;10158:128;;;10205:79;;:::i;:::-;10158:128;9724:568;;;;;:::o;10298:559::-;10384:6;10392;10441:2;10429:9;10420:7;10416:23;10412:32;10409:119;;;10447:79;;:::i;:::-;10409:119;10595:1;10584:9;10580:17;10567:31;10625:18;10617:6;10614:30;10611:117;;;10647:79;;:::i;:::-;10611:117;10760:80;10832:7;10823:6;10812:9;10808:22;10760:80;:::i;:::-;10742:98;;;;10538:312;10298:559;;;;;:::o;10863:468::-;10928:6;10936;10985:2;10973:9;10964:7;10960:23;10956:32;10953:119;;;10991:79;;:::i;:::-;10953:119;11111:1;11136:53;11181:7;11172:6;11161:9;11157:22;11136:53;:::i;:::-;11126:63;;11082:117;11238:2;11264:50;11306:7;11297:6;11286:9;11282:22;11264:50;:::i;:::-;11254:60;;11209:115;10863:468;;;;;:::o;11337:307::-;11398:4;11488:18;11480:6;11477:30;11474:56;;;11510:18;;:::i;:::-;11474:56;11548:29;11570:6;11548:29;:::i;:::-;11540:37;;11632:4;11626;11622:15;11614:23;;11337:307;;;:::o;11650:410::-;11727:5;11752:65;11768:48;11809:6;11768:48;:::i;:::-;11752:65;:::i;:::-;11743:74;;11840:6;11833:5;11826:21;11878:4;11871:5;11867:16;11916:3;11907:6;11902:3;11898:16;11895:25;11892:112;;;11923:79;;:::i;:::-;11892:112;12013:41;12047:6;12042:3;12037;12013:41;:::i;:::-;11733:327;11650:410;;;;;:::o;12079:338::-;12134:5;12183:3;12176:4;12168:6;12164:17;12160:27;12150:122;;12191:79;;:::i;:::-;12150:122;12308:6;12295:20;12333:78;12407:3;12399:6;12392:4;12384:6;12380:17;12333:78;:::i;:::-;12324:87;;12140:277;12079:338;;;;:::o;12423:943::-;12518:6;12526;12534;12542;12591:3;12579:9;12570:7;12566:23;12562:33;12559:120;;;12598:79;;:::i;:::-;12559:120;12718:1;12743:53;12788:7;12779:6;12768:9;12764:22;12743:53;:::i;:::-;12733:63;;12689:117;12845:2;12871:53;12916:7;12907:6;12896:9;12892:22;12871:53;:::i;:::-;12861:63;;12816:118;12973:2;12999:53;13044:7;13035:6;13024:9;13020:22;12999:53;:::i;:::-;12989:63;;12944:118;13129:2;13118:9;13114:18;13101:32;13160:18;13152:6;13149:30;13146:117;;;13182:79;;:::i;:::-;13146:117;13287:62;13341:7;13332:6;13321:9;13317:22;13287:62;:::i;:::-;13277:72;;13072:287;12423:943;;;;;;;:::o;13372:474::-;13440:6;13448;13497:2;13485:9;13476:7;13472:23;13468:32;13465:119;;;13503:79;;:::i;:::-;13465:119;13623:1;13648:53;13693:7;13684:6;13673:9;13669:22;13648:53;:::i;:::-;13638:63;;13594:117;13750:2;13776:53;13821:7;13812:6;13801:9;13797:22;13776:53;:::i;:::-;13766:63;;13721:118;13372:474;;;;;:::o;13852:77::-;13889:7;13918:5;13907:16;;13852:77;;;:::o;13935:118::-;14022:24;14040:5;14022:24;:::i;:::-;14017:3;14010:37;13935:118;;:::o;14059:222::-;14152:4;14190:2;14179:9;14175:18;14167:26;;14203:71;14271:1;14260:9;14256:17;14247:6;14203:71;:::i;:::-;14059:222;;;;:::o;14287:474::-;14355:6;14363;14412:2;14400:9;14391:7;14387:23;14383:32;14380:119;;;14418:79;;:::i;:::-;14380:119;14538:1;14563:53;14608:7;14599:6;14588:9;14584:22;14563:53;:::i;:::-;14553:63;;14509:117;14665:2;14691:53;14736:7;14727:6;14716:9;14712:22;14691:53;:::i;:::-;14681:63;;14636:118;14287:474;;;;;:::o;14767:180::-;14815:77;14812:1;14805:88;14912:4;14909:1;14902:15;14936:4;14933:1;14926:15;14953:320;14997:6;15034:1;15028:4;15024:12;15014:22;;15081:1;15075:4;15071:12;15102:18;15092:81;;15158:4;15150:6;15146:17;15136:27;;15092:81;15220:2;15212:6;15209:14;15189:18;15186:38;15183:84;;;15239:18;;:::i;:::-;15183:84;15004:269;14953:320;;;:::o;15279:231::-;15419:34;15415:1;15407:6;15403:14;15396:58;15488:14;15483:2;15475:6;15471:15;15464:39;15279:231;:::o;15516:366::-;15658:3;15679:67;15743:2;15738:3;15679:67;:::i;:::-;15672:74;;15755:93;15844:3;15755:93;:::i;:::-;15873:2;15868:3;15864:12;15857:19;;15516:366;;;:::o;15888:419::-;16054:4;16092:2;16081:9;16077:18;16069:26;;16141:9;16135:4;16131:20;16127:1;16116:9;16112:17;16105:47;16169:131;16295:4;16169:131;:::i;:::-;16161:139;;15888:419;;;:::o;16313:220::-;16453:34;16449:1;16441:6;16437:14;16430:58;16522:3;16517:2;16509:6;16505:15;16498:28;16313:220;:::o;16539:366::-;16681:3;16702:67;16766:2;16761:3;16702:67;:::i;:::-;16695:74;;16778:93;16867:3;16778:93;:::i;:::-;16896:2;16891:3;16887:12;16880:19;;16539:366;;;:::o;16911:419::-;17077:4;17115:2;17104:9;17100:18;17092:26;;17164:9;17158:4;17154:20;17150:1;17139:9;17135:17;17128:47;17192:131;17318:4;17192:131;:::i;:::-;17184:139;;16911:419;;;:::o;17336:243::-;17476:34;17472:1;17464:6;17460:14;17453:58;17545:26;17540:2;17532:6;17528:15;17521:51;17336:243;:::o;17585:366::-;17727:3;17748:67;17812:2;17807:3;17748:67;:::i;:::-;17741:74;;17824:93;17913:3;17824:93;:::i;:::-;17942:2;17937:3;17933:12;17926:19;;17585:366;;;:::o;17957:419::-;18123:4;18161:2;18150:9;18146:18;18138:26;;18210:9;18204:4;18200:20;18196:1;18185:9;18181:17;18174:47;18238:131;18364:4;18238:131;:::i;:::-;18230:139;;17957:419;;;:::o;18382:182::-;18522:34;18518:1;18510:6;18506:14;18499:58;18382:182;:::o;18570:366::-;18712:3;18733:67;18797:2;18792:3;18733:67;:::i;:::-;18726:74;;18809:93;18898:3;18809:93;:::i;:::-;18927:2;18922:3;18918:12;18911:19;;18570:366;;;:::o;18942:419::-;19108:4;19146:2;19135:9;19131:18;19123:26;;19195:9;19189:4;19185:20;19181:1;19170:9;19166:17;19159:47;19223:131;19349:4;19223:131;:::i;:::-;19215:139;;18942:419;;;:::o;19367:236::-;19507:34;19503:1;19495:6;19491:14;19484:58;19576:19;19571:2;19563:6;19559:15;19552:44;19367:236;:::o;19609:366::-;19751:3;19772:67;19836:2;19831:3;19772:67;:::i;:::-;19765:74;;19848:93;19937:3;19848:93;:::i;:::-;19966:2;19961:3;19957:12;19950:19;;19609:366;;;:::o;19981:419::-;20147:4;20185:2;20174:9;20170:18;20162:26;;20234:9;20228:4;20224:20;20220:1;20209:9;20205:17;20198:47;20262:131;20388:4;20262:131;:::i;:::-;20254:139;;19981:419;;;:::o;20406:147::-;20507:11;20544:3;20529:18;;20406:147;;;;:::o;20559:114::-;;:::o;20679:398::-;20838:3;20859:83;20940:1;20935:3;20859:83;:::i;:::-;20852:90;;20951:93;21040:3;20951:93;:::i;:::-;21069:1;21064:3;21060:11;21053:18;;20679:398;;;:::o;21083:379::-;21267:3;21289:147;21432:3;21289:147;:::i;:::-;21282:154;;21453:3;21446:10;;21083:379;;;:::o;21468:228::-;21608:34;21604:1;21596:6;21592:14;21585:58;21677:11;21672:2;21664:6;21660:15;21653:36;21468:228;:::o;21702:366::-;21844:3;21865:67;21929:2;21924:3;21865:67;:::i;:::-;21858:74;;21941:93;22030:3;21941:93;:::i;:::-;22059:2;22054:3;22050:12;22043:19;;21702:366;;;:::o;22074:419::-;22240:4;22278:2;22267:9;22263:18;22255:26;;22327:9;22321:4;22317:20;22313:1;22302:9;22298:17;22291:47;22355:131;22481:4;22355:131;:::i;:::-;22347:139;;22074:419;;;:::o;22499:229::-;22639:34;22635:1;22627:6;22623:14;22616:58;22708:12;22703:2;22695:6;22691:15;22684:37;22499:229;:::o;22734:366::-;22876:3;22897:67;22961:2;22956:3;22897:67;:::i;:::-;22890:74;;22973:93;23062:3;22973:93;:::i;:::-;23091:2;23086:3;23082:12;23075:19;;22734:366;;;:::o;23106:419::-;23272:4;23310:2;23299:9;23295:18;23287:26;;23359:9;23353:4;23349:20;23345:1;23334:9;23330:17;23323:47;23387:131;23513:4;23387:131;:::i;:::-;23379:139;;23106:419;;;:::o;23531:94::-;23564:8;23612:5;23608:2;23604:14;23583:35;;23531:94;;;:::o;23631:::-;23670:7;23699:20;23713:5;23699:20;:::i;:::-;23688:31;;23631:94;;;:::o;23731:100::-;23770:7;23799:26;23819:5;23799:26;:::i;:::-;23788:37;;23731:100;;;:::o;23837:157::-;23942:45;23962:24;23980:5;23962:24;:::i;:::-;23942:45;:::i;:::-;23937:3;23930:58;23837:157;;:::o;24000:256::-;24112:3;24127:75;24198:3;24189:6;24127:75;:::i;:::-;24227:2;24222:3;24218:12;24211:19;;24247:3;24240:10;;24000:256;;;;:::o;24262:225::-;24402:34;24398:1;24390:6;24386:14;24379:58;24471:8;24466:2;24458:6;24454:15;24447:33;24262:225;:::o;24493:366::-;24635:3;24656:67;24720:2;24715:3;24656:67;:::i;:::-;24649:74;;24732:93;24821:3;24732:93;:::i;:::-;24850:2;24845:3;24841:12;24834:19;;24493:366;;;:::o;24865:419::-;25031:4;25069:2;25058:9;25054:18;25046:26;;25118:9;25112:4;25108:20;25104:1;25093:9;25089:17;25082:47;25146:131;25272:4;25146:131;:::i;:::-;25138:139;;24865:419;;;:::o;25290:170::-;25430:22;25426:1;25418:6;25414:14;25407:46;25290:170;:::o;25466:366::-;25608:3;25629:67;25693:2;25688:3;25629:67;:::i;:::-;25622:74;;25705:93;25794:3;25705:93;:::i;:::-;25823:2;25818:3;25814:12;25807:19;;25466:366;;;:::o;25838:419::-;26004:4;26042:2;26031:9;26027:18;26019:26;;26091:9;26085:4;26081:20;26077:1;26066:9;26062:17;26055:47;26119:131;26245:4;26119:131;:::i;:::-;26111:139;;25838:419;;;:::o;26263:180::-;26311:77;26308:1;26301:88;26408:4;26405:1;26398:15;26432:4;26429:1;26422:15;26449:305;26489:3;26508:20;26526:1;26508:20;:::i;:::-;26503:25;;26542:20;26560:1;26542:20;:::i;:::-;26537:25;;26696:1;26628:66;26624:74;26621:1;26618:81;26615:107;;;26702:18;;:::i;:::-;26615:107;26746:1;26743;26739:9;26732:16;;26449:305;;;;:::o;26760:170::-;26900:22;26896:1;26888:6;26884:14;26877:46;26760:170;:::o;26936:366::-;27078:3;27099:67;27163:2;27158:3;27099:67;:::i;:::-;27092:74;;27175:93;27264:3;27175:93;:::i;:::-;27293:2;27288:3;27284:12;27277:19;;26936:366;;;:::o;27308:419::-;27474:4;27512:2;27501:9;27497:18;27489:26;;27561:9;27555:4;27551:20;27547:1;27536:9;27532:17;27525:47;27589:131;27715:4;27589:131;:::i;:::-;27581:139;;27308:419;;;:::o;27733:173::-;27873:25;27869:1;27861:6;27857:14;27850:49;27733:173;:::o;27912:366::-;28054:3;28075:67;28139:2;28134:3;28075:67;:::i;:::-;28068:74;;28151:93;28240:3;28151:93;:::i;:::-;28269:2;28264:3;28260:12;28253:19;;27912:366;;;:::o;28284:419::-;28450:4;28488:2;28477:9;28473:18;28465:26;;28537:9;28531:4;28527:20;28523:1;28512:9;28508:17;28501:47;28565:131;28691:4;28565:131;:::i;:::-;28557:139;;28284:419;;;:::o;28709:348::-;28749:7;28772:20;28790:1;28772:20;:::i;:::-;28767:25;;28806:20;28824:1;28806:20;:::i;:::-;28801:25;;28994:1;28926:66;28922:74;28919:1;28916:81;28911:1;28904:9;28897:17;28893:105;28890:131;;;29001:18;;:::i;:::-;28890:131;29049:1;29046;29042:9;29031:20;;28709:348;;;;:::o;29063:169::-;29203:21;29199:1;29191:6;29187:14;29180:45;29063:169;:::o;29238:366::-;29380:3;29401:67;29465:2;29460:3;29401:67;:::i;:::-;29394:74;;29477:93;29566:3;29477:93;:::i;:::-;29595:2;29590:3;29586:12;29579:19;;29238:366;;;:::o;29610:419::-;29776:4;29814:2;29803:9;29799:18;29791:26;;29863:9;29857:4;29853:20;29849:1;29838:9;29834:17;29827:47;29891:131;30017:4;29891:131;:::i;:::-;29883:139;;29610:419;;;:::o;30035:234::-;30175:34;30171:1;30163:6;30159:14;30152:58;30244:17;30239:2;30231:6;30227:15;30220:42;30035:234;:::o;30275:366::-;30417:3;30438:67;30502:2;30497:3;30438:67;:::i;:::-;30431:74;;30514:93;30603:3;30514:93;:::i;:::-;30632:2;30627:3;30623:12;30616:19;;30275:366;;;:::o;30647:419::-;30813:4;30851:2;30840:9;30836:18;30828:26;;30900:9;30894:4;30890:20;30886:1;30875:9;30871:17;30864:47;30928:131;31054:4;30928:131;:::i;:::-;30920:139;;30647:419;;;:::o;31072:148::-;31174:11;31211:3;31196:18;;31072:148;;;;:::o;31226:377::-;31332:3;31360:39;31393:5;31360:39;:::i;:::-;31415:89;31497:6;31492:3;31415:89;:::i;:::-;31408:96;;31513:52;31558:6;31553:3;31546:4;31539:5;31535:16;31513:52;:::i;:::-;31590:6;31585:3;31581:16;31574:23;;31336:267;31226:377;;;;:::o;31609:141::-;31658:4;31681:3;31673:11;;31704:3;31701:1;31694:14;31738:4;31735:1;31725:18;31717:26;;31609:141;;;:::o;31780:845::-;31883:3;31920:5;31914:12;31949:36;31975:9;31949:36;:::i;:::-;32001:89;32083:6;32078:3;32001:89;:::i;:::-;31994:96;;32121:1;32110:9;32106:17;32137:1;32132:137;;;;32283:1;32278:341;;;;32099:520;;32132:137;32216:4;32212:9;32201;32197:25;32192:3;32185:38;32252:6;32247:3;32243:16;32236:23;;32132:137;;32278:341;32345:38;32377:5;32345:38;:::i;:::-;32405:1;32419:154;32433:6;32430:1;32427:13;32419:154;;;32507:7;32501:14;32497:1;32492:3;32488:11;32481:35;32557:1;32548:7;32544:15;32533:26;;32455:4;32452:1;32448:12;32443:17;;32419:154;;;32602:6;32597:3;32593:16;32586:23;;32285:334;;32099:520;;31887:738;;31780:845;;;;:::o;32631:589::-;32856:3;32878:95;32969:3;32960:6;32878:95;:::i;:::-;32871:102;;32990:95;33081:3;33072:6;32990:95;:::i;:::-;32983:102;;33102:92;33190:3;33181:6;33102:92;:::i;:::-;33095:99;;33211:3;33204:10;;32631:589;;;;;;:::o;33226:225::-;33366:34;33362:1;33354:6;33350:14;33343:58;33435:8;33430:2;33422:6;33418:15;33411:33;33226:225;:::o;33457:366::-;33599:3;33620:67;33684:2;33679:3;33620:67;:::i;:::-;33613:74;;33696:93;33785:3;33696:93;:::i;:::-;33814:2;33809:3;33805:12;33798:19;;33457:366;;;:::o;33829:419::-;33995:4;34033:2;34022:9;34018:18;34010:26;;34082:9;34076:4;34072:20;34068:1;34057:9;34053:17;34046:47;34110:131;34236:4;34110:131;:::i;:::-;34102:139;;33829:419;;;:::o;34254:231::-;34394:34;34390:1;34382:6;34378:14;34371:58;34463:14;34458:2;34450:6;34446:15;34439:39;34254:231;:::o;34491:366::-;34633:3;34654:67;34718:2;34713:3;34654:67;:::i;:::-;34647:74;;34730:93;34819:3;34730:93;:::i;:::-;34848:2;34843:3;34839:12;34832:19;;34491:366;;;:::o;34863:419::-;35029:4;35067:2;35056:9;35052:18;35044:26;;35116:9;35110:4;35106:20;35102:1;35091:9;35087:17;35080:47;35144:131;35270:4;35144:131;:::i;:::-;35136:139;;34863:419;;;:::o;35288:224::-;35428:34;35424:1;35416:6;35412:14;35405:58;35497:7;35492:2;35484:6;35480:15;35473:32;35288:224;:::o;35518:366::-;35660:3;35681:67;35745:2;35740:3;35681:67;:::i;:::-;35674:74;;35757:93;35846:3;35757:93;:::i;:::-;35875:2;35870:3;35866:12;35859:19;;35518:366;;;:::o;35890:419::-;36056:4;36094:2;36083:9;36079:18;36071:26;;36143:9;36137:4;36133:20;36129:1;36118:9;36114:17;36107:47;36171:131;36297:4;36171:131;:::i;:::-;36163:139;;35890:419;;;:::o;36315:223::-;36455:34;36451:1;36443:6;36439:14;36432:58;36524:6;36519:2;36511:6;36507:15;36500:31;36315:223;:::o;36544:366::-;36686:3;36707:67;36771:2;36766:3;36707:67;:::i;:::-;36700:74;;36783:93;36872:3;36783:93;:::i;:::-;36901:2;36896:3;36892:12;36885:19;;36544:366;;;:::o;36916:419::-;37082:4;37120:2;37109:9;37105:18;37097:26;;37169:9;37163:4;37159:20;37155:1;37144:9;37140:17;37133:47;37197:131;37323:4;37197:131;:::i;:::-;37189:139;;36916:419;;;:::o;37341:191::-;37381:4;37401:20;37419:1;37401:20;:::i;:::-;37396:25;;37435:20;37453:1;37435:20;:::i;:::-;37430:25;;37474:1;37471;37468:8;37465:34;;;37479:18;;:::i;:::-;37465:34;37524:1;37521;37517:9;37509:17;;37341:191;;;;:::o;37538:233::-;37577:3;37600:24;37618:5;37600:24;:::i;:::-;37591:33;;37646:66;37639:5;37636:77;37633:103;;;37716:18;;:::i;:::-;37633:103;37763:1;37756:5;37752:13;37745:20;;37538:233;;;:::o;37777:175::-;37917:27;37913:1;37905:6;37901:14;37894:51;37777:175;:::o;37958:366::-;38100:3;38121:67;38185:2;38180:3;38121:67;:::i;:::-;38114:74;;38197:93;38286:3;38197:93;:::i;:::-;38315:2;38310:3;38306:12;38299:19;;37958:366;;;:::o;38330:419::-;38496:4;38534:2;38523:9;38519:18;38511:26;;38583:9;38577:4;38573:20;38569:1;38558:9;38554:17;38547:47;38611:131;38737:4;38611:131;:::i;:::-;38603:139;;38330:419;;;:::o;38755:237::-;38895:34;38891:1;38883:6;38879:14;38872:58;38964:20;38959:2;38951:6;38947:15;38940:45;38755:237;:::o;38998:366::-;39140:3;39161:67;39225:2;39220:3;39161:67;:::i;:::-;39154:74;;39237:93;39326:3;39237:93;:::i;:::-;39355:2;39350:3;39346:12;39339:19;;38998:366;;;:::o;39370:419::-;39536:4;39574:2;39563:9;39559:18;39551:26;;39623:9;39617:4;39613:20;39609:1;39598:9;39594:17;39587:47;39651:131;39777:4;39651:131;:::i;:::-;39643:139;;39370:419;;;:::o;39795:180::-;39843:77;39840:1;39833:88;39940:4;39937:1;39930:15;39964:4;39961:1;39954:15;39981:185;40021:1;40038:20;40056:1;40038:20;:::i;:::-;40033:25;;40072:20;40090:1;40072:20;:::i;:::-;40067:25;;40111:1;40101:35;;40116:18;;:::i;:::-;40101:35;40158:1;40155;40151:9;40146:14;;39981:185;;;;:::o;40172:176::-;40204:1;40221:20;40239:1;40221:20;:::i;:::-;40216:25;;40255:20;40273:1;40255:20;:::i;:::-;40250:25;;40294:1;40284:35;;40299:18;;:::i;:::-;40284:35;40340:1;40337;40333:9;40328:14;;40172:176;;;;:::o;40354:180::-;40402:77;40399:1;40392:88;40499:4;40496:1;40489:15;40523:4;40520:1;40513:15;40540:98;40591:6;40625:5;40619:12;40609:22;;40540:98;;;:::o;40644:168::-;40727:11;40761:6;40756:3;40749:19;40801:4;40796:3;40792:14;40777:29;;40644:168;;;;:::o;40818:360::-;40904:3;40932:38;40964:5;40932:38;:::i;:::-;40986:70;41049:6;41044:3;40986:70;:::i;:::-;40979:77;;41065:52;41110:6;41105:3;41098:4;41091:5;41087:16;41065:52;:::i;:::-;41142:29;41164:6;41142:29;:::i;:::-;41137:3;41133:39;41126:46;;40908:270;40818:360;;;;:::o;41184:640::-;41379:4;41417:3;41406:9;41402:19;41394:27;;41431:71;41499:1;41488:9;41484:17;41475:6;41431:71;:::i;:::-;41512:72;41580:2;41569:9;41565:18;41556:6;41512:72;:::i;:::-;41594;41662:2;41651:9;41647:18;41638:6;41594:72;:::i;:::-;41713:9;41707:4;41703:20;41698:2;41687:9;41683:18;41676:48;41741:76;41812:4;41803:6;41741:76;:::i;:::-;41733:84;;41184:640;;;;;;;:::o;41830:141::-;41886:5;41917:6;41911:13;41902:22;;41933:32;41959:5;41933:32;:::i;:::-;41830:141;;;;:::o;41977:349::-;42046:6;42095:2;42083:9;42074:7;42070:23;42066:32;42063:119;;;42101:79;;:::i;:::-;42063:119;42221:1;42246:63;42301:7;42292:6;42281:9;42277:22;42246:63;:::i;:::-;42236:73;;42192:127;41977:349;;;;:::o;42332:182::-;42472:34;42468:1;42460:6;42456:14;42449:58;42332:182;:::o;42520:366::-;42662:3;42683:67;42747:2;42742:3;42683:67;:::i;:::-;42676:74;;42759:93;42848:3;42759:93;:::i;:::-;42877:2;42872:3;42868:12;42861:19;;42520:366;;;:::o;42892:419::-;43058:4;43096:2;43085:9;43081:18;43073:26;;43145:9;43139:4;43135:20;43131:1;43120:9;43116:17;43109:47;43173:131;43299:4;43173:131;:::i;:::-;43165:139;;42892:419;;;:::o;43317:178::-;43457:30;43453:1;43445:6;43441:14;43434:54;43317:178;:::o;43501:366::-;43643:3;43664:67;43728:2;43723:3;43664:67;:::i;:::-;43657:74;;43740:93;43829:3;43740:93;:::i;:::-;43858:2;43853:3;43849:12;43842:19;;43501:366;;;:::o;43873:419::-;44039:4;44077:2;44066:9;44062:18;44054:26;;44126:9;44120:4;44116:20;44112:1;44101:9;44097:17;44090:47;44154:131;44280:4;44154:131;:::i;:::-;44146:139;;43873:419;;;:::o
Swarm Source
ipfs://5c08f9f9d7722c924719c58405905a035a4736be7afe41750ec66b2ab72355cc
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.