


'''simple docstring'''







from __future__ import annotations

from string import ascii_letters






def    lowerCAmelCase__ (       lowerCamelCase  :    str						,lowerCamelCase  :    int						,lowerCamelCase  :    str | None = None     ):
       _A  :			Optional[Any]											=      alphabet or ascii_letters

       # The final result string
       _A  :			Tuple											=      ''

       for character in input_string:
              if character not in alpha:
                     # Append without encryption if character is not in the alphabet
                     result += character
              else:
                     # Get the index of the new key and make sure it isn't too large
                     _A  :			Optional[int]											=      (alpha.index(lowerCamelCase     ) + key) % len(lowerCamelCase     )

                     # Append the encoded character to the alphabet
                     result += alpha[new_key]

       return result






def    lowerCAmelCase__ (       lowerCamelCase  :    str						,lowerCamelCase  :    int						,lowerCamelCase  :    str | None = None     ):
       key *= -1

       return encrypt(lowerCamelCase						,lowerCamelCase						,lowerCamelCase     )






def    lowerCAmelCase__ (       lowerCamelCase  :    str						,lowerCamelCase  :    str | None = None     ):
       _A  :			Union[str, Any]											=      alphabet or ascii_letters

       # To store data on all the combinations
       _A  :			Dict											=      {}

       # Cycle through each combination
       for key in range(1						,len(lowerCamelCase     ) + 1     ):
              # Decrypt the message and store the result in the data
              _A  :			Any											=      decrypt(lowerCamelCase						,lowerCamelCase						,lowerCamelCase     )

       return brute_force_data


if __name__ == "__main__":
   while True:
      print(f"""\n{"-" * 10}\n Menu\n{"-" * 10}""")
      print(*['''1.Encrypt''', '''2.Decrypt''', '''3.BruteForce''', '''4.Quit'''], sep='''\n''')

      # get user input
      A   :  Any       		=				input('''\nWhat would you like to do?: ''').strip() or '''4'''

      # run functions based on what the user chose
      if choice not in ("1", "2", "3", "4"):
         print('''Invalid choice, please enter a valid choice''')
      elif choice == "1":
         A   :  Union[str, Any]       		=				input('''Please enter the string to be encrypted: ''')
         A   :  List[Any]       		=				int(input('''Please enter off-set: ''').strip())

         print(encrypt(input_string, key))
      elif choice == "2":
         A   :  Tuple       		=				input('''Please enter the string to be decrypted: ''')
         A   :  List[str]       		=				int(input('''Please enter off-set: ''').strip())

         print(decrypt(input_string, key))
      elif choice == "3":
         A   :  Optional[Any]       		=				input('''Please enter the string to be decrypted: ''')
         A   :  Tuple       		=				brute_force(input_string)

         for key, value in brute_force_data.items():
            print(f"""Key: {key} | Message: {value}""")

      elif choice == "4":
         print('''Goodbye.''')
         break










'''simple docstring'''







A   :  Optional[Any]       		=				{
    '''0000''': '''0''',
    '''0001''': '''1''',
    '''0010''': '''2''',
    '''0011''': '''3''',
    '''0100''': '''4''',
    '''0101''': '''5''',
    '''0110''': '''6''',
    '''0111''': '''7''',
    '''1000''': '''8''',
    '''1001''': '''9''',
    '''1010''': '''a''',
    '''1011''': '''b''',
    '''1100''': '''c''',
    '''1101''': '''d''',
    '''1110''': '''e''',
    '''1111''': '''f''',
}






def    lowerCAmelCase__ (       lowerCamelCase  :    str     ):
       _A  :			Union[str, Any]											=      str(lowerCamelCase     ).strip()

       # Exceptions
       if not binary_str:
              raise ValueError('Empty string was passed to the function'     )
       _A  :			Any											=      binary_str[0] == '-'
       _A  :			str											=      binary_str[1:] if is_negative else binary_str
       if not all(char in '01' for char in binary_str     ):
              raise ValueError('Non-binary value was passed to the function'     )

       _A  :			Optional[Any]											=      (
           '0' * (4 * (divmod(len(lowerCamelCase     )						,4     )[0] + 1) - len(lowerCamelCase     )) + binary_str
       )

       _A  :			Optional[int]											=      []
       for x in range(0						,len(lowerCamelCase     )						,4     ):
              hexadecimal.append(BITS_TO_HEX[binary_str[x : x + 4]]     )
       _A  :			int											=      '0x' + ''.join(lowerCamelCase     )

       return "-" + hexadecimal_str if is_negative else hexadecimal_str


if __name__ == "__main__":
   from doctest import testmod

   testmod()






