






'''simple docstring'''





import argparse

import torch

from transformers import (
    SpeechTaConfig,
    SpeechTaFeatureExtractor,
    SpeechTaForSpeechToSpeech,
    SpeechTaForSpeechToText,
    SpeechTaForTextToSpeech,
    SpeechTaProcessor,
    SpeechTaTokenizer,
    logging,
)
from transformers.tokenization_utils import AddedToken


logging.set_verbosity_info()
__UpperCAmelCase							:   Dict							=  logging.get_logger("transformers.models.speecht5")

__UpperCAmelCase							:   Optional[int]							=  {
    "speech_encoder_prenet.layer_norm": "speecht5.encoder.prenet.feature_projection.layer_norm",
    "speech_encoder_prenet.post_extract_proj": "speecht5.encoder.prenet.feature_projection.projection",
    "speech_encoder_prenet.pos_conv.0": "speecht5.encoder.prenet.pos_conv_embed.conv",
    "speech_encoder_prenet.mask_emb": "speecht5.encoder.prenet.masked_spec_embed",
}
__UpperCAmelCase							:   Dict							=  {
    "text_encoder_prenet.encoder_prenet.0": "speecht5.encoder.prenet.embed_tokens",
    "text_encoder_prenet.encoder_prenet.1.alpha": "speecht5.encoder.prenet.encode_positions.alpha",
}
__UpperCAmelCase							:   Optional[Any]							=  {
    "speech_decoder_prenet.decoder_prenet.0.0.prenet.0.0": "speecht5.decoder.prenet.layers.0",
    "speech_decoder_prenet.decoder_prenet.0.0.prenet.1.0": "speecht5.decoder.prenet.layers.1",
    "speech_decoder_prenet.decoder_prenet.0.1": "speecht5.decoder.prenet.final_layer",
    "speech_decoder_prenet.decoder_prenet.1.alpha": "speecht5.decoder.prenet.encode_positions.alpha",
    "speech_decoder_prenet.spkembs_layer.0": "speecht5.decoder.prenet.speaker_embeds_layer",
}
__UpperCAmelCase							:   Optional[int]							=  {
    "speech_decoder_postnet.feat_out": "speech_decoder_postnet.feat_out",
    "speech_decoder_postnet.prob_out": "speech_decoder_postnet.prob_out",
    "speech_decoder_postnet.postnet.postnet.0.0": "speech_decoder_postnet.layers.0.conv",
    "speech_decoder_postnet.postnet.postnet.0.1": "speech_decoder_postnet.layers.0.batch_norm",
    "speech_decoder_postnet.postnet.postnet.1.0": "speech_decoder_postnet.layers.1.conv",
    "speech_decoder_postnet.postnet.postnet.1.1": "speech_decoder_postnet.layers.1.batch_norm",
    "speech_decoder_postnet.postnet.postnet.2.0": "speech_decoder_postnet.layers.2.conv",
    "speech_decoder_postnet.postnet.postnet.2.1": "speech_decoder_postnet.layers.2.batch_norm",
    "speech_decoder_postnet.postnet.postnet.3.0": "speech_decoder_postnet.layers.3.conv",
    "speech_decoder_postnet.postnet.postnet.3.1": "speech_decoder_postnet.layers.3.batch_norm",
    "speech_decoder_postnet.postnet.postnet.4.0": "speech_decoder_postnet.layers.4.conv",
    "speech_decoder_postnet.postnet.postnet.4.1": "speech_decoder_postnet.layers.4.batch_norm",
}
__UpperCAmelCase							:   Any							=  {
    "text_decoder_prenet.embed_tokens": "speecht5.decoder.prenet.embed_tokens",
}
__UpperCAmelCase							:   Optional[Any]							=  {
    "text_decoder_postnet.output_projection": "text_decoder_postnet.lm_head",
}
__UpperCAmelCase							:   Dict							=  {
    "encoder.layers.*.self_attn.k_proj": "speecht5.encoder.wrapped_encoder.layers.*.attention.k_proj",
    "encoder.layers.*.self_attn.v_proj": "speecht5.encoder.wrapped_encoder.layers.*.attention.v_proj",
    "encoder.layers.*.self_attn.q_proj": "speecht5.encoder.wrapped_encoder.layers.*.attention.q_proj",
    "encoder.layers.*.self_attn.out_proj": "speecht5.encoder.wrapped_encoder.layers.*.attention.out_proj",
    "encoder.layers.*.self_attn_layer_norm": "speecht5.encoder.wrapped_encoder.layers.*.layer_norm",
    "encoder.layers.*.fc1": "speecht5.encoder.wrapped_encoder.layers.*.feed_forward.intermediate_dense",
    "encoder.layers.*.fc2": "speecht5.encoder.wrapped_encoder.layers.*.feed_forward.output_dense",
    "encoder.layers.*.final_layer_norm": "speecht5.encoder.wrapped_encoder.layers.*.final_layer_norm",
    "encoder.layer_norm": "speecht5.encoder.wrapped_encoder.layer_norm",
    "encoder.pos_emb.pe_k": "speecht5.encoder.wrapped_encoder.embed_positions.pe_k",
}
__UpperCAmelCase							:   Optional[Any]							=  {
    "decoder.layers.*.self_attn.k_proj": "speecht5.decoder.wrapped_decoder.layers.*.self_attn.k_proj",
    "decoder.layers.*.self_attn.v_proj": "speecht5.decoder.wrapped_decoder.layers.*.self_attn.v_proj",
    "decoder.layers.*.self_attn.q_proj": "speecht5.decoder.wrapped_decoder.layers.*.self_attn.q_proj",
    "decoder.layers.*.self_attn.out_proj": "speecht5.decoder.wrapped_decoder.layers.*.self_attn.out_proj",
    "decoder.layers.*.self_attn_layer_norm": "speecht5.decoder.wrapped_decoder.layers.*.self_attn_layer_norm",
    "decoder.layers.*.encoder_attn.k_proj": "speecht5.decoder.wrapped_decoder.layers.*.encoder_attn.k_proj",
    "decoder.layers.*.encoder_attn.v_proj": "speecht5.decoder.wrapped_decoder.layers.*.encoder_attn.v_proj",
    "decoder.layers.*.encoder_attn.q_proj": "speecht5.decoder.wrapped_decoder.layers.*.encoder_attn.q_proj",
    "decoder.layers.*.encoder_attn.out_proj": "speecht5.decoder.wrapped_decoder.layers.*.encoder_attn.out_proj",
    "decoder.layers.*.encoder_attn_layer_norm": "speecht5.decoder.wrapped_decoder.layers.*.encoder_attn_layer_norm",
    "decoder.layers.*.fc1": "speecht5.decoder.wrapped_decoder.layers.*.feed_forward.intermediate_dense",
    "decoder.layers.*.fc2": "speecht5.decoder.wrapped_decoder.layers.*.feed_forward.output_dense",
    "decoder.layers.*.final_layer_norm": "speecht5.decoder.wrapped_decoder.layers.*.final_layer_norm",
}
__UpperCAmelCase							:   Optional[int]							=  {
    **MAPPING_SPEECH_ENCODER_PRENET,
    **MAPPING_ENCODER,
    **MAPPING_DECODER,
    **MAPPING_TEXT_DECODER_PRENET,
    **MAPPING_TEXT_DECODER_POSTNET,
}
__UpperCAmelCase							:   Optional[int]							=  {
    **MAPPING_TEXT_ENCODER_PRENET,
    **MAPPING_ENCODER,
    **MAPPING_DECODER,
    **MAPPING_SPEECH_DECODER_PRENET,
    **MAPPING_SPEECH_DECODER_POSTNET,
}
__UpperCAmelCase							:   Optional[int]							=  {
    **MAPPING_SPEECH_ENCODER_PRENET,
    **MAPPING_ENCODER,
    **MAPPING_DECODER,
    **MAPPING_SPEECH_DECODER_PRENET,
    **MAPPING_SPEECH_DECODER_POSTNET,
}
__UpperCAmelCase							:   str							=  []
__UpperCAmelCase							:   Union[str, Any]							=  [
    "encoder.version",
    "encoder.layers.*.norm_k.weight",
    "encoder.layers.*.norm_k.bias",
    "decoder.version",
    "decoder.layers.*.norm_k.weight",
    "decoder.layers.*.norm_k.bias",
    "decoder.pos_emb.pe_k",
    "speech_encoder_prenet.embed_positions._float_tensor",
    "text_decoder_prenet.embed_positions._float_tensor",
]
__UpperCAmelCase							:   Tuple							=  IGNORE_KEYS + [
    "encoder.proj",
    "text_encoder_prenet.*",
    "speech_decoder_prenet.*",
    "speech_decoder_postnet.*",
]
__UpperCAmelCase							:   List[Any]							=  IGNORE_KEYS + [
    "encoder.proj",
    "speech_encoder_prenet.*",
    "text_decoder_prenet.*",
    "text_decoder_postnet.*",
]
__UpperCAmelCase							:   Any							=  IGNORE_KEYS + [
    "encoder.proj",
    "text_encoder_prenet.*",
    "text_decoder_prenet.*",
    "text_decoder_postnet.*",
]





def 					lowercase_ (    __snake_case     :							List[Any]	,	__snake_case     :							List[Any]	,	__snake_case     :							int	,	__snake_case     :							List[Any]	,	__snake_case     :							Optional[Any]      )     -> Optional[Any]:





				'''simple docstring'''


				for attribute in key.split("."      ):
								snake_case__      :Optional[Any]         =   getattr(__snake_case	,	__snake_case      )

				if weight_type is not None:
								snake_case__      :Union[str, Any]         =   getattr(__snake_case	,	__snake_case      ).shape
				else:
								snake_case__      :Optional[Any]         =   hf_pointer.shape

				if hf_shape != value.shape:
								raise ValueError(
								    F'Shape of hf {key + "." + weight_type if weight_type is not None else ""} is {hf_shape}, but should be'
								    F' {value.shape} for {full_name}'      )

				if weight_type == "weight":
								snake_case__      :Tuple         =   value
				elif weight_type == "weight_g":
								snake_case__      :Optional[int]         =   value
				elif weight_type == "weight_v":
								snake_case__      :int         =   value
				elif weight_type == "bias":
								snake_case__      :List[str]         =   value
				elif weight_type == "running_mean":
								snake_case__      :Optional[Any]         =   value
				elif weight_type == "running_var":
								snake_case__      :str         =   value
				elif weight_type == "num_batches_tracked":
								snake_case__      :Union[str, Any]         =   value
				else:
								snake_case__      :Dict         =   value

				logger.info(F'{key + ("." + weight_type if weight_type is not None else "")} was initialized from {full_name}.'      )





def 					lowercase_ (    __snake_case     :							str	,	__snake_case     :							List[Any]      )     -> Tuple:





				'''simple docstring'''


				for key in ignore_keys:
								if key.endswith(".*"      ):
												if name.startswith(key[:-1]      ):
																return True
								elif ".*." in key:
												snake_case__    ,						snake_case__      :Tuple         =   key.split(".*."      )
												if prefix in name and suffix in name:
																return True
								elif key in name:
												return True
				return False





def 					lowercase_ (    __snake_case     :							Optional[int]	,	__snake_case     :							List[str]	,	__snake_case     :							List[str]      )     -> List[str]:





				'''simple docstring'''


				snake_case__      :str         =   []

				if task == "s2t":
								snake_case__      :int         =   hf_model.speechta.encoder.prenet.feature_encoder
								snake_case__      :Optional[int]         =   MAPPING_S2T
								snake_case__      :str         =   IGNORE_KEYS_S2T
				elif task == "t2s":
								snake_case__      :List[Any]         =   None
								snake_case__      :Dict         =   MAPPING_T2S
								snake_case__      :Tuple         =   IGNORE_KEYS_T2S
				elif task == "s2s":
								snake_case__      :Tuple         =   hf_model.speechta.encoder.prenet.feature_encoder
								snake_case__      :Optional[Any]         =   MAPPING_S2S
								snake_case__      :Union[str, Any]         =   IGNORE_KEYS_S2S
				else:
								raise ValueError(F'Unsupported task: {task}'      )

				for name, value in fairseq_dict.items():
								if should_ignore(__snake_case	,	__snake_case      ):
												logger.info(F'{name} was ignored'      )
												continue

								snake_case__      :List[str]         =   False
								if "conv_layers" in name:
												load_conv_layer(
												    __snake_case	,	__snake_case	,	__snake_case	,	__snake_case	,	hf_model.config.feat_extract_norm == "group"	,	)
												snake_case__      :Tuple         =   True
								else:
												for key, mapped_key in MAPPING.items():
																# mapped_key = "speecht5." + mapped_key if mapped_key not in TOP_LEVEL_KEYS else mapped_key

																if "*" in key:
																				snake_case__    ,						snake_case__      :Optional[int]         =   key.split(".*."      )
																				if prefix in name and suffix in name:
																								snake_case__      :Tuple         =   suffix

                # if key in name or key.split("w2v_model.")[-1] == name.split(".")[0]:
																if key in name:
																				snake_case__      :Dict         =   True
																				if "*" in mapped_key:
																								snake_case__      :Optional[int]         =   name.split(__snake_case      )[0].split("."      )[-2]
																								snake_case__      :int         =   mapped_key.replace("*"	,	__snake_case      )
																				if "weight_g" in name:
																								snake_case__      :Optional[int]         =   "weight_g"
																				elif "weight_v" in name:
																								snake_case__      :List[str]         =   "weight_v"
																				elif "bias" in name:
																								snake_case__      :Tuple         =   "bias"
																				elif "weight" in name:
																								snake_case__      :Optional[Any]         =   "weight"
																				elif "running_mean" in name:
																								snake_case__      :List[Any]         =   "running_mean"
																				elif "running_var" in name:
																								snake_case__      :List[str]         =   "running_var"
																				elif "num_batches_tracked" in name:
																								snake_case__      :Tuple         =   "num_batches_tracked"
																				else:
																								snake_case__      :Any         =   None
																				set_recursively(__snake_case	,	__snake_case	,	__snake_case	,	__snake_case	,	__snake_case      )
																continue
								if not is_used:
												unused_weights.append(__snake_case      )

				logger.warning(F'Unused weights: {unused_weights}'      )





def 					lowercase_ (    __snake_case     :							Dict	,	__snake_case     :							Tuple	,	__snake_case     :							int	,	__snake_case     :							List[str]	,	__snake_case     :							str      )     -> Optional[int]:





				'''simple docstring'''


				snake_case__      :Any         =   full_name.split("conv_layers."      )[-1]
				snake_case__      :Optional[int]         =   name.split("."      )
				snake_case__      :List[str]         =   int(items[0]      )
				snake_case__      :Tuple         =   int(items[1]      )

				if type_id == 0:
								if "bias" in name:
												if value.shape != feature_extractor.conv_layers[layer_id].conv.bias.data.shape:
																raise ValueError(
																    F'{full_name} has size {value.shape}, but'
																    F' {feature_extractor.conv_layers[layer_id].conv.bias.data.shape} was found.'      )
												snake_case__      :Any         =   value
												logger.info(F'Feat extract conv layer {layer_id} was initialized from {full_name}.'      )
								elif "weight" in name:
												if value.shape != feature_extractor.conv_layers[layer_id].conv.weight.data.shape:
																raise ValueError(
																    F'{full_name} has size {value.shape}, but'
																    F' {feature_extractor.conv_layers[layer_id].conv.weight.data.shape} was found.'      )
												snake_case__      :Tuple         =   value
												logger.info(F'Feat extract conv layer {layer_id} was initialized from {full_name}.'      )
				elif (type_id == 2 and not use_group_norm) or (type_id == 2 and layer_id == 0 and use_group_norm):
								if "bias" in name:
												if value.shape != feature_extractor.conv_layers[layer_id].layer_norm.bias.data.shape:
																raise ValueError(
																    F'{full_name} has size {value.shape}, but'
																    F' {feature_extractor.conv_layers[layer_id].layer_norm.bias.data.shape} was found.'      )
												snake_case__      :List[Any]         =   value
												logger.info(F'Feat extract layer norm weight of layer {layer_id} was initialized from {full_name}.'      )
								elif "weight" in name:
												if value.shape != feature_extractor.conv_layers[layer_id].layer_norm.weight.data.shape:
																raise ValueError(
																    F'{full_name} has size {value.shape}, but'
																    F' {feature_extractor.conv_layers[layer_id].layer_norm.weight.data.shape} was found.'      )
												snake_case__      :Any         =   value
												logger.info(F'Feat extract layer norm weight of layer {layer_id} was initialized from {full_name}.'      )
				else:
								unused_weights.append(__snake_case      )





@torch.no_grad()
def 					lowercase_ (    __snake_case     :							int	,	__snake_case     :							Tuple	,	__snake_case     :							Dict	,	__snake_case     :							Tuple=None	,	__snake_case     :							List[str]=None	,	__snake_case     :							Optional[int]=None	,	)     -> List[Any]:





				'''simple docstring'''


				if config_path is not None:
								snake_case__      :List[str]         =   SpeechTaConfig.from_pretrained(__snake_case      )
				else:
								snake_case__      :Dict         =   SpeechTaConfig()

				if task == "s2t":
								snake_case__      :List[Any]         =   config.max_text_positions
								snake_case__      :Any         =   SpeechTaForSpeechToText(__snake_case      )
				elif task == "t2s":
								snake_case__      :str         =   18_76
								snake_case__      :List[Any]         =   6_00
								snake_case__      :Dict         =   config.max_speech_positions
								snake_case__      :str         =   SpeechTaForTextToSpeech(__snake_case      )
				elif task == "s2s":
								snake_case__      :Any         =   18_76
								snake_case__      :List[str]         =   config.max_speech_positions
								snake_case__      :int         =   SpeechTaForSpeechToSpeech(__snake_case      )
				else:
								raise ValueError(F'Unknown task name: {task}'      )

				if vocab_path:
								snake_case__      :Any         =   SpeechTaTokenizer(__snake_case	,	model_max_length=config.max_text_positions      )

								# Mask token behaves like a normal word, i.e. include the space before it
								snake_case__      :List[str]         =   AddedToken("<mask>"	,	lstrip=__snake_case	,	rstrip=__snake_case      )
								snake_case__      :Optional[Any]         =   mask_token
								tokenizer.add_special_tokens({"mask_token": mask_token}      )
								tokenizer.add_tokens(["<ctc_blank>"]      )

				snake_case__      :Any         =   SpeechTaFeatureExtractor()
				snake_case__      :Optional[Any]         =   SpeechTaProcessor(tokenizer=__snake_case	,	feature_extractor=__snake_case      )
				processor.save_pretrained(__snake_case      )

				snake_case__      :Any         =   torch.load(__snake_case      )
				recursively_load_weights(fairseq_checkpoint["model"]	,	__snake_case	,	__snake_case      )

				model.save_pretrained(__snake_case      )

				if repo_id:
								print("Pushing to the hub..."      )
								processor.push_to_hub(__snake_case      )
								model.push_to_hub(__snake_case      )


if __name__ == "__main__":
	__UpperCAmelCase							:   Optional[int]							=  argparse.ArgumentParser()
	parser.add_argument(
	    "--task",
	    default="s2t",
	    type=str,
	    help="Type of the SpeechT5 model you'd like to convert. Should be one of 's2t', 't2s', 's2s'.",
	)
	parser.add_argument("--checkpoint_path", required=True, default=None, type=str, help="Path to fairseq checkpoint")
	parser.add_argument("--vocab_path", default=None, type=str, help="Path to SentencePiece model")
	parser.add_argument("--config_path", default=None, type=str, help="Path to hf config.json of model to convert")
	parser.add_argument(
	    "--pytorch_dump_folder_path", required=True, default=None, type=str, help="Path to the output PyTorch model."
	)
	parser.add_argument(
	    "--push_to_hub", default=None, type=str, help="Where to upload the converted model on the 🤗 hub."
	)

	__UpperCAmelCase							:   Optional[Any]							=  parser.parse_args()
	convert_speechta_checkpoint(
	    args.task,
	    args.checkpoint_path,
	    args.pytorch_dump_folder_path,
	    args.config_path,
	    args.vocab_path,
	    args.push_to_hub,
	)







import json
import os
import shutil
import warnings
from argparse import ArgumentParser, Namespace
from pathlib import Path
from typing import List

from ..utils import logging
from . import BaseTransformersCLICommand


try:
	from cookiecutter.main import cookiecutter

	__UpperCAmelCase							:   Dict							=  True
except ImportError:
	__UpperCAmelCase							:   List[Any]							=  False

__UpperCAmelCase							:   Dict							=  logging.get_logger(__name__)  # pylint: disable=invalid-name





def 					lowercase_ (    __snake_case     :							Namespace      )     -> Dict:





				'''simple docstring'''


				return AddNewModelCommand(args.testing	,	args.testing_file	,	path=args.path      )


class 					_snake_case						(			_A ):






	@staticmethod
	def    lowerCAmelCase_							(		UpperCamelCase       )						->    Any:
					snake_case__      :Dict         =   parser.add_parser("add-new-model"       )
					add_new_model_parser.add_argument("--testing"					,action="store_true"					,help="If in testing mode."       )
					add_new_model_parser.add_argument("--testing_file"					,type=UpperCamelCase					,help="Configuration file on which to run."       )
					add_new_model_parser.add_argument(
					    "--path"					,type=UpperCamelCase					,help="Path to cookiecutter. Should only be used for testing purposes."       )
					add_new_model_parser.set_defaults(func=UpperCamelCase       )






	def __init__(		self					,UpperCamelCase					,UpperCamelCase					,UpperCamelCase=None					,*UpperCamelCase       )						->    Any:
					snake_case__      :Union[str, Any]         =   testing
					snake_case__      :Union[str, Any]         =   testing_file
					snake_case__      :List[str]         =   path






	def    lowerCAmelCase_							(		self       )						->    List[Any]:
					warnings.warn(
					    "The command `transformers-cli add-new-model` is deprecated and will be removed in v5 of Transformers. "
					    "It is not actively maintained anymore, so might give a result that won't pass all tests and quality "
					    "checks, you should use `transformers-cli add-new-model-like` instead."       )
					if not _has_cookiecutter:
									raise ImportError(
									    "Model creation dependencies are required to use the `add_new_model` command. Install them by running "
									    "the following at the root of your `transformers` clone:\n\n\t$ pip install -e .[modelcreation]\n"       )
					# Ensure that there is no other `cookiecutter-template-xxx` directory in the current working directory
					snake_case__      :Tuple         =   [directory for directory in os.listdir() if "cookiecutter-template-" == directory[:22]]
					if len(UpperCamelCase       ) > 0:
									raise ValueError(
									    "Several directories starting with `cookiecutter-template-` in current working directory. "
									    "Please clean your directory by removing all folders starting with `cookiecutter-template-` or "
									    "change your working directory."       )

					snake_case__      :str         =   (
					    Path(UpperCamelCase       ).parent.parent.parent.parent if self._path is None else Path(self._path       ).parent.parent
					)
					snake_case__      :Tuple         =   path_to_transformer_root / "templates" / "adding_a_new_model"

					# Execute cookiecutter
					if not self._testing:
									cookiecutter(str(UpperCamelCase       )       )
					else:
									with open(self._testing_file					,"r"       ) as configuration_file:
													snake_case__      :str         =   json.load(UpperCamelCase       )

									cookiecutter(
									    str(path_to_cookiecutter if self._path is None else self._path       )					,no_input=UpperCamelCase					,extra_context=UpperCamelCase					,)

					snake_case__      :List[Any]         =   [directory for directory in os.listdir() if "cookiecutter-template-" in directory[:22]][0]

					# Retrieve configuration
					with open(directory + "/configuration.json"					,"r"       ) as configuration_file:
									snake_case__      :Dict         =   json.load(UpperCamelCase       )

					snake_case__      :Optional[Any]         =   configuration["lowercase_modelname"]
					snake_case__      :List[Any]         =   configuration["generate_tensorflow_pytorch_and_flax"]
					os.remove(f'{directory}/configuration.json'       )

					snake_case__      :Any         =   "PyTorch" in generate_tensorflow_pytorch_and_flax
					snake_case__      :Any         =   "TensorFlow" in generate_tensorflow_pytorch_and_flax
					snake_case__      :Any         =   "Flax" in generate_tensorflow_pytorch_and_flax

					snake_case__      :Dict         =   f'{path_to_transformer_root}/src/transformers/models/{lowercase_model_name}'
					os.makedirs(UpperCamelCase					,exist_ok=UpperCamelCase       )
					os.makedirs(f'{path_to_transformer_root}/tests/models/{lowercase_model_name}'					,exist_ok=UpperCamelCase       )

					# Tests require submodules as they have parent imports
					with open(f'{path_to_transformer_root}/tests/models/{lowercase_model_name}/__init__.py'					,"w"       ):
									pass

					shutil.move(
					    f'{directory}/__init__.py'					,f'{model_dir}/__init__.py'					,)
					shutil.move(
					    f'{directory}/configuration_{lowercase_model_name}.py'					,f'{model_dir}/configuration_{lowercase_model_name}.py'					,)

					def remove_copy_lines(UpperCamelCase       ):
									with open(UpperCamelCase					,"r"       ) as f:
													snake_case__      :List[str]         =   f.readlines()
									with open(UpperCamelCase					,"w"       ) as f:
													for line in lines:
																	if "# Copied from transformers." not in line:
																					f.write(UpperCamelCase       )

					if output_pytorch:
									if not self._testing:
													remove_copy_lines(f'{directory}/modeling_{lowercase_model_name}.py'       )

									shutil.move(
									    f'{directory}/modeling_{lowercase_model_name}.py'					,f'{model_dir}/modeling_{lowercase_model_name}.py'					,)

									shutil.move(
									    f'{directory}/test_modeling_{lowercase_model_name}.py'					,f'{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_{lowercase_model_name}.py'					,)
					else:
									os.remove(f'{directory}/modeling_{lowercase_model_name}.py'       )
									os.remove(f'{directory}/test_modeling_{lowercase_model_name}.py'       )

					if output_tensorflow:
									if not self._testing:
													remove_copy_lines(f'{directory}/modeling_tf_{lowercase_model_name}.py'       )

									shutil.move(
									    f'{directory}/modeling_tf_{lowercase_model_name}.py'					,f'{model_dir}/modeling_tf_{lowercase_model_name}.py'					,)

									shutil.move(
									    f'{directory}/test_modeling_tf_{lowercase_model_name}.py'					,f'{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_tf_{lowercase_model_name}.py'					,)
					else:
									os.remove(f'{directory}/modeling_tf_{lowercase_model_name}.py'       )
									os.remove(f'{directory}/test_modeling_tf_{lowercase_model_name}.py'       )

					if output_flax:
									if not self._testing:
													remove_copy_lines(f'{directory}/modeling_flax_{lowercase_model_name}.py'       )

									shutil.move(
									    f'{directory}/modeling_flax_{lowercase_model_name}.py'					,f'{model_dir}/modeling_flax_{lowercase_model_name}.py'					,)

									shutil.move(
									    f'{directory}/test_modeling_flax_{lowercase_model_name}.py'					,f'{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_flax_{lowercase_model_name}.py'					,)
					else:
									os.remove(f'{directory}/modeling_flax_{lowercase_model_name}.py'       )
									os.remove(f'{directory}/test_modeling_flax_{lowercase_model_name}.py'       )

					shutil.move(
					    f'{directory}/{lowercase_model_name}.md'					,f'{path_to_transformer_root}/docs/source/en/model_doc/{lowercase_model_name}.md'					,)

					shutil.move(
					    f'{directory}/tokenization_{lowercase_model_name}.py'					,f'{model_dir}/tokenization_{lowercase_model_name}.py'					,)

					shutil.move(
					    f'{directory}/tokenization_fast_{lowercase_model_name}.py'					,f'{model_dir}/tokenization_{lowercase_model_name}_fast.py'					,)

					from os import fdopen, remove
					from shutil import copymode, move
					from tempfile import mkstemp

					def replace(UpperCamelCase					,UpperCamelCase					,UpperCamelCase       ):
									# Create temp file
									snake_case__    ,						snake_case__      :Optional[Any]         =   mkstemp()
									snake_case__      :Optional[Any]         =   False
									with fdopen(UpperCamelCase					,"w"       ) as new_file:
													with open(UpperCamelCase       ) as old_file:
																	for line in old_file:
																					new_file.write(UpperCamelCase       )
																					if line_to_copy_below in line:
																									snake_case__      :Optional[Any]         =   True
																									for line_to_copy in lines_to_copy:
																													new_file.write(UpperCamelCase       )

									if not line_found:
													raise ValueError(f'Line {line_to_copy_below} was not found in file.'       )

									# Copy the file permissions from the old file to the new file
									copymode(UpperCamelCase					,UpperCamelCase       )
									# Remove original file
									remove(UpperCamelCase       )
									# Move new file
									move(UpperCamelCase					,UpperCamelCase       )

					def skip_units(UpperCamelCase       ):
									return (
									    ("generating PyTorch" in line and not output_pytorch)
									    or ("generating TensorFlow" in line and not output_tensorflow)
									    or ("generating Flax" in line and not output_flax)
									)

					def replace_in_files(UpperCamelCase       ):
									with open(UpperCamelCase       ) as datafile:
													snake_case__      :int         =   []
													snake_case__      :Optional[int]         =   False
													snake_case__      :List[str]         =   False
													for line in datafile:
																	if "# To replace in: " in line and "##" not in line:
																					snake_case__      :Optional[Any]         =   line.split("\""       )[1]
																					snake_case__      :Tuple         =   skip_units(UpperCamelCase       )
																	elif "# Below: " in line and "##" not in line:
																					snake_case__      :Optional[Any]         =   line.split("\""       )[1]
																					snake_case__      :List[str]         =   skip_units(UpperCamelCase       )
																	elif "# End." in line and "##" not in line:
																					if not skip_file and not skip_snippet:
																									replace(UpperCamelCase					,UpperCamelCase					,UpperCamelCase       )

																					snake_case__      :Tuple         =   []
																	elif "# Replace with" in line and "##" not in line:
																					snake_case__      :Optional[Any]         =   []
																	elif "##" not in line:
																					lines_to_copy.append(UpperCamelCase       )

									remove(UpperCamelCase       )

					replace_in_files(f'{directory}/to_replace_{lowercase_model_name}.py'       )
					os.rmdir(UpperCamelCase       )