ERC-721
Overview
Max Total Supply
2,272 EKTAPORTAL
Holders
398
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 EKTAPORTALLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EktaPortalNft
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-27 */ //SPDX-License-Identifier: UNLICENSED // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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: contracts/common/Whitelist.sol pragma solidity ^0.8.9; contract Whitelist is Ownable { mapping(address => bool) public whitelistedAddress; function isWhitelisted(address _address) public view returns (bool) { return _address == owner() || whitelistedAddress[_address]; } function whitelistAddresses(address[] calldata _addresses) public onlyOwner { for (uint256 i = 0; i < _addresses.length; i++) { whitelistedAddress[_addresses[i]] = true; } } function unwhitelistAddresses(address[] calldata _addresses) public onlyOwner { for (uint256 i = 0; i < _addresses.length; i++) { whitelistedAddress[_addresses[i]] = false; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // 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 v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/common/ERC721Basic.sol pragma solidity ^0.8.9; contract ERC721Basic is ERC721, Ownable { using Counters for Counters.Counter; using SafeMath for uint256; using Strings for uint256; Counters.Counter internal _tokenIdCounter; Counters.Counter internal _tokenSupplyCounter; string internal baseURI; string public baseExtension = ".json"; uint256 public maxSupply; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, uint256 _maxSupply ) ERC721(_name, _symbol) { setBaseURI(_initBaseURI); maxSupply = _maxSupply; } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _batchMint(uint256 _qty, address _receiver) internal { for (uint256 i = 0; i < _qty; i++) { _incrementCounters(); uint256 _tokenId = _tokenIdCounter.current(); _safeMint(_receiver, _tokenId); } } function _incrementCounters() internal { _tokenIdCounter.increment(); _tokenSupplyCounter.increment(); } function _currentTokenId() internal view returns (uint256) { return _tokenIdCounter.current(); } function totalSupply() external view returns (uint256) { return _tokenSupplyCounter.current(); } function _tokenURI(uint256 tokenId) public view returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function burn(uint256 tokenId) public { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved" ); _tokenSupplyCounter.decrement(); _burn(tokenId); } } // File: contracts/projects/Ekta/EktaNft.sol pragma solidity 0.8.9; contract EktaNFT is ERC721Basic { using SafeMath for uint256; struct QtyRecipient { uint256 qty; address[] recipients; } constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _baseUriExtension, uint256 _maxSupply ) ERC721Basic(_name, _symbol, _initBaseURI, _maxSupply) { baseExtension = _baseUriExtension; } // function mintAndTransferBatch( // uint256[] memory _qtys, // address[] memory _receivers // ) public onlyOwner { // require( // _qtys.length == _receivers.length, // "The param length should be the same" // ); // uint256 totalQtys = 0; // for (uint256 i = 0; i < _qtys.length; i++) { // totalQtys += _qtys[i]; // } // require( // totalQtys.add(_tokenIdCounter.current()) <= maxSupply, // "Exceeds max supply" // ); // for (uint256 i = 0; i < _receivers.length; i++) { // _batchMint(_qtys[i], _receivers[i]); // } // } // function mintAndTransfer( // uint256 _qtyPerAddress, // address[] memory _receivers // ) public onlyOwner { // require( // _qtyPerAddress.mul(_receivers.length).add( // _tokenIdCounter.current() // ) <= maxSupply, // "Exceeds max supply" // ); // for (uint256 i = 0; i < _receivers.length; i++) { // _batchMint(_qtyPerAddress, _receivers[i]); // } // } function mintAndTransfer(QtyRecipient[] memory _qtyRecipients) external onlyOwner { uint256 totalQtys = 0; for (uint256 i = 0; i < _qtyRecipients.length; i++) { totalQtys += _qtyRecipients[i].qty * _qtyRecipients[i].recipients.length; } require( totalQtys.add(_currentTokenId()) <= maxSupply, "Exceeds max supply" ); for (uint256 i = 0; i < _qtyRecipients.length; i++) { for (uint256 j = 0; j < _qtyRecipients[i].recipients.length; j++) { _batchMint( _qtyRecipients[i].qty, _qtyRecipients[i].recipients[j] ); } } } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return _tokenURI(tokenId); } } // File: contracts/common/ERC721BasicWithEnumerable.sol pragma solidity ^0.8.9; contract ERC721BasicWithEnumerable is ERC721Enumerable, Ownable { using Counters for Counters.Counter; using SafeMath for uint256; using Strings for uint256; Counters.Counter internal _tokenIdCounter; string internal baseURI; string public baseExtension = ".json"; uint256 public maxSupply; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, uint256 _maxSupply ) ERC721(_name, _symbol) { setBaseURI(_initBaseURI); maxSupply = _maxSupply; } /// @notice Internal function that returns baseUri of the Nft function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /// @notice Internal function to execute minting in batch /// @dev use this function as the base of minting operation function _batchMint(uint256 _qty, address _receiver) internal { for (uint256 i = 0; i < _qty; i++) { _tokenIdCounter.increment(); uint256 _tokenId = _tokenIdCounter.current(); _safeMint(_receiver, _tokenId); } } /// @notice Internal function that returns the current tokenId count /// @dev use this to mint the next token Id /// we are not using maxSupply as the next token to mint because it risks of /// trying to mint tokenId that already existed when there's a burn executed before function _currentTokenId() internal view returns (uint256) { return _tokenIdCounter.current(); } /// @notice Internal function that returns the token URI of a given tokenId function _tokenURI(uint256 tokenId) internal view returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } /// @notice Changes the base URI of the NFTs by owner function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } /// @notice Changes the base extension of the NFTs by owner function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } /// @notice Burns a specified tokenId function burn(uint256 tokenId) public { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved" ); _burn(tokenId); } } // File: contracts/projects/Ekta/EktaPortalNft.sol pragma solidity 0.8.9; /// @title EktaPortalNft /// @notice NFT contract with custom minting logic /// (claim fre NFT, whitelist, pause and reveal mechanism) contract EktaPortalNft is ERC721BasicWithEnumerable, Whitelist, ReentrancyGuard { event Reveal(string baseURI); event MintingPaused(bool); mapping(address => uint256) private addressMintCount; mapping(address => uint256) private addressClaimCount; mapping(uint256 => bool) private freeAccessGranterUsed; uint256 private reservedFreeAccessMints = 969; address public freeAccessGranter; uint256 public maxMintPerAddress; uint256 public price; bool public isMintingPaused = true; uint256 public publicMintingStartTimestamp; bool public isRevealed; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _baseUriExtension, uint256 _maxSupply, uint256 _maxMintPerAddress, uint256 _price, uint256 _publicMintingStartTimestamp, address _freeAccessGranter ) ERC721BasicWithEnumerable(_name, _symbol, _initBaseURI, _maxSupply) { baseExtension = _baseUriExtension; maxMintPerAddress = _maxMintPerAddress; price = _price; publicMintingStartTimestamp = _publicMintingStartTimestamp; freeAccessGranter = _freeAccessGranter; } /// @notice internal function returning list of tokenIds of granter NFT /// that can be used for claiming free NFT /// @return tokenIdList List of token ids available for claim function _getGranterTokenIds(address _addr) internal view returns (uint256[] memory) { EktaNFT granterNft = EktaNFT(freeAccessGranter); uint256 userGrantNftBalance = granterNft.balanceOf(_addr); uint256[] memory availableTokenIds = new uint256[](userGrantNftBalance); if (userGrantNftBalance == 0) { return availableTokenIds; } uint256 balanceCounter = 0; for (uint256 i = 1; i <= granterNft.totalSupply(); i++) { if (freeAccessGranterUsed[i]) { continue; } if (granterNft.ownerOf(i) != _addr) { continue; } availableTokenIds[balanceCounter] = i; balanceCounter++; if (balanceCounter == userGrantNftBalance) { break; } } // returning cleaned array if some tokens has already used for claiming if (availableTokenIds.length != balanceCounter) { uint256[] memory cleanedTokenIds = new uint256[](balanceCounter); for (uint256 i = 0; i < balanceCounter; i++) { cleanedTokenIds[i] = availableTokenIds[i]; } return cleanedTokenIds; } return availableTokenIds; } /// @notice Change minting price by owner function setPrice(uint256 _newPrice) external onlyOwner { price = _newPrice; } /// @notice Change the starting timestamp of the public minting period by owner function setPublicMintingStartTimestamp( uint256 _newPublicMintingStartTimestamp ) external onlyOwner { publicMintingStartTimestamp = _newPublicMintingStartTimestamp; } /// @notice Pause / unpause minting by owner function setIsMintingPaused(bool _isMintingPaused) external onlyOwner { isMintingPaused = _isMintingPaused; emit MintingPaused(_isMintingPaused); } /// @notice Reveal the NFTs by supplying a new base URI by owner /// can only be called once /// @dev Emits Reveal(string[]) function reveal(string memory _revealedBaseURI) external onlyOwner { require(!isRevealed, "It is already revealed"); isRevealed = true; setBaseURI(_revealedBaseURI); emit Reveal(_revealedBaseURI); } /// @notice Withdraws contract balance by owner to owner's wallet function withdraw(uint256 amount) external onlyOwner nonReentrant { require(amount <= address(this).balance, "Amount exceeds balance"); (bool sent, ) = payable(owner()).call{value: amount}(""); require(sent, "Failed to send Bnb"); } /// @notice Returns count of NFTs an address has minted by owner function getAddressMintCount(address _addr) external view onlyOwner returns (uint256) { return addressMintCount[_addr]; } /// @notice Returns count of NFTs an address has claimed by owner function getAddressClaimCount(address _addr) external view onlyOwner returns (uint256) { return addressClaimCount[_addr]; } /// @notice Returns list of granter tokenIds that address can use for claiming by owner /// this method is used for the owner to help check whether an address has free claims or not /// @param _addr Address of a wallet to check function getGranterTokenIds(address _addr) external view onlyOwner returns (uint256[] memory) { return _getGranterTokenIds(_addr); } /// @notice Returns token URI for a given tokenId /// @dev If the NFT is not revealed yet, return a static string /// if the NFT is revealed, return `baseUri + tokenId + extension` function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!isRevealed) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return _baseURI(); } return _tokenURI(tokenId); } /// @notice Returns a status whether a tokenId of a granter NFT /// is already used for claiming function isGranterTokenIdUsed(uint256 _tokenId) external view returns (bool) { return freeAccessGranterUsed[_tokenId]; } /// @notice Claims and mints NFT in batch /// @param _mintQty number of (payable) Nfts to mint /// @param _granterTokenIds list of granter tokenIds used to claim function batchMint(uint256 _mintQty, uint256[] calldata _granterTokenIds) external payable nonReentrant { require(!isMintingPaused, "Minting is paused"); require( _mintQty != 0 || _granterTokenIds.length != 0, "Quantity can not be 0" ); bool isPublicMintingPeriod = publicMintingStartTimestamp <= block.timestamp; uint256 totalMint = _mintQty + _granterTokenIds.length; // reserving seat for owner of freeAccessGranterNft except when the owner decide to mint them if (msg.sender == owner()) { require(isPublicMintingPeriod, "Owner mint on public sale"); require( _currentTokenId() + totalMint <= maxSupply, "Exceeds max supply" ); } else { require( _currentTokenId() + _mintQty <= maxSupply - reservedFreeAccessMints, "Exceeds max supply" ); } if (_granterTokenIds.length > 0) { reservedFreeAccessMints -= _granterTokenIds.length; addressClaimCount[msg.sender] += _granterTokenIds.length; EktaNFT granterNft = EktaNFT(freeAccessGranter); for (uint256 i; i < _granterTokenIds.length; i++) { require( !freeAccessGranterUsed[_granterTokenIds[i]], "Token ID has been used" ); require( granterNft.ownerOf(_granterTokenIds[i]) == msg.sender, "You don't own this granter NFT" ); freeAccessGranterUsed[_granterTokenIds[i]] = true; } } if (msg.sender != owner()) { require( isPublicMintingPeriod || isWhitelisted(msg.sender) || addressClaimCount[msg.sender] > 0, "You are not whitelisted" ); require( _mintQty + addressMintCount[msg.sender] <= maxMintPerAddress, "Too many minted" ); require(msg.value == price * _mintQty, "incorrect price"); } addressMintCount[msg.sender] += _mintQty; _batchMint(totalMint, msg.sender); } /// @notice Returns list of granter tokenIds that the sender can use for claiming by caller /// this method is used for the owner to help check whether an address has free claims or not function getMyGranterTokenIds() external view returns (uint256[] memory) { return _getGranterTokenIds(msg.sender); } /// @notice Transfers multiple tokenIds at once /// @param _tokenIds List of tokenIds to transfers /// @param _recipient The recipient of the transfer function batchTransfer(uint256[] calldata _tokenIds, address _recipient) public { for (uint256 i = 0; i < _tokenIds.length; i++) { transferFrom(msg.sender, _recipient, _tokenIds[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_baseUriExtension","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_publicMintingStartTimestamp","type":"uint256"},{"internalType":"address","name":"_freeAccessGranter","type":"address"}],"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":false,"internalType":"bool","name":"","type":"bool"}],"name":"MintingPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"Reveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintQty","type":"uint256"},{"internalType":"uint256[]","name":"_granterTokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeAccessGranter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getAddressClaimCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getAddressMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getGranterTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMyGranterTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isGranterTokenIdUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintingStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_revealedBaseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isMintingPaused","type":"bool"}],"name":"setIsMintingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPublicMintingStartTimestamp","type":"uint256"}],"name":"setPublicMintingStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"unwhitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"whitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005192919062000345565b506103c96014556001601860006101000a81548160ff0219169083151502179055503480156200008057600080fd5b5060405162006863380380620068638339818101604052810190620000a6919062000632565b8888888783838160009080519060200190620000c492919062000345565b508060019080519060200190620000dd92919062000345565b50505062000100620000f4620001a260201b60201c565b620001aa60201b60201c565b62000111826200027060201b60201c565b80600e8190555050505050600160108190555085600d90805190602001906200013c92919062000345565b5083601681905550826017819055508160198190555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505062000875565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000280620001a260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002a66200031b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f690620007ee565b60405180910390fd5b80600c90805190602001906200031792919062000345565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000353906200083f565b90600052602060002090601f016020900481019282620003775760008555620003c3565b82601f106200039257805160ff1916838001178555620003c3565b82800160010185558215620003c3579182015b82811115620003c2578251825591602001919060010190620003a5565b5b509050620003d29190620003d6565b5090565b5b80821115620003f1576000816000905550600101620003d7565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200045e8262000413565b810181811067ffffffffffffffff8211171562000480576200047f62000424565b5b80604052505050565b600062000495620003f5565b9050620004a3828262000453565b919050565b600067ffffffffffffffff821115620004c657620004c562000424565b5b620004d18262000413565b9050602081019050919050565b60005b83811015620004fe578082015181840152602081019050620004e1565b838111156200050e576000848401525b50505050565b60006200052b6200052584620004a8565b62000489565b9050828152602081018484840111156200054a57620005496200040e565b5b62000557848285620004de565b509392505050565b600082601f83011262000577576200057662000409565b5b81516200058984826020860162000514565b91505092915050565b6000819050919050565b620005a78162000592565b8114620005b357600080fd5b50565b600081519050620005c7816200059c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005fa82620005cd565b9050919050565b6200060c81620005ed565b81146200061857600080fd5b50565b6000815190506200062c8162000601565b92915050565b60008060008060008060008060006101208a8c031215620006585762000657620003ff565b5b60008a015167ffffffffffffffff81111562000679576200067862000404565b5b620006878c828d016200055f565b99505060208a015167ffffffffffffffff811115620006ab57620006aa62000404565b5b620006b98c828d016200055f565b98505060408a015167ffffffffffffffff811115620006dd57620006dc62000404565b5b620006eb8c828d016200055f565b97505060608a015167ffffffffffffffff8111156200070f576200070e62000404565b5b6200071d8c828d016200055f565b9650506080620007308c828d01620005b6565b95505060a0620007438c828d01620005b6565b94505060c0620007568c828d01620005b6565b93505060e0620007698c828d01620005b6565b9250506101006200077d8c828d016200061b565b9150509295985092959850929598565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007d66020836200078d565b9150620007e3826200079e565b602082019050919050565b600060208201905081810360008301526200080981620007c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200085857607f821691505b602082108114156200086f576200086e62000810565b5b50919050565b615fde80620008856000396000f3fe60806040526004361061027d5760003560e01c80636352211e1161014f578063bee35c81116100c1578063ce40ad861161007a578063ce40ad86146109e5578063d2454f3414610a0e578063d5abeb0114610a39578063da3ef23f14610a64578063e985e9c514610a8d578063f2fde38b14610aca5761027d565b8063bee35c81146108af578063c2b16d00146108da578063c30796ab14610917578063c566fa2714610954578063c66828621461097d578063c87b56dd146109a85761027d565b806391b7f5ed1161011357806391b7f5ed146107c257806395d89b41146107eb578063a035b1fe14610816578063a1a5dd9d14610841578063a22cb4651461085d578063b88d4fde146108865761027d565b80636352211e146106dd57806370a082311461071a578063715018a61461075757806388a2653c1461076e5780638da5cb5b146107975761027d565b80632e1a7d4d116101f35780634c261247116101ac5780634c261247146105cf5780634f6ccce7146105f857806354214f691461063557806355f804b314610660578063572849c41461068957806358c559a3146106b45761027d565b80632e1a7d4d146104af5780632f745c59146104d85780633af32abf1461051557806341d637371461055257806342842e0e1461057d57806342966c68146105a65761027d565b80631082ef12116102455780631082ef121461038d57806318160ddd146103ca57806323b872dd146103f55780632bf043041461041e5780632d8f03d2146104475780632e105b42146104845761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630ac2383214610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614183565b610af3565b6040516102b691906141cb565b60405180910390f35b3480156102cb57600080fd5b506102d4610b6d565b6040516102e1919061427f565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906142d7565b610bff565b60405161031e9190614345565b60405180910390f35b34801561033357600080fd5b5061034e6004803603810190610349919061438c565b610c84565b005b34801561035c57600080fd5b50610377600480360381019061037291906143cc565b610d9c565b60405161038491906144b7565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af91906143cc565b610e2a565b6040516103c191906144e8565b60405180910390f35b3480156103d657600080fd5b506103df610eef565b6040516103ec91906144e8565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190614503565b610efc565b005b34801561042a57600080fd5b50610445600480360381019061044091906145bb565b610f5c565b005b34801561045357600080fd5b5061046e600480360381019061046991906143cc565b61107d565b60405161047b91906144e8565b60405180910390f35b34801561049057600080fd5b50610499611142565b6040516104a691906141cb565b60405180910390f35b3480156104bb57600080fd5b506104d660048036038101906104d191906142d7565b611155565b005b3480156104e457600080fd5b506104ff60048036038101906104fa919061438c565b611321565b60405161050c91906144e8565b60405180910390f35b34801561052157600080fd5b5061053c600480360381019061053791906143cc565b6113c6565b60405161054991906141cb565b60405180910390f35b34801561055e57600080fd5b50610567611459565b6040516105749190614345565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190614503565b61147f565b005b3480156105b257600080fd5b506105cd60048036038101906105c891906142d7565b61149f565b005b3480156105db57600080fd5b506105f660048036038101906105f19190614738565b6114fb565b005b34801561060457600080fd5b5061061f600480360381019061061a91906142d7565b611625565b60405161062c91906144e8565b60405180910390f35b34801561064157600080fd5b5061064a611696565b60405161065791906141cb565b60405180910390f35b34801561066c57600080fd5b5061068760048036038101906106829190614738565b6116a9565b005b34801561069557600080fd5b5061069e61173f565b6040516106ab91906144e8565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d691906142d7565b611745565b005b3480156106e957600080fd5b5061070460048036038101906106ff91906142d7565b6117cb565b6040516107119190614345565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906143cc565b61187d565b60405161074e91906144e8565b60405180910390f35b34801561076357600080fd5b5061076c611935565b005b34801561077a57600080fd5b50610795600480360381019061079091906145bb565b6119bd565b005b3480156107a357600080fd5b506107ac611ade565b6040516107b99190614345565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e491906142d7565b611b08565b005b3480156107f757600080fd5b50610800611b8e565b60405161080d919061427f565b60405180910390f35b34801561082257600080fd5b5061082b611c20565b60405161083891906144e8565b60405180910390f35b61085b600480360381019061085691906147d7565b611c26565b005b34801561086957600080fd5b50610884600480360381019061087f9190614863565b61232c565b005b34801561089257600080fd5b506108ad60048036038101906108a89190614944565b612342565b005b3480156108bb57600080fd5b506108c46123a4565b6040516108d191906144e8565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc91906142d7565b6123aa565b60405161090e91906141cb565b60405180910390f35b34801561092357600080fd5b5061093e600480360381019061093991906143cc565b6123d4565b60405161094b91906141cb565b60405180910390f35b34801561096057600080fd5b5061097b600480360381019061097691906149c7565b6123f4565b005b34801561098957600080fd5b506109926124c4565b60405161099f919061427f565b60405180910390f35b3480156109b457600080fd5b506109cf60048036038101906109ca91906142d7565b612552565b6040516109dc919061427f565b60405180910390f35b3480156109f157600080fd5b50610a0c6004803603810190610a0791906149f4565b6125d0565b005b348015610a1a57600080fd5b50610a2361261b565b604051610a3091906144b7565b60405180910390f35b348015610a4557600080fd5b50610a4e61262b565b604051610a5b91906144e8565b60405180910390f35b348015610a7057600080fd5b50610a8b6004803603810190610a869190614738565b612631565b005b348015610a9957600080fd5b50610ab46004803603810190610aaf9190614a54565b6126c7565b604051610ac191906141cb565b60405180910390f35b348015610ad657600080fd5b50610af16004803603810190610aec91906143cc565b61275b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b665750610b6582612853565b5b9050919050565b606060008054610b7c90614ac3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba890614ac3565b8015610bf55780601f10610bca57610100808354040283529160200191610bf5565b820191906000526020600020905b815481529060010190602001808311610bd857829003601f168201915b5050505050905090565b6000610c0a82612935565b610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090614b67565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8f826117cb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790614bf9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d1f6129a1565b73ffffffffffffffffffffffffffffffffffffffff161480610d4e5750610d4d81610d486129a1565b6126c7565b5b610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490614c8b565b60405180910390fd5b610d9783836129a9565b505050565b6060610da66129a1565b73ffffffffffffffffffffffffffffffffffffffff16610dc4611ade565b73ffffffffffffffffffffffffffffffffffffffff1614610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1190614cf7565b60405180910390fd5b610e2382612a62565b9050919050565b6000610e346129a1565b73ffffffffffffffffffffffffffffffffffffffff16610e52611ade565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90614cf7565b60405180910390fd5b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600880549050905090565b610f0d610f076129a1565b82612e08565b610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390614d89565b60405180910390fd5b610f57838383612ee6565b505050565b610f646129a1565b73ffffffffffffffffffffffffffffffffffffffff16610f82611ade565b73ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf90614cf7565b60405180910390fd5b60005b82829050811015611078576001600f6000858585818110610fff57610ffe614da9565b5b905060200201602081019061101491906143cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061107090614e07565b915050610fdb565b505050565b60006110876129a1565b73ffffffffffffffffffffffffffffffffffffffff166110a5611ade565b73ffffffffffffffffffffffffffffffffffffffff16146110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290614cf7565b60405180910390fd5b601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601860009054906101000a900460ff1681565b61115d6129a1565b73ffffffffffffffffffffffffffffffffffffffff1661117b611ade565b73ffffffffffffffffffffffffffffffffffffffff16146111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890614cf7565b60405180910390fd5b60026010541415611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614e9c565b60405180910390fd5b600260108190555047811115611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990614f08565b60405180910390fd5b600061126c611ade565b73ffffffffffffffffffffffffffffffffffffffff168260405161128f90614f59565b60006040518083038185875af1925050503d80600081146112cc576040519150601f19603f3d011682016040523d82523d6000602084013e6112d1565b606091505b5050905080611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c90614fba565b60405180910390fd5b50600160108190555050565b600061132c8361187d565b821061136d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113649061504c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006113d0611ade565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806114525750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b9050919050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61149a83838360405180602001604052806000815250612342565b505050565b6114b06114aa6129a1565b82612e08565b6114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e6906150de565b60405180910390fd5b6114f881613142565b50565b6115036129a1565b73ffffffffffffffffffffffffffffffffffffffff16611521611ade565b73ffffffffffffffffffffffffffffffffffffffff1614611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e90614cf7565b60405180910390fd5b601a60009054906101000a900460ff16156115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be9061514a565b60405180910390fd5b6001601a60006101000a81548160ff0219169083151502179055506115eb816116a9565b7ff040279f20c4475afca9a566d33b14e09c92fcb6460fb4121fadf563ab9ecc1f8160405161161a919061427f565b60405180910390a150565b600061162f610eef565b8210611670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611667906151dc565b60405180910390fd5b6008828154811061168457611683614da9565b5b90600052602060002001549050919050565b601a60009054906101000a900460ff1681565b6116b16129a1565b73ffffffffffffffffffffffffffffffffffffffff166116cf611ade565b73ffffffffffffffffffffffffffffffffffffffff1614611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c90614cf7565b60405180910390fd5b80600c908051906020019061173b929190614074565b5050565b60165481565b61174d6129a1565b73ffffffffffffffffffffffffffffffffffffffff1661176b611ade565b73ffffffffffffffffffffffffffffffffffffffff16146117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b890614cf7565b60405180910390fd5b8060198190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b9061526e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e590615300565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61193d6129a1565b73ffffffffffffffffffffffffffffffffffffffff1661195b611ade565b73ffffffffffffffffffffffffffffffffffffffff16146119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a890614cf7565b60405180910390fd5b6119bb6000613253565b565b6119c56129a1565b73ffffffffffffffffffffffffffffffffffffffff166119e3611ade565b73ffffffffffffffffffffffffffffffffffffffff1614611a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3090614cf7565b60405180910390fd5b60005b82829050811015611ad9576000600f6000858585818110611a6057611a5f614da9565b5b9050602002016020810190611a7591906143cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ad190614e07565b915050611a3c565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b106129a1565b73ffffffffffffffffffffffffffffffffffffffff16611b2e611ade565b73ffffffffffffffffffffffffffffffffffffffff1614611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b90614cf7565b60405180910390fd5b8060178190555050565b606060018054611b9d90614ac3565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc990614ac3565b8015611c165780601f10611beb57610100808354040283529160200191611c16565b820191906000526020600020905b815481529060010190602001808311611bf957829003601f168201915b5050505050905090565b60175481565b60026010541415611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6390614e9c565b60405180910390fd5b6002601081905550601860009054906101000a900460ff1615611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb9061536c565b60405180910390fd5b600083141580611cd8575060008282905014155b611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e906153d8565b60405180910390fd5b6000426019541115905060008383905085611d3291906153f8565b9050611d3c611ade565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611e0b5781611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da69061549a565b60405180910390fd5b600e5481611dbb613319565b611dc591906153f8565b1115611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd90615506565b60405180910390fd5b611e70565b601454600e54611e1b9190615526565b85611e24613319565b611e2e91906153f8565b1115611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6690615506565b60405180910390fd5b5b600084849050111561210a578383905060146000828254611e919190615526565b9250508190555083839050601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eea91906153f8565b925050819055506000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b858590508110156121075760136000878784818110611f3d57611f3c614da9565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f97906155a6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e888885818110611fe657611fe5614da9565b5b905060200201356040518263ffffffff1660e01b815260040161200991906144e8565b60206040518083038186803b15801561202157600080fd5b505afa158015612035573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205991906155db565b73ffffffffffffffffffffffffffffffffffffffff16146120af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a690615654565b60405180910390fd5b6001601360008888858181106120c8576120c7614da9565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806120ff90614e07565b915050611f1b565b50505b612112611ade565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122bd5781806121555750612154336113c6565b5b8061219f57506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b6121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906156c0565b60405180910390fd5b601654601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548661222c91906153f8565b111561226d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122649061572c565b60405180910390fd5b8460175461227b919061574c565b34146122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b3906157f2565b60405180910390fd5b5b84601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230c91906153f8565b9250508190555061231d813361332a565b50506001601081905550505050565b61233e6123376129a1565b8383613370565b5050565b61235361234d6129a1565b83612e08565b612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238990614d89565b60405180910390fd5b61239e848484846134dd565b50505050565b60195481565b60006013600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b6123fc6129a1565b73ffffffffffffffffffffffffffffffffffffffff1661241a611ade565b73ffffffffffffffffffffffffffffffffffffffff1614612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246790614cf7565b60405180910390fd5b80601860006101000a81548160ff0219169083151502179055507f5708b32f825aa2f1192da18d8205d00f2cb633e72d1c5bb33a3111ccc61be8f4816040516124b991906141cb565b60405180910390a150565b600d80546124d190614ac3565b80601f01602080910402602001604051908101604052809291908181526020018280546124fd90614ac3565b801561254a5780601f1061251f5761010080835404028352916020019161254a565b820191906000526020600020905b81548152906001019060200180831161252d57829003601f168201915b505050505081565b6060601a60009054906101000a900460ff166125bf5761257182612935565b6125b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a790615884565b60405180910390fd5b6125b8613539565b90506125cb565b6125c8826135cb565b90505b919050565b60005b838390508110156126155761260233838686858181106125f6576125f5614da9565b5b90506020020135610efc565b808061260d90614e07565b9150506125d3565b50505050565b606061262633612a62565b905090565b600e5481565b6126396129a1565b73ffffffffffffffffffffffffffffffffffffffff16612657611ade565b73ffffffffffffffffffffffffffffffffffffffff16146126ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a490614cf7565b60405180910390fd5b80600d90805190602001906126c3929190614074565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6127636129a1565b73ffffffffffffffffffffffffffffffffffffffff16612781611ade565b73ffffffffffffffffffffffffffffffffffffffff16146127d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ce90614cf7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283e90615916565b60405180910390fd5b61285081613253565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061291e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061292e575061292d82613675565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a1c836117cb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612ac69190614345565b60206040518083038186803b158015612ade57600080fd5b505afa158015612af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b16919061594b565b905060008167ffffffffffffffff811115612b3457612b3361460d565b5b604051908082528060200260200182016040528015612b625781602001602082028036833780820191505090505b5090506000821415612b7957809350505050612e03565b600080600190505b8473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bc757600080fd5b505afa158015612bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bff919061594b565b8111612d3f576013600082815260200190815260200160002060009054906101000a900460ff1615612c3057612d2c565b8673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612c8091906144e8565b60206040518083038186803b158015612c9857600080fd5b505afa158015612cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd091906155db565b73ffffffffffffffffffffffffffffffffffffffff1614612cf057612d2c565b80838381518110612d0457612d03614da9565b5b6020026020010181815250508180612d1b90614e07565b92505083821415612d2b57612d3f565b5b8080612d3790614e07565b915050612b81565b5080825114612dfb5760008167ffffffffffffffff811115612d6457612d6361460d565b5b604051908082528060200260200182016040528015612d925781602001602082028036833780820191505090505b50905060005b82811015612ded57838181518110612db357612db2614da9565b5b6020026020010151828281518110612dce57612dcd614da9565b5b6020026020010181815250508080612de590614e07565b915050612d98565b508095505050505050612e03565b819450505050505b919050565b6000612e1382612935565b612e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e49906159ea565b60405180910390fd5b6000612e5d836117cb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ecc57508373ffffffffffffffffffffffffffffffffffffffff16612eb484610bff565b73ffffffffffffffffffffffffffffffffffffffff16145b80612edd5750612edc81856126c7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f06826117cb565b73ffffffffffffffffffffffffffffffffffffffff1614612f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5390615a7c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc390615b0e565b60405180910390fd5b612fd78383836136df565b612fe26000826129a9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130329190615526565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461308991906153f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061314d826117cb565b905061315b816000846136df565b6131666000836129a9565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131b69190615526565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000613325600b6137f3565b905090565b60005b8281101561336b5761333f600b613801565b600061334b600b6137f3565b90506133578382613817565b50808061336390614e07565b91505061332d565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d690615b7a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516134d091906141cb565b60405180910390a3505050565b6134e8848484612ee6565b6134f484848484613835565b613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90615c0c565b60405180910390fd5b50505050565b6060600c805461354890614ac3565b80601f016020809104026020016040519081016040528092919081815260200182805461357490614ac3565b80156135c15780601f10613596576101008083540402835291602001916135c1565b820191906000526020600020905b8154815290600101906020018083116135a457829003601f168201915b5050505050905090565b60606135d682612935565b613615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360c90615884565b60405180910390fd5b600061361f613539565b9050600081511161363f576040518060200160405280600081525061366d565b80613649846139cc565b600d60405160200161365d93929190615cfc565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136ea838383613b2d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561372d5761372881613b32565b61376c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461376b5761376a8382613b7b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137af576137aa81613ce8565b6137ee565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137ed576137ec8282613db9565b5b5b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b613831828260405180602001604052806000815250613e38565b5050565b60006138568473ffffffffffffffffffffffffffffffffffffffff16613e93565b156139bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261387f6129a1565b8786866040518563ffffffff1660e01b81526004016138a19493929190615d82565b602060405180830381600087803b1580156138bb57600080fd5b505af19250505080156138ec57506040513d601f19601f820116820180604052508101906138e99190615de3565b60015b61396f573d806000811461391c576040519150601f19603f3d011682016040523d82523d6000602084013e613921565b606091505b50600081511415613967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161395e90615c0c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139c4565b600190505b949350505050565b60606000821415613a14576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b28565b600082905060005b60008214613a46578080613a2f90614e07565b915050600a82613a3f9190615e3f565b9150613a1c565b60008167ffffffffffffffff811115613a6257613a6161460d565b5b6040519080825280601f01601f191660200182016040528015613a945781602001600182028036833780820191505090505b5090505b60008514613b2157600182613aad9190615526565b9150600a85613abc9190615e70565b6030613ac891906153f8565b60f81b818381518110613ade57613add614da9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b1a9190615e3f565b9450613a98565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b888461187d565b613b929190615526565b9050600060076000848152602001908152602001600020549050818114613c77576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613cfc9190615526565b9050600060096000848152602001908152602001600020549050600060088381548110613d2c57613d2b614da9565b5b906000526020600020015490508060088381548110613d4e57613d4d614da9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d9d57613d9c615ea1565b5b6001900381819060005260206000200160009055905550505050565b6000613dc48361187d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b613e428383613ea6565b613e4f6000848484613835565b613e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8590615c0c565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f0d90615f1c565b60405180910390fd5b613f1f81612935565b15613f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f5690615f88565b60405180910390fd5b613f6b600083836136df565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613fbb91906153f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461408090614ac3565b90600052602060002090601f0160209004810192826140a257600085556140e9565b82601f106140bb57805160ff19168380011785556140e9565b828001600101855582156140e9579182015b828111156140e85782518255916020019190600101906140cd565b5b5090506140f691906140fa565b5090565b5b808211156141135760008160009055506001016140fb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141608161412b565b811461416b57600080fd5b50565b60008135905061417d81614157565b92915050565b60006020828403121561419957614198614121565b5b60006141a78482850161416e565b91505092915050565b60008115159050919050565b6141c5816141b0565b82525050565b60006020820190506141e060008301846141bc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614220578082015181840152602081019050614205565b8381111561422f576000848401525b50505050565b6000601f19601f8301169050919050565b6000614251826141e6565b61425b81856141f1565b935061426b818560208601614202565b61427481614235565b840191505092915050565b600060208201905081810360008301526142998184614246565b905092915050565b6000819050919050565b6142b4816142a1565b81146142bf57600080fd5b50565b6000813590506142d1816142ab565b92915050565b6000602082840312156142ed576142ec614121565b5b60006142fb848285016142c2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061432f82614304565b9050919050565b61433f81614324565b82525050565b600060208201905061435a6000830184614336565b92915050565b61436981614324565b811461437457600080fd5b50565b60008135905061438681614360565b92915050565b600080604083850312156143a3576143a2614121565b5b60006143b185828601614377565b92505060206143c2858286016142c2565b9150509250929050565b6000602082840312156143e2576143e1614121565b5b60006143f084828501614377565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61442e816142a1565b82525050565b60006144408383614425565b60208301905092915050565b6000602082019050919050565b6000614464826143f9565b61446e8185614404565b935061447983614415565b8060005b838110156144aa5781516144918882614434565b975061449c8361444c565b92505060018101905061447d565b5085935050505092915050565b600060208201905081810360008301526144d18184614459565b905092915050565b6144e2816142a1565b82525050565b60006020820190506144fd60008301846144d9565b92915050565b60008060006060848603121561451c5761451b614121565b5b600061452a86828701614377565b935050602061453b86828701614377565b925050604061454c868287016142c2565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261457b5761457a614556565b5b8235905067ffffffffffffffff8111156145985761459761455b565b5b6020830191508360208202830111156145b4576145b3614560565b5b9250929050565b600080602083850312156145d2576145d1614121565b5b600083013567ffffffffffffffff8111156145f0576145ef614126565b5b6145fc85828601614565565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61464582614235565b810181811067ffffffffffffffff821117156146645761466361460d565b5b80604052505050565b6000614677614117565b9050614683828261463c565b919050565b600067ffffffffffffffff8211156146a3576146a261460d565b5b6146ac82614235565b9050602081019050919050565b82818337600083830152505050565b60006146db6146d684614688565b61466d565b9050828152602081018484840111156146f7576146f6614608565b5b6147028482856146b9565b509392505050565b600082601f83011261471f5761471e614556565b5b813561472f8482602086016146c8565b91505092915050565b60006020828403121561474e5761474d614121565b5b600082013567ffffffffffffffff81111561476c5761476b614126565b5b6147788482850161470a565b91505092915050565b60008083601f84011261479757614796614556565b5b8235905067ffffffffffffffff8111156147b4576147b361455b565b5b6020830191508360208202830111156147d0576147cf614560565b5b9250929050565b6000806000604084860312156147f0576147ef614121565b5b60006147fe868287016142c2565b935050602084013567ffffffffffffffff81111561481f5761481e614126565b5b61482b86828701614781565b92509250509250925092565b614840816141b0565b811461484b57600080fd5b50565b60008135905061485d81614837565b92915050565b6000806040838503121561487a57614879614121565b5b600061488885828601614377565b92505060206148998582860161484e565b9150509250929050565b600067ffffffffffffffff8211156148be576148bd61460d565b5b6148c782614235565b9050602081019050919050565b60006148e76148e2846148a3565b61466d565b90508281526020810184848401111561490357614902614608565b5b61490e8482856146b9565b509392505050565b600082601f83011261492b5761492a614556565b5b813561493b8482602086016148d4565b91505092915050565b6000806000806080858703121561495e5761495d614121565b5b600061496c87828801614377565b945050602061497d87828801614377565b935050604061498e878288016142c2565b925050606085013567ffffffffffffffff8111156149af576149ae614126565b5b6149bb87828801614916565b91505092959194509250565b6000602082840312156149dd576149dc614121565b5b60006149eb8482850161484e565b91505092915050565b600080600060408486031215614a0d57614a0c614121565b5b600084013567ffffffffffffffff811115614a2b57614a2a614126565b5b614a3786828701614781565b93509350506020614a4a86828701614377565b9150509250925092565b60008060408385031215614a6b57614a6a614121565b5b6000614a7985828601614377565b9250506020614a8a85828601614377565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614adb57607f821691505b60208210811415614aef57614aee614a94565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614b51602c836141f1565b9150614b5c82614af5565b604082019050919050565b60006020820190508181036000830152614b8081614b44565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614be36021836141f1565b9150614bee82614b87565b604082019050919050565b60006020820190508181036000830152614c1281614bd6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614c756038836141f1565b9150614c8082614c19565b604082019050919050565b60006020820190508181036000830152614ca481614c68565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ce16020836141f1565b9150614cec82614cab565b602082019050919050565b60006020820190508181036000830152614d1081614cd4565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614d736031836141f1565b9150614d7e82614d17565b604082019050919050565b60006020820190508181036000830152614da281614d66565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e12826142a1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e4557614e44614dd8565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614e86601f836141f1565b9150614e9182614e50565b602082019050919050565b60006020820190508181036000830152614eb581614e79565b9050919050565b7f416d6f756e7420657863656564732062616c616e636500000000000000000000600082015250565b6000614ef26016836141f1565b9150614efd82614ebc565b602082019050919050565b60006020820190508181036000830152614f2181614ee5565b9050919050565b600081905092915050565b50565b6000614f43600083614f28565b9150614f4e82614f33565b600082019050919050565b6000614f6482614f36565b9150819050919050565b7f4661696c656420746f2073656e6420426e620000000000000000000000000000600082015250565b6000614fa46012836141f1565b9150614faf82614f6e565b602082019050919050565b60006020820190508181036000830152614fd381614f97565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000615036602b836141f1565b915061504182614fda565b604082019050919050565b6000602082019050818103600083015261506581615029565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b60006150c86030836141f1565b91506150d38261506c565b604082019050919050565b600060208201905081810360008301526150f7816150bb565b9050919050565b7f497420697320616c72656164792072657665616c656400000000000000000000600082015250565b60006151346016836141f1565b915061513f826150fe565b602082019050919050565b6000602082019050818103600083015261516381615127565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006151c6602c836141f1565b91506151d18261516a565b604082019050919050565b600060208201905081810360008301526151f5816151b9565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006152586029836141f1565b9150615263826151fc565b604082019050919050565b600060208201905081810360008301526152878161524b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006152ea602a836141f1565b91506152f58261528e565b604082019050919050565b60006020820190508181036000830152615319816152dd565b9050919050565b7f4d696e74696e6720697320706175736564000000000000000000000000000000600082015250565b60006153566011836141f1565b915061536182615320565b602082019050919050565b6000602082019050818103600083015261538581615349565b9050919050565b7f5175616e746974792063616e206e6f7420626520300000000000000000000000600082015250565b60006153c26015836141f1565b91506153cd8261538c565b602082019050919050565b600060208201905081810360008301526153f1816153b5565b9050919050565b6000615403826142a1565b915061540e836142a1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561544357615442614dd8565b5b828201905092915050565b7f4f776e6572206d696e74206f6e207075626c69632073616c6500000000000000600082015250565b60006154846019836141f1565b915061548f8261544e565b602082019050919050565b600060208201905081810360008301526154b381615477565b9050919050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b60006154f06012836141f1565b91506154fb826154ba565b602082019050919050565b6000602082019050818103600083015261551f816154e3565b9050919050565b6000615531826142a1565b915061553c836142a1565b92508282101561554f5761554e614dd8565b5b828203905092915050565b7f546f6b656e20494420686173206265656e207573656400000000000000000000600082015250565b60006155906016836141f1565b915061559b8261555a565b602082019050919050565b600060208201905081810360008301526155bf81615583565b9050919050565b6000815190506155d581614360565b92915050565b6000602082840312156155f1576155f0614121565b5b60006155ff848285016155c6565b91505092915050565b7f596f7520646f6e2774206f776e2074686973206772616e746572204e46540000600082015250565b600061563e601e836141f1565b915061564982615608565b602082019050919050565b6000602082019050818103600083015261566d81615631565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b60006156aa6017836141f1565b91506156b582615674565b602082019050919050565b600060208201905081810360008301526156d98161569d565b9050919050565b7f546f6f206d616e79206d696e7465640000000000000000000000000000000000600082015250565b6000615716600f836141f1565b9150615721826156e0565b602082019050919050565b6000602082019050818103600083015261574581615709565b9050919050565b6000615757826142a1565b9150615762836142a1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561579b5761579a614dd8565b5b828202905092915050565b7f696e636f72726563742070726963650000000000000000000000000000000000600082015250565b60006157dc600f836141f1565b91506157e7826157a6565b602082019050919050565b6000602082019050818103600083015261580b816157cf565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061586e602f836141f1565b915061587982615812565b604082019050919050565b6000602082019050818103600083015261589d81615861565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006159006026836141f1565b915061590b826158a4565b604082019050919050565b6000602082019050818103600083015261592f816158f3565b9050919050565b600081519050615945816142ab565b92915050565b60006020828403121561596157615960614121565b5b600061596f84828501615936565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006159d4602c836141f1565b91506159df82615978565b604082019050919050565b60006020820190508181036000830152615a03816159c7565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615a666029836141f1565b9150615a7182615a0a565b604082019050919050565b60006020820190508181036000830152615a9581615a59565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615af86024836141f1565b9150615b0382615a9c565b604082019050919050565b60006020820190508181036000830152615b2781615aeb565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615b646019836141f1565b9150615b6f82615b2e565b602082019050919050565b60006020820190508181036000830152615b9381615b57565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615bf66032836141f1565b9150615c0182615b9a565b604082019050919050565b60006020820190508181036000830152615c2581615be9565b9050919050565b600081905092915050565b6000615c42826141e6565b615c4c8185615c2c565b9350615c5c818560208601614202565b80840191505092915050565b60008190508160005260206000209050919050565b60008154615c8a81614ac3565b615c948186615c2c565b94506001821660008114615caf5760018114615cc057615cf3565b60ff19831686528186019350615cf3565b615cc985615c68565b60005b83811015615ceb57815481890152600182019150602081019050615ccc565b838801955050505b50505092915050565b6000615d088286615c37565b9150615d148285615c37565b9150615d208284615c7d565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b6000615d5482615d2d565b615d5e8185615d38565b9350615d6e818560208601614202565b615d7781614235565b840191505092915050565b6000608082019050615d976000830187614336565b615da46020830186614336565b615db160408301856144d9565b8181036060830152615dc38184615d49565b905095945050505050565b600081519050615ddd81614157565b92915050565b600060208284031215615df957615df8614121565b5b6000615e0784828501615dce565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615e4a826142a1565b9150615e55836142a1565b925082615e6557615e64615e10565b5b828204905092915050565b6000615e7b826142a1565b9150615e86836142a1565b925082615e9657615e95615e10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615f066020836141f1565b9150615f1182615ed0565b602082019050919050565b60006020820190508181036000830152615f3581615ef9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615f72601c836141f1565b9150615f7d82615f3c565b602082019050919050565b60006020820190508181036000830152615fa181615f65565b905091905056fea2646970667358221220c6ef346470af820e3f23325f05f9fd8e08e87f36b13d870556fec4d1d6bfcfbb64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000685c682846f000000000000000000000000000000000000000000000000000000000000633499b00000000000000000000000003112352ca058d39a861c1fec3753b64b70da675f000000000000000000000000000000000000000000000000000000000000000a456b7461506f7274616c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a454b5441504f5254414c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5369746f7145713745574a734837787563733834417737764d43437037364a42686f4171437069323139704b2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061027d5760003560e01c80636352211e1161014f578063bee35c81116100c1578063ce40ad861161007a578063ce40ad86146109e5578063d2454f3414610a0e578063d5abeb0114610a39578063da3ef23f14610a64578063e985e9c514610a8d578063f2fde38b14610aca5761027d565b8063bee35c81146108af578063c2b16d00146108da578063c30796ab14610917578063c566fa2714610954578063c66828621461097d578063c87b56dd146109a85761027d565b806391b7f5ed1161011357806391b7f5ed146107c257806395d89b41146107eb578063a035b1fe14610816578063a1a5dd9d14610841578063a22cb4651461085d578063b88d4fde146108865761027d565b80636352211e146106dd57806370a082311461071a578063715018a61461075757806388a2653c1461076e5780638da5cb5b146107975761027d565b80632e1a7d4d116101f35780634c261247116101ac5780634c261247146105cf5780634f6ccce7146105f857806354214f691461063557806355f804b314610660578063572849c41461068957806358c559a3146106b45761027d565b80632e1a7d4d146104af5780632f745c59146104d85780633af32abf1461051557806341d637371461055257806342842e0e1461057d57806342966c68146105a65761027d565b80631082ef12116102455780631082ef121461038d57806318160ddd146103ca57806323b872dd146103f55780632bf043041461041e5780632d8f03d2146104475780632e105b42146104845761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630ac2383214610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614183565b610af3565b6040516102b691906141cb565b60405180910390f35b3480156102cb57600080fd5b506102d4610b6d565b6040516102e1919061427f565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906142d7565b610bff565b60405161031e9190614345565b60405180910390f35b34801561033357600080fd5b5061034e6004803603810190610349919061438c565b610c84565b005b34801561035c57600080fd5b50610377600480360381019061037291906143cc565b610d9c565b60405161038491906144b7565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af91906143cc565b610e2a565b6040516103c191906144e8565b60405180910390f35b3480156103d657600080fd5b506103df610eef565b6040516103ec91906144e8565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190614503565b610efc565b005b34801561042a57600080fd5b50610445600480360381019061044091906145bb565b610f5c565b005b34801561045357600080fd5b5061046e600480360381019061046991906143cc565b61107d565b60405161047b91906144e8565b60405180910390f35b34801561049057600080fd5b50610499611142565b6040516104a691906141cb565b60405180910390f35b3480156104bb57600080fd5b506104d660048036038101906104d191906142d7565b611155565b005b3480156104e457600080fd5b506104ff60048036038101906104fa919061438c565b611321565b60405161050c91906144e8565b60405180910390f35b34801561052157600080fd5b5061053c600480360381019061053791906143cc565b6113c6565b60405161054991906141cb565b60405180910390f35b34801561055e57600080fd5b50610567611459565b6040516105749190614345565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190614503565b61147f565b005b3480156105b257600080fd5b506105cd60048036038101906105c891906142d7565b61149f565b005b3480156105db57600080fd5b506105f660048036038101906105f19190614738565b6114fb565b005b34801561060457600080fd5b5061061f600480360381019061061a91906142d7565b611625565b60405161062c91906144e8565b60405180910390f35b34801561064157600080fd5b5061064a611696565b60405161065791906141cb565b60405180910390f35b34801561066c57600080fd5b5061068760048036038101906106829190614738565b6116a9565b005b34801561069557600080fd5b5061069e61173f565b6040516106ab91906144e8565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d691906142d7565b611745565b005b3480156106e957600080fd5b5061070460048036038101906106ff91906142d7565b6117cb565b6040516107119190614345565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906143cc565b61187d565b60405161074e91906144e8565b60405180910390f35b34801561076357600080fd5b5061076c611935565b005b34801561077a57600080fd5b50610795600480360381019061079091906145bb565b6119bd565b005b3480156107a357600080fd5b506107ac611ade565b6040516107b99190614345565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e491906142d7565b611b08565b005b3480156107f757600080fd5b50610800611b8e565b60405161080d919061427f565b60405180910390f35b34801561082257600080fd5b5061082b611c20565b60405161083891906144e8565b60405180910390f35b61085b600480360381019061085691906147d7565b611c26565b005b34801561086957600080fd5b50610884600480360381019061087f9190614863565b61232c565b005b34801561089257600080fd5b506108ad60048036038101906108a89190614944565b612342565b005b3480156108bb57600080fd5b506108c46123a4565b6040516108d191906144e8565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc91906142d7565b6123aa565b60405161090e91906141cb565b60405180910390f35b34801561092357600080fd5b5061093e600480360381019061093991906143cc565b6123d4565b60405161094b91906141cb565b60405180910390f35b34801561096057600080fd5b5061097b600480360381019061097691906149c7565b6123f4565b005b34801561098957600080fd5b506109926124c4565b60405161099f919061427f565b60405180910390f35b3480156109b457600080fd5b506109cf60048036038101906109ca91906142d7565b612552565b6040516109dc919061427f565b60405180910390f35b3480156109f157600080fd5b50610a0c6004803603810190610a0791906149f4565b6125d0565b005b348015610a1a57600080fd5b50610a2361261b565b604051610a3091906144b7565b60405180910390f35b348015610a4557600080fd5b50610a4e61262b565b604051610a5b91906144e8565b60405180910390f35b348015610a7057600080fd5b50610a8b6004803603810190610a869190614738565b612631565b005b348015610a9957600080fd5b50610ab46004803603810190610aaf9190614a54565b6126c7565b604051610ac191906141cb565b60405180910390f35b348015610ad657600080fd5b50610af16004803603810190610aec91906143cc565b61275b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b665750610b6582612853565b5b9050919050565b606060008054610b7c90614ac3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba890614ac3565b8015610bf55780601f10610bca57610100808354040283529160200191610bf5565b820191906000526020600020905b815481529060010190602001808311610bd857829003601f168201915b5050505050905090565b6000610c0a82612935565b610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090614b67565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8f826117cb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790614bf9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d1f6129a1565b73ffffffffffffffffffffffffffffffffffffffff161480610d4e5750610d4d81610d486129a1565b6126c7565b5b610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490614c8b565b60405180910390fd5b610d9783836129a9565b505050565b6060610da66129a1565b73ffffffffffffffffffffffffffffffffffffffff16610dc4611ade565b73ffffffffffffffffffffffffffffffffffffffff1614610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1190614cf7565b60405180910390fd5b610e2382612a62565b9050919050565b6000610e346129a1565b73ffffffffffffffffffffffffffffffffffffffff16610e52611ade565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90614cf7565b60405180910390fd5b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600880549050905090565b610f0d610f076129a1565b82612e08565b610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390614d89565b60405180910390fd5b610f57838383612ee6565b505050565b610f646129a1565b73ffffffffffffffffffffffffffffffffffffffff16610f82611ade565b73ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf90614cf7565b60405180910390fd5b60005b82829050811015611078576001600f6000858585818110610fff57610ffe614da9565b5b905060200201602081019061101491906143cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061107090614e07565b915050610fdb565b505050565b60006110876129a1565b73ffffffffffffffffffffffffffffffffffffffff166110a5611ade565b73ffffffffffffffffffffffffffffffffffffffff16146110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290614cf7565b60405180910390fd5b601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601860009054906101000a900460ff1681565b61115d6129a1565b73ffffffffffffffffffffffffffffffffffffffff1661117b611ade565b73ffffffffffffffffffffffffffffffffffffffff16146111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890614cf7565b60405180910390fd5b60026010541415611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614e9c565b60405180910390fd5b600260108190555047811115611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990614f08565b60405180910390fd5b600061126c611ade565b73ffffffffffffffffffffffffffffffffffffffff168260405161128f90614f59565b60006040518083038185875af1925050503d80600081146112cc576040519150601f19603f3d011682016040523d82523d6000602084013e6112d1565b606091505b5050905080611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c90614fba565b60405180910390fd5b50600160108190555050565b600061132c8361187d565b821061136d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113649061504c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006113d0611ade565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806114525750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b9050919050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61149a83838360405180602001604052806000815250612342565b505050565b6114b06114aa6129a1565b82612e08565b6114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e6906150de565b60405180910390fd5b6114f881613142565b50565b6115036129a1565b73ffffffffffffffffffffffffffffffffffffffff16611521611ade565b73ffffffffffffffffffffffffffffffffffffffff1614611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e90614cf7565b60405180910390fd5b601a60009054906101000a900460ff16156115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be9061514a565b60405180910390fd5b6001601a60006101000a81548160ff0219169083151502179055506115eb816116a9565b7ff040279f20c4475afca9a566d33b14e09c92fcb6460fb4121fadf563ab9ecc1f8160405161161a919061427f565b60405180910390a150565b600061162f610eef565b8210611670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611667906151dc565b60405180910390fd5b6008828154811061168457611683614da9565b5b90600052602060002001549050919050565b601a60009054906101000a900460ff1681565b6116b16129a1565b73ffffffffffffffffffffffffffffffffffffffff166116cf611ade565b73ffffffffffffffffffffffffffffffffffffffff1614611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c90614cf7565b60405180910390fd5b80600c908051906020019061173b929190614074565b5050565b60165481565b61174d6129a1565b73ffffffffffffffffffffffffffffffffffffffff1661176b611ade565b73ffffffffffffffffffffffffffffffffffffffff16146117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b890614cf7565b60405180910390fd5b8060198190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b9061526e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e590615300565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61193d6129a1565b73ffffffffffffffffffffffffffffffffffffffff1661195b611ade565b73ffffffffffffffffffffffffffffffffffffffff16146119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a890614cf7565b60405180910390fd5b6119bb6000613253565b565b6119c56129a1565b73ffffffffffffffffffffffffffffffffffffffff166119e3611ade565b73ffffffffffffffffffffffffffffffffffffffff1614611a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3090614cf7565b60405180910390fd5b60005b82829050811015611ad9576000600f6000858585818110611a6057611a5f614da9565b5b9050602002016020810190611a7591906143cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ad190614e07565b915050611a3c565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b106129a1565b73ffffffffffffffffffffffffffffffffffffffff16611b2e611ade565b73ffffffffffffffffffffffffffffffffffffffff1614611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b90614cf7565b60405180910390fd5b8060178190555050565b606060018054611b9d90614ac3565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc990614ac3565b8015611c165780601f10611beb57610100808354040283529160200191611c16565b820191906000526020600020905b815481529060010190602001808311611bf957829003601f168201915b5050505050905090565b60175481565b60026010541415611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6390614e9c565b60405180910390fd5b6002601081905550601860009054906101000a900460ff1615611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb9061536c565b60405180910390fd5b600083141580611cd8575060008282905014155b611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e906153d8565b60405180910390fd5b6000426019541115905060008383905085611d3291906153f8565b9050611d3c611ade565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611e0b5781611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da69061549a565b60405180910390fd5b600e5481611dbb613319565b611dc591906153f8565b1115611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd90615506565b60405180910390fd5b611e70565b601454600e54611e1b9190615526565b85611e24613319565b611e2e91906153f8565b1115611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6690615506565b60405180910390fd5b5b600084849050111561210a578383905060146000828254611e919190615526565b9250508190555083839050601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eea91906153f8565b925050819055506000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b858590508110156121075760136000878784818110611f3d57611f3c614da9565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f97906155a6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e888885818110611fe657611fe5614da9565b5b905060200201356040518263ffffffff1660e01b815260040161200991906144e8565b60206040518083038186803b15801561202157600080fd5b505afa158015612035573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205991906155db565b73ffffffffffffffffffffffffffffffffffffffff16146120af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a690615654565b60405180910390fd5b6001601360008888858181106120c8576120c7614da9565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806120ff90614e07565b915050611f1b565b50505b612112611ade565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122bd5781806121555750612154336113c6565b5b8061219f57506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b6121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906156c0565b60405180910390fd5b601654601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548661222c91906153f8565b111561226d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122649061572c565b60405180910390fd5b8460175461227b919061574c565b34146122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b3906157f2565b60405180910390fd5b5b84601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230c91906153f8565b9250508190555061231d813361332a565b50506001601081905550505050565b61233e6123376129a1565b8383613370565b5050565b61235361234d6129a1565b83612e08565b612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238990614d89565b60405180910390fd5b61239e848484846134dd565b50505050565b60195481565b60006013600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b6123fc6129a1565b73ffffffffffffffffffffffffffffffffffffffff1661241a611ade565b73ffffffffffffffffffffffffffffffffffffffff1614612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246790614cf7565b60405180910390fd5b80601860006101000a81548160ff0219169083151502179055507f5708b32f825aa2f1192da18d8205d00f2cb633e72d1c5bb33a3111ccc61be8f4816040516124b991906141cb565b60405180910390a150565b600d80546124d190614ac3565b80601f01602080910402602001604051908101604052809291908181526020018280546124fd90614ac3565b801561254a5780601f1061251f5761010080835404028352916020019161254a565b820191906000526020600020905b81548152906001019060200180831161252d57829003601f168201915b505050505081565b6060601a60009054906101000a900460ff166125bf5761257182612935565b6125b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a790615884565b60405180910390fd5b6125b8613539565b90506125cb565b6125c8826135cb565b90505b919050565b60005b838390508110156126155761260233838686858181106125f6576125f5614da9565b5b90506020020135610efc565b808061260d90614e07565b9150506125d3565b50505050565b606061262633612a62565b905090565b600e5481565b6126396129a1565b73ffffffffffffffffffffffffffffffffffffffff16612657611ade565b73ffffffffffffffffffffffffffffffffffffffff16146126ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a490614cf7565b60405180910390fd5b80600d90805190602001906126c3929190614074565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6127636129a1565b73ffffffffffffffffffffffffffffffffffffffff16612781611ade565b73ffffffffffffffffffffffffffffffffffffffff16146127d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ce90614cf7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283e90615916565b60405180910390fd5b61285081613253565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061291e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061292e575061292d82613675565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a1c836117cb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612ac69190614345565b60206040518083038186803b158015612ade57600080fd5b505afa158015612af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b16919061594b565b905060008167ffffffffffffffff811115612b3457612b3361460d565b5b604051908082528060200260200182016040528015612b625781602001602082028036833780820191505090505b5090506000821415612b7957809350505050612e03565b600080600190505b8473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bc757600080fd5b505afa158015612bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bff919061594b565b8111612d3f576013600082815260200190815260200160002060009054906101000a900460ff1615612c3057612d2c565b8673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612c8091906144e8565b60206040518083038186803b158015612c9857600080fd5b505afa158015612cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd091906155db565b73ffffffffffffffffffffffffffffffffffffffff1614612cf057612d2c565b80838381518110612d0457612d03614da9565b5b6020026020010181815250508180612d1b90614e07565b92505083821415612d2b57612d3f565b5b8080612d3790614e07565b915050612b81565b5080825114612dfb5760008167ffffffffffffffff811115612d6457612d6361460d565b5b604051908082528060200260200182016040528015612d925781602001602082028036833780820191505090505b50905060005b82811015612ded57838181518110612db357612db2614da9565b5b6020026020010151828281518110612dce57612dcd614da9565b5b6020026020010181815250508080612de590614e07565b915050612d98565b508095505050505050612e03565b819450505050505b919050565b6000612e1382612935565b612e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e49906159ea565b60405180910390fd5b6000612e5d836117cb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ecc57508373ffffffffffffffffffffffffffffffffffffffff16612eb484610bff565b73ffffffffffffffffffffffffffffffffffffffff16145b80612edd5750612edc81856126c7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f06826117cb565b73ffffffffffffffffffffffffffffffffffffffff1614612f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5390615a7c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc390615b0e565b60405180910390fd5b612fd78383836136df565b612fe26000826129a9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130329190615526565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461308991906153f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061314d826117cb565b905061315b816000846136df565b6131666000836129a9565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131b69190615526565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000613325600b6137f3565b905090565b60005b8281101561336b5761333f600b613801565b600061334b600b6137f3565b90506133578382613817565b50808061336390614e07565b91505061332d565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d690615b7a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516134d091906141cb565b60405180910390a3505050565b6134e8848484612ee6565b6134f484848484613835565b613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90615c0c565b60405180910390fd5b50505050565b6060600c805461354890614ac3565b80601f016020809104026020016040519081016040528092919081815260200182805461357490614ac3565b80156135c15780601f10613596576101008083540402835291602001916135c1565b820191906000526020600020905b8154815290600101906020018083116135a457829003601f168201915b5050505050905090565b60606135d682612935565b613615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360c90615884565b60405180910390fd5b600061361f613539565b9050600081511161363f576040518060200160405280600081525061366d565b80613649846139cc565b600d60405160200161365d93929190615cfc565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136ea838383613b2d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561372d5761372881613b32565b61376c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461376b5761376a8382613b7b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137af576137aa81613ce8565b6137ee565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137ed576137ec8282613db9565b5b5b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b613831828260405180602001604052806000815250613e38565b5050565b60006138568473ffffffffffffffffffffffffffffffffffffffff16613e93565b156139bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261387f6129a1565b8786866040518563ffffffff1660e01b81526004016138a19493929190615d82565b602060405180830381600087803b1580156138bb57600080fd5b505af19250505080156138ec57506040513d601f19601f820116820180604052508101906138e99190615de3565b60015b61396f573d806000811461391c576040519150601f19603f3d011682016040523d82523d6000602084013e613921565b606091505b50600081511415613967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161395e90615c0c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139c4565b600190505b949350505050565b60606000821415613a14576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b28565b600082905060005b60008214613a46578080613a2f90614e07565b915050600a82613a3f9190615e3f565b9150613a1c565b60008167ffffffffffffffff811115613a6257613a6161460d565b5b6040519080825280601f01601f191660200182016040528015613a945781602001600182028036833780820191505090505b5090505b60008514613b2157600182613aad9190615526565b9150600a85613abc9190615e70565b6030613ac891906153f8565b60f81b818381518110613ade57613add614da9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b1a9190615e3f565b9450613a98565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b888461187d565b613b929190615526565b9050600060076000848152602001908152602001600020549050818114613c77576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613cfc9190615526565b9050600060096000848152602001908152602001600020549050600060088381548110613d2c57613d2b614da9565b5b906000526020600020015490508060088381548110613d4e57613d4d614da9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d9d57613d9c615ea1565b5b6001900381819060005260206000200160009055905550505050565b6000613dc48361187d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b613e428383613ea6565b613e4f6000848484613835565b613e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8590615c0c565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f0d90615f1c565b60405180910390fd5b613f1f81612935565b15613f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f5690615f88565b60405180910390fd5b613f6b600083836136df565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613fbb91906153f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461408090614ac3565b90600052602060002090601f0160209004810192826140a257600085556140e9565b82601f106140bb57805160ff19168380011785556140e9565b828001600101855582156140e9579182015b828111156140e85782518255916020019190600101906140cd565b5b5090506140f691906140fa565b5090565b5b808211156141135760008160009055506001016140fb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141608161412b565b811461416b57600080fd5b50565b60008135905061417d81614157565b92915050565b60006020828403121561419957614198614121565b5b60006141a78482850161416e565b91505092915050565b60008115159050919050565b6141c5816141b0565b82525050565b60006020820190506141e060008301846141bc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614220578082015181840152602081019050614205565b8381111561422f576000848401525b50505050565b6000601f19601f8301169050919050565b6000614251826141e6565b61425b81856141f1565b935061426b818560208601614202565b61427481614235565b840191505092915050565b600060208201905081810360008301526142998184614246565b905092915050565b6000819050919050565b6142b4816142a1565b81146142bf57600080fd5b50565b6000813590506142d1816142ab565b92915050565b6000602082840312156142ed576142ec614121565b5b60006142fb848285016142c2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061432f82614304565b9050919050565b61433f81614324565b82525050565b600060208201905061435a6000830184614336565b92915050565b61436981614324565b811461437457600080fd5b50565b60008135905061438681614360565b92915050565b600080604083850312156143a3576143a2614121565b5b60006143b185828601614377565b92505060206143c2858286016142c2565b9150509250929050565b6000602082840312156143e2576143e1614121565b5b60006143f084828501614377565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61442e816142a1565b82525050565b60006144408383614425565b60208301905092915050565b6000602082019050919050565b6000614464826143f9565b61446e8185614404565b935061447983614415565b8060005b838110156144aa5781516144918882614434565b975061449c8361444c565b92505060018101905061447d565b5085935050505092915050565b600060208201905081810360008301526144d18184614459565b905092915050565b6144e2816142a1565b82525050565b60006020820190506144fd60008301846144d9565b92915050565b60008060006060848603121561451c5761451b614121565b5b600061452a86828701614377565b935050602061453b86828701614377565b925050604061454c868287016142c2565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261457b5761457a614556565b5b8235905067ffffffffffffffff8111156145985761459761455b565b5b6020830191508360208202830111156145b4576145b3614560565b5b9250929050565b600080602083850312156145d2576145d1614121565b5b600083013567ffffffffffffffff8111156145f0576145ef614126565b5b6145fc85828601614565565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61464582614235565b810181811067ffffffffffffffff821117156146645761466361460d565b5b80604052505050565b6000614677614117565b9050614683828261463c565b919050565b600067ffffffffffffffff8211156146a3576146a261460d565b5b6146ac82614235565b9050602081019050919050565b82818337600083830152505050565b60006146db6146d684614688565b61466d565b9050828152602081018484840111156146f7576146f6614608565b5b6147028482856146b9565b509392505050565b600082601f83011261471f5761471e614556565b5b813561472f8482602086016146c8565b91505092915050565b60006020828403121561474e5761474d614121565b5b600082013567ffffffffffffffff81111561476c5761476b614126565b5b6147788482850161470a565b91505092915050565b60008083601f84011261479757614796614556565b5b8235905067ffffffffffffffff8111156147b4576147b361455b565b5b6020830191508360208202830111156147d0576147cf614560565b5b9250929050565b6000806000604084860312156147f0576147ef614121565b5b60006147fe868287016142c2565b935050602084013567ffffffffffffffff81111561481f5761481e614126565b5b61482b86828701614781565b92509250509250925092565b614840816141b0565b811461484b57600080fd5b50565b60008135905061485d81614837565b92915050565b6000806040838503121561487a57614879614121565b5b600061488885828601614377565b92505060206148998582860161484e565b9150509250929050565b600067ffffffffffffffff8211156148be576148bd61460d565b5b6148c782614235565b9050602081019050919050565b60006148e76148e2846148a3565b61466d565b90508281526020810184848401111561490357614902614608565b5b61490e8482856146b9565b509392505050565b600082601f83011261492b5761492a614556565b5b813561493b8482602086016148d4565b91505092915050565b6000806000806080858703121561495e5761495d614121565b5b600061496c87828801614377565b945050602061497d87828801614377565b935050604061498e878288016142c2565b925050606085013567ffffffffffffffff8111156149af576149ae614126565b5b6149bb87828801614916565b91505092959194509250565b6000602082840312156149dd576149dc614121565b5b60006149eb8482850161484e565b91505092915050565b600080600060408486031215614a0d57614a0c614121565b5b600084013567ffffffffffffffff811115614a2b57614a2a614126565b5b614a3786828701614781565b93509350506020614a4a86828701614377565b9150509250925092565b60008060408385031215614a6b57614a6a614121565b5b6000614a7985828601614377565b9250506020614a8a85828601614377565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614adb57607f821691505b60208210811415614aef57614aee614a94565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614b51602c836141f1565b9150614b5c82614af5565b604082019050919050565b60006020820190508181036000830152614b8081614b44565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614be36021836141f1565b9150614bee82614b87565b604082019050919050565b60006020820190508181036000830152614c1281614bd6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614c756038836141f1565b9150614c8082614c19565b604082019050919050565b60006020820190508181036000830152614ca481614c68565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ce16020836141f1565b9150614cec82614cab565b602082019050919050565b60006020820190508181036000830152614d1081614cd4565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614d736031836141f1565b9150614d7e82614d17565b604082019050919050565b60006020820190508181036000830152614da281614d66565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e12826142a1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e4557614e44614dd8565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614e86601f836141f1565b9150614e9182614e50565b602082019050919050565b60006020820190508181036000830152614eb581614e79565b9050919050565b7f416d6f756e7420657863656564732062616c616e636500000000000000000000600082015250565b6000614ef26016836141f1565b9150614efd82614ebc565b602082019050919050565b60006020820190508181036000830152614f2181614ee5565b9050919050565b600081905092915050565b50565b6000614f43600083614f28565b9150614f4e82614f33565b600082019050919050565b6000614f6482614f36565b9150819050919050565b7f4661696c656420746f2073656e6420426e620000000000000000000000000000600082015250565b6000614fa46012836141f1565b9150614faf82614f6e565b602082019050919050565b60006020820190508181036000830152614fd381614f97565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000615036602b836141f1565b915061504182614fda565b604082019050919050565b6000602082019050818103600083015261506581615029565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b60006150c86030836141f1565b91506150d38261506c565b604082019050919050565b600060208201905081810360008301526150f7816150bb565b9050919050565b7f497420697320616c72656164792072657665616c656400000000000000000000600082015250565b60006151346016836141f1565b915061513f826150fe565b602082019050919050565b6000602082019050818103600083015261516381615127565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006151c6602c836141f1565b91506151d18261516a565b604082019050919050565b600060208201905081810360008301526151f5816151b9565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006152586029836141f1565b9150615263826151fc565b604082019050919050565b600060208201905081810360008301526152878161524b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006152ea602a836141f1565b91506152f58261528e565b604082019050919050565b60006020820190508181036000830152615319816152dd565b9050919050565b7f4d696e74696e6720697320706175736564000000000000000000000000000000600082015250565b60006153566011836141f1565b915061536182615320565b602082019050919050565b6000602082019050818103600083015261538581615349565b9050919050565b7f5175616e746974792063616e206e6f7420626520300000000000000000000000600082015250565b60006153c26015836141f1565b91506153cd8261538c565b602082019050919050565b600060208201905081810360008301526153f1816153b5565b9050919050565b6000615403826142a1565b915061540e836142a1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561544357615442614dd8565b5b828201905092915050565b7f4f776e6572206d696e74206f6e207075626c69632073616c6500000000000000600082015250565b60006154846019836141f1565b915061548f8261544e565b602082019050919050565b600060208201905081810360008301526154b381615477565b9050919050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b60006154f06012836141f1565b91506154fb826154ba565b602082019050919050565b6000602082019050818103600083015261551f816154e3565b9050919050565b6000615531826142a1565b915061553c836142a1565b92508282101561554f5761554e614dd8565b5b828203905092915050565b7f546f6b656e20494420686173206265656e207573656400000000000000000000600082015250565b60006155906016836141f1565b915061559b8261555a565b602082019050919050565b600060208201905081810360008301526155bf81615583565b9050919050565b6000815190506155d581614360565b92915050565b6000602082840312156155f1576155f0614121565b5b60006155ff848285016155c6565b91505092915050565b7f596f7520646f6e2774206f776e2074686973206772616e746572204e46540000600082015250565b600061563e601e836141f1565b915061564982615608565b602082019050919050565b6000602082019050818103600083015261566d81615631565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b60006156aa6017836141f1565b91506156b582615674565b602082019050919050565b600060208201905081810360008301526156d98161569d565b9050919050565b7f546f6f206d616e79206d696e7465640000000000000000000000000000000000600082015250565b6000615716600f836141f1565b9150615721826156e0565b602082019050919050565b6000602082019050818103600083015261574581615709565b9050919050565b6000615757826142a1565b9150615762836142a1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561579b5761579a614dd8565b5b828202905092915050565b7f696e636f72726563742070726963650000000000000000000000000000000000600082015250565b60006157dc600f836141f1565b91506157e7826157a6565b602082019050919050565b6000602082019050818103600083015261580b816157cf565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061586e602f836141f1565b915061587982615812565b604082019050919050565b6000602082019050818103600083015261589d81615861565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006159006026836141f1565b915061590b826158a4565b604082019050919050565b6000602082019050818103600083015261592f816158f3565b9050919050565b600081519050615945816142ab565b92915050565b60006020828403121561596157615960614121565b5b600061596f84828501615936565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006159d4602c836141f1565b91506159df82615978565b604082019050919050565b60006020820190508181036000830152615a03816159c7565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615a666029836141f1565b9150615a7182615a0a565b604082019050919050565b60006020820190508181036000830152615a9581615a59565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615af86024836141f1565b9150615b0382615a9c565b604082019050919050565b60006020820190508181036000830152615b2781615aeb565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615b646019836141f1565b9150615b6f82615b2e565b602082019050919050565b60006020820190508181036000830152615b9381615b57565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615bf66032836141f1565b9150615c0182615b9a565b604082019050919050565b60006020820190508181036000830152615c2581615be9565b9050919050565b600081905092915050565b6000615c42826141e6565b615c4c8185615c2c565b9350615c5c818560208601614202565b80840191505092915050565b60008190508160005260206000209050919050565b60008154615c8a81614ac3565b615c948186615c2c565b94506001821660008114615caf5760018114615cc057615cf3565b60ff19831686528186019350615cf3565b615cc985615c68565b60005b83811015615ceb57815481890152600182019150602081019050615ccc565b838801955050505b50505092915050565b6000615d088286615c37565b9150615d148285615c37565b9150615d208284615c7d565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b6000615d5482615d2d565b615d5e8185615d38565b9350615d6e818560208601614202565b615d7781614235565b840191505092915050565b6000608082019050615d976000830187614336565b615da46020830186614336565b615db160408301856144d9565b8181036060830152615dc38184615d49565b905095945050505050565b600081519050615ddd81614157565b92915050565b600060208284031215615df957615df8614121565b5b6000615e0784828501615dce565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615e4a826142a1565b9150615e55836142a1565b925082615e6557615e64615e10565b5b828204905092915050565b6000615e7b826142a1565b9150615e86836142a1565b925082615e9657615e95615e10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615f066020836141f1565b9150615f1182615ed0565b602082019050919050565b60006020820190508181036000830152615f3581615ef9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615f72601c836141f1565b9150615f7d82615f3c565b602082019050919050565b60006020820190508181036000830152615fa181615f65565b905091905056fea2646970667358221220c6ef346470af820e3f23325f05f9fd8e08e87f36b13d870556fec4d1d6bfcfbb64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000685c682846f000000000000000000000000000000000000000000000000000000000000633499b00000000000000000000000003112352ca058d39a861c1fec3753b64b70da675f000000000000000000000000000000000000000000000000000000000000000a456b7461506f7274616c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a454b5441504f5254414c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5369746f7145713745574a734837787563733834417737764d43437037364a42686f4171437069323139704b2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): EktaPortal
Arg [1] : _symbol (string): EKTAPORTAL
Arg [2] : _initBaseURI (string): ipfs://QmSitoqEq7EWJsH7xucs84Aw7vMCCp76JBhoAqCpi219pK/
Arg [3] : _baseUriExtension (string): .json
Arg [4] : _maxSupply (uint256): 10000
Arg [5] : _maxMintPerAddress (uint256): 100
Arg [6] : _price (uint256): 470000000000000000
Arg [7] : _publicMintingStartTimestamp (uint256): 1664391600
Arg [8] : _freeAccessGranter (address): 0x3112352cA058D39A861c1FeC3753B64b70da675F
-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [6] : 0000000000000000000000000000000000000000000000000685c682846f0000
Arg [7] : 00000000000000000000000000000000000000000000000000000000633499b0
Arg [8] : 0000000000000000000000003112352ca058d39a861c1fec3753b64b70da675f
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [10] : 456b7461506f7274616c00000000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [12] : 454b5441504f5254414c00000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [14] : 697066733a2f2f516d5369746f7145713745574a734837787563733834417737
Arg [15] : 764d43437037364a42686f4171437069323139704b2f00000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [17] : 2e6a736f6e000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
67181:9386:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45028:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31792:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33485:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33008:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72164:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71735:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45831:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34404:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10211:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71480:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67692:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71138:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45412:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10058:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67587:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34851:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66735:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70820:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46021:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67782:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66356:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67626:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70248:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31399:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31042:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9038:103;;;;;;;;;;;;;:::i;:::-;;10451:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8387:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70063:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31961:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67665:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73414:2406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33865:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35107:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67733:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73063:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9999:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70502:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64295:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72555:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76328:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76024:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64339:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66533:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34123:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9296:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45028:300;45175:4;45232:35;45217:50;;;:11;:50;;;;:103;;;;45284:36;45308:11;45284:23;:36::i;:::-;45217:103;45197:123;;45028:300;;;:::o;31792:100::-;31846:13;31879:5;31872:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31792:100;:::o;33485:308::-;33606:7;33653:16;33661:7;33653;:16::i;:::-;33631:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;33761:15;:24;33777:7;33761:24;;;;;;;;;;;;;;;;;;;;;33754:31;;33485:308;;;:::o;33008:411::-;33089:13;33105:23;33120:7;33105:14;:23::i;:::-;33089:39;;33153:5;33147:11;;:2;:11;;;;33139:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33247:5;33231:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33256:37;33273:5;33280:12;:10;:12::i;:::-;33256:16;:37::i;:::-;33231:62;33209:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33390:21;33399:2;33403:7;33390:8;:21::i;:::-;33078:341;33008:411;;:::o;72164:187::-;72276:16;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72317:26:::1;72337:5;72317:19;:26::i;:::-;72310:33;;72164:187:::0;;;:::o;71735:178::-;71849:7;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71881:17:::1;:24;71899:5;71881:24;;;;;;;;;;;;;;;;71874:31;;71735:178:::0;;;:::o;45831:113::-;45892:7;45919:10;:17;;;;45912:24;;45831:113;:::o;34404:376::-;34613:41;34632:12;:10;:12::i;:::-;34646:7;34613:18;:41::i;:::-;34591:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;34744:28;34754:4;34760:2;34764:7;34744:9;:28::i;:::-;34404:376;;;:::o;10211:232::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10326:9:::1;10321:115;10345:10;;:17;;10341:1;:21;10321:115;;;10420:4;10384:18;:33;10403:10;;10414:1;10403:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10384:33;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;10364:3;;;;;:::i;:::-;;;;10321:115;;;;10211:232:::0;;:::o;71480:176::-;71593:7;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71625:16:::1;:23;71642:5;71625:23;;;;;;;;;;;;;;;;71618:30;;71480:176:::0;;;:::o;67692:34::-;;;;;;;;;;;;;:::o;71138:264::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3312:1:::1;3910:7;;:19;;3902:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3312:1;4043:7;:18;;;;71233:21:::2;71223:6;:31;;71215:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71293:9;71316:7;:5;:7::i;:::-;71308:21;;71337:6;71308:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71292:56;;;71367:4;71359:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;71204:198;3268:1:::1;4222:7;:22;;;;71138:264:::0;:::o;45412:343::-;45554:7;45609:23;45626:5;45609:16;:23::i;:::-;45601:5;:31;45579:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;45721:12;:19;45734:5;45721:19;;;;;;;;;;;;;;;:26;45741:5;45721:26;;;;;;;;;;;;45714:33;;45412:343;;;;:::o;10058:145::-;10120:4;10156:7;:5;:7::i;:::-;10144:19;;:8;:19;;;:51;;;;10167:18;:28;10186:8;10167:28;;;;;;;;;;;;;;;;;;;;;;;;;10144:51;10137:58;;10058:145;;;:::o;67587:32::-;;;;;;;;;;;;;:::o;34851:185::-;34989:39;35006:4;35012:2;35016:7;34989:39;;;;;;;;;;;;:16;:39::i;:::-;34851:185;;;:::o;66735:221::-;66806:41;66825:12;:10;:12::i;:::-;66839:7;66806:18;:41::i;:::-;66784:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;66934:14;66940:7;66934:5;:14::i;:::-;66735:221;:::o;70820:239::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70907:10:::1;;;;;;;;;;;70906:11;70898:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;70968:4;70955:10;;:17;;;;;;;;;;;;;;;;;;70983:28;70994:16;70983:10;:28::i;:::-;71027:24;71034:16;71027:24;;;;;;:::i;:::-;;;;;;;;70820:239:::0;:::o;46021:320::-;46141:7;46196:30;:28;:30::i;:::-;46188:5;:38;46166:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;46316:10;46327:5;46316:17;;;;;;;;:::i;:::-;;;;;;;;;;46309:24;;46021:320;;;:::o;67782:22::-;;;;;;;;;;;;;:::o;66356:104::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66441:11:::1;66431:7;:21;;;;;;;;;;;;:::i;:::-;;66356:104:::0;:::o;67626:32::-;;;;:::o;70248:196::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70405:31:::1;70375:27;:61;;;;70248:196:::0;:::o;31399:326::-;31516:7;31541:13;31557:7;:16;31565:7;31557:16;;;;;;;;;;;;;;;;;;;;;31541:32;;31623:1;31606:19;;:5;:19;;;;31584:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31712:5;31705:12;;;31399:326;;;:::o;31042:295::-;31159:7;31223:1;31206:19;;:5;:19;;;;31184:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31313:9;:16;31323:5;31313:16;;;;;;;;;;;;;;;;31306:23;;31042:295;;;:::o;9038:103::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9103:30:::1;9130:1;9103:18;:30::i;:::-;9038:103::o:0;10451:235::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10568:9:::1;10563:116;10587:10;;:17;;10583:1;:21;10563:116;;;10662:5;10626:18;:33;10645:10;;10656:1;10645:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10626:33;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;10606:3;;;;;:::i;:::-;;;;10563:116;;;;10451:235:::0;;:::o;8387:87::-;8433:7;8460:6;;;;;;;;;;;8453:13;;8387:87;:::o;70063:92::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70138:9:::1;70130:5;:17;;;;70063:92:::0;:::o;31961:104::-;32017:13;32050:7;32043:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31961:104;:::o;67665:20::-;;;;:::o;73414:2406::-;3312:1;3910:7;;:19;;3902:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3312:1;4043:7;:18;;;;73570:15:::1;;;;;;;;;;;73569:16;73561:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73652:1;73640:8;:13;;:45;;;;73684:1;73657:16;;:23;;:28;;73640:45;73618:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;73747:26;73820:15;73776:27;;:59;;73747:88;;73848:17;73879:16;;:23;;73868:8;:34;;;;:::i;:::-;73848:54;;74036:7;:5;:7::i;:::-;74022:21;;:10;:21;;;74018:451;;;74068:21;74060:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;74193:9;;74180;74160:17;:15;:17::i;:::-;:29;;;;:::i;:::-;:42;;74134:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;74018:451;;;74380:23;;74368:9;;:35;;;;:::i;:::-;74335:8;74315:17;:15;:17::i;:::-;:28;;;;:::i;:::-;:88;;74289:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;74018:451;74511:1;74485:16;;:23;;:27;74481:727;;;74556:16;;:23;;74529;;:50;;;;;;;:::i;:::-;;;;;;;;74627:16;;:23;;74594:17;:29;74612:10;74594:29;;;;;;;;;;;;;;;;:56;;;;;;;:::i;:::-;;;;;;;;74665:18;74694:17;;;;;;;;;;;74665:47;;74732:9;74727:470;74747:16;;:23;;74743:1;:27;74727:470;;;74827:21;:42;74849:16;;74866:1;74849:19;;;;;;;:::i;:::-;;;;;;;;74827:42;;;;;;;;;;;;;;;;;;;;;74826:43;74796:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;75027:10;74984:53;;:10;:18;;;75003:16;;75020:1;75003:19;;;;;;;:::i;:::-;;;;;;;;74984:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;74954:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;75177:4;75132:21;:42;75154:16;;75171:1;75154:19;;;;;;;:::i;:::-;;;;;;;;75132:42;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;74772:3;;;;;:::i;:::-;;;;74727:470;;;;74514:694;74481:727;75238:7;:5;:7::i;:::-;75224:21;;:10;:21;;;75220:496;;75288:21;:71;;;;75334:25;75348:10;75334:13;:25::i;:::-;75288:71;:129;;;;75416:1;75384:17;:29;75402:10;75384:29;;;;;;;;;;;;;;;;:33;75288:129;75262:214;;;;;;;;;;;;:::i;:::-;;;;;;;;;75562:17;;75530:16;:28;75547:10;75530:28;;;;;;;;;;;;;;;;75519:8;:39;;;;:::i;:::-;:60;;75493:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;75676:8;75668:5;;:16;;;;:::i;:::-;75655:9;:29;75647:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;75220:496;75760:8;75728:16;:28;75745:10;75728:28;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;75779:33;75790:9;75801:10;75779;:33::i;:::-;73550:2270;;3268:1:::0;4222:7;:22;;;;73414:2406;;;:::o;33865:187::-;33992:52;34011:12;:10;:12::i;:::-;34025:8;34035;33992:18;:52::i;:::-;33865:187;;:::o;35107:365::-;35296:41;35315:12;:10;:12::i;:::-;35329:7;35296:18;:41::i;:::-;35274:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;35425:39;35439:4;35445:2;35449:7;35458:5;35425:13;:39::i;:::-;35107:365;;;;:::o;67733:42::-;;;;:::o;73063:166::-;73161:4;73190:21;:31;73212:8;73190:31;;;;;;;;;;;;;;;;;;;;;73183:38;;73063:166;;;:::o;9999:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;70502:170::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70601:16:::1;70583:15;;:34;;;;;;;;;;;;;;;;;;70633:31;70647:16;70633:31;;;;;;:::i;:::-;;;;;;;;70502:170:::0;:::o;64295:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72555:393::-;72673:13;72709:10;;;;;;;;;;;72704:201;;72762:16;72770:7;72762;:16::i;:::-;72736:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;72883:10;:8;:10::i;:::-;72876:17;;;;72704:201;72922:18;72932:7;72922:9;:18::i;:::-;72915:25;;72555:393;;;;:::o;76328:236::-;76438:9;76433:124;76457:9;;:16;;76453:1;:20;76433:124;;;76495:50;76508:10;76520;76532:9;;76542:1;76532:12;;;;;;;:::i;:::-;;;;;;;;76495;:50::i;:::-;76475:3;;;;;:::i;:::-;;;;76433:124;;;;76328:236;;;:::o;76024:130::-;76079:16;76115:31;76135:10;76115:19;:31::i;:::-;76108:38;;76024:130;:::o;64339:24::-;;;;:::o;66533:151::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66659:17:::1;66643:13;:33;;;;;;;;;;;;:::i;:::-;;66533:151:::0;:::o;34123:214::-;34265:4;34294:18;:25;34313:5;34294:25;;;;;;;;;;;;;;;:35;34320:8;34294:35;;;;;;;;;;;;;;;;;;;;;;;;;34287:42;;34123:214;;;;:::o;9296:238::-;8618:12;:10;:12::i;:::-;8607:23;;:7;:5;:7::i;:::-;:23;;;8599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9419:1:::1;9399:22;;:8;:22;;;;9377:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;9498:28;9517:8;9498:18;:28::i;:::-;9296:238:::0;:::o;30623:355::-;30770:4;30827:25;30812:40;;;:11;:40;;;;:105;;;;30884:33;30869:48;;;:11;:48;;;;30812:105;:158;;;;30934:36;30958:11;30934:23;:36::i;:::-;30812:158;30792:178;;30623:355;;;:::o;37019:127::-;37084:4;37136:1;37108:30;;:7;:16;37116:7;37108:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37101:37;;37019:127;;;:::o;7090:98::-;7143:7;7170:10;7163:17;;7090:98;:::o;41142:174::-;41244:2;41217:15;:24;41233:7;41217:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41300:7;41296:2;41262:46;;41271:23;41286:7;41271:14;:23::i;:::-;41262:46;;;;;;;;;;;;41142:174;;:::o;68660:1348::-;68754:16;68788:18;68817:17;;;;;;;;;;;68788:47;;68846:27;68876:10;:20;;;68897:5;68876:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68846:57;;68914:34;68965:19;68951:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68914:71;;69023:1;69000:19;:24;68996:81;;;69048:17;69041:24;;;;;;;68996:81;69089:22;69131:9;69143:1;69131:13;;69126:434;69151:10;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69146:1;:29;69126:434;;69201:21;:24;69223:1;69201:24;;;;;;;;;;;;;;;;;;;;;69197:73;;;69246:8;;69197:73;69315:5;69290:30;;:10;:18;;;69309:1;69290:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;;;69286:79;;69341:8;;69286:79;69417:1;69381:17;69399:14;69381:33;;;;;;;;:::i;:::-;;;;;;;:37;;;;;69433:16;;;;;:::i;:::-;;;;69488:19;69470:14;:37;69466:83;;;69528:5;;69466:83;69126:434;69177:3;;;;;:::i;:::-;;;;69126:434;;;;69685:14;69657:17;:24;:42;69653:311;;69716:32;69765:14;69751:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69716:64;;69800:9;69795:121;69819:14;69815:1;:18;69795:121;;;69880:17;69898:1;69880:20;;;;;;;;:::i;:::-;;;;;;;;69859:15;69875:1;69859:18;;;;;;;;:::i;:::-;;;;;;;:41;;;;;69835:3;;;;;:::i;:::-;;;;69795:121;;;;69937:15;69930:22;;;;;;;;;69653:311;69983:17;69976:24;;;;;;68660:1348;;;;:::o;37313:452::-;37442:4;37486:16;37494:7;37486;:16::i;:::-;37464:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;37585:13;37601:23;37616:7;37601:14;:23::i;:::-;37585:39;;37654:5;37643:16;;:7;:16;;;:64;;;;37700:7;37676:31;;:20;37688:7;37676:11;:20::i;:::-;:31;;;37643:64;:113;;;;37724:32;37741:5;37748:7;37724:16;:32::i;:::-;37643:113;37635:122;;;37313:452;;;;:::o;40409:615::-;40582:4;40555:31;;:23;40570:7;40555:14;:23::i;:::-;:31;;;40533:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;40688:1;40674:16;;:2;:16;;;;40666:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40744:39;40765:4;40771:2;40775:7;40744:20;:39::i;:::-;40848:29;40865:1;40869:7;40848:8;:29::i;:::-;40909:1;40890:9;:15;40900:4;40890:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40938:1;40921:9;:13;40931:2;40921:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40969:2;40950:7;:16;40958:7;40950:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41008:7;41004:2;40989:27;;40998:4;40989:27;;;;;;;;;;;;40409:615;;;:::o;39712:360::-;39772:13;39788:23;39803:7;39788:14;:23::i;:::-;39772:39;;39824:48;39845:5;39860:1;39864:7;39824:20;:48::i;:::-;39913:29;39930:1;39934:7;39913:8;:29::i;:::-;39975:1;39955:9;:16;39965:5;39955:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;39994:7;:16;40002:7;39994:16;;;;;;;;;;;;39987:23;;;;;;;;;;;40056:7;40052:1;40028:36;;40037:5;40028:36;;;;;;;;;;;;39761:311;39712:360;:::o;9694:191::-;9768:16;9787:6;;;;;;;;;;;9768:25;;9813:8;9804:6;;:17;;;;;;;;;;;;;;;;;;9868:8;9837:40;;9858:8;9837:40;;;;;;;;;;;;9757:128;9694:191;:::o;65512:110::-;65562:7;65589:25;:15;:23;:25::i;:::-;65582:32;;65512:110;:::o;64937:273::-;65015:9;65010:193;65034:4;65030:1;:8;65010:193;;;65060:27;:15;:25;:27::i;:::-;65102:16;65121:25;:15;:23;:25::i;:::-;65102:44;;65161:30;65171:9;65182:8;65161:9;:30::i;:::-;65045:158;65040:3;;;;;:::i;:::-;;;;65010:193;;;;64937:273;;:::o;41458:315::-;41613:8;41604:17;;:5;:17;;;;41596:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41700:8;41662:18;:25;41681:5;41662:25;;;;;;;;;;;;;;;:35;41688:8;41662:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41746:8;41724:41;;41739:5;41724:41;;;41756:8;41724:41;;;;;;:::i;:::-;;;;;;;;41458:315;;;:::o;36354:352::-;36511:28;36521:4;36527:2;36531:7;36511:9;:28::i;:::-;36572:48;36595:4;36601:2;36605:7;36614:5;36572:22;:48::i;:::-;36550:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;36354:352;;;;:::o;64693:108::-;64753:13;64786:7;64779:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64693:108;:::o;65711:578::-;65770:13;65818:16;65826:7;65818;:16::i;:::-;65796:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;65922:28;65953:10;:8;:10::i;:::-;65922:41;;66025:1;66000:14;65994:28;:32;:287;;;;;;;;;;;;;;;;;66118:14;66159:18;:7;:16;:18::i;:::-;66204:13;66075:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65994:287;65974:307;;;65711:578;;;:::o;22114:207::-;22244:4;22288:25;22273:40;;;:11;:40;;;;22266:47;;22114:207;;;:::o;46954:589::-;47098:45;47125:4;47131:2;47135:7;47098:26;:45::i;:::-;47176:1;47160:18;;:4;:18;;;47156:187;;;47195:40;47227:7;47195:31;:40::i;:::-;47156:187;;;47265:2;47257:10;;:4;:10;;;47253:90;;47284:47;47317:4;47323:7;47284:32;:47::i;:::-;47253:90;47156:187;47371:1;47357:16;;:2;:16;;;47353:183;;;47390:45;47427:7;47390:36;:45::i;:::-;47353:183;;;47463:4;47457:10;;:2;:10;;;47453:83;;47484:40;47512:2;47516:7;47484:27;:40::i;:::-;47453:83;47353:183;46954:589;;;:::o;909:114::-;974:7;1001;:14;;;994:21;;909:114;;;:::o;1031:127::-;1138:1;1120:7;:14;;;:19;;;;;;;;;;;1031:127;:::o;38107:110::-;38183:26;38193:2;38197:7;38183:26;;;;;;;;;;;;:9;:26::i;:::-;38107:110;;:::o;42338:980::-;42493:4;42514:15;:2;:13;;;:15::i;:::-;42510:801;;;42583:2;42567:36;;;42626:12;:10;:12::i;:::-;42661:4;42688:7;42718:5;42567:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42546:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42942:1;42925:6;:13;:18;42921:320;;;42968:108;;;;;;;;;;:::i;:::-;;;;;;;;42921:320;43191:6;43185:13;43176:6;43172:2;43168:15;43161:38;42546:710;42816:41;;;42806:51;;;:6;:51;;;;42799:58;;;;;42510:801;43295:4;43288:11;;42338:980;;;;;;;:::o;4622:723::-;4678:13;4908:1;4899:5;:10;4895:53;;;4926:10;;;;;;;;;;;;;;;;;;;;;4895:53;4958:12;4973:5;4958:20;;4989:14;5014:78;5029:1;5021:4;:9;5014:78;;5047:8;;;;;:::i;:::-;;;;5078:2;5070:10;;;;;:::i;:::-;;;5014:78;;;5102:19;5134:6;5124:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5102:39;;5152:154;5168:1;5159:5;:10;5152:154;;5196:1;5186:11;;;;;:::i;:::-;;;5263:2;5255:5;:10;;;;:::i;:::-;5242:2;:24;;;;:::i;:::-;5229:39;;5212:6;5219;5212:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5292:2;5283:11;;;;;:::i;:::-;;;5152:154;;;5330:6;5316:21;;;;;4622:723;;;;:::o;43890:126::-;;;;:::o;48266:164::-;48370:10;:17;;;;48343:15;:24;48359:7;48343:24;;;;;;;;;;;:44;;;;48398:10;48414:7;48398:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48266:164;:::o;49057:1002::-;49337:22;49387:1;49362:22;49379:4;49362:16;:22::i;:::-;:26;;;;:::i;:::-;49337:51;;49399:18;49420:17;:26;49438:7;49420:26;;;;;;;;;;;;49399:47;;49567:14;49553:10;:28;49549:328;;49598:19;49620:12;:18;49633:4;49620:18;;;;;;;;;;;;;;;:34;49639:14;49620:34;;;;;;;;;;;;49598:56;;49704:11;49671:12;:18;49684:4;49671:18;;;;;;;;;;;;;;;:30;49690:10;49671:30;;;;;;;;;;;:44;;;;49821:10;49788:17;:30;49806:11;49788:30;;;;;;;;;;;:43;;;;49583:294;49549:328;49973:17;:26;49991:7;49973:26;;;;;;;;;;;49966:33;;;50017:12;:18;50030:4;50017:18;;;;;;;;;;;;;;;:34;50036:14;50017:34;;;;;;;;;;;50010:41;;;49152:907;;49057:1002;;:::o;50354:1079::-;50607:22;50652:1;50632:10;:17;;;;:21;;;;:::i;:::-;50607:46;;50664:18;50685:15;:24;50701:7;50685:24;;;;;;;;;;;;50664:45;;51036:19;51058:10;51069:14;51058:26;;;;;;;;:::i;:::-;;;;;;;;;;51036:48;;51122:11;51097:10;51108;51097:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;51233:10;51202:15;:28;51218:11;51202:28;;;;;;;;;;;:41;;;;51374:15;:24;51390:7;51374:24;;;;;;;;;;;51367:31;;;51409:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50425:1008;;;50354:1079;:::o;47844:221::-;47929:14;47946:20;47963:2;47946:16;:20::i;:::-;47929:37;;48004:7;47977:12;:16;47990:2;47977:16;;;;;;;;;;;;;;;:24;47994:6;47977:24;;;;;;;;;;;:34;;;;48051:6;48022:17;:26;48040:7;48022:26;;;;;;;;;;;:35;;;;47918:147;47844:221;;:::o;38444:321::-;38574:18;38580:2;38584:7;38574:5;:18::i;:::-;38625:54;38656:1;38660:2;38664:7;38673:5;38625:22;:54::i;:::-;38603:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38444:321;;;:::o;11511:387::-;11571:4;11779:12;11846:7;11834:20;11826:28;;11889:1;11882:4;:8;11875:15;;;11511:387;;;:::o;39101:382::-;39195:1;39181:16;;:2;:16;;;;39173:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39254:16;39262:7;39254;:16::i;:::-;39253:17;39245:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39316:45;39345:1;39349:2;39353:7;39316:20;:45::i;:::-;39391:1;39374:9;:13;39384:2;39374:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39422:2;39403:7;:16;39411:7;39403:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39467:7;39463:2;39442:33;;39459:1;39442:33;;;;;;;;;;;;39101:382;;:::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:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:114::-;5340:6;5374:5;5368:12;5358:22;;5273:114;;;:::o;5393:184::-;5492:11;5526:6;5521:3;5514:19;5566:4;5561:3;5557:14;5542:29;;5393:184;;;;:::o;5583:132::-;5650:4;5673:3;5665:11;;5703:4;5698:3;5694:14;5686:22;;5583:132;;;:::o;5721:108::-;5798:24;5816:5;5798:24;:::i;:::-;5793:3;5786:37;5721:108;;:::o;5835:179::-;5904:10;5925:46;5967:3;5959:6;5925:46;:::i;:::-;6003:4;5998:3;5994:14;5980:28;;5835:179;;;;:::o;6020:113::-;6090:4;6122;6117:3;6113:14;6105:22;;6020:113;;;:::o;6169:732::-;6288:3;6317:54;6365:5;6317:54;:::i;:::-;6387:86;6466:6;6461:3;6387:86;:::i;:::-;6380:93;;6497:56;6547:5;6497:56;:::i;:::-;6576:7;6607:1;6592:284;6617:6;6614:1;6611:13;6592:284;;;6693:6;6687:13;6720:63;6779:3;6764:13;6720:63;:::i;:::-;6713:70;;6806:60;6859:6;6806:60;:::i;:::-;6796:70;;6652:224;6639:1;6636;6632:9;6627:14;;6592:284;;;6596:14;6892:3;6885:10;;6293:608;;;6169:732;;;;:::o;6907:373::-;7050:4;7088:2;7077:9;7073:18;7065:26;;7137:9;7131:4;7127:20;7123:1;7112:9;7108:17;7101:47;7165:108;7268:4;7259:6;7165:108;:::i;:::-;7157:116;;6907:373;;;;:::o;7286:118::-;7373:24;7391:5;7373:24;:::i;:::-;7368:3;7361:37;7286:118;;:::o;7410:222::-;7503:4;7541:2;7530:9;7526:18;7518:26;;7554:71;7622:1;7611:9;7607:17;7598:6;7554:71;:::i;:::-;7410:222;;;;:::o;7638:619::-;7715:6;7723;7731;7780:2;7768:9;7759:7;7755:23;7751:32;7748:119;;;7786:79;;:::i;:::-;7748:119;7906:1;7931:53;7976:7;7967:6;7956:9;7952:22;7931:53;:::i;:::-;7921:63;;7877:117;8033:2;8059:53;8104:7;8095:6;8084:9;8080:22;8059:53;:::i;:::-;8049:63;;8004:118;8161:2;8187:53;8232:7;8223:6;8212:9;8208:22;8187:53;:::i;:::-;8177:63;;8132:118;7638:619;;;;;:::o;8263:117::-;8372:1;8369;8362:12;8386:117;8495:1;8492;8485:12;8509:117;8618:1;8615;8608:12;8649:568;8722:8;8732:6;8782:3;8775:4;8767:6;8763:17;8759:27;8749:122;;8790:79;;:::i;:::-;8749:122;8903:6;8890:20;8880:30;;8933:18;8925:6;8922:30;8919:117;;;8955:79;;:::i;:::-;8919:117;9069:4;9061:6;9057:17;9045:29;;9123:3;9115:4;9107:6;9103:17;9093:8;9089:32;9086:41;9083:128;;;9130:79;;:::i;:::-;9083:128;8649:568;;;;;:::o;9223:559::-;9309:6;9317;9366:2;9354:9;9345:7;9341:23;9337:32;9334:119;;;9372:79;;:::i;:::-;9334:119;9520:1;9509:9;9505:17;9492:31;9550:18;9542:6;9539:30;9536:117;;;9572:79;;:::i;:::-;9536:117;9685:80;9757:7;9748:6;9737:9;9733:22;9685:80;:::i;:::-;9667:98;;;;9463:312;9223:559;;;;;:::o;9788:117::-;9897:1;9894;9887:12;9911:180;9959:77;9956:1;9949:88;10056:4;10053:1;10046:15;10080:4;10077:1;10070:15;10097:281;10180:27;10202:4;10180:27;:::i;:::-;10172:6;10168:40;10310:6;10298:10;10295:22;10274:18;10262:10;10259:34;10256:62;10253:88;;;10321:18;;:::i;:::-;10253:88;10361:10;10357:2;10350:22;10140:238;10097:281;;:::o;10384:129::-;10418:6;10445:20;;:::i;:::-;10435:30;;10474:33;10502:4;10494:6;10474:33;:::i;:::-;10384:129;;;:::o;10519:308::-;10581:4;10671:18;10663:6;10660:30;10657:56;;;10693:18;;:::i;:::-;10657:56;10731:29;10753:6;10731:29;:::i;:::-;10723:37;;10815:4;10809;10805:15;10797:23;;10519:308;;;:::o;10833:154::-;10917:6;10912:3;10907;10894:30;10979:1;10970:6;10965:3;10961:16;10954:27;10833:154;;;:::o;10993:412::-;11071:5;11096:66;11112:49;11154:6;11112:49;:::i;:::-;11096:66;:::i;:::-;11087:75;;11185:6;11178:5;11171:21;11223:4;11216:5;11212:16;11261:3;11252:6;11247:3;11243:16;11240:25;11237:112;;;11268:79;;:::i;:::-;11237:112;11358:41;11392:6;11387:3;11382;11358:41;:::i;:::-;11077:328;10993:412;;;;;:::o;11425:340::-;11481:5;11530:3;11523:4;11515:6;11511:17;11507:27;11497:122;;11538:79;;:::i;:::-;11497:122;11655:6;11642:20;11680:79;11755:3;11747:6;11740:4;11732:6;11728:17;11680:79;:::i;:::-;11671:88;;11487:278;11425:340;;;;:::o;11771:509::-;11840:6;11889:2;11877:9;11868:7;11864:23;11860:32;11857:119;;;11895:79;;:::i;:::-;11857:119;12043:1;12032:9;12028:17;12015:31;12073:18;12065:6;12062:30;12059:117;;;12095:79;;:::i;:::-;12059:117;12200:63;12255:7;12246:6;12235:9;12231:22;12200:63;:::i;:::-;12190:73;;11986:287;11771:509;;;;:::o;12303:568::-;12376:8;12386:6;12436:3;12429:4;12421:6;12417:17;12413:27;12403:122;;12444:79;;:::i;:::-;12403:122;12557:6;12544:20;12534:30;;12587:18;12579:6;12576:30;12573:117;;;12609:79;;:::i;:::-;12573:117;12723:4;12715:6;12711:17;12699:29;;12777:3;12769:4;12761:6;12757:17;12747:8;12743:32;12740:41;12737:128;;;12784:79;;:::i;:::-;12737:128;12303:568;;;;;:::o;12877:704::-;12972:6;12980;12988;13037:2;13025:9;13016:7;13012:23;13008:32;13005:119;;;13043:79;;:::i;:::-;13005:119;13163:1;13188:53;13233:7;13224:6;13213:9;13209:22;13188:53;:::i;:::-;13178:63;;13134:117;13318:2;13307:9;13303:18;13290:32;13349:18;13341:6;13338:30;13335:117;;;13371:79;;:::i;:::-;13335:117;13484:80;13556:7;13547:6;13536:9;13532:22;13484:80;:::i;:::-;13466:98;;;;13261:313;12877:704;;;;;:::o;13587:116::-;13657:21;13672:5;13657:21;:::i;:::-;13650:5;13647:32;13637:60;;13693:1;13690;13683:12;13637:60;13587:116;:::o;13709:133::-;13752:5;13790:6;13777:20;13768:29;;13806:30;13830:5;13806:30;:::i;:::-;13709:133;;;;:::o;13848:468::-;13913:6;13921;13970:2;13958:9;13949:7;13945:23;13941:32;13938:119;;;13976:79;;:::i;:::-;13938:119;14096:1;14121:53;14166:7;14157:6;14146:9;14142:22;14121:53;:::i;:::-;14111:63;;14067:117;14223:2;14249:50;14291:7;14282:6;14271:9;14267:22;14249:50;:::i;:::-;14239:60;;14194:115;13848:468;;;;;:::o;14322:307::-;14383:4;14473:18;14465:6;14462:30;14459:56;;;14495:18;;:::i;:::-;14459:56;14533:29;14555:6;14533:29;:::i;:::-;14525:37;;14617:4;14611;14607:15;14599:23;;14322:307;;;:::o;14635:410::-;14712:5;14737:65;14753:48;14794:6;14753:48;:::i;:::-;14737:65;:::i;:::-;14728:74;;14825:6;14818:5;14811:21;14863:4;14856:5;14852:16;14901:3;14892:6;14887:3;14883:16;14880:25;14877:112;;;14908:79;;:::i;:::-;14877:112;14998:41;15032:6;15027:3;15022;14998:41;:::i;:::-;14718:327;14635:410;;;;;:::o;15064:338::-;15119:5;15168:3;15161:4;15153:6;15149:17;15145:27;15135:122;;15176:79;;:::i;:::-;15135:122;15293:6;15280:20;15318:78;15392:3;15384:6;15377:4;15369:6;15365:17;15318:78;:::i;:::-;15309:87;;15125:277;15064:338;;;;:::o;15408:943::-;15503:6;15511;15519;15527;15576:3;15564:9;15555:7;15551:23;15547:33;15544:120;;;15583:79;;:::i;:::-;15544:120;15703:1;15728:53;15773:7;15764:6;15753:9;15749:22;15728:53;:::i;:::-;15718:63;;15674:117;15830:2;15856:53;15901:7;15892:6;15881:9;15877:22;15856:53;:::i;:::-;15846:63;;15801:118;15958:2;15984:53;16029:7;16020:6;16009:9;16005:22;15984:53;:::i;:::-;15974:63;;15929:118;16114:2;16103:9;16099:18;16086:32;16145:18;16137:6;16134:30;16131:117;;;16167:79;;:::i;:::-;16131:117;16272:62;16326:7;16317:6;16306:9;16302:22;16272:62;:::i;:::-;16262:72;;16057:287;15408:943;;;;;;;:::o;16357:323::-;16413:6;16462:2;16450:9;16441:7;16437:23;16433:32;16430:119;;;16468:79;;:::i;:::-;16430:119;16588:1;16613:50;16655:7;16646:6;16635:9;16631:22;16613:50;:::i;:::-;16603:60;;16559:114;16357:323;;;;:::o;16686:704::-;16781:6;16789;16797;16846:2;16834:9;16825:7;16821:23;16817:32;16814:119;;;16852:79;;:::i;:::-;16814:119;17000:1;16989:9;16985:17;16972:31;17030:18;17022:6;17019:30;17016:117;;;17052:79;;:::i;:::-;17016:117;17165:80;17237:7;17228:6;17217:9;17213:22;17165:80;:::i;:::-;17147:98;;;;16943:312;17294:2;17320:53;17365:7;17356:6;17345:9;17341:22;17320:53;:::i;:::-;17310:63;;17265:118;16686:704;;;;;:::o;17396:474::-;17464:6;17472;17521:2;17509:9;17500:7;17496:23;17492:32;17489:119;;;17527:79;;:::i;:::-;17489:119;17647:1;17672:53;17717:7;17708:6;17697:9;17693:22;17672:53;:::i;:::-;17662:63;;17618:117;17774:2;17800:53;17845:7;17836:6;17825:9;17821:22;17800:53;:::i;:::-;17790:63;;17745:118;17396:474;;;;;:::o;17876:180::-;17924:77;17921:1;17914:88;18021:4;18018:1;18011:15;18045:4;18042:1;18035:15;18062:320;18106:6;18143:1;18137:4;18133:12;18123:22;;18190:1;18184:4;18180:12;18211:18;18201:81;;18267:4;18259:6;18255:17;18245:27;;18201:81;18329:2;18321:6;18318:14;18298:18;18295:38;18292:84;;;18348:18;;:::i;:::-;18292:84;18113:269;18062:320;;;:::o;18388:231::-;18528:34;18524:1;18516:6;18512:14;18505:58;18597:14;18592:2;18584:6;18580:15;18573:39;18388:231;:::o;18625:366::-;18767:3;18788:67;18852:2;18847:3;18788:67;:::i;:::-;18781:74;;18864:93;18953:3;18864:93;:::i;:::-;18982:2;18977:3;18973:12;18966:19;;18625:366;;;:::o;18997:419::-;19163:4;19201:2;19190:9;19186:18;19178:26;;19250:9;19244:4;19240:20;19236:1;19225:9;19221:17;19214:47;19278:131;19404:4;19278:131;:::i;:::-;19270:139;;18997:419;;;:::o;19422:220::-;19562:34;19558:1;19550:6;19546:14;19539:58;19631:3;19626:2;19618:6;19614:15;19607:28;19422:220;:::o;19648:366::-;19790:3;19811:67;19875:2;19870:3;19811:67;:::i;:::-;19804:74;;19887:93;19976:3;19887:93;:::i;:::-;20005:2;20000:3;19996:12;19989:19;;19648:366;;;:::o;20020:419::-;20186:4;20224:2;20213:9;20209:18;20201:26;;20273:9;20267:4;20263:20;20259:1;20248:9;20244:17;20237:47;20301:131;20427:4;20301:131;:::i;:::-;20293:139;;20020:419;;;:::o;20445:243::-;20585:34;20581:1;20573:6;20569:14;20562:58;20654:26;20649:2;20641:6;20637:15;20630:51;20445:243;:::o;20694:366::-;20836:3;20857:67;20921:2;20916:3;20857:67;:::i;:::-;20850:74;;20933:93;21022:3;20933:93;:::i;:::-;21051:2;21046:3;21042:12;21035:19;;20694:366;;;:::o;21066:419::-;21232:4;21270:2;21259:9;21255:18;21247:26;;21319:9;21313:4;21309:20;21305:1;21294:9;21290:17;21283:47;21347:131;21473:4;21347:131;:::i;:::-;21339:139;;21066:419;;;:::o;21491:182::-;21631:34;21627:1;21619:6;21615:14;21608:58;21491:182;:::o;21679:366::-;21821:3;21842:67;21906:2;21901:3;21842:67;:::i;:::-;21835:74;;21918:93;22007:3;21918:93;:::i;:::-;22036:2;22031:3;22027:12;22020:19;;21679:366;;;:::o;22051:419::-;22217:4;22255:2;22244:9;22240:18;22232:26;;22304:9;22298:4;22294:20;22290:1;22279:9;22275:17;22268:47;22332:131;22458:4;22332:131;:::i;:::-;22324:139;;22051:419;;;:::o;22476:236::-;22616:34;22612:1;22604:6;22600:14;22593:58;22685:19;22680:2;22672:6;22668:15;22661:44;22476:236;:::o;22718:366::-;22860:3;22881:67;22945:2;22940:3;22881:67;:::i;:::-;22874:74;;22957:93;23046:3;22957:93;:::i;:::-;23075:2;23070:3;23066:12;23059:19;;22718:366;;;:::o;23090:419::-;23256:4;23294:2;23283:9;23279:18;23271:26;;23343:9;23337:4;23333:20;23329:1;23318:9;23314:17;23307:47;23371:131;23497:4;23371:131;:::i;:::-;23363:139;;23090:419;;;:::o;23515:180::-;23563:77;23560:1;23553:88;23660:4;23657:1;23650:15;23684:4;23681:1;23674:15;23701:180;23749:77;23746:1;23739:88;23846:4;23843:1;23836:15;23870:4;23867:1;23860:15;23887:233;23926:3;23949:24;23967:5;23949:24;:::i;:::-;23940:33;;23995:66;23988:5;23985:77;23982:103;;;24065:18;;:::i;:::-;23982:103;24112:1;24105:5;24101:13;24094:20;;23887:233;;;:::o;24126:181::-;24266:33;24262:1;24254:6;24250:14;24243:57;24126:181;:::o;24313:366::-;24455:3;24476:67;24540:2;24535:3;24476:67;:::i;:::-;24469:74;;24552:93;24641:3;24552:93;:::i;:::-;24670:2;24665:3;24661:12;24654:19;;24313:366;;;:::o;24685:419::-;24851:4;24889:2;24878:9;24874:18;24866:26;;24938:9;24932:4;24928:20;24924:1;24913:9;24909:17;24902:47;24966:131;25092:4;24966:131;:::i;:::-;24958:139;;24685:419;;;:::o;25110:172::-;25250:24;25246:1;25238:6;25234:14;25227:48;25110:172;:::o;25288:366::-;25430:3;25451:67;25515:2;25510:3;25451:67;:::i;:::-;25444:74;;25527:93;25616:3;25527:93;:::i;:::-;25645:2;25640:3;25636:12;25629:19;;25288:366;;;:::o;25660:419::-;25826:4;25864:2;25853:9;25849:18;25841:26;;25913:9;25907:4;25903:20;25899:1;25888:9;25884:17;25877:47;25941:131;26067:4;25941:131;:::i;:::-;25933:139;;25660:419;;;:::o;26085:147::-;26186:11;26223:3;26208:18;;26085:147;;;;:::o;26238:114::-;;:::o;26358:398::-;26517:3;26538:83;26619:1;26614:3;26538:83;:::i;:::-;26531:90;;26630:93;26719:3;26630:93;:::i;:::-;26748:1;26743:3;26739:11;26732:18;;26358:398;;;:::o;26762:379::-;26946:3;26968:147;27111:3;26968:147;:::i;:::-;26961:154;;27132:3;27125:10;;26762:379;;;:::o;27147:168::-;27287:20;27283:1;27275:6;27271:14;27264:44;27147:168;:::o;27321:366::-;27463:3;27484:67;27548:2;27543:3;27484:67;:::i;:::-;27477:74;;27560:93;27649:3;27560:93;:::i;:::-;27678:2;27673:3;27669:12;27662:19;;27321:366;;;:::o;27693:419::-;27859:4;27897:2;27886:9;27882:18;27874:26;;27946:9;27940:4;27936:20;27932:1;27921:9;27917:17;27910:47;27974:131;28100:4;27974:131;:::i;:::-;27966:139;;27693:419;;;:::o;28118:230::-;28258:34;28254:1;28246:6;28242:14;28235:58;28327:13;28322:2;28314:6;28310:15;28303:38;28118:230;:::o;28354:366::-;28496:3;28517:67;28581:2;28576:3;28517:67;:::i;:::-;28510:74;;28593:93;28682:3;28593:93;:::i;:::-;28711:2;28706:3;28702:12;28695:19;;28354:366;;;:::o;28726:419::-;28892:4;28930:2;28919:9;28915:18;28907:26;;28979:9;28973:4;28969:20;28965:1;28954:9;28950:17;28943:47;29007:131;29133:4;29007:131;:::i;:::-;28999:139;;28726:419;;;:::o;29151:235::-;29291:34;29287:1;29279:6;29275:14;29268:58;29360:18;29355:2;29347:6;29343:15;29336:43;29151:235;:::o;29392:366::-;29534:3;29555:67;29619:2;29614:3;29555:67;:::i;:::-;29548:74;;29631:93;29720:3;29631:93;:::i;:::-;29749:2;29744:3;29740:12;29733:19;;29392:366;;;:::o;29764:419::-;29930:4;29968:2;29957:9;29953:18;29945:26;;30017:9;30011:4;30007:20;30003:1;29992:9;29988:17;29981:47;30045:131;30171:4;30045:131;:::i;:::-;30037:139;;29764:419;;;:::o;30189:172::-;30329:24;30325:1;30317:6;30313:14;30306:48;30189:172;:::o;30367:366::-;30509:3;30530:67;30594:2;30589:3;30530:67;:::i;:::-;30523:74;;30606:93;30695:3;30606:93;:::i;:::-;30724:2;30719:3;30715:12;30708:19;;30367:366;;;:::o;30739:419::-;30905:4;30943:2;30932:9;30928:18;30920:26;;30992:9;30986:4;30982:20;30978:1;30967:9;30963:17;30956:47;31020:131;31146:4;31020:131;:::i;:::-;31012:139;;30739:419;;;:::o;31164:231::-;31304:34;31300:1;31292:6;31288:14;31281:58;31373:14;31368:2;31360:6;31356:15;31349:39;31164:231;:::o;31401:366::-;31543:3;31564:67;31628:2;31623:3;31564:67;:::i;:::-;31557:74;;31640:93;31729:3;31640:93;:::i;:::-;31758:2;31753:3;31749:12;31742:19;;31401:366;;;:::o;31773:419::-;31939:4;31977:2;31966:9;31962:18;31954:26;;32026:9;32020:4;32016:20;32012:1;32001:9;31997:17;31990:47;32054:131;32180:4;32054:131;:::i;:::-;32046:139;;31773:419;;;:::o;32198:228::-;32338:34;32334:1;32326:6;32322:14;32315:58;32407:11;32402:2;32394:6;32390:15;32383:36;32198:228;:::o;32432:366::-;32574:3;32595:67;32659:2;32654:3;32595:67;:::i;:::-;32588:74;;32671:93;32760:3;32671:93;:::i;:::-;32789:2;32784:3;32780:12;32773:19;;32432:366;;;:::o;32804:419::-;32970:4;33008:2;32997:9;32993:18;32985:26;;33057:9;33051:4;33047:20;33043:1;33032:9;33028:17;33021:47;33085:131;33211:4;33085:131;:::i;:::-;33077:139;;32804:419;;;:::o;33229:229::-;33369:34;33365:1;33357:6;33353:14;33346:58;33438:12;33433:2;33425:6;33421:15;33414:37;33229:229;:::o;33464:366::-;33606:3;33627:67;33691:2;33686:3;33627:67;:::i;:::-;33620:74;;33703:93;33792:3;33703:93;:::i;:::-;33821:2;33816:3;33812:12;33805:19;;33464:366;;;:::o;33836:419::-;34002:4;34040:2;34029:9;34025:18;34017:26;;34089:9;34083:4;34079:20;34075:1;34064:9;34060:17;34053:47;34117:131;34243:4;34117:131;:::i;:::-;34109:139;;33836:419;;;:::o;34261:167::-;34401:19;34397:1;34389:6;34385:14;34378:43;34261:167;:::o;34434:366::-;34576:3;34597:67;34661:2;34656:3;34597:67;:::i;:::-;34590:74;;34673:93;34762:3;34673:93;:::i;:::-;34791:2;34786:3;34782:12;34775:19;;34434:366;;;:::o;34806:419::-;34972:4;35010:2;34999:9;34995:18;34987:26;;35059:9;35053:4;35049:20;35045:1;35034:9;35030:17;35023:47;35087:131;35213:4;35087:131;:::i;:::-;35079:139;;34806:419;;;:::o;35231:171::-;35371:23;35367:1;35359:6;35355:14;35348:47;35231:171;:::o;35408:366::-;35550:3;35571:67;35635:2;35630:3;35571:67;:::i;:::-;35564:74;;35647:93;35736:3;35647:93;:::i;:::-;35765:2;35760:3;35756:12;35749:19;;35408:366;;;:::o;35780:419::-;35946:4;35984:2;35973:9;35969:18;35961:26;;36033:9;36027:4;36023:20;36019:1;36008:9;36004:17;35997:47;36061:131;36187:4;36061:131;:::i;:::-;36053:139;;35780:419;;;:::o;36205:305::-;36245:3;36264:20;36282:1;36264:20;:::i;:::-;36259:25;;36298:20;36316:1;36298:20;:::i;:::-;36293:25;;36452:1;36384:66;36380:74;36377:1;36374:81;36371:107;;;36458:18;;:::i;:::-;36371:107;36502:1;36499;36495:9;36488:16;;36205:305;;;;:::o;36516:175::-;36656:27;36652:1;36644:6;36640:14;36633:51;36516:175;:::o;36697:366::-;36839:3;36860:67;36924:2;36919:3;36860:67;:::i;:::-;36853:74;;36936:93;37025:3;36936:93;:::i;:::-;37054:2;37049:3;37045:12;37038:19;;36697:366;;;:::o;37069:419::-;37235:4;37273:2;37262:9;37258:18;37250:26;;37322:9;37316:4;37312:20;37308:1;37297:9;37293:17;37286:47;37350:131;37476:4;37350:131;:::i;:::-;37342:139;;37069:419;;;:::o;37494:168::-;37634:20;37630:1;37622:6;37618:14;37611:44;37494:168;:::o;37668:366::-;37810:3;37831:67;37895:2;37890:3;37831:67;:::i;:::-;37824:74;;37907:93;37996:3;37907:93;:::i;:::-;38025:2;38020:3;38016:12;38009:19;;37668:366;;;:::o;38040:419::-;38206:4;38244:2;38233:9;38229:18;38221:26;;38293:9;38287:4;38283:20;38279:1;38268:9;38264:17;38257:47;38321:131;38447:4;38321:131;:::i;:::-;38313:139;;38040:419;;;:::o;38465:191::-;38505:4;38525:20;38543:1;38525:20;:::i;:::-;38520:25;;38559:20;38577:1;38559:20;:::i;:::-;38554:25;;38598:1;38595;38592:8;38589:34;;;38603:18;;:::i;:::-;38589:34;38648:1;38645;38641:9;38633:17;;38465:191;;;;:::o;38662:172::-;38802:24;38798:1;38790:6;38786:14;38779:48;38662:172;:::o;38840:366::-;38982:3;39003:67;39067:2;39062:3;39003:67;:::i;:::-;38996:74;;39079:93;39168:3;39079:93;:::i;:::-;39197:2;39192:3;39188:12;39181:19;;38840:366;;;:::o;39212:419::-;39378:4;39416:2;39405:9;39401:18;39393:26;;39465:9;39459:4;39455:20;39451:1;39440:9;39436:17;39429:47;39493:131;39619:4;39493:131;:::i;:::-;39485:139;;39212:419;;;:::o;39637:143::-;39694:5;39725:6;39719:13;39710:22;;39741:33;39768:5;39741:33;:::i;:::-;39637:143;;;;:::o;39786:351::-;39856:6;39905:2;39893:9;39884:7;39880:23;39876:32;39873:119;;;39911:79;;:::i;:::-;39873:119;40031:1;40056:64;40112:7;40103:6;40092:9;40088:22;40056:64;:::i;:::-;40046:74;;40002:128;39786:351;;;;:::o;40143:180::-;40283:32;40279:1;40271:6;40267:14;40260:56;40143:180;:::o;40329:366::-;40471:3;40492:67;40556:2;40551:3;40492:67;:::i;:::-;40485:74;;40568:93;40657:3;40568:93;:::i;:::-;40686:2;40681:3;40677:12;40670:19;;40329:366;;;:::o;40701:419::-;40867:4;40905:2;40894:9;40890:18;40882:26;;40954:9;40948:4;40944:20;40940:1;40929:9;40925:17;40918:47;40982:131;41108:4;40982:131;:::i;:::-;40974:139;;40701:419;;;:::o;41126:173::-;41266:25;41262:1;41254:6;41250:14;41243:49;41126:173;:::o;41305:366::-;41447:3;41468:67;41532:2;41527:3;41468:67;:::i;:::-;41461:74;;41544:93;41633:3;41544:93;:::i;:::-;41662:2;41657:3;41653:12;41646:19;;41305:366;;;:::o;41677:419::-;41843:4;41881:2;41870:9;41866:18;41858:26;;41930:9;41924:4;41920:20;41916:1;41905:9;41901:17;41894:47;41958:131;42084:4;41958:131;:::i;:::-;41950:139;;41677:419;;;:::o;42102:165::-;42242:17;42238:1;42230:6;42226:14;42219:41;42102:165;:::o;42273:366::-;42415:3;42436:67;42500:2;42495:3;42436:67;:::i;:::-;42429:74;;42512:93;42601:3;42512:93;:::i;:::-;42630:2;42625:3;42621:12;42614:19;;42273:366;;;:::o;42645:419::-;42811:4;42849:2;42838:9;42834:18;42826:26;;42898:9;42892:4;42888:20;42884:1;42873:9;42869:17;42862:47;42926:131;43052:4;42926:131;:::i;:::-;42918:139;;42645:419;;;:::o;43070:348::-;43110:7;43133:20;43151:1;43133:20;:::i;:::-;43128:25;;43167:20;43185:1;43167:20;:::i;:::-;43162:25;;43355:1;43287:66;43283:74;43280:1;43277:81;43272:1;43265:9;43258:17;43254:105;43251:131;;;43362:18;;:::i;:::-;43251:131;43410:1;43407;43403:9;43392:20;;43070:348;;;;:::o;43424:165::-;43564:17;43560:1;43552:6;43548:14;43541:41;43424:165;:::o;43595:366::-;43737:3;43758:67;43822:2;43817:3;43758:67;:::i;:::-;43751:74;;43834:93;43923:3;43834:93;:::i;:::-;43952:2;43947:3;43943:12;43936:19;;43595:366;;;:::o;43967:419::-;44133:4;44171:2;44160:9;44156:18;44148:26;;44220:9;44214:4;44210:20;44206:1;44195:9;44191:17;44184:47;44248:131;44374:4;44248:131;:::i;:::-;44240:139;;43967:419;;;:::o;44392:234::-;44532:34;44528:1;44520:6;44516:14;44509:58;44601:17;44596:2;44588:6;44584:15;44577:42;44392:234;:::o;44632:366::-;44774:3;44795:67;44859:2;44854:3;44795:67;:::i;:::-;44788:74;;44871:93;44960:3;44871:93;:::i;:::-;44989:2;44984:3;44980:12;44973:19;;44632:366;;;:::o;45004:419::-;45170:4;45208:2;45197:9;45193:18;45185:26;;45257:9;45251:4;45247:20;45243:1;45232:9;45228:17;45221:47;45285:131;45411:4;45285:131;:::i;:::-;45277:139;;45004:419;;;:::o;45429:225::-;45569:34;45565:1;45557:6;45553:14;45546:58;45638:8;45633:2;45625:6;45621:15;45614:33;45429:225;:::o;45660:366::-;45802:3;45823:67;45887:2;45882:3;45823:67;:::i;:::-;45816:74;;45899:93;45988:3;45899:93;:::i;:::-;46017:2;46012:3;46008:12;46001:19;;45660:366;;;:::o;46032:419::-;46198:4;46236:2;46225:9;46221:18;46213:26;;46285:9;46279:4;46275:20;46271:1;46260:9;46256:17;46249:47;46313:131;46439:4;46313:131;:::i;:::-;46305:139;;46032:419;;;:::o;46457:143::-;46514:5;46545:6;46539:13;46530:22;;46561:33;46588:5;46561:33;:::i;:::-;46457:143;;;;:::o;46606:351::-;46676:6;46725:2;46713:9;46704:7;46700:23;46696:32;46693:119;;;46731:79;;:::i;:::-;46693:119;46851:1;46876:64;46932:7;46923:6;46912:9;46908:22;46876:64;:::i;:::-;46866:74;;46822:128;46606:351;;;;:::o;46963:231::-;47103:34;47099:1;47091:6;47087:14;47080:58;47172:14;47167:2;47159:6;47155:15;47148:39;46963:231;:::o;47200:366::-;47342:3;47363:67;47427:2;47422:3;47363:67;:::i;:::-;47356:74;;47439:93;47528:3;47439:93;:::i;:::-;47557:2;47552:3;47548:12;47541:19;;47200:366;;;:::o;47572:419::-;47738:4;47776:2;47765:9;47761:18;47753:26;;47825:9;47819:4;47815:20;47811:1;47800:9;47796:17;47789:47;47853:131;47979:4;47853:131;:::i;:::-;47845:139;;47572:419;;;:::o;47997:228::-;48137:34;48133:1;48125:6;48121:14;48114:58;48206:11;48201:2;48193:6;48189:15;48182:36;47997:228;:::o;48231:366::-;48373:3;48394:67;48458:2;48453:3;48394:67;:::i;:::-;48387:74;;48470:93;48559:3;48470:93;:::i;:::-;48588:2;48583:3;48579:12;48572:19;;48231:366;;;:::o;48603:419::-;48769:4;48807:2;48796:9;48792:18;48784:26;;48856:9;48850:4;48846:20;48842:1;48831:9;48827:17;48820:47;48884:131;49010:4;48884:131;:::i;:::-;48876:139;;48603:419;;;:::o;49028:223::-;49168:34;49164:1;49156:6;49152:14;49145:58;49237:6;49232:2;49224:6;49220:15;49213:31;49028:223;:::o;49257:366::-;49399:3;49420:67;49484:2;49479:3;49420:67;:::i;:::-;49413:74;;49496:93;49585:3;49496:93;:::i;:::-;49614:2;49609:3;49605:12;49598:19;;49257:366;;;:::o;49629:419::-;49795:4;49833:2;49822:9;49818:18;49810:26;;49882:9;49876:4;49872:20;49868:1;49857:9;49853:17;49846:47;49910:131;50036:4;49910:131;:::i;:::-;49902:139;;49629:419;;;:::o;50054:175::-;50194:27;50190:1;50182:6;50178:14;50171:51;50054:175;:::o;50235:366::-;50377:3;50398:67;50462:2;50457:3;50398:67;:::i;:::-;50391:74;;50474:93;50563:3;50474:93;:::i;:::-;50592:2;50587:3;50583:12;50576:19;;50235:366;;;:::o;50607:419::-;50773:4;50811:2;50800:9;50796:18;50788:26;;50860:9;50854:4;50850:20;50846:1;50835:9;50831:17;50824:47;50888:131;51014:4;50888:131;:::i;:::-;50880:139;;50607:419;;;:::o;51032:237::-;51172:34;51168:1;51160:6;51156:14;51149:58;51241:20;51236:2;51228:6;51224:15;51217:45;51032:237;:::o;51275:366::-;51417:3;51438:67;51502:2;51497:3;51438:67;:::i;:::-;51431:74;;51514:93;51603:3;51514:93;:::i;:::-;51632:2;51627:3;51623:12;51616:19;;51275:366;;;:::o;51647:419::-;51813:4;51851:2;51840:9;51836:18;51828:26;;51900:9;51894:4;51890:20;51886:1;51875:9;51871:17;51864:47;51928:131;52054:4;51928:131;:::i;:::-;51920:139;;51647:419;;;:::o;52072:148::-;52174:11;52211:3;52196:18;;52072:148;;;;:::o;52226:377::-;52332:3;52360:39;52393:5;52360:39;:::i;:::-;52415:89;52497:6;52492:3;52415:89;:::i;:::-;52408:96;;52513:52;52558:6;52553:3;52546:4;52539:5;52535:16;52513:52;:::i;:::-;52590:6;52585:3;52581:16;52574:23;;52336:267;52226:377;;;;:::o;52609:141::-;52658:4;52681:3;52673:11;;52704:3;52701:1;52694:14;52738:4;52735:1;52725:18;52717:26;;52609:141;;;:::o;52780:845::-;52883:3;52920:5;52914:12;52949:36;52975:9;52949:36;:::i;:::-;53001:89;53083:6;53078:3;53001:89;:::i;:::-;52994:96;;53121:1;53110:9;53106:17;53137:1;53132:137;;;;53283:1;53278:341;;;;53099:520;;53132:137;53216:4;53212:9;53201;53197:25;53192:3;53185:38;53252:6;53247:3;53243:16;53236:23;;53132:137;;53278:341;53345:38;53377:5;53345:38;:::i;:::-;53405:1;53419:154;53433:6;53430:1;53427:13;53419:154;;;53507:7;53501:14;53497:1;53492:3;53488:11;53481:35;53557:1;53548:7;53544:15;53533:26;;53455:4;53452:1;53448:12;53443:17;;53419:154;;;53602:6;53597:3;53593:16;53586:23;;53285:334;;53099:520;;52887:738;;52780:845;;;;:::o;53631:589::-;53856:3;53878:95;53969:3;53960:6;53878:95;:::i;:::-;53871:102;;53990:95;54081:3;54072:6;53990:95;:::i;:::-;53983:102;;54102:92;54190:3;54181:6;54102:92;:::i;:::-;54095:99;;54211:3;54204:10;;53631:589;;;;;;:::o;54226:98::-;54277:6;54311:5;54305:12;54295:22;;54226:98;;;:::o;54330:168::-;54413:11;54447:6;54442:3;54435:19;54487:4;54482:3;54478:14;54463:29;;54330:168;;;;:::o;54504:360::-;54590:3;54618:38;54650:5;54618:38;:::i;:::-;54672:70;54735:6;54730:3;54672:70;:::i;:::-;54665:77;;54751:52;54796:6;54791:3;54784:4;54777:5;54773:16;54751:52;:::i;:::-;54828:29;54850:6;54828:29;:::i;:::-;54823:3;54819:39;54812:46;;54594:270;54504:360;;;;:::o;54870:640::-;55065:4;55103:3;55092:9;55088:19;55080:27;;55117:71;55185:1;55174:9;55170:17;55161:6;55117:71;:::i;:::-;55198:72;55266:2;55255:9;55251:18;55242:6;55198:72;:::i;:::-;55280;55348:2;55337:9;55333:18;55324:6;55280:72;:::i;:::-;55399:9;55393:4;55389:20;55384:2;55373:9;55369:18;55362:48;55427:76;55498:4;55489:6;55427:76;:::i;:::-;55419:84;;54870:640;;;;;;;:::o;55516:141::-;55572:5;55603:6;55597:13;55588:22;;55619:32;55645:5;55619:32;:::i;:::-;55516:141;;;;:::o;55663:349::-;55732:6;55781:2;55769:9;55760:7;55756:23;55752:32;55749:119;;;55787:79;;:::i;:::-;55749:119;55907:1;55932:63;55987:7;55978:6;55967:9;55963:22;55932:63;:::i;:::-;55922:73;;55878:127;55663:349;;;;:::o;56018:180::-;56066:77;56063:1;56056:88;56163:4;56160:1;56153:15;56187:4;56184:1;56177:15;56204:185;56244:1;56261:20;56279:1;56261:20;:::i;:::-;56256:25;;56295:20;56313:1;56295:20;:::i;:::-;56290:25;;56334:1;56324:35;;56339:18;;:::i;:::-;56324:35;56381:1;56378;56374:9;56369:14;;56204:185;;;;:::o;56395:176::-;56427:1;56444:20;56462:1;56444:20;:::i;:::-;56439:25;;56478:20;56496:1;56478:20;:::i;:::-;56473:25;;56517:1;56507:35;;56522:18;;:::i;:::-;56507:35;56563:1;56560;56556:9;56551:14;;56395:176;;;;:::o;56577:180::-;56625:77;56622:1;56615:88;56722:4;56719:1;56712:15;56746:4;56743:1;56736:15;56763:182;56903:34;56899:1;56891:6;56887:14;56880:58;56763:182;:::o;56951:366::-;57093:3;57114:67;57178:2;57173:3;57114:67;:::i;:::-;57107:74;;57190:93;57279:3;57190:93;:::i;:::-;57308:2;57303:3;57299:12;57292:19;;56951:366;;;:::o;57323:419::-;57489:4;57527:2;57516:9;57512:18;57504:26;;57576:9;57570:4;57566:20;57562:1;57551:9;57547:17;57540:47;57604:131;57730:4;57604:131;:::i;:::-;57596:139;;57323:419;;;:::o;57748:178::-;57888:30;57884:1;57876:6;57872:14;57865:54;57748:178;:::o;57932:366::-;58074:3;58095:67;58159:2;58154:3;58095:67;:::i;:::-;58088:74;;58171:93;58260:3;58171:93;:::i;:::-;58289:2;58284:3;58280:12;58273:19;;57932:366;;;:::o;58304:419::-;58470:4;58508:2;58497:9;58493:18;58485:26;;58557:9;58551:4;58547:20;58543:1;58532:9;58528:17;58521:47;58585:131;58711:4;58585:131;:::i;:::-;58577:139;;58304:419;;;:::o
Swarm Source
ipfs://c6ef346470af820e3f23325f05f9fd8e08e87f36b13d870556fec4d1d6bfcfbb
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.