"""simple docstring"""





from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_tf_available,
    is_torch_available,
)


_UpperCamelCase       :						Any     =   {
    '''auto_factory''': ['''get_values'''],
    '''configuration_auto''': ['''ALL_PRETRAINED_CONFIG_ARCHIVE_MAP''', '''CONFIG_MAPPING''', '''MODEL_NAMES_MAPPING''', '''AutoConfig'''],
    '''feature_extraction_auto''': ['''FEATURE_EXTRACTOR_MAPPING''', '''AutoFeatureExtractor'''],
    '''image_processing_auto''': ['''IMAGE_PROCESSOR_MAPPING''', '''AutoImageProcessor'''],
    '''processing_auto''': ['''PROCESSOR_MAPPING''', '''AutoProcessor'''],
    '''tokenization_auto''': ['''TOKENIZER_MAPPING''', '''AutoTokenizer'''],
}

try:
							if not is_torch_available():
														raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
							pass
else:
							_UpperCamelCase       :						Dict     =   [
							    '''MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING''',
							    '''MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING''',
							    '''MODEL_FOR_AUDIO_XVECTOR_MAPPING''',
							    '''MODEL_FOR_BACKBONE_MAPPING''',
							    '''MODEL_FOR_CAUSAL_IMAGE_MODELING_MAPPING''',
							    '''MODEL_FOR_CAUSAL_LM_MAPPING''',
							    '''MODEL_FOR_CTC_MAPPING''',
							    '''MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING''',
							    '''MODEL_FOR_DEPTH_ESTIMATION_MAPPING''',
							    '''MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING''',
							    '''MODEL_FOR_IMAGE_SEGMENTATION_MAPPING''',
							    '''MODEL_FOR_INSTANCE_SEGMENTATION_MAPPING''',
							    '''MODEL_FOR_MASKED_IMAGE_MODELING_MAPPING''',
							    '''MODEL_FOR_MASKED_LM_MAPPING''',
							    '''MODEL_FOR_MASK_GENERATION_MAPPING''',
							    '''MODEL_FOR_MULTIPLE_CHOICE_MAPPING''',
							    '''MODEL_FOR_NEXT_SENTENCE_PREDICTION_MAPPING''',
							    '''MODEL_FOR_OBJECT_DETECTION_MAPPING''',
							    '''MODEL_FOR_PRETRAINING_MAPPING''',
							    '''MODEL_FOR_QUESTION_ANSWERING_MAPPING''',
							    '''MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING''',
							    '''MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING''',
							    '''MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING''',
							    '''MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING''',
							    '''MODEL_FOR_TABLE_QUESTION_ANSWERING_MAPPING''',
							    '''MODEL_FOR_TEXT_ENCODING_MAPPING''',
							    '''MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING''',
							    '''MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING''',
							    '''MODEL_FOR_VIDEO_CLASSIFICATION_MAPPING''',
							    '''MODEL_FOR_VISION_2_SEQ_MAPPING''',
							    '''MODEL_FOR_VISUAL_QUESTION_ANSWERING_MAPPING''',
							    '''MODEL_MAPPING''',
							    '''MODEL_WITH_LM_HEAD_MAPPING''',
							    '''MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING''',
							    '''MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING''',
							    '''AutoModel''',
							    '''AutoBackbone''',
							    '''AutoModelForAudioClassification''',
							    '''AutoModelForAudioFrameClassification''',
							    '''AutoModelForAudioXVector''',
							    '''AutoModelForCausalLM''',
							    '''AutoModelForCTC''',
							    '''AutoModelForDepthEstimation''',
							    '''AutoModelForImageClassification''',
							    '''AutoModelForImageSegmentation''',
							    '''AutoModelForInstanceSegmentation''',
							    '''AutoModelForMaskGeneration''',
							    '''AutoModelForTextEncoding''',
							    '''AutoModelForMaskedImageModeling''',
							    '''AutoModelForMaskedLM''',
							    '''AutoModelForMultipleChoice''',
							    '''AutoModelForNextSentencePrediction''',
							    '''AutoModelForObjectDetection''',
							    '''AutoModelForPreTraining''',
							    '''AutoModelForQuestionAnswering''',
							    '''AutoModelForSemanticSegmentation''',
							    '''AutoModelForSeq2SeqLM''',
							    '''AutoModelForSequenceClassification''',
							    '''AutoModelForSpeechSeq2Seq''',
							    '''AutoModelForTableQuestionAnswering''',
							    '''AutoModelForTokenClassification''',
							    '''AutoModelForUniversalSegmentation''',
							    '''AutoModelForVideoClassification''',
							    '''AutoModelForVision2Seq''',
							    '''AutoModelForVisualQuestionAnswering''',
							    '''AutoModelForDocumentQuestionAnswering''',
							    '''AutoModelWithLMHead''',
							    '''AutoModelForZeroShotImageClassification''',
							    '''AutoModelForZeroShotObjectDetection''',
							]

try:
							if not is_tf_available():
														raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
							pass
else:
							_UpperCamelCase       :						Union[str, Any]     =   [
							    '''TF_MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING''',
							    '''TF_MODEL_FOR_CAUSAL_LM_MAPPING''',
							    '''TF_MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING''',
							    '''TF_MODEL_FOR_MASK_GENERATION_MAPPING''',
							    '''TF_MODEL_FOR_MASKED_IMAGE_MODELING_MAPPING''',
							    '''TF_MODEL_FOR_MASKED_LM_MAPPING''',
							    '''TF_MODEL_FOR_MULTIPLE_CHOICE_MAPPING''',
							    '''TF_MODEL_FOR_NEXT_SENTENCE_PREDICTION_MAPPING''',
							    '''TF_MODEL_FOR_PRETRAINING_MAPPING''',
							    '''TF_MODEL_FOR_QUESTION_ANSWERING_MAPPING''',
							    '''TF_MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING''',
							    '''TF_MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING''',
							    '''TF_MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING''',
							    '''TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING''',
							    '''TF_MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING''',
							    '''TF_MODEL_FOR_TABLE_QUESTION_ANSWERING_MAPPING''',
							    '''TF_MODEL_FOR_TEXT_ENCODING_MAPPING''',
							    '''TF_MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING''',
							    '''TF_MODEL_FOR_VISION_2_SEQ_MAPPING''',
							    '''TF_MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING''',
							    '''TF_MODEL_MAPPING''',
							    '''TF_MODEL_WITH_LM_HEAD_MAPPING''',
							    '''TFAutoModel''',
							    '''TFAutoModelForAudioClassification''',
							    '''TFAutoModelForCausalLM''',
							    '''TFAutoModelForImageClassification''',
							    '''TFAutoModelForMaskedImageModeling''',
							    '''TFAutoModelForMaskedLM''',
							    '''TFAutoModelForMaskGeneration''',
							    '''TFAutoModelForMultipleChoice''',
							    '''TFAutoModelForNextSentencePrediction''',
							    '''TFAutoModelForPreTraining''',
							    '''TFAutoModelForDocumentQuestionAnswering''',
							    '''TFAutoModelForQuestionAnswering''',
							    '''TFAutoModelForSemanticSegmentation''',
							    '''TFAutoModelForSeq2SeqLM''',
							    '''TFAutoModelForSequenceClassification''',
							    '''TFAutoModelForSpeechSeq2Seq''',
							    '''TFAutoModelForTableQuestionAnswering''',
							    '''TFAutoModelForTextEncoding''',
							    '''TFAutoModelForTokenClassification''',
							    '''TFAutoModelForVision2Seq''',
							    '''TFAutoModelForZeroShotImageClassification''',
							    '''TFAutoModelWithLMHead''',
							]

try:
							if not is_flax_available():
														raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
							pass
else:
							_UpperCamelCase       :						Optional[int]     =   [
							    '''FLAX_MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING''',
							    '''FLAX_MODEL_FOR_CAUSAL_LM_MAPPING''',
							    '''FLAX_MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING''',
							    '''FLAX_MODEL_FOR_MASKED_LM_MAPPING''',
							    '''FLAX_MODEL_FOR_MULTIPLE_CHOICE_MAPPING''',
							    '''FLAX_MODEL_FOR_NEXT_SENTENCE_PREDICTION_MAPPING''',
							    '''FLAX_MODEL_FOR_PRETRAINING_MAPPING''',
							    '''FLAX_MODEL_FOR_QUESTION_ANSWERING_MAPPING''',
							    '''FLAX_MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING''',
							    '''FLAX_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING''',
							    '''FLAX_MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING''',
							    '''FLAX_MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING''',
							    '''FLAX_MODEL_FOR_VISION_2_SEQ_MAPPING''',
							    '''FLAX_MODEL_MAPPING''',
							    '''FlaxAutoModel''',
							    '''FlaxAutoModelForCausalLM''',
							    '''FlaxAutoModelForImageClassification''',
							    '''FlaxAutoModelForMaskedLM''',
							    '''FlaxAutoModelForMultipleChoice''',
							    '''FlaxAutoModelForNextSentencePrediction''',
							    '''FlaxAutoModelForPreTraining''',
							    '''FlaxAutoModelForQuestionAnswering''',
							    '''FlaxAutoModelForSeq2SeqLM''',
							    '''FlaxAutoModelForSequenceClassification''',
							    '''FlaxAutoModelForSpeechSeq2Seq''',
							    '''FlaxAutoModelForTokenClassification''',
							    '''FlaxAutoModelForVision2Seq''',
							]


if TYPE_CHECKING:
							from .auto_factory import get_values
							from .configuration_auto import ALL_PRETRAINED_CONFIG_ARCHIVE_MAP, CONFIG_MAPPING, MODEL_NAMES_MAPPING, AutoConfig
							from .feature_extraction_auto import FEATURE_EXTRACTOR_MAPPING, AutoFeatureExtractor
							from .image_processing_auto import IMAGE_PROCESSOR_MAPPING, AutoImageProcessor
							from .processing_auto import PROCESSOR_MAPPING, AutoProcessor
							from .tokenization_auto import TOKENIZER_MAPPING, AutoTokenizer

							try:
														if not is_torch_available():
																					raise OptionalDependencyNotAvailable()
							except OptionalDependencyNotAvailable:
														pass
							else:
														from .modeling_auto import (
														    MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING,
														    MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING,
														    MODEL_FOR_AUDIO_XVECTOR_MAPPING,
														    MODEL_FOR_BACKBONE_MAPPING,
														    MODEL_FOR_CAUSAL_IMAGE_MODELING_MAPPING,
														    MODEL_FOR_CAUSAL_LM_MAPPING,
														    MODEL_FOR_CTC_MAPPING,
														    MODEL_FOR_DEPTH_ESTIMATION_MAPPING,
														    MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING,
														    MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING,
														    MODEL_FOR_IMAGE_SEGMENTATION_MAPPING,
														    MODEL_FOR_INSTANCE_SEGMENTATION_MAPPING,
														    MODEL_FOR_MASK_GENERATION_MAPPING,
														    MODEL_FOR_MASKED_IMAGE_MODELING_MAPPING,
														    MODEL_FOR_MASKED_LM_MAPPING,
														    MODEL_FOR_MULTIPLE_CHOICE_MAPPING,
														    MODEL_FOR_NEXT_SENTENCE_PREDICTION_MAPPING,
														    MODEL_FOR_OBJECT_DETECTION_MAPPING,
														    MODEL_FOR_PRETRAINING_MAPPING,
														    MODEL_FOR_QUESTION_ANSWERING_MAPPING,
														    MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING,
														    MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING,
														    MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
														    MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING,
														    MODEL_FOR_TABLE_QUESTION_ANSWERING_MAPPING,
														    MODEL_FOR_TEXT_ENCODING_MAPPING,
														    MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING,
														    MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING,
														    MODEL_FOR_VIDEO_CLASSIFICATION_MAPPING,
														    MODEL_FOR_VISION_2_SEQ_MAPPING,
														    MODEL_FOR_VISUAL_QUESTION_ANSWERING_MAPPING,
														    MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING,
														    MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING,
														    MODEL_MAPPING,
														    MODEL_WITH_LM_HEAD_MAPPING,
														    AutoBackbone,
														    AutoModel,
														    AutoModelForAudioClassification,
														    AutoModelForAudioFrameClassification,
														    AutoModelForAudioXVector,
														    AutoModelForCausalLM,
														    AutoModelForCTC,
														    AutoModelForDepthEstimation,
														    AutoModelForDocumentQuestionAnswering,
														    AutoModelForImageClassification,
														    AutoModelForImageSegmentation,
														    AutoModelForInstanceSegmentation,
														    AutoModelForMaskedImageModeling,
														    AutoModelForMaskedLM,
														    AutoModelForMaskGeneration,
														    AutoModelForMultipleChoice,
														    AutoModelForNextSentencePrediction,
														    AutoModelForObjectDetection,
														    AutoModelForPreTraining,
														    AutoModelForQuestionAnswering,
														    AutoModelForSemanticSegmentation,
														    AutoModelForSeqaSeqLM,
														    AutoModelForSequenceClassification,
														    AutoModelForSpeechSeqaSeq,
														    AutoModelForTableQuestionAnswering,
														    AutoModelForTextEncoding,
														    AutoModelForTokenClassification,
														    AutoModelForUniversalSegmentation,
														    AutoModelForVideoClassification,
														    AutoModelForVisionaSeq,
														    AutoModelForVisualQuestionAnswering,
														    AutoModelForZeroShotImageClassification,
														    AutoModelForZeroShotObjectDetection,
														    AutoModelWithLMHead,
														)

							try:
														if not is_tf_available():
																					raise OptionalDependencyNotAvailable()
							except OptionalDependencyNotAvailable:
														pass
							else:
														from .modeling_tf_auto import (
														    TF_MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING,
														    TF_MODEL_FOR_CAUSAL_LM_MAPPING,
														    TF_MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING,
														    TF_MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING,
														    TF_MODEL_FOR_MASK_GENERATION_MAPPING,
														    TF_MODEL_FOR_MASKED_IMAGE_MODELING_MAPPING,
														    TF_MODEL_FOR_MASKED_LM_MAPPING,
														    TF_MODEL_FOR_MULTIPLE_CHOICE_MAPPING,
														    TF_MODEL_FOR_NEXT_SENTENCE_PREDICTION_MAPPING,
														    TF_MODEL_FOR_PRETRAINING_MAPPING,
														    TF_MODEL_FOR_QUESTION_ANSWERING_MAPPING,
														    TF_MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING,
														    TF_MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING,
														    TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
														    TF_MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING,
														    TF_MODEL_FOR_TABLE_QUESTION_ANSWERING_MAPPING,
														    TF_MODEL_FOR_TEXT_ENCODING_MAPPING,
														    TF_MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING,
														    TF_MODEL_FOR_VISION_2_SEQ_MAPPING,
														    TF_MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING,
														    TF_MODEL_MAPPING,
														    TF_MODEL_WITH_LM_HEAD_MAPPING,
														    TFAutoModel,
														    TFAutoModelForAudioClassification,
														    TFAutoModelForCausalLM,
														    TFAutoModelForDocumentQuestionAnswering,
														    TFAutoModelForImageClassification,
														    TFAutoModelForMaskedImageModeling,
														    TFAutoModelForMaskedLM,
														    TFAutoModelForMaskGeneration,
														    TFAutoModelForMultipleChoice,
														    TFAutoModelForNextSentencePrediction,
														    TFAutoModelForPreTraining,
														    TFAutoModelForQuestionAnswering,
														    TFAutoModelForSemanticSegmentation,
														    TFAutoModelForSeqaSeqLM,
														    TFAutoModelForSequenceClassification,
														    TFAutoModelForSpeechSeqaSeq,
														    TFAutoModelForTableQuestionAnswering,
														    TFAutoModelForTextEncoding,
														    TFAutoModelForTokenClassification,
														    TFAutoModelForVisionaSeq,
														    TFAutoModelForZeroShotImageClassification,
														    TFAutoModelWithLMHead,
														)

							try:
														if not is_flax_available():
																					raise OptionalDependencyNotAvailable()
							except OptionalDependencyNotAvailable:
														pass
							else:
														from .modeling_flax_auto import (
														    FLAX_MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING,
														    FLAX_MODEL_FOR_CAUSAL_LM_MAPPING,
														    FLAX_MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING,
														    FLAX_MODEL_FOR_MASKED_LM_MAPPING,
														    FLAX_MODEL_FOR_MULTIPLE_CHOICE_MAPPING,
														    FLAX_MODEL_FOR_NEXT_SENTENCE_PREDICTION_MAPPING,
														    FLAX_MODEL_FOR_PRETRAINING_MAPPING,
														    FLAX_MODEL_FOR_QUESTION_ANSWERING_MAPPING,
														    FLAX_MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING,
														    FLAX_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
														    FLAX_MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING,
														    FLAX_MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING,
														    FLAX_MODEL_FOR_VISION_2_SEQ_MAPPING,
														    FLAX_MODEL_MAPPING,
														    FlaxAutoModel,
														    FlaxAutoModelForCausalLM,
														    FlaxAutoModelForImageClassification,
														    FlaxAutoModelForMaskedLM,
														    FlaxAutoModelForMultipleChoice,
														    FlaxAutoModelForNextSentencePrediction,
														    FlaxAutoModelForPreTraining,
														    FlaxAutoModelForQuestionAnswering,
														    FlaxAutoModelForSeqaSeqLM,
														    FlaxAutoModelForSequenceClassification,
														    FlaxAutoModelForSpeechSeqaSeq,
														    FlaxAutoModelForTokenClassification,
														    FlaxAutoModelForVisionaSeq,
														)

else:
							import sys

							_UpperCamelCase       :						Union[str, Any]     =   _LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)


"""simple docstring"""





import logging
from pathlib import Path
from typing import Any, List, Tuple

import yaml


# loading package files: https://stackoverflow.com/a/20885799
try:
       import importlib.resources as pkg_resources
except ImportError:
       # Try backported to PY<37 `importlib_resources`.
       import importlib_resources as pkg_resources

from . import resources


_UpperCamelCase       :						Optional[int]     =   "https://github.com/huggingface/datasets/tree/main/src/datasets/utils"
_UpperCamelCase       :						Union[str, Any]     =   f'''{BASE_REF_URL}/{__file__}'''
_UpperCamelCase       :						Any     =   logging.getLogger(__name__)





def     a_					(				_lowerCAmelCase  :			str					):





       '''simple docstring'''

       lowercase__      :		Optional[Any]          =     pkg_resources.read_text(_lowerCAmelCase       ,			_lowerCAmelCase					)
       return yaml.safe_load(_lowerCAmelCase					), f"""{BASE_REF_URL}/resources/{resource}"""


_UpperCamelCase   ,				_UpperCamelCase       :						int     =   load_yaml_resource("readme_structure.yaml")

_UpperCamelCase       :						Optional[Any]     =   [
    "[Needs More Information]",
    "[More Information Needed]",
    "(https://github.com/huggingface/datasets/blob/main/CONTRIBUTING.md#how-to-contribute-to-the-dataset-cards)",
]

# Dictionary representation of section/readme, error_list, warning_list
_UpperCamelCase       :						List[Any]     =   Tuple[dict, List[str], List[str]]


class 					UpperCAmelCase_     :


      def __init__(       self		,      a		,      a		,      a = None		,      a = False							)	-> str:
             lowercase__      :		List[str]          =     name
             lowercase__      :		int          =     level
             lowercase__      :		Dict          =     lines
             lowercase__      :		Optional[int]          =     ''
             lowercase__      :		List[str]          =     True
             lowercase__      :		Union[str, Any]          =     {}
             lowercase__      :		Any          =     []
             lowercase__      :		Optional[int]          =     []
             if self.lines is not None:
                    self.parse(suppress_parsing_errors=a							)


      def 		_UpperCAmelCase	(       self		,      a = False							)	-> Any:
             lowercase__      :		List[str]          =     ''
             lowercase__      :		int          =     []
             lowercase__      :		Any          =     False
             for line in self.lines:
                    if line.strip(' \n'							) == "":
                           continue
                    elif line.strip(' \n'							)[:3] == "```":
                           lowercase__      :		Optional[Any]          =     not code_start
                    elif line.split()[0] == self.level + "#" and not code_start:
                           if current_sub_level != "":
                                  lowercase__      :		Tuple          =     Section(a		,      self.level + '#'		,      a							)
                                  lowercase__      :		str          =     []
                           else:
                                  if current_lines != []:
                                         self.text += "".join(a							).strip()
                                         if self.text != "" and self.text not in FILLER_TEXT:
                                                lowercase__      :		List[Any]          =     False
                                         lowercase__      :		List[str]          =     []

                           lowercase__      :		Dict          =     ' '.join(line.split()[1:]							).strip(' \n'							)
                    else:
                           current_lines.append(a							)
             else:
                    if current_sub_level != "":
                           if current_sub_level in self.content:
                                  self.parsing_error_list.append(
                                      f"""Multiple sections with the same heading `{current_sub_level}` have been found. Please keep only one of these sections."""							)
                           lowercase__      :		Tuple          =     Section(a		,      self.level + '#'		,      a							)
                    else:
                           if current_lines != []:
                                  self.text += "".join(a							).strip()
                                  if self.text != "" and self.text not in FILLER_TEXT:
                                         lowercase__      :		Dict          =     False

             if self.level == "" and not suppress_parsing_errors:
                    if self.parsing_error_list != [] or self.parsing_warning_list != []:
                           lowercase__      :		Optional[Any]          =     '\n'.join('-\t' + x for x in self.parsing_error_list + self.parsing_warning_list							)
                           lowercase__      :		int          =     f"""The following issues were found while parsing the README at `{self.name}`:\n""" + errors
                           raise ValueError(a							)


      def 		_UpperCAmelCase	(       self		,      a							)	-> ReadmeValidatorOutput:
             lowercase__      :		Tuple          =     []
             lowercase__      :		int          =     []
             if structure["allow_empty"] is False:
                    # If content is expected
                    if self.is_empty_text and self.content == {}:
                           # If no content is found, mention it in the error_list
                           error_list.append(f"""Expected some content in section `{self.name}` but it is empty."""							)

             if structure["allow_empty_text"] is False:
                    # If some text is expected
                    if self.is_empty_text:
                           # If no text is found, mention it in the error_list
                           error_list.append(
                               f"""Expected some text in section `{self.name}` but it is empty (text in subsections are ignored)."""							)
        # Subsections Validation
             if structure["subsections"] is not None:
                    # If subsections are expected
                    if self.content == {}:
                           # If no subsections are present
                           lowercase__      :		str          =     [subsection['name'] for subsection in structure['subsections']]
                           # Mention the expected values in the error_list
                           error_list.append(
                               f"""Section `{self.name}` expected the following subsections: {", ".join(["`"+x+"`" for x in values]							)}. Found 'None'."""							)
                    else:
                           # If some subsections are present
                           lowercase__      :		Union[str, Any]          =     [subsection['name'] for subsection in structure['subsections']]
                           lowercase__      :		Any          =     False
                           for idx, name in enumerate(a							):
                                  if name not in self.content:
                                         # If the expected subsection is not present
                                         error_list.append(f"""Section `{self.name}` is missing subsection: `{name}`."""							)
                                         lowercase__      :		str          =     True
                                  else:
                                         # If the subsection is present, validate subsection, return the result
                                         # and concat the errors from subsection to section error_list

                                         # Skip sublevel validation if current level is `###`
                                         if self.level == "###":
                                                continue
                                         else:
                                                lowercase__   ,				lowercase__   ,				lowercase__      :		Optional[Any]          =     self.content[name].validate(
                                                    structure['subsections'][idx]							)
                                         error_list += subsec_error_list
                                         warning_list += subsec_warning_list

                           if has_missing_subsections:  # we only allow to have extra subsections if all the other ones are here
                                  for name in self.content:
                                         if name not in structure_names:
                                                # If an extra subsection is present
                                                warning_list.append(
                                                    f"""`{self.name}` has an extra subsection: `{name}`. Skipping further validation checks for this subsection as expected structure is unknown."""							)
             if error_list:
                    # If there are errors, do not return the dictionary as it is invalid
                    return {}, error_list, warning_list
             else:
                    return self.to_dict(), error_list, warning_list


      def 		_UpperCAmelCase	(       self							)	-> dict:
             return {
                 "name": self.name,
                 "text": self.text,
                 "is_empty_text": self.is_empty_text,
                 "subsections": [value.to_dict() for value in self.content.values()],
             }





class 					UpperCAmelCase_     (   _a):  # Level 0


      def __init__(       self		,      a		,      a		,      a = None		,      a = False							)	-> Any:
             super().__init__(name=a		,      level=''							)  # Not using lines here as we need to use a child class parse
             lowercase__      :		List[Any]          =     structure
             lowercase__      :		Dict          =     -2
             lowercase__      :		Union[str, Any]          =     0
             lowercase__      :		Dict          =     lines
             if self.lines is not None:
                    self.parse(suppress_parsing_errors=a							)


      def 		_UpperCAmelCase	(       self							)	-> Tuple:
             if self.structure is None:
                    lowercase__   ,				lowercase__   ,				lowercase__      :		Any          =     self._validate(a							)
             else:
                    lowercase__   ,				lowercase__   ,				lowercase__      :		Dict          =     self._validate(self.structure							)
             if error_list != [] or warning_list != []:
                    lowercase__      :		Optional[Any]          =     '\n'.join(['-\t' + x for x in error_list + warning_list]							)
                    lowercase__      :		Union[str, Any]          =     f"""The following issues were found for the README at `{self.name}`:\n""" + errors
                    raise ValueError(a							)


      @classmethod
      def 		_UpperCAmelCase	(       cls		,      a		,      a = None		,      a = False							)	-> Tuple:
             with open(a		,      encoding='utf-8'							) as f:
                    lowercase__      :		List[Any]          =     f.readlines()
             return cls(a		,      a		,      a		,      suppress_parsing_errors=a							)


      @classmethod
      def 		_UpperCAmelCase	(       cls		,      a		,      a = None		,      a = "root"		,      a = False							)	-> int:
             lowercase__      :		Optional[Any]          =     string.split('\n'							)
             return cls(a		,      a		,      a		,      suppress_parsing_errors=a							)


      def 		_UpperCAmelCase	(       self		,      a = False							)	-> List[Any]:
             # Skip Tags
             lowercase__      :		Tuple          =     0

             for line in self.lines:
                    self.yaml_tags_line_count += 1
                    if line.strip(' \n'							) == "---":
                           self.tag_count += 1
                           if self.tag_count == 2:
                                  break
                    line_count += 1
             if self.tag_count == 2:
                    lowercase__      :		Optional[int]          =     self.lines[line_count + 1 :]  # Get the last + 1 th item.
             else:
                    lowercase__      :		List[str]          =     self.lines[self.tag_count :]
             super().parse(suppress_parsing_errors=a							)


      def __str__(       self							)	-> Any:
             return str(self.to_dict()							)


      def 		_UpperCAmelCase	(       self		,      a							)	-> str:
             lowercase__      :		Any          =     []
             lowercase__      :		Optional[int]          =     []
             if self.yaml_tags_line_count == 0:
                    warning_list.append('Empty YAML markers are present in the README.'							)
             elif self.tag_count == 0:
                    warning_list.append('No YAML markers are present in the README.'							)
             elif self.tag_count == 1:
                    warning_list.append('Only the start of YAML tags present in the README.'							)
             # Check how many first level sections are present.
             lowercase__      :		int          =     len(self.content.keys()							)
             if num_first_level_keys > 1:
                    # If more than one, add to the error list, continue
                    error_list.append(
                        f"""The README has several first-level headings: {", ".join(["`"+x+"`" for x in list(self.content.keys()							)]							)}. Only one heading is expected. Skipping further validation for this README."""							)
             elif num_first_level_keys < 1:
                    # If less than one, append error.
                    error_list.append(
                        'The README has no first-level headings. One heading is expected. Skipping further validation for this README.'							)

             else:
                    # If one exactly
                    lowercase__      :		Dict          =     list(self.content.keys()							)[0]  # Get the key
                    if start_key.startswith('Dataset Card for'							):  # Check correct start
                           # If the starting is correct, validate all the sections
                           lowercase__   ,				lowercase__   ,				lowercase__      :		Any          =     self.content[start_key].validate(
                               readme_structure['subsections'][0]							)
                           error_list += sec_error_list
                           warning_list += sec_warning_list
                    else:
                           # If not found, append error
                           error_list.append(
                               'No first-level heading starting with `Dataset Card for` found in README. Skipping further validation for this README.'							)
             if error_list:
                    # If there are errors, do not return the dictionary as it is invalid
                    return {}, error_list, warning_list
             else:
                    return self.to_dict(), error_list, warning_list


if __name__ == "__main__":
       from argparse import ArgumentParser

       _UpperCamelCase       :						Tuple     =   ArgumentParser(usage="Validate the content (excluding YAML tags) of a README.md file.")
       ap.add_argument("readme_filepath")
       _UpperCamelCase       :						str     =   ap.parse_args()
       _UpperCamelCase       :						Optional[int]     =   Path(args.readme_filepath)
       _UpperCamelCase       :						Dict     =   ReadMe.from_readme(readme_filepath)

