code: def make_mutant_tuples(example_protos, original_feature, index_to_mutate,
                         viz_params):
    
    mutant_features = make_mutant_features(original_feature, index_to_mutate,
                                           viz_params)
    mutant_examples = []
    for example_proto in example_protos:
      for mutant_feature in mutant_features:
        copied_example = copy.deepcopy(example_proto)
        feature_name = mutant_feature.original_feature.feature_name
  
        try:
          feature_list = proto_value_for_feature(copied_example, feature_name)
          if index_to_mutate is None:
            new_values = mutant_feature.mutant_value
          else:
            new_values = list(feature_list)
            new_values[index_to_mutate] = mutant_feature.mutant_value
  
          del feature_list[:]
          feature_list.extend(new_values)
          mutant_examples.append(copied_example)
        except (ValueError, IndexError):
          # If the mutant value can't be set, still add the example to the
          # mutant_example even though no change was made. This is necessary to
          # allow for computation of global PD plots when not all examples have
          # the same number of feature values for a feature.
          mutant_examples.append(copied_example)
  
    return mutant_features, mutant_examples
docs: Return a list of `MutantFeatureValue`s and a list of mutant Examples.
  
    Args:
      example_protos: The examples to mutate.
      original_feature: A `OriginalFeatureList` that encapsulates the feature to
        mutate.
      index_to_mutate: The index of the int64_list or float_list to mutate.
      viz_params: A `VizParams` object that contains the UI state of the request.
  
    Returns:
      A list of `MutantFeatureValue`s and a list of mutant examples.