code: def crackOne(
      self,
      ctext: str,
      analysis: cipheycore.windowed_analysis_res,
      real_ctext: str,
  ) -> List[CrackResult]:
      possible_keys = cipheycore.vigenere_crack(
          analysis, self.expected, self.group, self.p_value
      )
      if len(possible_keys) > self.clamp:
          possible_keys = possible_keys[: self.clamp]
      logging.debug(
          f"Vigenere crack got keys: {[[i for i in candidate.key] for candidate in possible_keys]}"
      )
      return [
          CrackResult(
              value=fix_case(
                  cipheycore.vigenere_decrypt(
                      ctext, candidate.key, self.group
                  ),
                  real_ctext,
              ),
              key_info="".join([self.group[i] for i in candidate.key]),
              misc_info=f"p-value was {candidate.p_value}",
          )
          for candidate in possible_keys[: min(len(possible_keys), 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 3 for calling the Vigenere obj's underlying member method code with example usage: obj.crackOne(ctext, analysis, real_ctext) and returns: unknown