abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
/**
 __         ______   ________         ______                                          
 |  \       /      \ |        \       /      \                                         
 | $$      |  $$$$$$\| $$$$$$$$      |  $$$$$$\  ______    ______   __    __   ______  
 | $$       \$$__| $$| $$__          | $$ __\$$ /      \  /      \ |  \  |  \ /      \ 
 | $$       /      $$| $$  \         | $$|    \|  $$$$$$\|  $$$$$$\| $$  | $$|  $$$$$$\
 | $$      |  $$$$$$ | $$$$$         | $$ \$$$$| $$   \$$| $$  | $$| $$  | $$| $$  | $$
 | $$_____ | $$_____ | $$_____       | $$__| $$| $$      | $$__/ $$| $$__/ $$| $$__/ $$
 | $$     \| $$     \| $$     \       \$$    $$| $$       \$$    $$ \$$    $$| $$    $$
 \$$$$$$$$ \$$$$$$$$ \$$$$$$$$        \$$$$$$  \$$        \$$$$$$   \$$$$$$ | $$$$$$$ 
 | $$      
 | $$      
 \$$      
 */
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    return interfaceId == type(IERC165).interfaceId;
}

/**
 * @dev See {IERC165-supportsInterface}.
 */