






"""simple docstring"""







import argparse
import json
import os

import requests
import torch
from huggingface_hub import hf_hub_download
from PIL import Image

from transformers import ConvNextImageProcessor, ConvNextVaConfig, ConvNextVaForImageClassification
from transformers.image_utils import PILImageResampling
from transformers.utils import logging


logging.set_verbosity_info()
a :				Union[str, Any]      					=		logging.get_logger(__name__)





def 						lowercase__(A						)				->Union[str, Any]:




						"""simple docstring"""



						lowercase__				:      Tuple=       ConvNextVaConfig()

						if "atto" in checkpoint_url:
												lowercase__				:      Optional[int]=       [2, 2, 6, 2]
												lowercase__				:      Union[str, Any]=       [40, 80, 160, 320]
						if "femto" in checkpoint_url:
												lowercase__				:      List[str]=       [2, 2, 6, 2]
												lowercase__				:      str=       [48, 96, 192, 384]
						if "pico" in checkpoint_url:
												lowercase__				:      List[Any]=       [2, 2, 6, 2]
												lowercase__				:      Optional[int]=       [64, 128, 256, 512]
						if "nano" in checkpoint_url:
												lowercase__				:      List[str]=       [2, 2, 8, 2]
												lowercase__				:      Union[str, Any]=       [80, 160, 320, 640]
						if "tiny" in checkpoint_url:
												lowercase__				:      Tuple=       [3, 3, 9, 3]
												lowercase__				:      Tuple=       [96, 192, 384, 768]
						if "base" in checkpoint_url:
												lowercase__				:      Union[str, Any]=       [3, 3, 27, 3]
												lowercase__				:      Dict=       [128, 256, 512, 1_024]
						if "large" in checkpoint_url:
												lowercase__				:      List[Any]=       [3, 3, 27, 3]
												lowercase__				:      int=       [192, 384, 768, 1_536]
						if "huge" in checkpoint_url:
												lowercase__				:      Optional[Any]=       [3, 3, 27, 3]
												lowercase__				:      Any=       [352, 704, 1_408, 2_816]

						lowercase__				:      Optional[Any]=       1_000
						lowercase__				:      str=       "imagenet-1k-id2label.json"
						lowercase__				:      Optional[int]=       (1, 1_000)

						lowercase__				:      int=       "huggingface/label-files"
						lowercase__				:      Optional[int]=       num_labels
						lowercase__				:      Any=       json.load(open(hf_hub_download(A					,		A					,		repo_type="dataset"						)					,		"r"						)						)
						lowercase__				:      str=       {int(A						): v for k, v in idalabel.items()}

						lowercase__				:      Union[str, Any]=       idalabel
						lowercase__				:      Union[str, Any]=       {v: k for k, v in idalabel.items()}
						lowercase__				:      Optional[int]=       hidden_sizes
						lowercase__				:      Dict=       depths

						return config, expected_shape





def 						lowercase__(A						)				->Optional[int]:




						"""simple docstring"""



						if "downsample_layers.0.0" in name:
												lowercase__				:      Tuple=       name.replace("downsample_layers.0.0"					,		"embeddings.patch_embeddings"						)
						if "downsample_layers.0.1" in name:
												lowercase__				:      Dict=       name.replace("downsample_layers.0.1"					,		"embeddings.norm"						)  # we rename to layernorm later on
						if "downsample_layers.1.0" in name:
												lowercase__				:      Dict=       name.replace("downsample_layers.1.0"					,		"stages.1.downsampling_layer.0"						)
						if "downsample_layers.1.1" in name:
												lowercase__				:      Union[str, Any]=       name.replace("downsample_layers.1.1"					,		"stages.1.downsampling_layer.1"						)
						if "downsample_layers.2.0" in name:
												lowercase__				:      int=       name.replace("downsample_layers.2.0"					,		"stages.2.downsampling_layer.0"						)
						if "downsample_layers.2.1" in name:
												lowercase__				:      Dict=       name.replace("downsample_layers.2.1"					,		"stages.2.downsampling_layer.1"						)
						if "downsample_layers.3.0" in name:
												lowercase__				:      int=       name.replace("downsample_layers.3.0"					,		"stages.3.downsampling_layer.0"						)
						if "downsample_layers.3.1" in name:
												lowercase__				:      Tuple=       name.replace("downsample_layers.3.1"					,		"stages.3.downsampling_layer.1"						)
						if "stages" in name and "downsampling_layer" not in name:
												# stages.0.0. for instance should be renamed to stages.0.layers.0.
												lowercase__				:      Union[str, Any]=       name[: len("stages.0"						)] + ".layers" + name[len("stages.0"						) :]
						if "gamma" in name:
												lowercase__				:      List[Any]=       name.replace("gamma"					,		"weight"						)
						if "beta" in name:
												lowercase__				:      Tuple=       name.replace("beta"					,		"bias"						)
						if "stages" in name:
												lowercase__				:      Optional[Any]=       name.replace("stages"					,		"encoder.stages"						)
						if "norm" in name:
												lowercase__				:      List[Any]=       name.replace("norm"					,		"layernorm"						)
						if "head" in name:
												lowercase__				:      int=       name.replace("head"					,		"classifier"						)

						return name





def 						lowercase__()				->Dict:




						"""simple docstring"""



						lowercase__				:      Optional[Any]=       "http://images.cocodataset.org/val2017/000000039769.jpg"
						lowercase__				:      Optional[int]=       Image.open(requests.get(A					,		stream=A						).raw						)
						return im





def 						lowercase__(A						)				->str:




						"""simple docstring"""



						if "224" in checkpoint_url:
												lowercase__				:      Any=       224
												lowercase__				:      Optional[int]=       224 / 256
						elif "384" in checkpoint_url:
												lowercase__				:      Optional[int]=       384
												lowercase__				:      Dict=       None
						else:
												lowercase__				:      Optional[Any]=       512
												lowercase__				:      Dict=       None

						return ConvNextImageProcessor(
						    size=A					,		crop_pct=A					,		image_mean=[0.485, 0.456, 0.406]					,		image_std=[0.229, 0.224, 0.225]					,		resample=PILImageResampling.BICUBIC					,		)





@torch.no_grad()
def 						lowercase__(A					,		A					,		A					,		A						)				->Union[str, Any]:




						"""simple docstring"""



						print("Downloading original model from checkpoint..."						)
						# define ConvNeXTV2 configuration based on URL
						lowercase__,	lowercase__				:      Dict=       get_convnextva_config(A						)
						# load original state_dict from URL
						lowercase__				:      Tuple=       torch.hub.load_state_dict_from_url(A						)["model"]

						print("Converting model parameters..."						)
						# rename keys
						for key in state_dict.copy().keys():
												lowercase__				:      Optional[int]=       state_dict.pop(A						)
												lowercase__				:      List[str]=       val
						# add prefix to all keys expect classifier head
						for key in state_dict.copy().keys():
												lowercase__				:      Optional[Any]=       state_dict.pop(A						)
												if not key.startswith("classifier"						):
																		lowercase__				:      List[str]=       "convnextv2." + key
												lowercase__				:      Optional[Any]=       val

						# load HuggingFace model
						lowercase__				:      Union[str, Any]=       ConvNextVaForImageClassification(A						)
						model.load_state_dict(A						)
						model.eval()

						# Check outputs on an image, prepared by ConvNextImageProcessor
						lowercase__				:      str=       convert_preprocessor(A						)
						lowercase__				:      Optional[int]=       preprocessor(images=prepare_img()					,		return_tensors="pt"						)
						lowercase__				:      Optional[int]=       model(**A						).logits

						# note: the logits below were obtained without center cropping
						if checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_atto_1k_224_ema.pt":
												lowercase__				:      Union[str, Any]=       torch.tensor([-0.3_930, 0.1_747, -0.5_246, 0.4_177, 0.4_295]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_femto_1k_224_ema.pt":
												lowercase__				:      Optional[int]=       torch.tensor([-0.1_727, -0.5_341, -0.7_818, -0.4_745, -0.6_566]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_pico_1k_224_ema.pt":
												lowercase__				:      str=       torch.tensor([-0.0_333, 0.1_563, -0.9_137, 0.1_054, 0.0_381]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_nano_1k_224_ema.pt":
												lowercase__				:      Optional[int]=       torch.tensor([-0.1_744, -0.1_555, -0.0_713, 0.0_950, -0.1_431]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_tiny_1k_224_ema.pt":
												lowercase__				:      Optional[int]=       torch.tensor([0.9_996, 0.1_966, -0.4_386, -0.3_472, 0.6_661]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_base_1k_224_ema.pt":
												lowercase__				:      List[Any]=       torch.tensor([-0.2_553, -0.6_708, -0.1_359, 0.2_518, -0.2_488]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_large_1k_224_ema.pt":
												lowercase__				:      Tuple=       torch.tensor([-0.0_673, -0.5_627, -0.3_753, -0.2_722, 0.0_178]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_huge_1k_224_ema.pt":
												lowercase__				:      Union[str, Any]=       torch.tensor([-0.6_377, -0.7_458, -0.2_150, 0.1_184, -0.0_597]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_224_ema.pt":
												lowercase__				:      Tuple=       torch.tensor([1.0_799, 0.2_322, -0.8_860, 1.0_219, 0.6_231]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_384_ema.pt":
												lowercase__				:      Optional[int]=       torch.tensor([0.3_766, 0.4_917, -1.1_426, 0.9_942, 0.6_024]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_224_ema.pt":
												lowercase__				:      Tuple=       torch.tensor([0.4_220, -0.6_919, -0.4_317, -0.2_881, -0.6_609]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_384_ema.pt":
												lowercase__				:      Tuple=       torch.tensor([0.1_082, -0.8_286, -0.5_095, 0.4_681, -0.8_085]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_224_ema.pt":
												lowercase__				:      str=       torch.tensor([-0.2_419, -0.6_221, 0.2_176, -0.0_980, -0.7_527]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_384_ema.pt":
												lowercase__				:      Union[str, Any]=       torch.tensor([0.0_391, -0.4_371, 0.3_786, 0.1_251, -0.2_784]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_224_ema.pt":
												lowercase__				:      Optional[int]=       torch.tensor([-0.0_504, 0.5_636, -0.1_729, -0.6_507, -0.3_949]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_384_ema.pt":
												lowercase__				:      int=       torch.tensor([0.3_560, 0.9_486, 0.3_149, -0.2_667, -0.5_138]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_384_ema.pt":
												lowercase__				:      str=       torch.tensor([-0.2_469, -0.4_550, -0.5_853, -0.0_810, 0.0_309]						)
						elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_512_ema.pt":
												lowercase__				:      Optional[Any]=       torch.tensor([-0.3_090, 0.0_802, -0.0_682, -0.1_979, -0.2_826]						)
						else:
												raise ValueError(f'''Unknown URL: {checkpoint_url}'''						)

						assert torch.allclose(logits[0, :5]					,		A					,		atol=1e-3						)
						assert logits.shape == expected_shape
						print("Model outputs match the original results!"						)

						if save_model:
												print("Saving model to local..."						)
												# Create folder to save model
												if not os.path.isdir(A						):
																		os.mkdir(A						)

												model.save_pretrained(A						)
												preprocessor.save_pretrained(A						)

						lowercase__				:      int=       "convnextv2"
						if "atto" in checkpoint_url:
												model_name += "-atto"
						if "femto" in checkpoint_url:
												model_name += "-femto"
						if "pico" in checkpoint_url:
												model_name += "-pico"
						if "nano" in checkpoint_url:
												model_name += "-nano"
						elif "tiny" in checkpoint_url:
												model_name += "-tiny"
						elif "base" in checkpoint_url:
												model_name += "-base"
						elif "large" in checkpoint_url:
												model_name += "-large"
						elif "huge" in checkpoint_url:
												model_name += "-huge"
						if "22k" in checkpoint_url and "1k" not in checkpoint_url:
												model_name += "-22k"
						elif "22k" in checkpoint_url and "1k" in checkpoint_url:
												model_name += "-22k-1k"
						elif "1k" in checkpoint_url:
												model_name += "-1k"
						if "224" in checkpoint_url:
												model_name += "-224"
						elif "384" in checkpoint_url:
												model_name += "-384"
						elif "512" in checkpoint_url:
												model_name += "-512"

						if push_to_hub:
												print(f'''Pushing {model_name} to the hub...'''						)
												model.push_to_hub(A						)
												preprocessor.push_to_hub(A						)


if __name__ == "__main__":
			a :				str      					=		argparse.ArgumentParser()
			# Required parameters
			parser.add_argument(
			    """--checkpoint_url""",
			    default="""https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_atto_1k_224_ema.pt""",
			    type=str,
			    help="""URL of the original ConvNeXTV2 checkpoint you'd like to convert.""",
			)
			parser.add_argument(
			    """--pytorch_dump_folder_path""",
			    default="""model""",
			    type=str,
			    help="""Path to the output PyTorch model directory.""",
			)
			parser.add_argument("""--save_model""", action="""store_true""", help="""Save model to local""")
			parser.add_argument("""--push_to_hub""", action="""store_true""", help="""Push model and image preprocessor to the hub""")

			a :				Any      					=		parser.parse_args()
			convert_convnextva_checkpoint(
			    args.checkpoint_url, args.pytorch_dump_folder_path, args.save_model, args.push_to_hub
			)














"""simple docstring"""







def 						lowercase__(A = 1_000						)				->int:




						"""simple docstring"""



						lowercase__				:      Any=       [0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8]
						# number of letters in twenty, thirty, ..., ninety (0 for numbers less than
						# 20 due to inconsistency in teens)
						lowercase__				:      List[str]=       [0, 0, 6, 6, 5, 5, 5, 7, 6, 6]

						lowercase__				:      Dict=       0

						for i in range(1					,		n + 1						):
												if i < 1_000:
																		if i >= 100:
																								# add number of letters for "n hundred"
																								count += ones_counts[i // 100] + 7

																								if i % 100 != 0:
																														# add number of letters for "and" if number is not multiple
																														# of 100
																														count += 3

																		if 0 < i % 100 < 20:
																								# add number of letters for one, two, three, ..., nineteen
																								# (could be combined with below if not for inconsistency in
																								# teens)
																								count += ones_counts[i % 100]
																		else:
																								# add number of letters for twenty, twenty one, ..., ninety
																								# nine
																								count += ones_counts[i % 10]
																								count += tens_counts[(i % 100 - i % 10) // 10]
												else:
																		count += ones_counts[i // 1_000] + 8
						return count


if __name__ == "__main__":
			print(solution(int(input().strip())))






