code: def getParams() -> Optional[Dict[str, ParamSpec]]:
      return {
          "expected": ParamSpec(
              desc="The expected distribution of the plaintext",
              req=False,
              config_ref=["default_dist"],
          ),
          "group": ParamSpec(
              desc="An ordered sequence of chars that make up the caesar cipher alphabet",
              req=False,
              default="abcdefghijklmnopqrstuvwxyz",
          ),
          "lower": ParamSpec(
              desc="Whether or not the ciphertext should be converted to lowercase first",
              req=False,
              default=True,
          ),
          "keysize": ParamSpec(
              desc="A key size that should be used. If not given, will attempt to work it out",
              req=False,
          ),
          "p_value": ParamSpec(
              desc="The p-value to use for windowed frequency analysis",
              req=False,
              default=0.5,
          ),
          "detect_p_value": ParamSpec(
              desc="The p-value to use for the detection of Vigenere length",
              req=False,
              default=0.01,
          ),
          "clamp": ParamSpec(
              desc="The maximum number of candidates that can be returned per key len",
              req=False,
              default=10,
          ),
      }
  
file_path: Ciphey/ciphey/basemods/Crackers/vigenere.py
imports: from distutils import util
  from typing import Dict, List, Optional, Union
  import cipheycore
  import logging
  from rich.logging import RichHandler
  from ciphey.common import fix_case
  from ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry
label_desc: Use image node_id 5 for calling the Vigenere obj's underlying member method code with example usage: obj.getParams() and returns: dict