<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def search_files(source: str, extensions: List[str]) -> List[Path]: """Retrieve files located the source directory and its subdirectories, whose extension match one of the listed extensions. :raise GuesslangError: when there is not enough files in the directory :param source: directory name :param extensions: list of file extensions :return: filenames """

    files = [
        path for path in Path(source).glob('**/*')
        if path.is_file() and path.suffix.lstrip('.') in extensions]
    nb_files = len(files)
    LOGGER.debug("Total files found: %d", nb_files)

    if nb_files < NB_FILES_MIN:
        LOGGER.error("Too few source files")
        raise GuesslangError(
            '{} source files found in {}. {} files minimum is required'.format(
                nb_files, source, NB_FILES_MIN))

    random.shuffle(files)
    return files