text: from typing import List, Dict
  from boofuzz import s_group, s_static
  from encodings_helper import Encoder, EncodingTypes
  from configuration_manager import ConfigurationManager
  
  
  class FuzzPayloads:
      payloads: Dict[str, List[str]] = {}
      CUSTOM_PAYLOADS_KEY = "custom"
  
      @staticmethod
      def add_payload_to_list(line, directory_name):
          if directory_name not in FuzzPayloads.payloads:
              FuzzPayloads.payloads[directory_name] = []
  
          if line not in FuzzPayloads.payloads[directory_name]:
              FuzzPayloads.payloads[directory_name].append(line)
  
      @staticmethod
      def _get_payloads_using_directory_names(directory_names: List[str]) -> List[str]:
          directory_names.append(FuzzPayloads.CUSTOM_PAYLOADS_KEY)    # Always add custom payloads into any payloads set
          payloads: List[str] = []
          for directory_name in directory_names:
              if directory_name in FuzzPayloads.payloads:
                  for line in FuzzPayloads.payloads[directory_name]:
                      payloads.append(line)
          return list(set(payloads))          # Remove duplicities
  
      @staticmethod
      def get_all_payloads():
          return FuzzPayloads._get_payloads_using_directory_names(list(FuzzPayloads.payloads.keys()))
  
      @staticmethod
      def _get_specific_type_payloads(payload_folders):
          return FuzzPayloads._get_payloads_using_directory_names(payload_folders) if payload_folders else FuzzPayloads.get_all_payloads()
  
      @staticmethod
      def get_string_payloads():
          payload_folders = ConfigurationManager.get_payloads_folders_for_string_json_primitive()
          return FuzzPayloads._get_specific_type_payloads(payload_folders)
  
      @staticmethod
      def get_number_payloads():
          payload_folders = ConfigurationManager.get_payloads_folders_for_number_json_primitive()
          return FuzzPayloads._get_specific_type_payloads(payload_folders)
  
      @staticmethod
      def get_boolean_payloads():
          payload_folders = ConfigurationManager.get_payloads_folders_for_boolean_json_primitive()
          return FuzzPayloads._get_specific_type_payloads(payload_folders)
  
  
  def s_http_general(value, payloads, fuzzable=True, encoding: EncodingTypes = EncodingTypes.ascii, name=None, add_quotation_marks=False):
      # Encode all payloads
      encoded_payloads: List[bytes] = []
      for payload in payloads:
          encoded = Encoder.encode_string(payload, encoding)
          if add_quotation_marks:
              encoded = Encoder.get_ascii_encoded_quotation_mark() + encoded + Encoder.get_ascii_encoded_quotation_mark()
          encoded_payloads.append(encoded)
  
      # Encode default value
      default_value = Encoder.encode_string(value, encoding)
      if fuzzable:
          # noinspection PyTypeChecker
          s_group(name, encoded_payloads, default_value)
      else:
          s_static(default_value)
  
  
  def s_http_string(value, fuzzable=True, encoding: EncodingTypes = EncodingTypes.ascii, name=None):
      s_http_general(value, FuzzPayloads.get_string_payloads(), fuzzable, encoding, name)
  
  
  def s_http_number(value, fuzzable=True, encoding: EncodingTypes = EncodingTypes.ascii, name=None, add_quotation_marks=False):
      s_http_general(value, FuzzPayloads.get_number_payloads(), fuzzable, encoding, name, add_quotation_marks)
  
  
  def s_http_boolean(value, fuzzable=True, encoding: EncodingTypes = EncodingTypes.ascii, name=None, add_quotation_marks=False):
      s_http_general(value, FuzzPayloads.get_boolean_payloads(), fuzzable, encoding, name, add_quotation_marks)
  