code: def typed_mutate(self, seed_input: List):
      if len(seed_input) == 0:
          return self.typed_gen([])
  
      choice = random.randint(1, 3)
      idx = random.randint(0, len(seed_input) - 1)
      if (
          choice == 1 and 0 < len(seed_input) < MAX_SIZE
      ):  # length *= 1.1
          old_length = len(seed_input)
          new_length = math.ceil(old_length * 1.1)
          for _ in range(new_length - old_length):
              seed_input.insert(
                  random.randint(0, len(seed_input) - 1),
                  self.typed_mutate(seed_input[idx]),
              )
      elif (
          choice == 2 and 0 < len(seed_input) < MAX_SIZE
      ):  # repeat, length *= 1.1
          old_length = len(seed_input)
          new_length = math.ceil(old_length * 1.1)
          for _ in range(new_length - old_length):
              seed_input.append(seed_input[idx])
      else:  # inplace element change, large_scale
          for idx in range(len(seed_input)):
              if random.uniform(0, 1) > 0.7:
                  seed_input[idx] = self.typed_mutate(seed_input[idx])
      return seed_input
  
imports: import copy
  import math
  import random
  import string
  from typing import Any, Dict, List, Optional, Set, Tuple
  from multipledispatch import dispatch
  from rich.progress import track
  from evalplus._experimental.evaluate_runtime import MAX_WARMUP_LIMIT, RUN_REPEAT, execute_for_runtime
  from evalplus.gen.mut_gen import MutateGen
label_desc: Use image node_id 17 for calling the TypedMutEffGen obj's underlying member method code with example usage: obj.typed_mutate(seed_input) and returns: seed_input, self