





'''simple docstring'''

# Lint as: python3
import os
import re
import urllib.parse
from pathlib import Path
from typing import Callable, List, Optional, Union
from zipfile import ZipFile

from ..utils.file_utils import cached_path, hf_github_url
from ..utils.logging import get_logger
from ..utils.version import Version


UpperCAmelCase					:		Union[str, Any]		=							get_logger(__name__)





class lowerCamelCase						:
  _lowercase  :	List[Any]       					=				"""dummy_data"""
  _lowercase  :	str       					=				"""datasets"""
  _lowercase  :	Tuple       					=				False







  def __init__(		self     ,     lowercase__     ,     lowercase__     ,     lowercase__     ,     lowercase__ = None     ,     lowercase__ = False     ,     lowercase__ = True     ,     lowercase__ = None     ,     )		->						Dict:






        """simple docstring"""





        _snake_case		:	List[Any]					     =     0
        _snake_case		:	Optional[int]					     =     dataset_name
        _snake_case		:	str					     =     cache_dir
        _snake_case		:	Optional[int]					     =     use_local_dummy_data
        _snake_case		:	Dict					     =     config
        # download_callbacks take a single url as input
        _snake_case		:	List[Callable]					     =     download_callbacks or []
        # if False, it doesn't load existing files and it returns the paths of the dummy files relative
        # to the dummy_data zip file root
        _snake_case		:	List[Any]					     =     load_existing_dummy_data

        # TODO(PVP, QL) might need to make this more general
        _snake_case		:	List[str]					     =     str(lowercase__		)
        # to be downloaded
        _snake_case		:	int					     =     None
        _snake_case		:	Tuple					     =     None







  @property
  def 				UpperCAmelCase_				(		self		)		->						Dict:






        """simple docstring"""





        if self._dummy_file is None:
              _snake_case		:	List[Any]					     =     self.download_dummy_data()
        return self._dummy_file







  @property
  def 				UpperCAmelCase_				(		self		)		->						str:






        """simple docstring"""





        if self.config is not None:
              # structure is dummy / config_name / version_name
              return os.path.join('''dummy'''     ,     self.config.name     ,     self.version_name		)
        # structure is dummy / version_name
        return os.path.join('''dummy'''     ,     self.version_name		)







  @property
  def 				UpperCAmelCase_				(		self		)		->						List[str]:






        """simple docstring"""





        return os.path.join(self.dummy_data_folder     ,     '''dummy_data.zip'''		)







  def 				UpperCAmelCase_				(		self		)		->						Dict:






        """simple docstring"""





        _snake_case		:	Optional[int]					     =     (
            self.local_path_to_dummy_data if self.use_local_dummy_data is True else self.github_path_to_dummy_data
        )

        _snake_case		:	int					     =     cached_path(
            lowercase__     ,     cache_dir=self.cache_dir     ,     extract_compressed_file=lowercase__     ,     force_extract=lowercase__		)

        return os.path.join(lowercase__     ,     self.dummy_file_name		)







  @property
  def 				UpperCAmelCase_				(		self		)		->						List[Any]:






        """simple docstring"""





        return os.path.join(self.datasets_scripts_dir     ,     self.dataset_name     ,     self.dummy_zip_file		)







  @property
  def 				UpperCAmelCase_				(		self		)		->						Union[str, Any]:






        """simple docstring"""





        if self._bucket_url is None:
              _snake_case		:	Any					     =     hf_github_url(self.dataset_name     ,     self.dummy_zip_file.replace(os.sep     ,     '''/'''		)		)
        return self._bucket_url







  @property
  def 				UpperCAmelCase_				(		self		)		->						str:






        """simple docstring"""





        if os.path.isdir(self.dummy_file		):
              return self.dummy_file
        # else cut off path to file -> example `xsum`.
        return "/".join(self.dummy_file.replace(os.sep     ,     '''/'''		).split('''/'''		)[:-1]		)







  def 				UpperCAmelCase_				(		self     ,     lowercase__     ,     *lowercase__		)		->						Union[str, Any]:






        """simple docstring"""





        if self.load_existing_dummy_data:
              # dummy data is downloaded and tested
              _snake_case		:	List[str]					     =     self.dummy_file
        else:
              # dummy data cannot be downloaded and only the path to dummy file is returned
              _snake_case		:	Optional[Any]					     =     self.dummy_file_name

        # special case when data_url is a dict
        if isinstance(lowercase__     ,     lowercase__		):
              return self.create_dummy_data_dict(lowercase__     ,     lowercase__		)
        elif isinstance(lowercase__     ,     (list, tuple)		):
              return self.create_dummy_data_list(lowercase__     ,     lowercase__		)
        else:
              return self.create_dummy_data_single(lowercase__     ,     lowercase__		)







  def 				UpperCAmelCase_				(		self     ,     lowercase__     ,     *lowercase__		)		->						Dict:






        """simple docstring"""





        return self.download_and_extract(lowercase__		)







  def 				UpperCAmelCase_				(		self     ,     lowercase__     ,     lowercase__		)		->						Tuple:






        """simple docstring"""





        return self.download_and_extract(lowercase__		)







  def 				UpperCAmelCase_				(		self     ,     lowercase__     ,     *lowercase__     ,     **lowercase__		)		->						List[str]:






        """simple docstring"""





        return path







  def 				UpperCAmelCase_				(		self		)		->						Union[str, Any]:






        """simple docstring"""





        return {}







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






        """simple docstring"""





        _snake_case		:	Union[str, Any]					     =     {}
        for key, single_urls in data_url.items():
              for download_callback in self.download_callbacks:
                    if isinstance(lowercase__     ,     lowercase__		):
                          for single_url in single_urls:
                                download_callback(lowercase__		)
                    else:
                          _snake_case		:	List[Any]					     =     single_urls
                          download_callback(lowercase__		)
            # we force the name of each key to be the last file / folder name of the url path
            # if the url has arguments, we need to encode them with urllib.parse.quote_plus
              if isinstance(lowercase__     ,     lowercase__		):
                    _snake_case		:	int					     =     [os.path.join(lowercase__     ,     urllib.parse.quote_plus(Path(lowercase__		).name		)		) for x in single_urls]
              else:
                    _snake_case		:	Dict					     =     single_urls
                    _snake_case		:	Optional[int]					     =     os.path.join(lowercase__     ,     urllib.parse.quote_plus(Path(lowercase__		).name		)		)
              _snake_case		:	List[Any]					     =     value

        # make sure that values are unique
        if all(isinstance(lowercase__     ,     lowercase__		) for i in dummy_data_dict.values()		) and len(set(dummy_data_dict.values()		)		) < len(
            dummy_data_dict.values()		):
              # append key to value to make its name unique
              _snake_case		:	str					     =     {key: value + key for key, value in dummy_data_dict.items()}

        return dummy_data_dict







  def 				UpperCAmelCase_				(		self     ,     lowercase__     ,     lowercase__		)		->						int:






        """simple docstring"""





        _snake_case		:	Union[str, Any]					     =     []
        # trick: if there are many shards named like `data.txt-000001-of-00300`, only use the first one
        _snake_case		:	List[Any]					     =     all(bool(re.findall('''[0-9]{3,}-of-[0-9]{3,}'''     ,     lowercase__		)		) for url in data_url		)
        _snake_case		:	Optional[int]					     =     all(
            url.startswith('''https://ftp.ncbi.nlm.nih.gov/pubmed/baseline/pubmed'''		) for url in data_url		)
        if data_url and (is_tf_records or is_pubmed_records):
              _snake_case		:	Tuple					     =     [data_url[0]] * len(lowercase__		)
        for single_url in data_url:
              for download_callback in self.download_callbacks:
                    download_callback(lowercase__		)
              # we force the name of each key to be the last file / folder name of the url path
              # if the url has arguments, we need to encode them with urllib.parse.quote_plus
              _snake_case		:	Optional[Any]					     =     os.path.join(lowercase__     ,     urllib.parse.quote_plus(single_url.split('''/'''		)[-1]		)		)
              dummy_data_list.append(lowercase__		)
        return dummy_data_list







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






        """simple docstring"""





        for download_callback in self.download_callbacks:
              download_callback(lowercase__		)
        # we force the name of each key to be the last file / folder name of the url path
        # if the url has arguments, we need to encode them with urllib.parse.quote_plus
        _snake_case		:	str					     =     os.path.join(lowercase__     ,     urllib.parse.quote_plus(data_url.split('''/'''		)[-1]		)		)
        if os.path.exists(lowercase__		) or not self.load_existing_dummy_data:
              return value
        else:
              # Backward compatibility, maybe deprecate at one point.
              # For many datasets with single url calls to dl_manager.download_and_extract,
              # the dummy_data.zip file is actually the zipped downloaded file
              # while now we expected the dummy_data.zip file to be a directory containing
              # the downloaded file.
              return path_to_dummy_data







  def 				UpperCAmelCase_				(		self		)		->						List[str]:






        """simple docstring"""





        pass







  def 				UpperCAmelCase_				(		self		)		->						str:






        """simple docstring"""





        pass







  def 				UpperCAmelCase_				(		self     ,     lowercase__		)		->						str:






        """simple docstring"""





        def _iter_archive_members(lowercase__		):
              # this preserves the order of the members inside the ZIP archive
              _snake_case		:	Optional[Any]					     =     Path(self.dummy_file		).parent
              _snake_case		:	Any					     =     path.relative_to(lowercase__		)
              with ZipFile(self.local_path_to_dummy_data		) as zip_file:
                    _snake_case		:	List[Any]					     =     zip_file.namelist()
              for member in members:
                    if member.startswith(relative_path.as_posix()		):
                          yield dummy_parent_path.joinpath(lowercase__		)

        _snake_case		:	Optional[Any]					     =     Path(lowercase__		)
        _snake_case		:	Dict					     =     _iter_archive_members(lowercase__		) if self.use_local_dummy_data else path.rglob('''*'''		)
        for file_path in file_paths:
              if file_path.is_file() and not file_path.name.startswith(('''.''', '''__''')		):
                    yield file_path.relative_to(lowercase__		).as_posix(), file_path.open('''rb'''		)







  def 				UpperCAmelCase_				(		self     ,     lowercase__		)		->						Dict:






        """simple docstring"""





        if not isinstance(lowercase__     ,     lowercase__		):
              _snake_case		:	Tuple					     =     [paths]
        for path in paths:
              if os.path.isfile(lowercase__		):
                    if os.path.basename(lowercase__		).startswith(('''.''', '''__''')		):
                          return
                    yield path
              else:
                    for dirpath, dirnames, filenames in os.walk(lowercase__		):
                          if os.path.basename(lowercase__		).startswith(('''.''', '''__''')		):
                                continue
                          dirnames.sort()
                          for filename in sorted(lowercase__		):
                                if filename.startswith(('''.''', '''__''')		):
                                      continue
                                yield os.path.join(lowercase__     ,     lowercase__		)









'''simple docstring'''

from collections.abc import Generator




def    _a    (							):





      """simple docstring"""



      _snake_case     ,							_snake_case		:	Union[str, Any]					     =     0, 1
      while True:
            _snake_case     ,							_snake_case		:	List[str]					     =     b, a + b
            yield b




def    _a    (							lowerCAmelCase_ = 1_000	):





      """simple docstring"""



      _snake_case		:	List[str]					     =     1
      _snake_case		:	Dict					     =     fibonacci_generator()
      while len(str(next(lowerCAmelCase_	)	)	) < n:
            answer += 1
      return answer + 1


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


