ETH Price: $3,600.50 (+5.94%)

Token

ELCOCO.XYZ (COCO)
 

Overview

Max Total Supply

10,000 COCO

Holders

1,437

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ElCocoContract

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-17
*/

// %%%%%%%%%%%%%%%%%%%%%/                                                 
      // /((((((((((((((((((((((/,    (%%%%%.                                            
      // ((((((((((((((/*,.....,,/(((((((@@@(* ,%%%%%,                                         
      // (((((.  * @  *@* &@.,@ &@ @. /@%    /(@@( (%%%%%#                                       
      // (((,  @ %@ @ & @# @@( @ &@,@%( @&.@&@@  (@(  %%%%%%.                                     
      // ((( % @@ %@@@ @ @% @/@ @@&@&@@& @@@&@@& .  ((  %%%%%%%                                    
      // (( @@ @ @@&@  @@@@@@@@ @@@@@@@   ..     &@  (( #%%%%%%%                                   
      // *(. @    @@&    (@@@@     ,**                ((  %%%%%%%%                                  
      // ((                                           /(( %%%%%%%%.                                 
      // ((            ((((.           *(((/           (( #%%%%%%%%                                 
      // ((         ((((((((/        (((((((((         (( .%%%%%%%%                                 
      // ((        (((((((((         ((((((((((        ((  %%%%%%%%#                                
      // *(       (((((((((.       @ *(((((((((        ((  %%%%%%%%#                                
      // (       (((((((((/       @  (((((((((        ((                                           
      // (       (((((((((((        ((((((((((        ((                                           
      // (        ((((((((((((((((((((((((((((        ((                                           
      // (.        ((((((((((((((((((((((((((         ((.                                          
      // (*          ((((((((((((((((((((((           ((,  #%%%%%%%                                
      // ((                                           ((/ %%%%%%%%%                                
      // ((                        &&                 ((( %%%%%%%%%                                
      // /(      %@@@@@@&        (@@@@@@              ((( %%%%%%%%%                                
      // (  @@ &@/@@@@@*  /(    %@ &@@@@(  @@@@@@ ,  ((( #%%%%%%%*                                
      // ((  @ @@,%@*@@ @@@@@@@  #,@ /@@@ .,@.@ @@   ((( #%%%%%%%/,                               
      // ((, @  &@.@*@# @@@@@@@, @@&.@@#@ # @ @#@   (@(/ %%%%%%%%%%                               
      // ((/ /. @ @ @@ @@& @ @% @,.@@ @% @(@ @@,& (@#( #****%%%%%%                               
      // .((/  @.@ .@ @@@ @ @@ @  @* @, @@@ @  /(((/ %******%%%%%%                              
      // %%  ((((,   @ @%@*@ @@ @  @ /@*    *(((((* *%%#****%%%%%%%                              
      // %%%%%   ,((((((*           ,(((((((((,  .%%%%%%%%%%%%%%%%%%                             
      // ***#%%%%%%#      ./(((((((*.      .%%%%%%%%%%%%%%%%%%%#   **                            
      // ****%%%%%%%%%%%%%%%%%%%%%%%%#(%%%%%%%%%%%%%%%%%%%%    %%%                               
      // **, %%%%%****(%%%%%%%%%%%%%****%%%%%%%%*****(  %% %%( ##%%***                           
      // .    *%%    .***%%%%%%%%%%%%%%%%%%%%%%%%    ,**    #%%%%%%%%%%%%                          
      // %%%(    **  *(%  .            .%* .%# #*, **%%%%%%%%%%%%%%%%%%%                         
      // *%%%%%%%%%%%/         /(   *.     #    %%%#%%%%%%%*****%%%%%%%%%%                        
      // %%%%%%%%%%%%%%%%(****/%  ,(#% %%%%%****#%%%%%%%%%%/****#%%%%%%%%%*                       
      // %%**(%%%%%%%%%%%(**** &@@      %%%******%%%%%%%%%%%%%%%%%%%%%%%%%**                      
      // /%****(%%%%%%(%%%%%%%%%%  ((((( %%%*****(%%%%(**%%%%%%%%%%%%%%%%%%***                     
      // %*****%%%%%****%%%%%%%%         %%%%%%%%%%%%%%/%%%%%%%%%%(**%%%%%%%***                    
      // %/***%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*******#%%%%%%%%,  


// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// 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/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/nono_contract.sol



pragma solidity ^0.8.0;





contract ElCocoContract is ERC2981, ERC721Enumerable, Ownable  {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  uint256 public cost = 0.0999 ether;
  uint256 public maxSupply = 10000;
  uint256 public maxMintAmount = 10;
  bool public paused = false;
  mapping(address => bool) public whitelisted;
  uint96 royaltyFeesInBips;
  address royaltyAddress;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    uint96 _royaltyFeesInBips
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    mint(msg.sender, 10);
    setRoyaltyInfo(msg.sender, _royaltyFeesInBips);
  }

  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  // public
  function mint(address _to, uint256 _mintAmount) public payable {
    uint256 supply = totalSupply();
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply + _mintAmount <= maxSupply);

    if (msg.sender != owner()) {
      require(msg.value >= cost * _mintAmount);
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(_to, supply + i);
    }
  }

  function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
      _setDefaultRoyalty(_receiver, _royaltyFeesInBips);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  //only owner
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
 
 function whitelistUser(address _user) public onlyOwner {
    whitelisted[_user] = true;
  }
 
  function removeWhitelistUser(address _user) public onlyOwner {
    whitelisted[_user] = false;
  }

  function withdraw() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }

  function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721Enumerable, ERC2981)
        returns (bool)
    {
        return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeWhitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200005192919062001075565b50670162ea854d0fc000600f55612710601055600a6011556000601260006101000a81548160ff0219169083151502179055503480156200009157600080fd5b5060405162006631380380620066318339818101604052810190620000b7919062001203565b83838160029080519060200190620000d192919062001075565b508060039080519060200190620000ea92919062001075565b5050506200010d620001016200014d60201b60201c565b6200015560201b60201c565b6200011e826200021b60201b60201c565b6200013133600a620002c660201b60201c565b620001433382620003db60201b60201c565b5050505062001b54565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022b6200014d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002516200048060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a19062001522565b60405180910390fd5b80600d9080519060200190620002c292919062001075565b5050565b6000620002d8620004aa60201b60201c565b9050601260009054906101000a900460ff1615620002f557600080fd5b600082116200030357600080fd5b6011548211156200031357600080fd5b601054828262000324919062001614565b11156200033057600080fd5b620003406200048060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620003915781600f5462000383919062001671565b3410156200039057600080fd5b5b6000600190505b828111620003d557620003bf848284620003b3919062001614565b620004b760201b60201c565b8080620003cc9062001831565b91505062000398565b50505050565b620003eb6200014d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004116200048060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200046a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004619062001522565b60405180910390fd5b6200047c8282620004dd60201b60201c565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a80549050905090565b620004d98282604051806020016040528060008152506200068060201b60201c565b5050565b620004ed620006ee60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200054e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005459062001544565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005b89062001566565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620006928383620006f860201b60201c565b620006a76000848484620008f260201b60201c565b620006e9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e0906200149a565b60405180910390fd5b505050565b6000612710905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200076b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007629062001500565b60405180910390fd5b6200077c8162000aac60201b60201c565b15620007bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007b690620014bc565b60405180910390fd5b620007d36000838362000b1860201b60201c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000825919062001614565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620008ee6000838362000c5f60201b60201c565b5050565b6000620009208473ffffffffffffffffffffffffffffffffffffffff1662000c6460201b62001d0f1760201c565b1562000a9f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620009526200014d60201b60201c565b8786866040518563ffffffff1660e01b815260040162000976949392919062001446565b602060405180830381600087803b1580156200099157600080fd5b505af1925050508015620009c557506040513d601f19601f82011682018060405250810190620009c29190620011d1565b60015b62000a4e573d8060008114620009f8576040519150601f19603f3d011682016040523d82523d6000602084013e620009fd565b606091505b5060008151141562000a46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a3d906200149a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000aa4565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000b3083838362000c8760201b62001d321760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000b7d5762000b778162000c8c60201b60201c565b62000bc5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000bc45762000bc3838262000cd560201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000c125762000c0c8162000e5260201b60201c565b62000c5a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000c595762000c58828262000f2e60201b60201c565b5b5b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000cef8462000fba60201b620016951760201c565b62000cfb9190620016d2565b905060006009600084815260200190815260200160002054905081811462000de1576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a8054905062000e689190620016d2565b90506000600b60008481526020019081526020016000205490506000600a838154811062000e9b5762000e9a6200190c565b5b9060005260206000200154905080600a838154811062000ec05762000ebf6200190c565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548062000f125762000f11620018dd565b5b6001900381819060005260206000200160009055905550505050565b600062000f468362000fba60201b620016951760201c565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200102e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200102590620014de565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8280546200108390620017c5565b90600052602060002090601f016020900481019282620010a75760008555620010f3565b82601f10620010c257805160ff1916838001178555620010f3565b82800160010185558215620010f3579182015b82811115620010f2578251825591602001919060010190620010d5565b5b50905062001102919062001106565b5090565b5b808211156200112157600081600090555060010162001107565b5090565b60006200113c6200113684620015b1565b62001588565b9050828152602081018484840111156200115b576200115a6200196f565b5b620011688482856200178f565b509392505050565b600081519050620011818162001b20565b92915050565b600082601f8301126200119f576200119e6200196a565b5b8151620011b184826020860162001125565b91505092915050565b600081519050620011cb8162001b3a565b92915050565b600060208284031215620011ea57620011e962001979565b5b6000620011fa8482850162001170565b91505092915050565b6000806000806080858703121562001220576200121f62001979565b5b600085015167ffffffffffffffff81111562001241576200124062001974565b5b6200124f8782880162001187565b945050602085015167ffffffffffffffff81111562001273576200127262001974565b5b620012818782880162001187565b935050604085015167ffffffffffffffff811115620012a557620012a462001974565b5b620012b38782880162001187565b9250506060620012c687828801620011ba565b91505092959194509250565b620012dd816200170d565b82525050565b6000620012f082620015e7565b620012fc8185620015f2565b93506200130e8185602086016200178f565b62001319816200197e565b840191505092915050565b60006200133360328362001603565b915062001340826200198f565b604082019050919050565b60006200135a601c8362001603565b91506200136782620019de565b602082019050919050565b600062001381602a8362001603565b91506200138e8262001a07565b604082019050919050565b6000620013a860208362001603565b9150620013b58262001a56565b602082019050919050565b6000620013cf60208362001603565b9150620013dc8262001a7f565b602082019050919050565b6000620013f6602a8362001603565b9150620014038262001aa8565b604082019050919050565b60006200141d60198362001603565b91506200142a8262001af7565b602082019050919050565b62001440816200176d565b82525050565b60006080820190506200145d6000830187620012d2565b6200146c6020830186620012d2565b6200147b604083018562001435565b81810360608301526200148f8184620012e3565b905095945050505050565b60006020820190508181036000830152620014b58162001324565b9050919050565b60006020820190508181036000830152620014d7816200134b565b9050919050565b60006020820190508181036000830152620014f98162001372565b9050919050565b600060208201905081810360008301526200151b8162001399565b9050919050565b600060208201905081810360008301526200153d81620013c0565b9050919050565b600060208201905081810360008301526200155f81620013e7565b9050919050565b6000602082019050818103600083015262001581816200140e565b9050919050565b600062001594620015a7565b9050620015a28282620017fb565b919050565b6000604051905090565b600067ffffffffffffffff821115620015cf57620015ce6200193b565b5b620015da826200197e565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062001621826200176d565b91506200162e836200176d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200166657620016656200187f565b5b828201905092915050565b60006200167e826200176d565b91506200168b836200176d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620016c757620016c66200187f565b5b828202905092915050565b6000620016df826200176d565b9150620016ec836200176d565b9250828210156200170257620017016200187f565b5b828203905092915050565b60006200171a826200174d565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b83811015620017af57808201518184015260208101905062001792565b83811115620017bf576000848401525b50505050565b60006002820490506001821680620017de57607f821691505b60208210811415620017f557620017f4620018ae565b5b50919050565b62001806826200197e565b810181811067ffffffffffffffff821117156200182857620018276200193b565b5b80604052505050565b60006200183e826200176d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200187457620018736200187f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b62001b2b8162001721565b811462001b3757600080fd5b50565b62001b458162001777565b811462001b5157600080fd5b50565b614acd8062001b646000396000f3fe6080604052600436106102255760003560e01c80634f6ccce71161012357806395d89b41116100ab578063d5abeb011161006f578063d5abeb01146107fc578063d936547e14610827578063da3ef23f14610864578063e985e9c51461088d578063f2fde38b146108ca57610225565b806395d89b4114610717578063a22cb46514610742578063b88d4fde1461076b578063c668286214610794578063c87b56dd146107bf57610225565b80636c0360eb116100f25780636c0360eb1461064457806370a082311461066f578063715018a6146106ac5780637f00c7a6146106c35780638da5cb5b146106ec57610225565b80634f6ccce71461057657806355f804b3146105b35780635c975abb146105dc5780636352211e1461060757610225565b806323b872dd116101b157806340c10f191161017557806340c10f19146104a257806342842e0e146104be578063438b6300146104e757806344a0d68a146105245780634a4c560d1461054d57610225565b806323b872dd146103cb5780632a55205a146103f45780632f745c591461043257806330cc7ae01461046f5780633ccfd60b1461049857610225565b8063081812fc116101f8578063081812fc146102e4578063095ea7b31461032157806313faede61461034a57806318160ddd14610375578063239c70ae146103a057610225565b806301ffc9a71461022a57806302329a291461026757806302fa7c471461029057806306fdde03146102b9575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613644565b6108f3565b60405161025e9190613cc7565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190613617565b610935565b005b34801561029c57600080fd5b506102b760048036038101906102b291906135d7565b6109ce565b005b3480156102c557600080fd5b506102ce610a58565b6040516102db9190613ce2565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906136e7565b610aea565b6040516103189190613c15565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190613597565b610b6f565b005b34801561035657600080fd5b5061035f610c87565b60405161036c9190613f84565b60405180910390f35b34801561038157600080fd5b5061038a610c8d565b6040516103979190613f84565b60405180910390f35b3480156103ac57600080fd5b506103b5610c9a565b6040516103c29190613f84565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613481565b610ca0565b005b34801561040057600080fd5b5061041b60048036038101906104169190613714565b610d00565b604051610429929190613c7c565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613597565b610eeb565b6040516104669190613f84565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190613414565b610f90565b005b6104a0611067565b005b6104bc60048036038101906104b79190613597565b611123565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190613481565b611210565b005b3480156104f357600080fd5b5061050e60048036038101906105099190613414565b611230565b60405161051b9190613ca5565b60405180910390f35b34801561053057600080fd5b5061054b600480360381019061054691906136e7565b6112de565b005b34801561055957600080fd5b50610574600480360381019061056f9190613414565b611364565b005b34801561058257600080fd5b5061059d600480360381019061059891906136e7565b61143b565b6040516105aa9190613f84565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d5919061369e565b6114ac565b005b3480156105e857600080fd5b506105f1611542565b6040516105fe9190613cc7565b60405180910390f35b34801561061357600080fd5b5061062e600480360381019061062991906136e7565b611555565b60405161063b9190613c15565b60405180910390f35b34801561065057600080fd5b50610659611607565b6040516106669190613ce2565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190613414565b611695565b6040516106a39190613f84565b60405180910390f35b3480156106b857600080fd5b506106c161174d565b005b3480156106cf57600080fd5b506106ea60048036038101906106e591906136e7565b6117d5565b005b3480156106f857600080fd5b5061070161185b565b60405161070e9190613c15565b60405180910390f35b34801561072357600080fd5b5061072c611885565b6040516107399190613ce2565b60405180910390f35b34801561074e57600080fd5b5061076960048036038101906107649190613557565b611917565b005b34801561077757600080fd5b50610792600480360381019061078d91906134d4565b61192d565b005b3480156107a057600080fd5b506107a961198f565b6040516107b69190613ce2565b60405180910390f35b3480156107cb57600080fd5b506107e660048036038101906107e191906136e7565b611a1d565b6040516107f39190613ce2565b60405180910390f35b34801561080857600080fd5b50610811611ac7565b60405161081e9190613f84565b60405180910390f35b34801561083357600080fd5b5061084e60048036038101906108499190613414565b611acd565b60405161085b9190613cc7565b60405180910390f35b34801561087057600080fd5b5061088b6004803603810190610886919061369e565b611aed565b005b34801561089957600080fd5b506108b460048036038101906108af9190613441565b611b83565b6040516108c19190613cc7565b60405180910390f35b3480156108d657600080fd5b506108f160048036038101906108ec9190613414565b611c17565b005b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092e575061092d82611d37565b5b9050919050565b61093d611db1565b73ffffffffffffffffffffffffffffffffffffffff1661095b61185b565b73ffffffffffffffffffffffffffffffffffffffff16146109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890613ea4565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6109d6611db1565b73ffffffffffffffffffffffffffffffffffffffff166109f461185b565b73ffffffffffffffffffffffffffffffffffffffff1614610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190613ea4565b60405180910390fd5b610a548282611db9565b5050565b606060028054610a679061429a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a939061429a565b8015610ae05780601f10610ab557610100808354040283529160200191610ae0565b820191906000526020600020905b815481529060010190602001808311610ac357829003601f168201915b5050505050905090565b6000610af582611f4e565b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90613e84565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7a82611555565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290613ee4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0a611db1565b73ffffffffffffffffffffffffffffffffffffffff161480610c395750610c3881610c33611db1565b611b83565b5b610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f90613e04565b60405180910390fd5b610c828383611fba565b505050565b600f5481565b6000600a80549050905090565b60115481565b610cb1610cab611db1565b82612073565b610cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce790613f04565b60405180910390fd5b610cfb838383612151565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610e965760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ea06123b8565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610ecc919061413e565b610ed6919061410d565b90508160000151819350935050509250929050565b6000610ef683611695565b8210610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90613d04565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f98611db1565b73ffffffffffffffffffffffffffffffffffffffff16610fb661185b565b73ffffffffffffffffffffffffffffffffffffffff161461100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390613ea4565b60405180910390fd5b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61106f611db1565b73ffffffffffffffffffffffffffffffffffffffff1661108d61185b565b73ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613ea4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061112157600080fd5b565b600061112d610c8d565b9050601260009054906101000a900460ff161561114957600080fd5b6000821161115657600080fd5b60115482111561116557600080fd5b601054828261117491906140b7565b111561117f57600080fd5b61118761185b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111d45781600f546111c7919061413e565b3410156111d357600080fd5b5b6000600190505b82811161120a576111f78482846111f291906140b7565b6123c2565b8080611202906142fd565b9150506111db565b50505050565b61122b8383836040518060200160405280600081525061192d565b505050565b6060600061123d83611695565b905060008167ffffffffffffffff81111561125b5761125a614462565b5b6040519080825280602002602001820160405280156112895781602001602082028036833780820191505090505b50905060005b828110156112d3576112a18582610eeb565b8282815181106112b4576112b3614433565b5b60200260200101818152505080806112cb906142fd565b91505061128f565b508092505050919050565b6112e6611db1565b73ffffffffffffffffffffffffffffffffffffffff1661130461185b565b73ffffffffffffffffffffffffffffffffffffffff161461135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190613ea4565b60405180910390fd5b80600f8190555050565b61136c611db1565b73ffffffffffffffffffffffffffffffffffffffff1661138a61185b565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790613ea4565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000611445610c8d565b8210611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90613f24565b60405180910390fd5b600a828154811061149a57611499614433565b5b90600052602060002001549050919050565b6114b4611db1565b73ffffffffffffffffffffffffffffffffffffffff166114d261185b565b73ffffffffffffffffffffffffffffffffffffffff1614611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90613ea4565b60405180910390fd5b80600d908051906020019061153e929190613213565b5050565b601260009054906101000a900460ff1681565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613e44565b60405180910390fd5b80915050919050565b600d80546116149061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546116409061429a565b801561168d5780601f106116625761010080835404028352916020019161168d565b820191906000526020600020905b81548152906001019060200180831161167057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90613e24565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611755611db1565b73ffffffffffffffffffffffffffffffffffffffff1661177361185b565b73ffffffffffffffffffffffffffffffffffffffff16146117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c090613ea4565b60405180910390fd5b6117d360006123e0565b565b6117dd611db1565b73ffffffffffffffffffffffffffffffffffffffff166117fb61185b565b73ffffffffffffffffffffffffffffffffffffffff1614611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184890613ea4565b60405180910390fd5b8060118190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118949061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546118c09061429a565b801561190d5780601f106118e25761010080835404028352916020019161190d565b820191906000526020600020905b8154815290600101906020018083116118f057829003601f168201915b5050505050905090565b611929611922611db1565b83836124a6565b5050565b61193e611938611db1565b83612073565b61197d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197490613f04565b60405180910390fd5b61198984848484612613565b50505050565b600e805461199c9061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546119c89061429a565b8015611a155780601f106119ea57610100808354040283529160200191611a15565b820191906000526020600020905b8154815290600101906020018083116119f857829003601f168201915b505050505081565b6060611a2882611f4e565b611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90613ec4565b60405180910390fd5b6000611a7161266f565b90506000815111611a915760405180602001604052806000815250611abf565b80611a9b84612701565b600e604051602001611aaf93929190613be4565b6040516020818303038152906040525b915050919050565b60105481565b60136020528060005260406000206000915054906101000a900460ff1681565b611af5611db1565b73ffffffffffffffffffffffffffffffffffffffff16611b1361185b565b73ffffffffffffffffffffffffffffffffffffffff1614611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090613ea4565b60405180910390fd5b80600e9080519060200190611b7f929190613213565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c1f611db1565b73ffffffffffffffffffffffffffffffffffffffff16611c3d61185b565b73ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90613ea4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90613d44565b60405180910390fd5b611d0c816123e0565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611daa5750611da982612862565b5b9050919050565b600033905090565b611dc16123b8565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690613f44565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8690613f64565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661202d83611555565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061207e82611f4e565b6120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490613de4565b60405180910390fd5b60006120c883611555565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061210a57506121098185611b83565b5b8061214857508373ffffffffffffffffffffffffffffffffffffffff1661213084610aea565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661217182611555565b73ffffffffffffffffffffffffffffffffffffffff16146121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be90613d64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222e90613da4565b60405180910390fd5b612242838383612944565b61224d600082611fba565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229d9190614198565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122f491906140b7565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b3838383612a58565b505050565b6000612710905090565b6123dc828260405180602001604052806000815250612a5d565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250c90613dc4565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126069190613cc7565b60405180910390a3505050565b61261e848484612151565b61262a84848484612ab8565b612669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266090613d24565b60405180910390fd5b50505050565b6060600d805461267e9061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546126aa9061429a565b80156126f75780601f106126cc576101008083540402835291602001916126f7565b820191906000526020600020905b8154815290600101906020018083116126da57829003601f168201915b5050505050905090565b60606000821415612749576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061285d565b600082905060005b6000821461277b578080612764906142fd565b915050600a82612774919061410d565b9150612751565b60008167ffffffffffffffff81111561279757612796614462565b5b6040519080825280601f01601f1916602001820160405280156127c95781602001600182028036833780820191505090505b5090505b60008514612856576001826127e29190614198565b9150600a856127f19190614346565b60306127fd91906140b7565b60f81b81838151811061281357612812614433565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561284f919061410d565b94506127cd565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061292d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061293d575061293c82612c4f565b5b9050919050565b61294f838383611d32565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129925761298d81612cc9565b6129d1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129d0576129cf8382612d12565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a1457612a0f81612e7f565b612a53565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a5257612a518282612f50565b5b5b505050565b505050565b612a678383612fcf565b612a746000848484612ab8565b612ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aaa90613d24565b60405180910390fd5b505050565b6000612ad98473ffffffffffffffffffffffffffffffffffffffff16611d0f565b15612c42578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b02611db1565b8786866040518563ffffffff1660e01b8152600401612b249493929190613c30565b602060405180830381600087803b158015612b3e57600080fd5b505af1925050508015612b6f57506040513d601f19601f82011682018060405250810190612b6c9190613671565b60015b612bf2573d8060008114612b9f576040519150601f19603f3d011682016040523d82523d6000602084013e612ba4565b606091505b50600081511415612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be190613d24565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c47565b600190505b949350505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cc25750612cc1826131a9565b5b9050919050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d1f84611695565b612d299190614198565b9050600060096000848152602001908152602001600020549050818114612e0e576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612e939190614198565b90506000600b60008481526020019081526020016000205490506000600a8381548110612ec357612ec2614433565b5b9060005260206000200154905080600a8381548110612ee557612ee4614433565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612f3457612f33614404565b5b6001900381819060005260206000200160009055905550505050565b6000612f5b83611695565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303690613e64565b60405180910390fd5b61304881611f4e565b15613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307f90613d84565b60405180910390fd5b61309460008383612944565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130e491906140b7565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a560008383612a58565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461321f9061429a565b90600052602060002090601f0160209004810192826132415760008555613288565b82601f1061325a57805160ff1916838001178555613288565b82800160010185558215613288579182015b8281111561328757825182559160200191906001019061326c565b5b5090506132959190613299565b5090565b5b808211156132b257600081600090555060010161329a565b5090565b60006132c96132c484613fc4565b613f9f565b9050828152602081018484840111156132e5576132e4614496565b5b6132f0848285614258565b509392505050565b600061330b61330684613ff5565b613f9f565b90508281526020810184848401111561332757613326614496565b5b613332848285614258565b509392505050565b60008135905061334981614a24565b92915050565b60008135905061335e81614a3b565b92915050565b60008135905061337381614a52565b92915050565b60008151905061338881614a52565b92915050565b600082601f8301126133a3576133a2614491565b5b81356133b38482602086016132b6565b91505092915050565b600082601f8301126133d1576133d0614491565b5b81356133e18482602086016132f8565b91505092915050565b6000813590506133f981614a69565b92915050565b60008135905061340e81614a80565b92915050565b60006020828403121561342a576134296144a0565b5b60006134388482850161333a565b91505092915050565b60008060408385031215613458576134576144a0565b5b60006134668582860161333a565b92505060206134778582860161333a565b9150509250929050565b60008060006060848603121561349a576134996144a0565b5b60006134a88682870161333a565b93505060206134b98682870161333a565b92505060406134ca868287016133ea565b9150509250925092565b600080600080608085870312156134ee576134ed6144a0565b5b60006134fc8782880161333a565b945050602061350d8782880161333a565b935050604061351e878288016133ea565b925050606085013567ffffffffffffffff81111561353f5761353e61449b565b5b61354b8782880161338e565b91505092959194509250565b6000806040838503121561356e5761356d6144a0565b5b600061357c8582860161333a565b925050602061358d8582860161334f565b9150509250929050565b600080604083850312156135ae576135ad6144a0565b5b60006135bc8582860161333a565b92505060206135cd858286016133ea565b9150509250929050565b600080604083850312156135ee576135ed6144a0565b5b60006135fc8582860161333a565b925050602061360d858286016133ff565b9150509250929050565b60006020828403121561362d5761362c6144a0565b5b600061363b8482850161334f565b91505092915050565b60006020828403121561365a576136596144a0565b5b600061366884828501613364565b91505092915050565b600060208284031215613687576136866144a0565b5b600061369584828501613379565b91505092915050565b6000602082840312156136b4576136b36144a0565b5b600082013567ffffffffffffffff8111156136d2576136d161449b565b5b6136de848285016133bc565b91505092915050565b6000602082840312156136fd576136fc6144a0565b5b600061370b848285016133ea565b91505092915050565b6000806040838503121561372b5761372a6144a0565b5b6000613739858286016133ea565b925050602061374a858286016133ea565b9150509250929050565b60006137608383613bc6565b60208301905092915050565b613775816141cc565b82525050565b60006137868261404b565b6137908185614079565b935061379b83614026565b8060005b838110156137cc5781516137b38882613754565b97506137be8361406c565b92505060018101905061379f565b5085935050505092915050565b6137e2816141de565b82525050565b60006137f382614056565b6137fd818561408a565b935061380d818560208601614267565b613816816144a5565b840191505092915050565b600061382c82614061565b613836818561409b565b9350613846818560208601614267565b61384f816144a5565b840191505092915050565b600061386582614061565b61386f81856140ac565b935061387f818560208601614267565b80840191505092915050565b600081546138988161429a565b6138a281866140ac565b945060018216600081146138bd57600181146138ce57613901565b60ff19831686528186019350613901565b6138d785614036565b60005b838110156138f9578154818901526001820191506020810190506138da565b838801955050505b50505092915050565b6000613917602b8361409b565b9150613922826144b6565b604082019050919050565b600061393a60328361409b565b915061394582614505565b604082019050919050565b600061395d60268361409b565b915061396882614554565b604082019050919050565b600061398060258361409b565b915061398b826145a3565b604082019050919050565b60006139a3601c8361409b565b91506139ae826145f2565b602082019050919050565b60006139c660248361409b565b91506139d18261461b565b604082019050919050565b60006139e960198361409b565b91506139f48261466a565b602082019050919050565b6000613a0c602c8361409b565b9150613a1782614693565b604082019050919050565b6000613a2f60388361409b565b9150613a3a826146e2565b604082019050919050565b6000613a52602a8361409b565b9150613a5d82614731565b604082019050919050565b6000613a7560298361409b565b9150613a8082614780565b604082019050919050565b6000613a9860208361409b565b9150613aa3826147cf565b602082019050919050565b6000613abb602c8361409b565b9150613ac6826147f8565b604082019050919050565b6000613ade60208361409b565b9150613ae982614847565b602082019050919050565b6000613b01602f8361409b565b9150613b0c82614870565b604082019050919050565b6000613b2460218361409b565b9150613b2f826148bf565b604082019050919050565b6000613b4760318361409b565b9150613b528261490e565b604082019050919050565b6000613b6a602c8361409b565b9150613b758261495d565b604082019050919050565b6000613b8d602a8361409b565b9150613b98826149ac565b604082019050919050565b6000613bb060198361409b565b9150613bbb826149fb565b602082019050919050565b613bcf81614236565b82525050565b613bde81614236565b82525050565b6000613bf0828661385a565b9150613bfc828561385a565b9150613c08828461388b565b9150819050949350505050565b6000602082019050613c2a600083018461376c565b92915050565b6000608082019050613c45600083018761376c565b613c52602083018661376c565b613c5f6040830185613bd5565b8181036060830152613c7181846137e8565b905095945050505050565b6000604082019050613c91600083018561376c565b613c9e6020830184613bd5565b9392505050565b60006020820190508181036000830152613cbf818461377b565b905092915050565b6000602082019050613cdc60008301846137d9565b92915050565b60006020820190508181036000830152613cfc8184613821565b905092915050565b60006020820190508181036000830152613d1d8161390a565b9050919050565b60006020820190508181036000830152613d3d8161392d565b9050919050565b60006020820190508181036000830152613d5d81613950565b9050919050565b60006020820190508181036000830152613d7d81613973565b9050919050565b60006020820190508181036000830152613d9d81613996565b9050919050565b60006020820190508181036000830152613dbd816139b9565b9050919050565b60006020820190508181036000830152613ddd816139dc565b9050919050565b60006020820190508181036000830152613dfd816139ff565b9050919050565b60006020820190508181036000830152613e1d81613a22565b9050919050565b60006020820190508181036000830152613e3d81613a45565b9050919050565b60006020820190508181036000830152613e5d81613a68565b9050919050565b60006020820190508181036000830152613e7d81613a8b565b9050919050565b60006020820190508181036000830152613e9d81613aae565b9050919050565b60006020820190508181036000830152613ebd81613ad1565b9050919050565b60006020820190508181036000830152613edd81613af4565b9050919050565b60006020820190508181036000830152613efd81613b17565b9050919050565b60006020820190508181036000830152613f1d81613b3a565b9050919050565b60006020820190508181036000830152613f3d81613b5d565b9050919050565b60006020820190508181036000830152613f5d81613b80565b9050919050565b60006020820190508181036000830152613f7d81613ba3565b9050919050565b6000602082019050613f996000830184613bd5565b92915050565b6000613fa9613fba565b9050613fb582826142cc565b919050565b6000604051905090565b600067ffffffffffffffff821115613fdf57613fde614462565b5b613fe8826144a5565b9050602081019050919050565b600067ffffffffffffffff8211156140105761400f614462565b5b614019826144a5565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140c282614236565b91506140cd83614236565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561410257614101614377565b5b828201905092915050565b600061411882614236565b915061412383614236565b925082614133576141326143a6565b5b828204905092915050565b600061414982614236565b915061415483614236565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561418d5761418c614377565b5b828202905092915050565b60006141a382614236565b91506141ae83614236565b9250828210156141c1576141c0614377565b5b828203905092915050565b60006141d782614216565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561428557808201518184015260208101905061426a565b83811115614294576000848401525b50505050565b600060028204905060018216806142b257607f821691505b602082108114156142c6576142c56143d5565b5b50919050565b6142d5826144a5565b810181811067ffffffffffffffff821117156142f4576142f3614462565b5b80604052505050565b600061430882614236565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561433b5761433a614377565b5b600182019050919050565b600061435182614236565b915061435c83614236565b92508261436c5761436b6143a6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b614a2d816141cc565b8114614a3857600080fd5b50565b614a44816141de565b8114614a4f57600080fd5b50565b614a5b816141ea565b8114614a6657600080fd5b50565b614a7281614236565b8114614a7d57600080fd5b50565b614a8981614240565b8114614a9457600080fd5b5056fea2646970667358221220d1feca48318dba53c8825fd21dbb3f6ffbd2919e85c903a1575886f1c1ecd09364736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000000a454c434f434f2e58595a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004434f434f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d52453166526b33705358796959475437395054454532394d575673667a61636743324b7a7959396d484b59462f00000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c80634f6ccce71161012357806395d89b41116100ab578063d5abeb011161006f578063d5abeb01146107fc578063d936547e14610827578063da3ef23f14610864578063e985e9c51461088d578063f2fde38b146108ca57610225565b806395d89b4114610717578063a22cb46514610742578063b88d4fde1461076b578063c668286214610794578063c87b56dd146107bf57610225565b80636c0360eb116100f25780636c0360eb1461064457806370a082311461066f578063715018a6146106ac5780637f00c7a6146106c35780638da5cb5b146106ec57610225565b80634f6ccce71461057657806355f804b3146105b35780635c975abb146105dc5780636352211e1461060757610225565b806323b872dd116101b157806340c10f191161017557806340c10f19146104a257806342842e0e146104be578063438b6300146104e757806344a0d68a146105245780634a4c560d1461054d57610225565b806323b872dd146103cb5780632a55205a146103f45780632f745c591461043257806330cc7ae01461046f5780633ccfd60b1461049857610225565b8063081812fc116101f8578063081812fc146102e4578063095ea7b31461032157806313faede61461034a57806318160ddd14610375578063239c70ae146103a057610225565b806301ffc9a71461022a57806302329a291461026757806302fa7c471461029057806306fdde03146102b9575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613644565b6108f3565b60405161025e9190613cc7565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190613617565b610935565b005b34801561029c57600080fd5b506102b760048036038101906102b291906135d7565b6109ce565b005b3480156102c557600080fd5b506102ce610a58565b6040516102db9190613ce2565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906136e7565b610aea565b6040516103189190613c15565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190613597565b610b6f565b005b34801561035657600080fd5b5061035f610c87565b60405161036c9190613f84565b60405180910390f35b34801561038157600080fd5b5061038a610c8d565b6040516103979190613f84565b60405180910390f35b3480156103ac57600080fd5b506103b5610c9a565b6040516103c29190613f84565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613481565b610ca0565b005b34801561040057600080fd5b5061041b60048036038101906104169190613714565b610d00565b604051610429929190613c7c565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613597565b610eeb565b6040516104669190613f84565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190613414565b610f90565b005b6104a0611067565b005b6104bc60048036038101906104b79190613597565b611123565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190613481565b611210565b005b3480156104f357600080fd5b5061050e60048036038101906105099190613414565b611230565b60405161051b9190613ca5565b60405180910390f35b34801561053057600080fd5b5061054b600480360381019061054691906136e7565b6112de565b005b34801561055957600080fd5b50610574600480360381019061056f9190613414565b611364565b005b34801561058257600080fd5b5061059d600480360381019061059891906136e7565b61143b565b6040516105aa9190613f84565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d5919061369e565b6114ac565b005b3480156105e857600080fd5b506105f1611542565b6040516105fe9190613cc7565b60405180910390f35b34801561061357600080fd5b5061062e600480360381019061062991906136e7565b611555565b60405161063b9190613c15565b60405180910390f35b34801561065057600080fd5b50610659611607565b6040516106669190613ce2565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190613414565b611695565b6040516106a39190613f84565b60405180910390f35b3480156106b857600080fd5b506106c161174d565b005b3480156106cf57600080fd5b506106ea60048036038101906106e591906136e7565b6117d5565b005b3480156106f857600080fd5b5061070161185b565b60405161070e9190613c15565b60405180910390f35b34801561072357600080fd5b5061072c611885565b6040516107399190613ce2565b60405180910390f35b34801561074e57600080fd5b5061076960048036038101906107649190613557565b611917565b005b34801561077757600080fd5b50610792600480360381019061078d91906134d4565b61192d565b005b3480156107a057600080fd5b506107a961198f565b6040516107b69190613ce2565b60405180910390f35b3480156107cb57600080fd5b506107e660048036038101906107e191906136e7565b611a1d565b6040516107f39190613ce2565b60405180910390f35b34801561080857600080fd5b50610811611ac7565b60405161081e9190613f84565b60405180910390f35b34801561083357600080fd5b5061084e60048036038101906108499190613414565b611acd565b60405161085b9190613cc7565b60405180910390f35b34801561087057600080fd5b5061088b6004803603810190610886919061369e565b611aed565b005b34801561089957600080fd5b506108b460048036038101906108af9190613441565b611b83565b6040516108c19190613cc7565b60405180910390f35b3480156108d657600080fd5b506108f160048036038101906108ec9190613414565b611c17565b005b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092e575061092d82611d37565b5b9050919050565b61093d611db1565b73ffffffffffffffffffffffffffffffffffffffff1661095b61185b565b73ffffffffffffffffffffffffffffffffffffffff16146109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890613ea4565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6109d6611db1565b73ffffffffffffffffffffffffffffffffffffffff166109f461185b565b73ffffffffffffffffffffffffffffffffffffffff1614610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190613ea4565b60405180910390fd5b610a548282611db9565b5050565b606060028054610a679061429a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a939061429a565b8015610ae05780601f10610ab557610100808354040283529160200191610ae0565b820191906000526020600020905b815481529060010190602001808311610ac357829003601f168201915b5050505050905090565b6000610af582611f4e565b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90613e84565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7a82611555565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290613ee4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0a611db1565b73ffffffffffffffffffffffffffffffffffffffff161480610c395750610c3881610c33611db1565b611b83565b5b610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f90613e04565b60405180910390fd5b610c828383611fba565b505050565b600f5481565b6000600a80549050905090565b60115481565b610cb1610cab611db1565b82612073565b610cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce790613f04565b60405180910390fd5b610cfb838383612151565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610e965760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ea06123b8565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610ecc919061413e565b610ed6919061410d565b90508160000151819350935050509250929050565b6000610ef683611695565b8210610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90613d04565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f98611db1565b73ffffffffffffffffffffffffffffffffffffffff16610fb661185b565b73ffffffffffffffffffffffffffffffffffffffff161461100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390613ea4565b60405180910390fd5b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61106f611db1565b73ffffffffffffffffffffffffffffffffffffffff1661108d61185b565b73ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613ea4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061112157600080fd5b565b600061112d610c8d565b9050601260009054906101000a900460ff161561114957600080fd5b6000821161115657600080fd5b60115482111561116557600080fd5b601054828261117491906140b7565b111561117f57600080fd5b61118761185b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111d45781600f546111c7919061413e565b3410156111d357600080fd5b5b6000600190505b82811161120a576111f78482846111f291906140b7565b6123c2565b8080611202906142fd565b9150506111db565b50505050565b61122b8383836040518060200160405280600081525061192d565b505050565b6060600061123d83611695565b905060008167ffffffffffffffff81111561125b5761125a614462565b5b6040519080825280602002602001820160405280156112895781602001602082028036833780820191505090505b50905060005b828110156112d3576112a18582610eeb565b8282815181106112b4576112b3614433565b5b60200260200101818152505080806112cb906142fd565b91505061128f565b508092505050919050565b6112e6611db1565b73ffffffffffffffffffffffffffffffffffffffff1661130461185b565b73ffffffffffffffffffffffffffffffffffffffff161461135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190613ea4565b60405180910390fd5b80600f8190555050565b61136c611db1565b73ffffffffffffffffffffffffffffffffffffffff1661138a61185b565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790613ea4565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000611445610c8d565b8210611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90613f24565b60405180910390fd5b600a828154811061149a57611499614433565b5b90600052602060002001549050919050565b6114b4611db1565b73ffffffffffffffffffffffffffffffffffffffff166114d261185b565b73ffffffffffffffffffffffffffffffffffffffff1614611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90613ea4565b60405180910390fd5b80600d908051906020019061153e929190613213565b5050565b601260009054906101000a900460ff1681565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613e44565b60405180910390fd5b80915050919050565b600d80546116149061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546116409061429a565b801561168d5780601f106116625761010080835404028352916020019161168d565b820191906000526020600020905b81548152906001019060200180831161167057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90613e24565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611755611db1565b73ffffffffffffffffffffffffffffffffffffffff1661177361185b565b73ffffffffffffffffffffffffffffffffffffffff16146117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c090613ea4565b60405180910390fd5b6117d360006123e0565b565b6117dd611db1565b73ffffffffffffffffffffffffffffffffffffffff166117fb61185b565b73ffffffffffffffffffffffffffffffffffffffff1614611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184890613ea4565b60405180910390fd5b8060118190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118949061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546118c09061429a565b801561190d5780601f106118e25761010080835404028352916020019161190d565b820191906000526020600020905b8154815290600101906020018083116118f057829003601f168201915b5050505050905090565b611929611922611db1565b83836124a6565b5050565b61193e611938611db1565b83612073565b61197d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197490613f04565b60405180910390fd5b61198984848484612613565b50505050565b600e805461199c9061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546119c89061429a565b8015611a155780601f106119ea57610100808354040283529160200191611a15565b820191906000526020600020905b8154815290600101906020018083116119f857829003601f168201915b505050505081565b6060611a2882611f4e565b611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90613ec4565b60405180910390fd5b6000611a7161266f565b90506000815111611a915760405180602001604052806000815250611abf565b80611a9b84612701565b600e604051602001611aaf93929190613be4565b6040516020818303038152906040525b915050919050565b60105481565b60136020528060005260406000206000915054906101000a900460ff1681565b611af5611db1565b73ffffffffffffffffffffffffffffffffffffffff16611b1361185b565b73ffffffffffffffffffffffffffffffffffffffff1614611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090613ea4565b60405180910390fd5b80600e9080519060200190611b7f929190613213565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c1f611db1565b73ffffffffffffffffffffffffffffffffffffffff16611c3d61185b565b73ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90613ea4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90613d44565b60405180910390fd5b611d0c816123e0565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611daa5750611da982612862565b5b9050919050565b600033905090565b611dc16123b8565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690613f44565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8690613f64565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661202d83611555565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061207e82611f4e565b6120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490613de4565b60405180910390fd5b60006120c883611555565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061210a57506121098185611b83565b5b8061214857508373ffffffffffffffffffffffffffffffffffffffff1661213084610aea565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661217182611555565b73ffffffffffffffffffffffffffffffffffffffff16146121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be90613d64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222e90613da4565b60405180910390fd5b612242838383612944565b61224d600082611fba565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229d9190614198565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122f491906140b7565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b3838383612a58565b505050565b6000612710905090565b6123dc828260405180602001604052806000815250612a5d565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250c90613dc4565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126069190613cc7565b60405180910390a3505050565b61261e848484612151565b61262a84848484612ab8565b612669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266090613d24565b60405180910390fd5b50505050565b6060600d805461267e9061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546126aa9061429a565b80156126f75780601f106126cc576101008083540402835291602001916126f7565b820191906000526020600020905b8154815290600101906020018083116126da57829003601f168201915b5050505050905090565b60606000821415612749576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061285d565b600082905060005b6000821461277b578080612764906142fd565b915050600a82612774919061410d565b9150612751565b60008167ffffffffffffffff81111561279757612796614462565b5b6040519080825280601f01601f1916602001820160405280156127c95781602001600182028036833780820191505090505b5090505b60008514612856576001826127e29190614198565b9150600a856127f19190614346565b60306127fd91906140b7565b60f81b81838151811061281357612812614433565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561284f919061410d565b94506127cd565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061292d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061293d575061293c82612c4f565b5b9050919050565b61294f838383611d32565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129925761298d81612cc9565b6129d1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129d0576129cf8382612d12565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a1457612a0f81612e7f565b612a53565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a5257612a518282612f50565b5b5b505050565b505050565b612a678383612fcf565b612a746000848484612ab8565b612ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aaa90613d24565b60405180910390fd5b505050565b6000612ad98473ffffffffffffffffffffffffffffffffffffffff16611d0f565b15612c42578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b02611db1565b8786866040518563ffffffff1660e01b8152600401612b249493929190613c30565b602060405180830381600087803b158015612b3e57600080fd5b505af1925050508015612b6f57506040513d601f19601f82011682018060405250810190612b6c9190613671565b60015b612bf2573d8060008114612b9f576040519150601f19603f3d011682016040523d82523d6000602084013e612ba4565b606091505b50600081511415612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be190613d24565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c47565b600190505b949350505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cc25750612cc1826131a9565b5b9050919050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d1f84611695565b612d299190614198565b9050600060096000848152602001908152602001600020549050818114612e0e576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612e939190614198565b90506000600b60008481526020019081526020016000205490506000600a8381548110612ec357612ec2614433565b5b9060005260206000200154905080600a8381548110612ee557612ee4614433565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612f3457612f33614404565b5b6001900381819060005260206000200160009055905550505050565b6000612f5b83611695565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303690613e64565b60405180910390fd5b61304881611f4e565b15613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307f90613d84565b60405180910390fd5b61309460008383612944565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130e491906140b7565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a560008383612a58565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461321f9061429a565b90600052602060002090601f0160209004810192826132415760008555613288565b82601f1061325a57805160ff1916838001178555613288565b82800160010185558215613288579182015b8281111561328757825182559160200191906001019061326c565b5b5090506132959190613299565b5090565b5b808211156132b257600081600090555060010161329a565b5090565b60006132c96132c484613fc4565b613f9f565b9050828152602081018484840111156132e5576132e4614496565b5b6132f0848285614258565b509392505050565b600061330b61330684613ff5565b613f9f565b90508281526020810184848401111561332757613326614496565b5b613332848285614258565b509392505050565b60008135905061334981614a24565b92915050565b60008135905061335e81614a3b565b92915050565b60008135905061337381614a52565b92915050565b60008151905061338881614a52565b92915050565b600082601f8301126133a3576133a2614491565b5b81356133b38482602086016132b6565b91505092915050565b600082601f8301126133d1576133d0614491565b5b81356133e18482602086016132f8565b91505092915050565b6000813590506133f981614a69565b92915050565b60008135905061340e81614a80565b92915050565b60006020828403121561342a576134296144a0565b5b60006134388482850161333a565b91505092915050565b60008060408385031215613458576134576144a0565b5b60006134668582860161333a565b92505060206134778582860161333a565b9150509250929050565b60008060006060848603121561349a576134996144a0565b5b60006134a88682870161333a565b93505060206134b98682870161333a565b92505060406134ca868287016133ea565b9150509250925092565b600080600080608085870312156134ee576134ed6144a0565b5b60006134fc8782880161333a565b945050602061350d8782880161333a565b935050604061351e878288016133ea565b925050606085013567ffffffffffffffff81111561353f5761353e61449b565b5b61354b8782880161338e565b91505092959194509250565b6000806040838503121561356e5761356d6144a0565b5b600061357c8582860161333a565b925050602061358d8582860161334f565b9150509250929050565b600080604083850312156135ae576135ad6144a0565b5b60006135bc8582860161333a565b92505060206135cd858286016133ea565b9150509250929050565b600080604083850312156135ee576135ed6144a0565b5b60006135fc8582860161333a565b925050602061360d858286016133ff565b9150509250929050565b60006020828403121561362d5761362c6144a0565b5b600061363b8482850161334f565b91505092915050565b60006020828403121561365a576136596144a0565b5b600061366884828501613364565b91505092915050565b600060208284031215613687576136866144a0565b5b600061369584828501613379565b91505092915050565b6000602082840312156136b4576136b36144a0565b5b600082013567ffffffffffffffff8111156136d2576136d161449b565b5b6136de848285016133bc565b91505092915050565b6000602082840312156136fd576136fc6144a0565b5b600061370b848285016133ea565b91505092915050565b6000806040838503121561372b5761372a6144a0565b5b6000613739858286016133ea565b925050602061374a858286016133ea565b9150509250929050565b60006137608383613bc6565b60208301905092915050565b613775816141cc565b82525050565b60006137868261404b565b6137908185614079565b935061379b83614026565b8060005b838110156137cc5781516137b38882613754565b97506137be8361406c565b92505060018101905061379f565b5085935050505092915050565b6137e2816141de565b82525050565b60006137f382614056565b6137fd818561408a565b935061380d818560208601614267565b613816816144a5565b840191505092915050565b600061382c82614061565b613836818561409b565b9350613846818560208601614267565b61384f816144a5565b840191505092915050565b600061386582614061565b61386f81856140ac565b935061387f818560208601614267565b80840191505092915050565b600081546138988161429a565b6138a281866140ac565b945060018216600081146138bd57600181146138ce57613901565b60ff19831686528186019350613901565b6138d785614036565b60005b838110156138f9578154818901526001820191506020810190506138da565b838801955050505b50505092915050565b6000613917602b8361409b565b9150613922826144b6565b604082019050919050565b600061393a60328361409b565b915061394582614505565b604082019050919050565b600061395d60268361409b565b915061396882614554565b604082019050919050565b600061398060258361409b565b915061398b826145a3565b604082019050919050565b60006139a3601c8361409b565b91506139ae826145f2565b602082019050919050565b60006139c660248361409b565b91506139d18261461b565b604082019050919050565b60006139e960198361409b565b91506139f48261466a565b602082019050919050565b6000613a0c602c8361409b565b9150613a1782614693565b604082019050919050565b6000613a2f60388361409b565b9150613a3a826146e2565b604082019050919050565b6000613a52602a8361409b565b9150613a5d82614731565b604082019050919050565b6000613a7560298361409b565b9150613a8082614780565b604082019050919050565b6000613a9860208361409b565b9150613aa3826147cf565b602082019050919050565b6000613abb602c8361409b565b9150613ac6826147f8565b604082019050919050565b6000613ade60208361409b565b9150613ae982614847565b602082019050919050565b6000613b01602f8361409b565b9150613b0c82614870565b604082019050919050565b6000613b2460218361409b565b9150613b2f826148bf565b604082019050919050565b6000613b4760318361409b565b9150613b528261490e565b604082019050919050565b6000613b6a602c8361409b565b9150613b758261495d565b604082019050919050565b6000613b8d602a8361409b565b9150613b98826149ac565b604082019050919050565b6000613bb060198361409b565b9150613bbb826149fb565b602082019050919050565b613bcf81614236565b82525050565b613bde81614236565b82525050565b6000613bf0828661385a565b9150613bfc828561385a565b9150613c08828461388b565b9150819050949350505050565b6000602082019050613c2a600083018461376c565b92915050565b6000608082019050613c45600083018761376c565b613c52602083018661376c565b613c5f6040830185613bd5565b8181036060830152613c7181846137e8565b905095945050505050565b6000604082019050613c91600083018561376c565b613c9e6020830184613bd5565b9392505050565b60006020820190508181036000830152613cbf818461377b565b905092915050565b6000602082019050613cdc60008301846137d9565b92915050565b60006020820190508181036000830152613cfc8184613821565b905092915050565b60006020820190508181036000830152613d1d8161390a565b9050919050565b60006020820190508181036000830152613d3d8161392d565b9050919050565b60006020820190508181036000830152613d5d81613950565b9050919050565b60006020820190508181036000830152613d7d81613973565b9050919050565b60006020820190508181036000830152613d9d81613996565b9050919050565b60006020820190508181036000830152613dbd816139b9565b9050919050565b60006020820190508181036000830152613ddd816139dc565b9050919050565b60006020820190508181036000830152613dfd816139ff565b9050919050565b60006020820190508181036000830152613e1d81613a22565b9050919050565b60006020820190508181036000830152613e3d81613a45565b9050919050565b60006020820190508181036000830152613e5d81613a68565b9050919050565b60006020820190508181036000830152613e7d81613a8b565b9050919050565b60006020820190508181036000830152613e9d81613aae565b9050919050565b60006020820190508181036000830152613ebd81613ad1565b9050919050565b60006020820190508181036000830152613edd81613af4565b9050919050565b60006020820190508181036000830152613efd81613b17565b9050919050565b60006020820190508181036000830152613f1d81613b3a565b9050919050565b60006020820190508181036000830152613f3d81613b5d565b9050919050565b60006020820190508181036000830152613f5d81613b80565b9050919050565b60006020820190508181036000830152613f7d81613ba3565b9050919050565b6000602082019050613f996000830184613bd5565b92915050565b6000613fa9613fba565b9050613fb582826142cc565b919050565b6000604051905090565b600067ffffffffffffffff821115613fdf57613fde614462565b5b613fe8826144a5565b9050602081019050919050565b600067ffffffffffffffff8211156140105761400f614462565b5b614019826144a5565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140c282614236565b91506140cd83614236565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561410257614101614377565b5b828201905092915050565b600061411882614236565b915061412383614236565b925082614133576141326143a6565b5b828204905092915050565b600061414982614236565b915061415483614236565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561418d5761418c614377565b5b828202905092915050565b60006141a382614236565b91506141ae83614236565b9250828210156141c1576141c0614377565b5b828203905092915050565b60006141d782614216565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561428557808201518184015260208101905061426a565b83811115614294576000848401525b50505050565b600060028204905060018216806142b257607f821691505b602082108114156142c6576142c56143d5565b5b50919050565b6142d5826144a5565b810181811067ffffffffffffffff821117156142f4576142f3614462565b5b80604052505050565b600061430882614236565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561433b5761433a614377565b5b600182019050919050565b600061435182614236565b915061435c83614236565b92508261436c5761436b6143a6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b614a2d816141cc565b8114614a3857600080fd5b50565b614a44816141de565b8114614a4f57600080fd5b50565b614a5b816141ea565b8114614a6657600080fd5b50565b614a7281614236565b8114614a7d57600080fd5b50565b614a8981614240565b8114614a9457600080fd5b5056fea2646970667358221220d1feca48318dba53c8825fd21dbb3f6ffbd2919e85c903a1575886f1c1ecd09364736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000000a454c434f434f2e58595a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004434f434f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d52453166526b33705358796959475437395054454532394d575673667a61636743324b7a7959396d484b59462f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): ELCOCO.XYZ
Arg [1] : _symbol (string): COCO
Arg [2] : _initBaseURI (string): ipfs://QmRE1fRk3pSXyiYGT79PTEE29MWVsfzacgC2KzyY9mHKYF/
Arg [3] : _royaltyFeesInBips (uint96): 666

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 000000000000000000000000000000000000000000000000000000000000029a
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 454c434f434f2e58595a00000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 434f434f00000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d52453166526b3370535879695947543739505445453239
Arg [10] : 4d575673667a61636743324b7a7959396d484b59462f00000000000000000000


Deployed Bytecode Sourcemap

54543:3328:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57626:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57221:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55825:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35135:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36695:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36218:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54711:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48956:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54787:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37445:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23472:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48624:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57400:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57506:114;;;:::i;:::-;;55380:439;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37855:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55982:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56781:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57300:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49146:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56989:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54825:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34829:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54643:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34559:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8598:103;;;;;;;;;;;;;:::i;:::-;;56867:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7947:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35304:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36988:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38111:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54669:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56336:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54750:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54856:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57093:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37214:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8856:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57626:242;57766:4;57810:10;57795:25;;:11;:25;;;;:65;;;;57824:36;57848:11;57824:23;:36::i;:::-;57795:65;57788:72;;57626:242;;;:::o;57221:73::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57282:6:::1;57273;;:15;;;;;;;;;;;;;;;;;;57221:73:::0;:::o;55825:151::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55921:49:::1;55940:9;55951:18;55921;:49::i;:::-;55825:151:::0;;:::o;35135:100::-;35189:13;35222:5;35215:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35135:100;:::o;36695:221::-;36771:7;36799:16;36807:7;36799;:16::i;:::-;36791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36884:15;:24;36900:7;36884:24;;;;;;;;;;;;;;;;;;;;;36877:31;;36695:221;;;:::o;36218:411::-;36299:13;36315:23;36330:7;36315:14;:23::i;:::-;36299:39;;36363:5;36357:11;;:2;:11;;;;36349:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36457:5;36441:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36466:37;36483:5;36490:12;:10;:12::i;:::-;36466:16;:37::i;:::-;36441:62;36419:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36600:21;36609:2;36613:7;36600:8;:21::i;:::-;36288:341;36218:411;;:::o;54711:34::-;;;;:::o;48956:113::-;49017:7;49044:10;:17;;;;49037:24;;48956:113;:::o;54787:33::-;;;;:::o;37445:339::-;37640:41;37659:12;:10;:12::i;:::-;37673:7;37640:18;:41::i;:::-;37632:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37748:28;37758:4;37764:2;37768:7;37748:9;:28::i;:::-;37445:339;;;:::o;23472:442::-;23569:7;23578;23598:26;23627:17;:27;23645:8;23627:27;;;;;;;;;;;23598:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23699:1;23671:30;;:7;:16;;;:30;;;23667:92;;;23728:19;23718:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23667:92;23771:21;23836:17;:15;:17::i;:::-;23795:58;;23809:7;:23;;;23796:36;;:10;:36;;;;:::i;:::-;23795:58;;;;:::i;:::-;23771:82;;23874:7;:16;;;23892:13;23866:40;;;;;;23472:442;;;;;:::o;48624:256::-;48721:7;48757:23;48774:5;48757:16;:23::i;:::-;48749:5;:31;48741:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48846:12;:19;48859:5;48846:19;;;;;;;;;;;;;;;:26;48866:5;48846:26;;;;;;;;;;;;48839:33;;48624:256;;;;:::o;57400:100::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57489:5:::1;57468:11;:18;57480:5;57468:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;57400:100:::0;:::o;57506:114::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57574:10:::1;57566:24;;:47;57591:21;57566:47;;;;;;;;;;;;;;;;;;;;;;;57558:56;;;::::0;::::1;;57506:114::o:0;55380:439::-;55450:14;55467:13;:11;:13::i;:::-;55450:30;;55496:6;;;;;;;;;;;55495:7;55487:16;;;;;;55532:1;55518:11;:15;55510:24;;;;;;55564:13;;55549:11;:28;;55541:37;;;;;;55617:9;;55602:11;55593:6;:20;;;;:::i;:::-;:33;;55585:42;;;;;;55654:7;:5;:7::i;:::-;55640:21;;:10;:21;;;55636:84;;55700:11;55693:4;;:18;;;;:::i;:::-;55680:9;:31;;55672:40;;;;;;55636:84;55733:9;55745:1;55733:13;;55728:86;55753:11;55748:1;:16;55728:86;;55780:26;55790:3;55804:1;55795:6;:10;;;;:::i;:::-;55780:9;:26::i;:::-;55766:3;;;;;:::i;:::-;;;;55728:86;;;;55443:376;55380:439;;:::o;37855:185::-;37993:39;38010:4;38016:2;38020:7;37993:39;;;;;;;;;;;;:16;:39::i;:::-;37855:185;;;:::o;55982:348::-;56057:16;56085:23;56111:17;56121:6;56111:9;:17::i;:::-;56085:43;;56135:25;56177:15;56163:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56135:58;;56205:9;56200:103;56220:15;56216:1;:19;56200:103;;;56265:30;56285:6;56293:1;56265:19;:30::i;:::-;56251:8;56260:1;56251:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;56237:3;;;;;:::i;:::-;;;;56200:103;;;;56316:8;56309:15;;;;55982:348;;;:::o;56781:80::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56847:8:::1;56840:4;:15;;;;56781:80:::0;:::o;57300:93::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57383:4:::1;57362:11;:18;57374:5;57362:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;57300:93:::0;:::o;49146:233::-;49221:7;49257:30;:28;:30::i;:::-;49249:5;:38;49241:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49354:10;49365:5;49354:17;;;;;;;;:::i;:::-;;;;;;;;;;49347:24;;49146:233;;;:::o;56989:98::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57070:11:::1;57060:7;:21;;;;;;;;;;;;:::i;:::-;;56989:98:::0;:::o;54825:26::-;;;;;;;;;;;;;:::o;34829:239::-;34901:7;34921:13;34937:7;:16;34945:7;34937:16;;;;;;;;;;;;;;;;;;;;;34921:32;;34989:1;34972:19;;:5;:19;;;;34964:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35055:5;35048:12;;;34829:239;;;:::o;54643:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34559:208::-;34631:7;34676:1;34659:19;;:5;:19;;;;34651:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34743:9;:16;34753:5;34743:16;;;;;;;;;;;;;;;;34736:23;;34559:208;;;:::o;8598:103::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8663:30:::1;8690:1;8663:18;:30::i;:::-;8598:103::o:0;56867:116::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56960:17:::1;56944:13;:33;;;;56867:116:::0;:::o;7947:87::-;7993:7;8020:6;;;;;;;;;;;8013:13;;7947:87;:::o;35304:104::-;35360:13;35393:7;35386:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35304:104;:::o;36988:155::-;37083:52;37102:12;:10;:12::i;:::-;37116:8;37126;37083:18;:52::i;:::-;36988:155;;:::o;38111:328::-;38286:41;38305:12;:10;:12::i;:::-;38319:7;38286:18;:41::i;:::-;38278:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38392:39;38406:4;38412:2;38416:7;38425:5;38392:13;:39::i;:::-;38111:328;;;;:::o;54669:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56336:423::-;56434:13;56475:16;56483:7;56475;:16::i;:::-;56459:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;56565:28;56596:10;:8;:10::i;:::-;56565:41;;56651:1;56626:14;56620:28;:32;:133;;;;;;;;;;;;;;;;;56688:14;56704:18;:7;:16;:18::i;:::-;56724:13;56671:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56620:133;56613:140;;;56336:423;;;:::o;54750:32::-;;;;:::o;54856:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;57093:122::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57192:17:::1;57176:13;:33;;;;;;;;;;;;:::i;:::-;;57093:122:::0;:::o;37214:164::-;37311:4;37335:18;:25;37354:5;37335:25;;;;;;;;;;;;;;;:35;37361:8;37335:35;;;;;;;;;;;;;;;;;;;;;;;;;37328:42;;37214:164;;;;:::o;8856:201::-;8178:12;:10;:12::i;:::-;8167:23;;:7;:5;:7::i;:::-;:23;;;8159:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8965:1:::1;8945:22;;:8;:22;;;;8937:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9021:28;9040:8;9021:18;:28::i;:::-;8856:201:::0;:::o;10648:326::-;10708:4;10965:1;10943:7;:19;;;:23;10936:30;;10648:326;;;:::o;46662:126::-;;;;:::o;48316:224::-;48418:4;48457:35;48442:50;;;:11;:50;;;;:90;;;;48496:36;48520:11;48496:23;:36::i;:::-;48442:90;48435:97;;48316:224;;;:::o;6671:98::-;6724:7;6751:10;6744:17;;6671:98;:::o;24564:332::-;24683:17;:15;:17::i;:::-;24667:33;;:12;:33;;;;24659:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24786:1;24766:22;;:8;:22;;;;24758:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24853:35;;;;;;;;24865:8;24853:35;;;;;;24875:12;24853:35;;;;;24831:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24564:332;;:::o;39949:127::-;40014:4;40066:1;40038:30;;:7;:16;40046:7;40038:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40031:37;;39949:127;;;:::o;44095:174::-;44197:2;44170:15;:24;44186:7;44170:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44253:7;44249:2;44215:46;;44224:23;44239:7;44224:14;:23::i;:::-;44215:46;;;;;;;;;;;;44095:174;;:::o;40243:348::-;40336:4;40361:16;40369:7;40361;:16::i;:::-;40353:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40437:13;40453:23;40468:7;40453:14;:23::i;:::-;40437:39;;40506:5;40495:16;;:7;:16;;;:52;;;;40515:32;40532:5;40539:7;40515:16;:32::i;:::-;40495:52;:87;;;;40575:7;40551:31;;:20;40563:7;40551:11;:20::i;:::-;:31;;;40495:87;40487:96;;;40243:348;;;;:::o;43352:625::-;43511:4;43484:31;;:23;43499:7;43484:14;:23::i;:::-;:31;;;43476:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43590:1;43576:16;;:2;:16;;;;43568:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43646:39;43667:4;43673:2;43677:7;43646:20;:39::i;:::-;43750:29;43767:1;43771:7;43750:8;:29::i;:::-;43811:1;43792:9;:15;43802:4;43792:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43840:1;43823:9;:13;43833:2;43823:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43871:2;43852:7;:16;43860:7;43852:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43910:7;43906:2;43891:27;;43900:4;43891:27;;;;;;;;;;;;43931:38;43951:4;43957:2;43961:7;43931:19;:38::i;:::-;43352:625;;;:::o;24196:97::-;24254:6;24280:5;24273:12;;24196:97;:::o;40933:110::-;41009:26;41019:2;41023:7;41009:26;;;;;;;;;;;;:9;:26::i;:::-;40933:110;;:::o;9217:191::-;9291:16;9310:6;;;;;;;;;;;9291:25;;9336:8;9327:6;;:17;;;;;;;;;;;;;;;;;;9391:8;9360:40;;9381:8;9360:40;;;;;;;;;;;;9280:128;9217:191;:::o;44411:315::-;44566:8;44557:17;;:5;:17;;;;44549:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44653:8;44615:18;:25;44634:5;44615:25;;;;;;;;;;;;;;;:35;44641:8;44615:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44699:8;44677:41;;44692:5;44677:41;;;44709:8;44677:41;;;;;;:::i;:::-;;;;;;;;44411:315;;;:::o;39321:::-;39478:28;39488:4;39494:2;39498:7;39478:9;:28::i;:::-;39525:48;39548:4;39554:2;39558:7;39567:5;39525:22;:48::i;:::-;39517:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39321:315;;;;:::o;55259:102::-;55319:13;55348:7;55341:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55259:102;:::o;4233:723::-;4289:13;4519:1;4510:5;:10;4506:53;;;4537:10;;;;;;;;;;;;;;;;;;;;;4506:53;4569:12;4584:5;4569:20;;4600:14;4625:78;4640:1;4632:4;:9;4625:78;;4658:8;;;;;:::i;:::-;;;;4689:2;4681:10;;;;;:::i;:::-;;;4625:78;;;4713:19;4745:6;4735:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4713:39;;4763:154;4779:1;4770:5;:10;4763:154;;4807:1;4797:11;;;;;:::i;:::-;;;4874:2;4866:5;:10;;;;:::i;:::-;4853:2;:24;;;;:::i;:::-;4840:39;;4823:6;4830;4823:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4903:2;4894:11;;;;;:::i;:::-;;;4763:154;;;4941:6;4927:21;;;;;4233:723;;;;:::o;34190:305::-;34292:4;34344:25;34329:40;;;:11;:40;;;;:105;;;;34401:33;34386:48;;;:11;:48;;;;34329:105;:158;;;;34451:36;34475:11;34451:23;:36::i;:::-;34329:158;34309:178;;34190:305;;;:::o;49992:589::-;50136:45;50163:4;50169:2;50173:7;50136:26;:45::i;:::-;50214:1;50198:18;;:4;:18;;;50194:187;;;50233:40;50265:7;50233:31;:40::i;:::-;50194:187;;;50303:2;50295:10;;:4;:10;;;50291:90;;50322:47;50355:4;50361:7;50322:32;:47::i;:::-;50291:90;50194:187;50409:1;50395:16;;:2;:16;;;50391:183;;;50428:45;50465:7;50428:36;:45::i;:::-;50391:183;;;50501:4;50495:10;;:2;:10;;;50491:83;;50522:40;50550:2;50554:7;50522:27;:40::i;:::-;50491:83;50391:183;49992:589;;;:::o;47173:125::-;;;;:::o;41270:321::-;41400:18;41406:2;41410:7;41400:5;:18::i;:::-;41451:54;41482:1;41486:2;41490:7;41499:5;41451:22;:54::i;:::-;41429:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41270:321;;;:::o;45291:799::-;45446:4;45467:15;:2;:13;;;:15::i;:::-;45463:620;;;45519:2;45503:36;;;45540:12;:10;:12::i;:::-;45554:4;45560:7;45569:5;45503:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45499:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45762:1;45745:6;:13;:18;45741:272;;;45788:60;;;;;;;;;;:::i;:::-;;;;;;;;45741:272;45963:6;45957:13;45948:6;45944:2;45940:15;45933:38;45499:529;45636:41;;;45626:51;;;:6;:51;;;;45619:58;;;;;45463:620;46067:4;46060:11;;45291:799;;;;;;;:::o;23202:215::-;23304:4;23343:26;23328:41;;;:11;:41;;;;:81;;;;23373:36;23397:11;23373:23;:36::i;:::-;23328:81;23321:88;;23202:215;;;:::o;51304:164::-;51408:10;:17;;;;51381:15;:24;51397:7;51381:24;;;;;;;;;;;:44;;;;51436:10;51452:7;51436:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51304:164;:::o;52095:988::-;52361:22;52411:1;52386:22;52403:4;52386:16;:22::i;:::-;:26;;;;:::i;:::-;52361:51;;52423:18;52444:17;:26;52462:7;52444:26;;;;;;;;;;;;52423:47;;52591:14;52577:10;:28;52573:328;;52622:19;52644:12;:18;52657:4;52644:18;;;;;;;;;;;;;;;:34;52663:14;52644:34;;;;;;;;;;;;52622:56;;52728:11;52695:12;:18;52708:4;52695:18;;;;;;;;;;;;;;;:30;52714:10;52695:30;;;;;;;;;;;:44;;;;52845:10;52812:17;:30;52830:11;52812:30;;;;;;;;;;;:43;;;;52607:294;52573:328;52997:17;:26;53015:7;52997:26;;;;;;;;;;;52990:33;;;53041:12;:18;53054:4;53041:18;;;;;;;;;;;;;;;:34;53060:14;53041:34;;;;;;;;;;;53034:41;;;52176:907;;52095:988;;:::o;53378:1079::-;53631:22;53676:1;53656:10;:17;;;;:21;;;;:::i;:::-;53631:46;;53688:18;53709:15;:24;53725:7;53709:24;;;;;;;;;;;;53688:45;;54060:19;54082:10;54093:14;54082:26;;;;;;;;:::i;:::-;;;;;;;;;;54060:48;;54146:11;54121:10;54132;54121:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54257:10;54226:15;:28;54242:11;54226:28;;;;;;;;;;;:41;;;;54398:15;:24;54414:7;54398:24;;;;;;;;;;;54391:31;;;54433:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53449:1008;;;53378:1079;:::o;50882:221::-;50967:14;50984:20;51001:2;50984:16;:20::i;:::-;50967:37;;51042:7;51015:12;:16;51028:2;51015:16;;;;;;;;;;;;;;;:24;51032:6;51015:24;;;;;;;;;;;:34;;;;51089:6;51060:17;:26;51078:7;51060:26;;;;;;;;;;;:35;;;;50956:147;50882:221;;:::o;41927:439::-;42021:1;42007:16;;:2;:16;;;;41999:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42080:16;42088:7;42080;:16::i;:::-;42079:17;42071:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42142:45;42171:1;42175:2;42179:7;42142:20;:45::i;:::-;42217:1;42200:9;:13;42210:2;42200:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42248:2;42229:7;:16;42237:7;42229:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42293:7;42289:2;42268:33;;42285:1;42268:33;;;;;;;;;;;;42314:44;42342:1;42346:2;42350:7;42314:19;:44::i;:::-;41927:439;;:::o;21652:157::-;21737:4;21776:25;21761:40;;;:11;:40;;;;21754:47;;21652:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:137::-;2322:5;2360:6;2347:20;2338:29;;2376:32;2402:5;2376:32;:::i;:::-;2277:137;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:472::-;5830:6;5838;5887:2;5875:9;5866:7;5862:23;5858:32;5855:119;;;5893:79;;:::i;:::-;5855:119;6013:1;6038:53;6083:7;6074:6;6063:9;6059:22;6038:53;:::i;:::-;6028:63;;5984:117;6140:2;6166:52;6210:7;6201:6;6190:9;6186:22;6166:52;:::i;:::-;6156:62;;6111:117;5763:472;;;;;:::o;6241:323::-;6297:6;6346:2;6334:9;6325:7;6321:23;6317:32;6314:119;;;6352:79;;:::i;:::-;6314:119;6472:1;6497:50;6539:7;6530:6;6519:9;6515:22;6497:50;:::i;:::-;6487:60;;6443:114;6241:323;;;;:::o;6570:327::-;6628:6;6677:2;6665:9;6656:7;6652:23;6648:32;6645:119;;;6683:79;;:::i;:::-;6645:119;6803:1;6828:52;6872:7;6863:6;6852:9;6848:22;6828:52;:::i;:::-;6818:62;;6774:116;6570:327;;;;:::o;6903:349::-;6972:6;7021:2;7009:9;7000:7;6996:23;6992:32;6989:119;;;7027:79;;:::i;:::-;6989:119;7147:1;7172:63;7227:7;7218:6;7207:9;7203:22;7172:63;:::i;:::-;7162:73;;7118:127;6903:349;;;;:::o;7258:509::-;7327:6;7376:2;7364:9;7355:7;7351:23;7347:32;7344:119;;;7382:79;;:::i;:::-;7344:119;7530:1;7519:9;7515:17;7502:31;7560:18;7552:6;7549:30;7546:117;;;7582:79;;:::i;:::-;7546:117;7687:63;7742:7;7733:6;7722:9;7718:22;7687:63;:::i;:::-;7677:73;;7473:287;7258:509;;;;:::o;7773:329::-;7832:6;7881:2;7869:9;7860:7;7856:23;7852:32;7849:119;;;7887:79;;:::i;:::-;7849:119;8007:1;8032:53;8077:7;8068:6;8057:9;8053:22;8032:53;:::i;:::-;8022:63;;7978:117;7773:329;;;;:::o;8108:474::-;8176:6;8184;8233:2;8221:9;8212:7;8208:23;8204:32;8201:119;;;8239:79;;:::i;:::-;8201:119;8359:1;8384:53;8429:7;8420:6;8409:9;8405:22;8384:53;:::i;:::-;8374:63;;8330:117;8486:2;8512:53;8557:7;8548:6;8537:9;8533:22;8512:53;:::i;:::-;8502:63;;8457:118;8108:474;;;;;:::o;8588:179::-;8657:10;8678:46;8720:3;8712:6;8678:46;:::i;:::-;8756:4;8751:3;8747:14;8733:28;;8588:179;;;;:::o;8773:118::-;8860:24;8878:5;8860:24;:::i;:::-;8855:3;8848:37;8773:118;;:::o;8927:732::-;9046:3;9075:54;9123:5;9075:54;:::i;:::-;9145:86;9224:6;9219:3;9145:86;:::i;:::-;9138:93;;9255:56;9305:5;9255:56;:::i;:::-;9334:7;9365:1;9350:284;9375:6;9372:1;9369:13;9350:284;;;9451:6;9445:13;9478:63;9537:3;9522:13;9478:63;:::i;:::-;9471:70;;9564:60;9617:6;9564:60;:::i;:::-;9554:70;;9410:224;9397:1;9394;9390:9;9385:14;;9350:284;;;9354:14;9650:3;9643:10;;9051:608;;;8927:732;;;;:::o;9665:109::-;9746:21;9761:5;9746:21;:::i;:::-;9741:3;9734:34;9665:109;;:::o;9780:360::-;9866:3;9894:38;9926:5;9894:38;:::i;:::-;9948:70;10011:6;10006:3;9948:70;:::i;:::-;9941:77;;10027:52;10072:6;10067:3;10060:4;10053:5;10049:16;10027:52;:::i;:::-;10104:29;10126:6;10104:29;:::i;:::-;10099:3;10095:39;10088:46;;9870:270;9780:360;;;;:::o;10146:364::-;10234:3;10262:39;10295:5;10262:39;:::i;:::-;10317:71;10381:6;10376:3;10317:71;:::i;:::-;10310:78;;10397:52;10442:6;10437:3;10430:4;10423:5;10419:16;10397:52;:::i;:::-;10474:29;10496:6;10474:29;:::i;:::-;10469:3;10465:39;10458:46;;10238:272;10146:364;;;;:::o;10516:377::-;10622:3;10650:39;10683:5;10650:39;:::i;:::-;10705:89;10787:6;10782:3;10705:89;:::i;:::-;10698:96;;10803:52;10848:6;10843:3;10836:4;10829:5;10825:16;10803:52;:::i;:::-;10880:6;10875:3;10871:16;10864:23;;10626:267;10516:377;;;;:::o;10923:845::-;11026:3;11063:5;11057:12;11092:36;11118:9;11092:36;:::i;:::-;11144:89;11226:6;11221:3;11144:89;:::i;:::-;11137:96;;11264:1;11253:9;11249:17;11280:1;11275:137;;;;11426:1;11421:341;;;;11242:520;;11275:137;11359:4;11355:9;11344;11340:25;11335:3;11328:38;11395:6;11390:3;11386:16;11379:23;;11275:137;;11421:341;11488:38;11520:5;11488:38;:::i;:::-;11548:1;11562:154;11576:6;11573:1;11570:13;11562:154;;;11650:7;11644:14;11640:1;11635:3;11631:11;11624:35;11700:1;11691:7;11687:15;11676:26;;11598:4;11595:1;11591:12;11586:17;;11562:154;;;11745:6;11740:3;11736:16;11729:23;;11428:334;;11242:520;;11030:738;;10923:845;;;;:::o;11774:366::-;11916:3;11937:67;12001:2;11996:3;11937:67;:::i;:::-;11930:74;;12013:93;12102:3;12013:93;:::i;:::-;12131:2;12126:3;12122:12;12115:19;;11774:366;;;:::o;12146:::-;12288:3;12309:67;12373:2;12368:3;12309:67;:::i;:::-;12302:74;;12385:93;12474:3;12385:93;:::i;:::-;12503:2;12498:3;12494:12;12487:19;;12146:366;;;:::o;12518:::-;12660:3;12681:67;12745:2;12740:3;12681:67;:::i;:::-;12674:74;;12757:93;12846:3;12757:93;:::i;:::-;12875:2;12870:3;12866:12;12859:19;;12518:366;;;:::o;12890:::-;13032:3;13053:67;13117:2;13112:3;13053:67;:::i;:::-;13046:74;;13129:93;13218:3;13129:93;:::i;:::-;13247:2;13242:3;13238:12;13231:19;;12890:366;;;:::o;13262:::-;13404:3;13425:67;13489:2;13484:3;13425:67;:::i;:::-;13418:74;;13501:93;13590:3;13501:93;:::i;:::-;13619:2;13614:3;13610:12;13603:19;;13262:366;;;:::o;13634:::-;13776:3;13797:67;13861:2;13856:3;13797:67;:::i;:::-;13790:74;;13873:93;13962:3;13873:93;:::i;:::-;13991:2;13986:3;13982:12;13975:19;;13634:366;;;:::o;14006:::-;14148:3;14169:67;14233:2;14228:3;14169:67;:::i;:::-;14162:74;;14245:93;14334:3;14245:93;:::i;:::-;14363:2;14358:3;14354:12;14347:19;;14006:366;;;:::o;14378:::-;14520:3;14541:67;14605:2;14600:3;14541:67;:::i;:::-;14534:74;;14617:93;14706:3;14617:93;:::i;:::-;14735:2;14730:3;14726:12;14719:19;;14378:366;;;:::o;14750:::-;14892:3;14913:67;14977:2;14972:3;14913:67;:::i;:::-;14906:74;;14989:93;15078:3;14989:93;:::i;:::-;15107:2;15102:3;15098:12;15091:19;;14750:366;;;:::o;15122:::-;15264:3;15285:67;15349:2;15344:3;15285:67;:::i;:::-;15278:74;;15361:93;15450:3;15361:93;:::i;:::-;15479:2;15474:3;15470:12;15463:19;;15122:366;;;:::o;15494:::-;15636:3;15657:67;15721:2;15716:3;15657:67;:::i;:::-;15650:74;;15733:93;15822:3;15733:93;:::i;:::-;15851:2;15846:3;15842:12;15835:19;;15494:366;;;:::o;15866:::-;16008:3;16029:67;16093:2;16088:3;16029:67;:::i;:::-;16022:74;;16105:93;16194:3;16105:93;:::i;:::-;16223:2;16218:3;16214:12;16207:19;;15866:366;;;:::o;16238:::-;16380:3;16401:67;16465:2;16460:3;16401:67;:::i;:::-;16394:74;;16477:93;16566:3;16477:93;:::i;:::-;16595:2;16590:3;16586:12;16579:19;;16238:366;;;:::o;16610:::-;16752:3;16773:67;16837:2;16832:3;16773:67;:::i;:::-;16766:74;;16849:93;16938:3;16849:93;:::i;:::-;16967:2;16962:3;16958:12;16951:19;;16610:366;;;:::o;16982:::-;17124:3;17145:67;17209:2;17204:3;17145:67;:::i;:::-;17138:74;;17221:93;17310:3;17221:93;:::i;:::-;17339:2;17334:3;17330:12;17323:19;;16982:366;;;:::o;17354:::-;17496:3;17517:67;17581:2;17576:3;17517:67;:::i;:::-;17510:74;;17593:93;17682:3;17593:93;:::i;:::-;17711:2;17706:3;17702:12;17695:19;;17354:366;;;:::o;17726:::-;17868:3;17889:67;17953:2;17948:3;17889:67;:::i;:::-;17882:74;;17965:93;18054:3;17965:93;:::i;:::-;18083:2;18078:3;18074:12;18067:19;;17726:366;;;:::o;18098:::-;18240:3;18261:67;18325:2;18320:3;18261:67;:::i;:::-;18254:74;;18337:93;18426:3;18337:93;:::i;:::-;18455:2;18450:3;18446:12;18439:19;;18098:366;;;:::o;18470:::-;18612:3;18633:67;18697:2;18692:3;18633:67;:::i;:::-;18626:74;;18709:93;18798:3;18709:93;:::i;:::-;18827:2;18822:3;18818:12;18811:19;;18470:366;;;:::o;18842:::-;18984:3;19005:67;19069:2;19064:3;19005:67;:::i;:::-;18998:74;;19081:93;19170:3;19081:93;:::i;:::-;19199:2;19194:3;19190:12;19183:19;;18842:366;;;:::o;19214:108::-;19291:24;19309:5;19291:24;:::i;:::-;19286:3;19279:37;19214:108;;:::o;19328:118::-;19415:24;19433:5;19415:24;:::i;:::-;19410:3;19403:37;19328:118;;:::o;19452:589::-;19677:3;19699:95;19790:3;19781:6;19699:95;:::i;:::-;19692:102;;19811:95;19902:3;19893:6;19811:95;:::i;:::-;19804:102;;19923:92;20011:3;20002:6;19923:92;:::i;:::-;19916:99;;20032:3;20025:10;;19452:589;;;;;;:::o;20047:222::-;20140:4;20178:2;20167:9;20163:18;20155:26;;20191:71;20259:1;20248:9;20244:17;20235:6;20191:71;:::i;:::-;20047:222;;;;:::o;20275:640::-;20470:4;20508:3;20497:9;20493:19;20485:27;;20522:71;20590:1;20579:9;20575:17;20566:6;20522:71;:::i;:::-;20603:72;20671:2;20660:9;20656:18;20647:6;20603:72;:::i;:::-;20685;20753:2;20742:9;20738:18;20729:6;20685:72;:::i;:::-;20804:9;20798:4;20794:20;20789:2;20778:9;20774:18;20767:48;20832:76;20903:4;20894:6;20832:76;:::i;:::-;20824:84;;20275:640;;;;;;;:::o;20921:332::-;21042:4;21080:2;21069:9;21065:18;21057:26;;21093:71;21161:1;21150:9;21146:17;21137:6;21093:71;:::i;:::-;21174:72;21242:2;21231:9;21227:18;21218:6;21174:72;:::i;:::-;20921:332;;;;;:::o;21259:373::-;21402:4;21440:2;21429:9;21425:18;21417:26;;21489:9;21483:4;21479:20;21475:1;21464:9;21460:17;21453:47;21517:108;21620:4;21611:6;21517:108;:::i;:::-;21509:116;;21259:373;;;;:::o;21638:210::-;21725:4;21763:2;21752:9;21748:18;21740:26;;21776:65;21838:1;21827:9;21823:17;21814:6;21776:65;:::i;:::-;21638:210;;;;:::o;21854:313::-;21967:4;22005:2;21994:9;21990:18;21982:26;;22054:9;22048:4;22044:20;22040:1;22029:9;22025:17;22018:47;22082:78;22155:4;22146:6;22082:78;:::i;:::-;22074:86;;21854:313;;;;:::o;22173:419::-;22339:4;22377:2;22366:9;22362:18;22354:26;;22426:9;22420:4;22416:20;22412:1;22401:9;22397:17;22390:47;22454:131;22580:4;22454:131;:::i;:::-;22446:139;;22173:419;;;:::o;22598:::-;22764:4;22802:2;22791:9;22787:18;22779:26;;22851:9;22845:4;22841:20;22837:1;22826:9;22822:17;22815:47;22879:131;23005:4;22879:131;:::i;:::-;22871:139;;22598:419;;;:::o;23023:::-;23189:4;23227:2;23216:9;23212:18;23204:26;;23276:9;23270:4;23266:20;23262:1;23251:9;23247:17;23240:47;23304:131;23430:4;23304:131;:::i;:::-;23296:139;;23023:419;;;:::o;23448:::-;23614:4;23652:2;23641:9;23637:18;23629:26;;23701:9;23695:4;23691:20;23687:1;23676:9;23672:17;23665:47;23729:131;23855:4;23729:131;:::i;:::-;23721:139;;23448:419;;;:::o;23873:::-;24039:4;24077:2;24066:9;24062:18;24054:26;;24126:9;24120:4;24116:20;24112:1;24101:9;24097:17;24090:47;24154:131;24280:4;24154:131;:::i;:::-;24146:139;;23873:419;;;:::o;24298:::-;24464:4;24502:2;24491:9;24487:18;24479:26;;24551:9;24545:4;24541:20;24537:1;24526:9;24522:17;24515:47;24579:131;24705:4;24579:131;:::i;:::-;24571:139;;24298:419;;;:::o;24723:::-;24889:4;24927:2;24916:9;24912:18;24904:26;;24976:9;24970:4;24966:20;24962:1;24951:9;24947:17;24940:47;25004:131;25130:4;25004:131;:::i;:::-;24996:139;;24723:419;;;:::o;25148:::-;25314:4;25352:2;25341:9;25337:18;25329:26;;25401:9;25395:4;25391:20;25387:1;25376:9;25372:17;25365:47;25429:131;25555:4;25429:131;:::i;:::-;25421:139;;25148:419;;;:::o;25573:::-;25739:4;25777:2;25766:9;25762:18;25754:26;;25826:9;25820:4;25816:20;25812:1;25801:9;25797:17;25790:47;25854:131;25980:4;25854:131;:::i;:::-;25846:139;;25573:419;;;:::o;25998:::-;26164:4;26202:2;26191:9;26187:18;26179:26;;26251:9;26245:4;26241:20;26237:1;26226:9;26222:17;26215:47;26279:131;26405:4;26279:131;:::i;:::-;26271:139;;25998:419;;;:::o;26423:::-;26589:4;26627:2;26616:9;26612:18;26604:26;;26676:9;26670:4;26666:20;26662:1;26651:9;26647:17;26640:47;26704:131;26830:4;26704:131;:::i;:::-;26696:139;;26423:419;;;:::o;26848:::-;27014:4;27052:2;27041:9;27037:18;27029:26;;27101:9;27095:4;27091:20;27087:1;27076:9;27072:17;27065:47;27129:131;27255:4;27129:131;:::i;:::-;27121:139;;26848:419;;;:::o;27273:::-;27439:4;27477:2;27466:9;27462:18;27454:26;;27526:9;27520:4;27516:20;27512:1;27501:9;27497:17;27490:47;27554:131;27680:4;27554:131;:::i;:::-;27546:139;;27273:419;;;:::o;27698:::-;27864:4;27902:2;27891:9;27887:18;27879:26;;27951:9;27945:4;27941:20;27937:1;27926:9;27922:17;27915:47;27979:131;28105:4;27979:131;:::i;:::-;27971:139;;27698:419;;;:::o;28123:::-;28289:4;28327:2;28316:9;28312:18;28304:26;;28376:9;28370:4;28366:20;28362:1;28351:9;28347:17;28340:47;28404:131;28530:4;28404:131;:::i;:::-;28396:139;;28123:419;;;:::o;28548:::-;28714:4;28752:2;28741:9;28737:18;28729:26;;28801:9;28795:4;28791:20;28787:1;28776:9;28772:17;28765:47;28829:131;28955:4;28829:131;:::i;:::-;28821:139;;28548:419;;;:::o;28973:::-;29139:4;29177:2;29166:9;29162:18;29154:26;;29226:9;29220:4;29216:20;29212:1;29201:9;29197:17;29190:47;29254:131;29380:4;29254:131;:::i;:::-;29246:139;;28973:419;;;:::o;29398:::-;29564:4;29602:2;29591:9;29587:18;29579:26;;29651:9;29645:4;29641:20;29637:1;29626:9;29622:17;29615:47;29679:131;29805:4;29679:131;:::i;:::-;29671:139;;29398:419;;;:::o;29823:::-;29989:4;30027:2;30016:9;30012:18;30004:26;;30076:9;30070:4;30066:20;30062:1;30051:9;30047:17;30040:47;30104:131;30230:4;30104:131;:::i;:::-;30096:139;;29823:419;;;:::o;30248:::-;30414:4;30452:2;30441:9;30437:18;30429:26;;30501:9;30495:4;30491:20;30487:1;30476:9;30472:17;30465:47;30529:131;30655:4;30529:131;:::i;:::-;30521:139;;30248:419;;;:::o;30673:222::-;30766:4;30804:2;30793:9;30789:18;30781:26;;30817:71;30885:1;30874:9;30870:17;30861:6;30817:71;:::i;:::-;30673:222;;;;:::o;30901:129::-;30935:6;30962:20;;:::i;:::-;30952:30;;30991:33;31019:4;31011:6;30991:33;:::i;:::-;30901:129;;;:::o;31036:75::-;31069:6;31102:2;31096:9;31086:19;;31036:75;:::o;31117:307::-;31178:4;31268:18;31260:6;31257:30;31254:56;;;31290:18;;:::i;:::-;31254:56;31328:29;31350:6;31328:29;:::i;:::-;31320:37;;31412:4;31406;31402:15;31394:23;;31117:307;;;:::o;31430:308::-;31492:4;31582:18;31574:6;31571:30;31568:56;;;31604:18;;:::i;:::-;31568:56;31642:29;31664:6;31642:29;:::i;:::-;31634:37;;31726:4;31720;31716:15;31708:23;;31430:308;;;:::o;31744:132::-;31811:4;31834:3;31826:11;;31864:4;31859:3;31855:14;31847:22;;31744:132;;;:::o;31882:141::-;31931:4;31954:3;31946:11;;31977:3;31974:1;31967:14;32011:4;32008:1;31998:18;31990:26;;31882:141;;;:::o;32029:114::-;32096:6;32130:5;32124:12;32114:22;;32029:114;;;:::o;32149:98::-;32200:6;32234:5;32228:12;32218:22;;32149:98;;;:::o;32253:99::-;32305:6;32339:5;32333:12;32323:22;;32253:99;;;:::o;32358:113::-;32428:4;32460;32455:3;32451:14;32443:22;;32358:113;;;:::o;32477:184::-;32576:11;32610:6;32605:3;32598:19;32650:4;32645:3;32641:14;32626:29;;32477:184;;;;:::o;32667:168::-;32750:11;32784:6;32779:3;32772:19;32824:4;32819:3;32815:14;32800:29;;32667:168;;;;:::o;32841:169::-;32925:11;32959:6;32954:3;32947:19;32999:4;32994:3;32990:14;32975:29;;32841:169;;;;:::o;33016:148::-;33118:11;33155:3;33140:18;;33016:148;;;;:::o;33170:305::-;33210:3;33229:20;33247:1;33229:20;:::i;:::-;33224:25;;33263:20;33281:1;33263:20;:::i;:::-;33258:25;;33417:1;33349:66;33345:74;33342:1;33339:81;33336:107;;;33423:18;;:::i;:::-;33336:107;33467:1;33464;33460:9;33453:16;;33170:305;;;;:::o;33481:185::-;33521:1;33538:20;33556:1;33538:20;:::i;:::-;33533:25;;33572:20;33590:1;33572:20;:::i;:::-;33567:25;;33611:1;33601:35;;33616:18;;:::i;:::-;33601:35;33658:1;33655;33651:9;33646:14;;33481:185;;;;:::o;33672:348::-;33712:7;33735:20;33753:1;33735:20;:::i;:::-;33730:25;;33769:20;33787:1;33769:20;:::i;:::-;33764:25;;33957:1;33889:66;33885:74;33882:1;33879:81;33874:1;33867:9;33860:17;33856:105;33853:131;;;33964:18;;:::i;:::-;33853:131;34012:1;34009;34005:9;33994:20;;33672:348;;;;:::o;34026:191::-;34066:4;34086:20;34104:1;34086:20;:::i;:::-;34081:25;;34120:20;34138:1;34120:20;:::i;:::-;34115:25;;34159:1;34156;34153:8;34150:34;;;34164:18;;:::i;:::-;34150:34;34209:1;34206;34202:9;34194:17;;34026:191;;;;:::o;34223:96::-;34260:7;34289:24;34307:5;34289:24;:::i;:::-;34278:35;;34223:96;;;:::o;34325:90::-;34359:7;34402:5;34395:13;34388:21;34377:32;;34325:90;;;:::o;34421:149::-;34457:7;34497:66;34490:5;34486:78;34475:89;;34421:149;;;:::o;34576:126::-;34613:7;34653:42;34646:5;34642:54;34631:65;;34576:126;;;:::o;34708:77::-;34745:7;34774:5;34763:16;;34708:77;;;:::o;34791:109::-;34827:7;34867:26;34860:5;34856:38;34845:49;;34791:109;;;:::o;34906:154::-;34990:6;34985:3;34980;34967:30;35052:1;35043:6;35038:3;35034:16;35027:27;34906:154;;;:::o;35066:307::-;35134:1;35144:113;35158:6;35155:1;35152:13;35144:113;;;35243:1;35238:3;35234:11;35228:18;35224:1;35219:3;35215:11;35208:39;35180:2;35177:1;35173:10;35168:15;;35144:113;;;35275:6;35272:1;35269:13;35266:101;;;35355:1;35346:6;35341:3;35337:16;35330:27;35266:101;35115:258;35066:307;;;:::o;35379:320::-;35423:6;35460:1;35454:4;35450:12;35440:22;;35507:1;35501:4;35497:12;35528:18;35518:81;;35584:4;35576:6;35572:17;35562:27;;35518:81;35646:2;35638:6;35635:14;35615:18;35612:38;35609:84;;;35665:18;;:::i;:::-;35609:84;35430:269;35379:320;;;:::o;35705:281::-;35788:27;35810:4;35788:27;:::i;:::-;35780:6;35776:40;35918:6;35906:10;35903:22;35882:18;35870:10;35867:34;35864:62;35861:88;;;35929:18;;:::i;:::-;35861:88;35969:10;35965:2;35958:22;35748:238;35705:281;;:::o;35992:233::-;36031:3;36054:24;36072:5;36054:24;:::i;:::-;36045:33;;36100:66;36093:5;36090:77;36087:103;;;36170:18;;:::i;:::-;36087:103;36217:1;36210:5;36206:13;36199:20;;35992:233;;;:::o;36231:176::-;36263:1;36280:20;36298:1;36280:20;:::i;:::-;36275:25;;36314:20;36332:1;36314:20;:::i;:::-;36309:25;;36353:1;36343:35;;36358:18;;:::i;:::-;36343:35;36399:1;36396;36392:9;36387:14;;36231:176;;;;:::o;36413:180::-;36461:77;36458:1;36451:88;36558:4;36555:1;36548:15;36582:4;36579:1;36572:15;36599:180;36647:77;36644:1;36637:88;36744:4;36741:1;36734:15;36768:4;36765:1;36758:15;36785:180;36833:77;36830:1;36823:88;36930:4;36927:1;36920:15;36954:4;36951:1;36944:15;36971:180;37019:77;37016:1;37009:88;37116:4;37113:1;37106:15;37140:4;37137:1;37130:15;37157:180;37205:77;37202:1;37195:88;37302:4;37299:1;37292:15;37326:4;37323:1;37316:15;37343:180;37391:77;37388:1;37381:88;37488:4;37485:1;37478:15;37512:4;37509:1;37502:15;37529:117;37638:1;37635;37628:12;37652:117;37761:1;37758;37751:12;37775:117;37884:1;37881;37874:12;37898:117;38007:1;38004;37997:12;38021:102;38062:6;38113:2;38109:7;38104:2;38097:5;38093:14;38089:28;38079:38;;38021:102;;;:::o;38129:230::-;38269:34;38265:1;38257:6;38253:14;38246:58;38338:13;38333:2;38325:6;38321:15;38314:38;38129:230;:::o;38365:237::-;38505:34;38501:1;38493:6;38489:14;38482:58;38574:20;38569:2;38561:6;38557:15;38550:45;38365:237;:::o;38608:225::-;38748:34;38744:1;38736:6;38732:14;38725:58;38817:8;38812:2;38804:6;38800:15;38793:33;38608:225;:::o;38839:224::-;38979:34;38975:1;38967:6;38963:14;38956:58;39048:7;39043:2;39035:6;39031:15;39024:32;38839:224;:::o;39069:178::-;39209:30;39205:1;39197:6;39193:14;39186:54;39069:178;:::o;39253:223::-;39393:34;39389:1;39381:6;39377:14;39370:58;39462:6;39457:2;39449:6;39445:15;39438:31;39253:223;:::o;39482:175::-;39622:27;39618:1;39610:6;39606:14;39599:51;39482:175;:::o;39663:231::-;39803:34;39799:1;39791:6;39787:14;39780:58;39872:14;39867:2;39859:6;39855:15;39848:39;39663:231;:::o;39900:243::-;40040:34;40036:1;40028:6;40024:14;40017:58;40109:26;40104:2;40096:6;40092:15;40085:51;39900:243;:::o;40149:229::-;40289:34;40285:1;40277:6;40273:14;40266:58;40358:12;40353:2;40345:6;40341:15;40334:37;40149:229;:::o;40384:228::-;40524:34;40520:1;40512:6;40508:14;40501:58;40593:11;40588:2;40580:6;40576:15;40569:36;40384:228;:::o;40618:182::-;40758:34;40754:1;40746:6;40742:14;40735:58;40618:182;:::o;40806:231::-;40946:34;40942:1;40934:6;40930:14;40923:58;41015:14;41010:2;41002:6;40998:15;40991:39;40806:231;:::o;41043:182::-;41183:34;41179:1;41171:6;41167:14;41160:58;41043:182;:::o;41231:234::-;41371:34;41367:1;41359:6;41355:14;41348:58;41440:17;41435:2;41427:6;41423:15;41416:42;41231:234;:::o;41471:220::-;41611:34;41607:1;41599:6;41595:14;41588:58;41680:3;41675:2;41667:6;41663:15;41656:28;41471:220;:::o;41697:236::-;41837:34;41833:1;41825:6;41821:14;41814:58;41906:19;41901:2;41893:6;41889:15;41882:44;41697:236;:::o;41939:231::-;42079:34;42075:1;42067:6;42063:14;42056:58;42148:14;42143:2;42135:6;42131:15;42124:39;41939:231;:::o;42176:229::-;42316:34;42312:1;42304:6;42300:14;42293:58;42385:12;42380:2;42372:6;42368:15;42361:37;42176:229;:::o;42411:175::-;42551:27;42547:1;42539:6;42535:14;42528:51;42411:175;:::o;42592:122::-;42665:24;42683:5;42665:24;:::i;:::-;42658:5;42655:35;42645:63;;42704:1;42701;42694:12;42645:63;42592:122;:::o;42720:116::-;42790:21;42805:5;42790:21;:::i;:::-;42783:5;42780:32;42770:60;;42826:1;42823;42816:12;42770:60;42720:116;:::o;42842:120::-;42914:23;42931:5;42914:23;:::i;:::-;42907:5;42904:34;42894:62;;42952:1;42949;42942:12;42894:62;42842:120;:::o;42968:122::-;43041:24;43059:5;43041:24;:::i;:::-;43034:5;43031:35;43021:63;;43080:1;43077;43070:12;43021:63;42968:122;:::o;43096:120::-;43168:23;43185:5;43168:23;:::i;:::-;43161:5;43158:34;43148:62;;43206:1;43203;43196:12;43148:62;43096:120;:::o

Swarm Source

ipfs://d1feca48318dba53c8825fd21dbb3f6ffbd2919e85c903a1575886f1c1ecd093
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.