class_docstr: A scenario represents a (task, data distribution).
  It is usually based on some raw dataset and is converted into a list of `Instance`s.
  Override this class.
  
  Note: the constructor should be lightweight, `get_instances` should do all
  the heavy lifting.
code: def render_lines(self, instances: List[Instance]) -> List[str]:
      total = len(instances)
      output = [
          f"name: {self.name}",
          f"description: {self.description}",
          f"tags: {format_tags(self.tags)}",
          "",
      ]
  
      for i, instance in enumerate(instances):
          output.append(
              f"instance {i} ({total} total) {format_split(str(instance.split))} {{"
          )
          output.extend(indent_lines(instance.render_lines()))
          output.append("}")
      return output
  
imports: from abc import ABC, abstractmethod
  from dataclasses import dataclass, field, replace
  from typing import List, Optional, Tuple
  import re
  import inspect
  from helm.common.object_spec import ObjectSpec, create_object
  from helm.common.general import format_text, format_split, format_tags, indent_lines
  from helm.benchmark.augmentations.perturbation_description import PerturbationDescription
label_desc: Use image node_id 3 for calling the Scenario obj's underlying member method code with example usage: obj.render_lines(instances) and returns: output